diff options
author | Mike Frysinger <vapier@google.com> | 2025-04-22 14:10:52 -0400 |
---|---|---|
committer | LUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2025-04-28 10:24:33 -0700 |
commit | 21cbcc54e99db175619959a5b185bbb4d9b81d5a (patch) | |
tree | f348d94fcfd29514a2ecdb1e50a3e4ff3e539e8f | |
parent | 0f200bb3a1dedafdc435a86f0308f22469b4e404 (diff) | |
download | git-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.py | 35 | ||||
-rwxr-xr-x | run_tests | 15 |
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 | |||
27 | import subprocess | 27 | import subprocess |
28 | import sys | 28 | import sys |
29 | import tempfile | 29 | import tempfile |
30 | from typing import List | ||
30 | 31 | ||
31 | 32 | ||
32 | TOPDIR = Path(__file__).resolve().parent.parent | 33 | THIS_FILE = Path(__file__).resolve() |
34 | TOPDIR = THIS_FILE.parent.parent | ||
33 | MANDIR = TOPDIR.joinpath("man") | 35 | MANDIR = 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 | ||
45 | def main(argv): | 47 | def 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 | |||
61 | def 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 | ||
139 | def replace_regex(data): | 166 | def replace_regex(data): |
@@ -17,6 +17,7 @@ | |||
17 | 17 | ||
18 | import functools | 18 | import functools |
19 | import os | 19 | import os |
20 | import shutil | ||
20 | import subprocess | 21 | import subprocess |
21 | import sys | 22 | import sys |
22 | from typing import List | 23 | from typing import List |
@@ -101,6 +102,19 @@ def run_isort(): | |||
101 | ).returncode | 102 | ).returncode |
102 | 103 | ||
103 | 104 | ||
105 | def 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 | |||
104 | def main(argv): | 118 | def 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. |