summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2025-04-22 14:10:52 -0400
committerLUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com>2025-04-28 10:24:33 -0700
commit21cbcc54e99db175619959a5b185bbb4d9b81d5a (patch)
treef348d94fcfd29514a2ecdb1e50a3e4ff3e539e8f
parent0f200bb3a1dedafdc435a86f0308f22469b4e404 (diff)
downloadgit-repo-21cbcc54e99db175619959a5b185bbb4d9b81d5a.tar.gz
update-manpages: include in unittests
People often forget to regen when making interface changes. We skip the test if help2man isn't installed since it's not common, and it's not available on our CI bots currently. Change-Id: Ib4911a0e3fa1294ad90e4ac8afc047a0b7c2b66d Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/469741 Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Mike Frysinger <vapier@google.com>
-rw-r--r--release/update_manpages.py35
-rwxr-xr-xrun_tests15
2 files changed, 46 insertions, 4 deletions
diff --git a/release/update_manpages.py b/release/update_manpages.py
index 489de357..9ada83ff 100644
--- a/release/update_manpages.py
+++ b/release/update_manpages.py
@@ -27,9 +27,11 @@ import shutil
27import subprocess 27import subprocess
28import sys 28import sys
29import tempfile 29import tempfile
30from typing import List
30 31
31 32
32TOPDIR = Path(__file__).resolve().parent.parent 33THIS_FILE = Path(__file__).resolve()
34TOPDIR = THIS_FILE.parent.parent
33MANDIR = TOPDIR.joinpath("man") 35MANDIR = TOPDIR.joinpath("man")
34 36
35# Load repo local modules. 37# Load repo local modules.
@@ -42,9 +44,23 @@ def worker(cmd, **kwargs):
42 subprocess.run(cmd, **kwargs) 44 subprocess.run(cmd, **kwargs)
43 45
44 46
45def main(argv): 47def get_parser() -> argparse.ArgumentParser:
48 """Get argument parser."""
46 parser = argparse.ArgumentParser(description=__doc__) 49 parser = argparse.ArgumentParser(description=__doc__)
47 parser.parse_args(argv) 50 parser.add_argument(
51 "-n",
52 "--check",
53 "--dry-run",
54 action="store_const",
55 const=True,
56 help="Check if changes are necessary; don't actually change files",
57 )
58 return parser
59
60
61def main(argv: List[str]) -> int:
62 parser = get_parser()
63 opts = parser.parse_args(argv)
48 64
49 if not shutil.which("help2man"): 65 if not shutil.which("help2man"):
50 sys.exit("Please install help2man to continue.") 66 sys.exit("Please install help2man to continue.")
@@ -117,6 +133,7 @@ def main(argv):
117 functools.partial(worker, cwd=tempdir, check=True), cmdlist 133 functools.partial(worker, cwd=tempdir, check=True), cmdlist
118 ) 134 )
119 135
136 ret = 0
120 for tmp_path in MANDIR.glob("*.1.tmp"): 137 for tmp_path in MANDIR.glob("*.1.tmp"):
121 path = tmp_path.parent / tmp_path.stem 138 path = tmp_path.parent / tmp_path.stem
122 old_data = path.read_text() if path.exists() else "" 139 old_data = path.read_text() if path.exists() else ""
@@ -133,7 +150,17 @@ def main(argv):
133 ) 150 )
134 new_data = re.sub(r'^(\.TH REPO "1" ")([^"]+)', r"\1", data, flags=re.M) 151 new_data = re.sub(r'^(\.TH REPO "1" ")([^"]+)', r"\1", data, flags=re.M)
135 if old_data != new_data: 152 if old_data != new_data:
136 path.write_text(data) 153 if opts.check:
154 ret = 1
155 print(
156 f"{THIS_FILE.name}: {path.name}: "
157 "man page needs regenerating",
158 file=sys.stderr,
159 )
160 else:
161 path.write_text(data)
162
163 return ret
137 164
138 165
139def replace_regex(data): 166def replace_regex(data):
diff --git a/run_tests b/run_tests
index d64cc700..ea34e675 100755
--- a/run_tests
+++ b/run_tests
@@ -17,6 +17,7 @@
17 17
18import functools 18import functools
19import os 19import os
20import shutil
20import subprocess 21import subprocess
21import sys 22import sys
22from typing import List 23from typing import List
@@ -101,6 +102,19 @@ def run_isort():
101 ).returncode 102 ).returncode
102 103
103 104
105def run_update_manpages() -> int:
106 """Returns the exit code from release/update-manpages."""
107 if not shutil.which("help2mafn"):
108 print("update-manpages: help2man not found; skipping test")
109 return 0
110
111 return subprocess.run(
112 [sys.executable, "release/update-manpages", "--check"],
113 check=False,
114 cwd=ROOT_DIR,
115 ).returncode
116
117
104def main(argv): 118def main(argv):
105 """The main entry.""" 119 """The main entry."""
106 checks = ( 120 checks = (
@@ -109,6 +123,7 @@ def main(argv):
109 run_black, 123 run_black,
110 run_flake8, 124 run_flake8,
111 run_isort, 125 run_isort,
126 run_update_manpages,
112 ) 127 )
113 # Run all the tests all the time to get full feedback. Don't exit on the 128 # Run all the tests all the time to get full feedback. Don't exit on the
114 # first error as that makes it more difficult to iterate in the CQ. 129 # first error as that makes it more difficult to iterate in the CQ.