summaryrefslogtreecommitdiff
path: root/release
diff options
context:
space:
mode:
authorRoger Shimizu <rosh@debian.org>2021-06-20 21:41:05 +0900
committerMike Frysinger <vapier@google.com>2021-07-16 20:11:41 +0000
commit0a1f533e2835c856473e3e4046341a4d2f66764b (patch)
tree0902c039b76525f1c6785cec561df46265fdb787 /release
parent927d29a8afa26a3f1aec841f2150c65e3931ef9b (diff)
downloadgit-repo-0a1f533e2835c856473e3e4046341a4d2f66764b.tar.gz
git-repo-0a1f533e2835c856473e3e4046341a4d2f66764b.zip
Add script 'release/update-manpages' to generate manpages
Debian package started to ship manpages for repo since 2.8 [1] And it's about for one year. So I think it should be upstreamed. The script depends on help2man, which is available in both debian [2] and ubuntu [3]. [1] https://tracker.debian.org/news/1150858/accepted-repo-28-1-source-into-unstable [2] https://tracker.debian.org/pkg/help2man [3] https://launchpad.net/ubuntu/+source/help2man Change-Id: Ide2b356d0944ebde34cc96c6d5a782655bd72288 Signed-off-by: Roger Shimizu <rosh@debian.org> Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/309782 Reviewed-by: Mike Frysinger <vapier@google.com>
Diffstat (limited to 'release')
-rwxr-xr-xrelease/update-manpages85
1 files changed, 85 insertions, 0 deletions
diff --git a/release/update-manpages b/release/update-manpages
new file mode 100755
index 000000000..3aeee206d
--- /dev/null
+++ b/release/update-manpages
@@ -0,0 +1,85 @@
+#!/usr/bin/env python3
+# Copyright (C) 2021 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Helper tool for generating manual page for all repo commands.
+
+This is intended to be run before every official Repo release.
+"""
+
+from pathlib import Path
+from functools import partial
+import argparse
+import multiprocessing
+import os
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+
+TOPDIR = Path(__file__).resolve().parent.parent
+MANDIR = TOPDIR.joinpath('man')
+
+# Load repo local modules.
+sys.path.insert(0, str(TOPDIR))
+from git_command import RepoSourceVersion
+import subcmds
+
+def worker(cmd, **kwargs):
+ subprocess.run(cmd, **kwargs)
+
+def main(argv):
+ parser = argparse.ArgumentParser(description=__doc__)
+ opts = parser.parse_args(argv)
+
+ if not shutil.which('help2man'):
+ sys.exit('Please install help2man to continue.')
+
+ # "repo branch" is an alias for "repo branches".
+ del subcmds.all_commands['branch']
+ (MANDIR / 'repo-branch.1').write_text('.so man1/repo-branches.1')
+
+ version = RepoSourceVersion()
+ cmdlist = [['help2man', '-N', '-n', f'repo {cmd} - manual page for repo {cmd}',
+ '-S', f'repo {cmd}', '-m', 'Repo Manual', f'--version-string={version}',
+ '-o', MANDIR.joinpath(f'repo-{cmd}.1'), TOPDIR.joinpath('repo'),
+ '-h', f'help {cmd}'] for cmd in subcmds.all_commands]
+ cmdlist.append(['help2man', '-N', '-n', 'repository management tool built on top of git',
+ '-S', 'repo', '-m', 'Repo Manual', f'--version-string={version}',
+ '-o', MANDIR.joinpath('repo.1'), TOPDIR.joinpath('repo'),
+ '-h', 'help --all'])
+
+ with tempfile.TemporaryDirectory() as tempdir:
+ repo_dir = Path(tempdir) / '.repo'
+ repo_dir.mkdir()
+ (repo_dir / 'repo').symlink_to(TOPDIR)
+
+ # Run all cmd in parallel, and wait for them to finish.
+ with multiprocessing.Pool() as pool:
+ pool.map(partial(worker, cwd=tempdir, check=True), cmdlist)
+
+ regex = (
+ (r'(It was generated by help2man) [0-9.]+', '\g<1>.'),
+ (r'^\.IP\n(.*:)\n', '.SS \g<1>\n'),
+ (r'^\.PP\nDescription', '.SH DETAILS'),
+ )
+ for path in MANDIR.glob('*.1'):
+ data = path.read_text()
+ for pattern, replacement in regex:
+ data = re.sub(pattern, replacement, data, flags=re.M)
+ path.write_text(data)
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))