blob: 68639bd9e70f1e4393aa4f31744c35abff04a1a7 [file] [log] [blame]
Anthony Sottile8f615292022-01-15 19:24:05 -05001from __future__ import annotations
2
Anthony Sottile9db0a742017-10-06 23:32:11 -07003import argparse
4import re
5import sys
Youngmin Koo1f8151a2020-11-17 02:33:47 +09006from typing import Pattern
Anthony Sottile030bfac2019-01-31 19:19:10 -08007from typing import Sequence
Anthony Sottile9db0a742017-10-06 23:32:11 -07008
9
Youngmin Koo1f8151a2020-11-17 02:33:47 +090010def _get_pattern(domain: str) -> Pattern[bytes]:
jack114247299182021-04-06 20:07:08 +020011 regex = (
12 rf'https://{domain}/[^/ ]+/[^/ ]+/blob/'
13 r'(?![a-fA-F0-9]{4,64}/)([^/. ]+)/[^# ]+#L\d+'
14 )
Youngmin Koo1f8151a2020-11-17 02:33:47 +090015 return re.compile(regex.encode())
Anthony Sottile9db0a742017-10-06 23:32:11 -070016
17
Anthony Sottile8f615292022-01-15 19:24:05 -050018def _check_filename(filename: str, patterns: list[Pattern[bytes]]) -> int:
Anthony Sottile9db0a742017-10-06 23:32:11 -070019 retv = 0
20 with open(filename, 'rb') as f:
21 for i, line in enumerate(f, 1):
Youngmin Koo1f8151a2020-11-17 02:33:47 +090022 for pattern in patterns:
23 if pattern.search(line):
24 sys.stdout.write(f'{filename}:{i}:')
25 sys.stdout.flush()
26 sys.stdout.buffer.write(line)
27 retv = 1
Anthony Sottile9db0a742017-10-06 23:32:11 -070028 return retv
29
30
Anthony Sottile8f615292022-01-15 19:24:05 -050031def main(argv: Sequence[str] | None = None) -> int:
Anthony Sottile9db0a742017-10-06 23:32:11 -070032 parser = argparse.ArgumentParser()
33 parser.add_argument('filenames', nargs='*')
Youngmin Koo1f8151a2020-11-17 02:33:47 +090034 parser.add_argument(
35 '--additional-github-domain',
36 dest='additional_github_domains',
37 action='append',
38 default=['github.com'],
39 )
Anthony Sottile9db0a742017-10-06 23:32:11 -070040 args = parser.parse_args(argv)
41
Youngmin Koo1f8151a2020-11-17 02:33:47 +090042 patterns = [
43 _get_pattern(domain)
44 for domain in args.additional_github_domains
45 ]
46
Anthony Sottile9db0a742017-10-06 23:32:11 -070047 retv = 0
Youngmin Koo1f8151a2020-11-17 02:33:47 +090048
Anthony Sottile9db0a742017-10-06 23:32:11 -070049 for filename in args.filenames:
Youngmin Koo1f8151a2020-11-17 02:33:47 +090050 retv |= _check_filename(filename, patterns)
Anthony Sottile9db0a742017-10-06 23:32:11 -070051
52 if retv:
53 print()
54 print('Non-permanent github link detected.')
55 print('On any page on github press [y] to load a permalink.')
56 return retv
57
58
59if __name__ == '__main__':
Anthony Sottile39ab2ed2021-10-23 13:23:50 -040060 raise SystemExit(main())