summaryrefslogtreecommitdiffstats
path: root/tools/sync-docs.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/sync-docs.py')
-rwxr-xr-xtools/sync-docs.py151
1 files changed, 151 insertions, 0 deletions
diff --git a/tools/sync-docs.py b/tools/sync-docs.py
new file mode 100755
index 0000000..95436e2
--- /dev/null
+++ b/tools/sync-docs.py
@@ -0,0 +1,151 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+from argparse import ArgumentParser
+import glob
+import json
+import os
+import re
+import subprocess
+import sys
+
+import requests
+
+BASE_URL = "https://www.freedesktop.org/software/systemd/man/"
+JQUERY_URL = "https://code.jquery.com/jquery-3.7.1.min.js"
+SCRIPT_TAG = '<script src="{}"></script>'
+
+NAV_JS = """
+$(document).ready(function() {
+ $.getJSON("../index.json", function(data) {
+ data.sort().reverse();
+
+ var [filename, dirname] = window.location.pathname.split("/").reverse();
+
+ var items = [];
+ $.each( data, function(_, version) {
+ if (version == dirname) {
+ items.push( "<option selected value='" + version + "'>" + "systemd " + version + "</option>");
+ } else if (dirname == "latest" && version == data[0]) {
+ items.push( "<option selected value='" + version + "'>" + "systemd " + version + "</option>");
+ } else {
+ items.push( "<option value='" + version + "'>" + "systemd " + version + "</option>");
+ }
+ });
+
+ $("span:first").html($( "<select/>", {
+ id: "version-selector",
+ html: items.join( "" )
+ }));
+
+ $("#version-selector").on("change", function() {
+ window.location.assign("../" + $(this).val() + "/" + filename);
+ });
+ });
+});
+"""
+
+
+def process_file(filename):
+ with open(filename) as f:
+ contents = f.read()
+
+ if SCRIPT_TAG.format("../nav.js") in contents:
+ return
+
+ body_tag = re.search("<body[^>]*>", contents)
+ new_contents = (
+ contents[: body_tag.end()]
+ + SCRIPT_TAG.format(JQUERY_URL)
+ + SCRIPT_TAG.format("../nav.js")
+ + contents[body_tag.end() :]
+ )
+
+ with open(filename, "w") as f:
+ f.write(new_contents)
+
+
+def update_index_file(version, index_filename):
+ response = requests.get(BASE_URL + "index.json")
+ if response.status_code == 404:
+ index = []
+ elif response.ok:
+ index = response.json()
+ else:
+ sys.exit(f"Error getting index: {response.status_code} {response.reason}")
+
+ if version not in index:
+ index.insert(0, version)
+
+ with open(index_filename, "w") as f:
+ json.dump(index, f)
+
+
+def get_latest_version():
+ tags = subprocess.check_output(["git", "tag", "-l", "v*"], text=True).split()
+ versions = []
+ for tag in tags:
+ m = re.match("v?(\d+).*", tag)
+ if m:
+ versions.append(int(m.group(1)))
+ return max(versions)
+
+
+def main(version, directory, www_target):
+ index_filename = os.path.join(directory, "index.json")
+ nav_filename = os.path.join(directory, "nav.js")
+
+ current_branch = subprocess.check_output(["git", "branch", "--show-current"], text=True).strip()
+
+ if current_branch != 'main' and not current_branch.endswith("-stable"):
+ sys.exit("doc-sync should only be run from main or a stable branch")
+
+ for filename in glob.glob(os.path.join(directory, "*.html")):
+ process_file(filename)
+
+ if current_branch == "main":
+ version = "devel"
+ dirs = ["devel"]
+ elif int(version) == get_latest_version():
+ dirs = [version, "latest"]
+ else:
+ dirs = [version]
+
+ with open(nav_filename, "w") as f:
+ f.write(NAV_JS)
+
+ update_index_file(version, index_filename)
+
+ for d in dirs:
+ subprocess.check_call(
+ [
+ "rsync",
+ "-rlv",
+ "--delete-excluded",
+ "--include=*.html",
+ "--exclude=*",
+ "--omit-dir-times",
+ directory + "/", # copy contents of directory
+ os.path.join(www_target, "man", d),
+ ]
+ )
+
+ subprocess.check_call(
+ [
+ "rsync",
+ "-v",
+ os.path.join(directory, "index.json"),
+ os.path.join(directory, "nav.js"),
+ os.path.join(www_target, "man"),
+ ]
+ )
+
+
+if __name__ == "__main__":
+ parser = ArgumentParser()
+ parser.add_argument("--version", required=True)
+ parser.add_argument("directory")
+ parser.add_argument("www_target")
+
+ args = parser.parse_args()
+ main(args.version, args.directory, args.www_target)