summaryrefslogtreecommitdiffstats
path: root/upstream/copy-manpages.py
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/copy-manpages.py')
-rwxr-xr-xupstream/copy-manpages.py147
1 files changed, 147 insertions, 0 deletions
diff --git a/upstream/copy-manpages.py b/upstream/copy-manpages.py
new file mode 100755
index 00000000..b9db627d
--- /dev/null
+++ b/upstream/copy-manpages.py
@@ -0,0 +1,147 @@
+#!/usr/bin/python3
+#
+# Copyright © 2020 Dr. Tobias Quathamer <toddy@debian.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import json
+import os
+import re
+import subprocess
+import sys
+from pathlib import Path
+
+# Get the current distribution from the command line
+if len(sys.argv) != 2:
+ print("Error: Please specify the distribution.", file=sys.stderr)
+ sys.exit(1)
+distribution = sys.argv[1]
+
+# Require package download information from a JSON file
+package_data = {}
+json_filename = "{}/downloads/packages.json".format(distribution)
+if os.path.exists(json_filename):
+ with open(json_filename) as input_file:
+ package_data = json.loads(input_file.read())
+else:
+ print("Error: The information about downloads is missing.", file=sys.stderr)
+ sys.exit(1)
+
+
+# Cycle through all packages and look for needed updates
+for package, info in package_data.items():
+ print("Checking '{}' ... ".format(package), end="")
+ if info['needs_update']:
+ package_links = []
+ workdir = "{}/downloads/{}".format(distribution, package)
+ # Get all mandirs
+ all_dirs = os.listdir(workdir)
+ mandirs = []
+ for mdir in all_dirs:
+ if mdir.startswith("man"):
+ mandirs.append(mdir)
+ mandirs.sort()
+
+ # Get all files in the mandirs
+ for mandir in mandirs:
+ # The section starts after "man", so remove 3 characters
+ section = mandir[3:]
+ manpages = os.listdir("{}/{}".format(workdir, mandir))
+ manpages.sort()
+
+ for manpage in manpages:
+ manpage_path = "{}/{}/{}".format(workdir, mandir, manpage)
+ if Path(manpage_path).is_symlink():
+ # This is a symlink, so add it to the links
+ link = os.readlink(manpage_path)
+ # Ensure that the link is always in the form
+ # of mandir/manpage
+ if (os.path.basename(os.path.dirname(link)).startswith("man")):
+ link = "{}/{}".format(os.path.basename(os.path.dirname(link)),
+ os.path.basename(link))
+ else:
+ link = "{}/{}".format(mandir, os.path.basename(link))
+ # Remove compression extension
+ for extension in ['.gz', '.bz2', '.xz']:
+ if link.endswith(extension):
+ link = link[:-len(extension)]
+ if manpage.endswith(extension):
+ manpage = manpage[:-len(extension)]
+ package_links.append("{} {}/{}".format(link, mandir, manpage))
+ else:
+ # This is a regular file, first decompress it
+ new_filename = "{}/{}/{}".format(distribution, mandir, manpage)
+ if manpage.endswith(".gz"):
+ new_filename = new_filename[:-3]
+ manpage = manpage[:-3]
+ new_file = open(new_filename, "w")
+ subprocess.run(["gzip", "-cd", manpage_path], stdout=new_file)
+ elif manpage.endswith(".bz2"):
+ new_filename = new_filename[:-4]
+ manpage = manpage[:-4]
+ new_file = open(new_filename, "w")
+ subprocess.run(["bzip2", "-cd", manpage_path], stdout=new_file)
+ elif manpage.endswith(".xz"):
+ new_filename = new_filename[:-3]
+ manpage = manpage[:-3]
+ new_file = open(new_filename, "w")
+ subprocess.run(["xz", "-cd", manpage_path], stdout=new_file)
+ else:
+ new_file = open(new_filename, "w")
+ subprocess.run(["cat", manpage_path], stdout=new_file)
+ new_file.close()
+
+ # Check if it contains a manpage link with .so
+ see_other = None
+ try:
+ with open(new_filename, "rt", encoding="UTF-8") as new_file:
+ for line in new_file:
+ see_other = re.search(r"^\.so.(.*)", line)
+ if see_other:
+ break
+ except UnicodeDecodeError:
+ with open(new_filename, "rt", encoding="ISO 8859-1") as new_file:
+ for line in new_file:
+ see_other = re.search(r"^\.so.(.*)", line)
+ if see_other:
+ break
+ if see_other:
+ link = see_other.group(1)
+ # Ensure that the link is always in the form
+ # of mandir/manpage
+ if (os.path.basename(os.path.dirname(link)).startswith("man")):
+ link = "{}/{}".format(os.path.basename(os.path.dirname(link)),
+ os.path.basename(link))
+ else:
+ link = "{}/{}".format(mandir, os.path.basename(link))
+ package_links.append("{} {}/{}".format(link, mandir, manpage))
+ os.remove(new_filename)
+
+
+ # Write all links of the package to a file
+ if len(package_links) > 0:
+ with open("{}/links.txt".format(workdir), "w") as links_file:
+ for link in package_links:
+ links_file.write(link + "\n")
+
+ # Reset the update flag
+ package_data[package]['needs_update'] = False
+ print("updated.")
+ else:
+ print("current.")
+
+
+# Save updated package information in a JSON file
+with open(json_filename, "w") as output_file:
+ output_file.write(json.dumps(package_data, sort_keys=True, indent=4))