X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=check-shebang.py;h=0ea9ca0ff85736c90b3e783587b5e36fb32c9ba4;hb=refs%2Fheads%2Fmaster;hp=4408e3f6e4a46290aef2a94d958851dfb3858aeb;hpb=178671a149ba6373c38938215d0410ee83581b79;p=packages%2Frpm-build-tools.git diff --git a/check-shebang.py b/check-shebang.py index 4408e3f..0ea9ca0 100755 --- a/check-shebang.py +++ b/check-shebang.py @@ -3,6 +3,7 @@ # thisscript.py --buildroot=~/tmp/somepackage ~/rpm/BUILD/somepackage/ import argparse +import hashlib import io import os import re @@ -17,19 +18,33 @@ rep = { 'python2': [], 'python3': [], 'perl': [], + 'ruby': [], + 'bash': [], + 'awk': [], } skip_files = [".h", ".c", ".cc", ".gif", ".png", ".jpg", ".ko", ".gz", ".o"] +def hash(fname): + hash_alg = hashlib.sha256() + with open(fname, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hash_alg.update(chunk) + return hash_alg.hexdigest() + +rpm_build_root_files = [] if args.buildroot: print("%s: Caching `%s' files..." % (sys.argv[0], args.buildroot)) - rpm_build_root_files = [] for root, dirs, files in os.walk(args.buildroot): for name in files: fname, fext = os.path.splitext(name) if fext in skip_files: continue - rpm_build_root_files.append(fname) + fpath = os.path.join(root, name) + try: + rpm_build_root_files.append(hash(fpath)) + except FileNotFoundError: + pass print("%s: Caching done." % (sys.argv[0])) for root, dirs, files in os.walk(args.sourcedir): @@ -39,47 +54,55 @@ for root, dirs, files in os.walk(args.sourcedir): continue fpath = os.path.join(root, name) - with open(fpath, 'rt', encoding='utf-8', errors='replace') as f: - try: - fline = f.read(128) - f = io.StringIO(fline) - shebang = f.readline() - except UnicodeDecodeError as e: - print("%s: skipping file `%s': %s" % (sys.argv[0], fpath, e), file=sys.stderr) - continue - if re.compile(r'^#!/usr/bin/env python\s').match(shebang) \ - or re.compile(r'^#!/usr/bin/env python2\s').match(shebang) \ - or re.compile(r'^#!/usr/bin/python\s').match(shebang): - rep['python2'].append(fpath) - elif re.compile(r'^#!/usr/bin/env python3\s').match(shebang): - rep['python3'].append(fpath) - elif re.compile(r'^#!/usr/bin/env perl\s').match(shebang): - rep['perl'].append(fpath) + try: + with open(fpath, 'rt', encoding='utf-8', errors='replace') as f: + try: + fline = f.read(128) + f = io.StringIO(fline) + shebang = f.readline() + except UnicodeDecodeError as e: + print("%s: skipping file `%s': %s" % (sys.argv[0], fpath, e), file=sys.stderr) + continue + if re.compile(r'^#!\s*/usr/bin/env python\s').match(shebang) \ + or re.compile(r'^#!\s*/usr/bin/env\s+python2\s').match(shebang) \ + or re.compile(r'^#!\s*/usr/bin/python\s').match(shebang): + rep['python2'].append(fpath) + elif re.compile(r'^#!\s*/usr/bin/env\s+python3\s').match(shebang): + rep['python3'].append(fpath) + elif re.compile(r'^#!\s*/usr/bin/env\s+perl\s').match(shebang): + rep['perl'].append(fpath) + elif re.compile(r'^#!\s*/usr/bin/env\s+ruby\s').match(shebang): + rep['ruby'].append(fpath) + elif re.compile(r'^#!\s*/usr/bin/env\s+bash\s').match(shebang): + rep['bash'].append(fpath) + elif re.compile(r'^#!\s*/usr/bin/env\s+awk\s').match(shebang): + rep['awk'].append(fpath) + except FileNotFoundError: + pass -def gf(files): +def gf(cmd, files): newfiles = [] for f in files: - if not rpm_build_root_files or os.path.basename(f) in rpm_build_root_files: + if not rpm_build_root_files or hash(f) in rpm_build_root_files: newfiles.append(f) newfiles.sort() + if not newfiles: + return + print(cmd) for i in range(0, len(newfiles) - 1): - print("\t%s \\\n" % os.path.relpath(newfiles[i], start=args.sourcedir), end='') - print("\t%s\n" % os.path.relpath(newfiles[len(newfiles) - 1], start=args.sourcedir)) + print(" %s \\\n" % os.path.relpath(newfiles[i], start=args.sourcedir), end='') + print(" %s\n" % os.path.relpath(newfiles[len(newfiles) - 1], start=args.sourcedir)) print("\n# Copy from here:") print("# %s " % sys.argv[0], end='') if args.buildroot: - print("--root=%s " % args.buildroot, end='') + print("--buildroot=%s " % args.buildroot, end='') print("%s\n" % args.sourcedir) -if rep['python2']: - print("sed -i -e '1s,#!/usr/bin/env python2,%{__python},' -e '1s,#!/usr/bin/env python,%{__python},' -e '1s,#!/usr/bin/python,%{__python},' \\") - gf(rep['python2']) - -if rep['python3']: - print("sed -i -e '1s,#!/usr/bin/env python3,%{__python3},' \\") - gf(rep['python3']) - -if rep['perl']: - print("sed -i -e '1s,#!/usr/bin/env perl,%{__perl},' \\") - gf(rep['perl']) +gf("%{__sed} -E -i -e '1s,#!\s*/usr/bin/env\s+python2(\s|$),#!%{__python}\\1,' -e '1s,#!\s*/usr/bin/env\s+python(\s|$),#!%{__python}\\1,' -e '1s,#!\s*/usr/bin/python(\s|$),#!%{__python}\\1,' \\", + rep['python2']) +gf("%{__sed} -E -i -e '1s,#!\s*/usr/bin/env\s+python3(\s|$),#!%{__python3}\\1,' \\", rep['python3']) +gf("%{__sed} -E -i -e '1s,#!\s*/usr/bin/env\s+perl(\s|$),#!%{__perl}\\1,' \\", rep['perl']) +gf("%{__sed} -E -i -e '1s,#!\s*/usr/bin/env\s+ruby(\s|$),#!%{__ruby}\\1,' \\", rep['ruby']) +gf("%{__sed} -E -i -e '1s,#!\s*/usr/bin/env\s+bash(\s|$),#!/bin/bash\\1,' \\", rep['bash']) +gf("%{__sed} -E -i -e '1s,#!\s*/usr/bin/env\s+awk(\s|$),#!/bin/awk\\1,' \\", rep['awk'])