1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- from __future__ import annotations
- import argparse
- import glob
- import os.path
- import re
- import subprocess
- import sys
- from typing import Sequence
- def main(argv: Sequence[str] | None = None) -> int:
- parser = argparse.ArgumentParser()
- parser.add_argument("action")
- parser.add_argument("version")
- parser.add_argument("--base-dir", default=".")
- args = parser.parse_args(argv)
- reg = re.compile(f"(?<=uses: {re.escape(args.action)}@).*$", re.M)
- filenames = [
- filename
- for yml_glob in (".github/workflows/*.yml", ".github/actions/*/*.yml")
- for filename in glob.glob(os.path.join(args.base_dir, yml_glob))
- ]
- changed = []
- for filename in filenames:
- with open(filename) as f:
- original_contents = f.read()
- contents = reg.sub(args.version, original_contents)
- if contents != original_contents:
- print(f"{filename} upgrading {args.action}...")
- changed.append(filename)
- with open(filename, "w") as f:
- f.write(contents)
- if changed:
- print("freezing...")
- return subprocess.call((sys.executable, "-m", "tools.pin_github_action", *changed))
- else:
- return 0
- if __name__ == "__main__":
- raise SystemExit(main())
|