diff options
author | Georg Brandl <georg@python.org> | 2010-11-26 08:04:57 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2010-11-26 08:04:57 (GMT) |
commit | ef212e0a51707c3ae44a757f7607297150d74154 (patch) | |
tree | 5d50f72d4c1342f70651a8949b84a9a995ae7c33 /Tools/scripts | |
parent | 837fbb0d9a2e2b4ecc828100eef08bf17ac2b61f (diff) | |
download | cpython-ef212e0a51707c3ae44a757f7607297150d74154.zip cpython-ef212e0a51707c3ae44a757f7607297150d74154.tar.gz cpython-ef212e0a51707c3ae44a757f7607297150d74154.tar.bz2 |
Merged revisions 85766-85767 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r85766 | georg.brandl | 2010-10-21 09:40:03 +0200 (Do, 21 Okt 2010) | 1 line
#10159: sort completion matches before comparing to dir() result.
........
r85767 | georg.brandl | 2010-10-21 14:49:28 +0200 (Do, 21 Okt 2010) | 1 line
#9095, #8912, #8999: add support in patchcheck for Mercurial checkouts, C file reindenting, and docs whitespace fixing.
........
Diffstat (limited to 'Tools/scripts')
-rw-r--r-- | Tools/scripts/patchcheck.py | 138 | ||||
-rwxr-xr-x | Tools/scripts/reindent-rst.py | 21 | ||||
-rwxr-xr-x | Tools/scripts/untabify.py | 10 |
3 files changed, 111 insertions, 58 deletions
diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py index e194c98..bc8bc79 100644 --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -1,8 +1,16 @@ +import re +import sys +import shutil import os.path import subprocess -import sys import reindent +import untabify + + +def n_files_str(count): + """Return 'N file(s)' with the proper plurality on 'file'.""" + return "{} file{}".format(count, "s" if count != 1 else "") def status(message, modal=False, info=None): @@ -17,53 +25,105 @@ def status(message, modal=False, info=None): elif info: print info(result) else: - if result: - print "yes" - else: - print "NO" + print "yes" if result else "NO" return result return call_fxn return decorated_fxn + @status("Getting the list of files that have been added/changed", - info=lambda x: "%s files" % len(x)) + info=lambda x: n_files_str(len(x))) def changed_files(): - """Run ``svn status`` and return a set of files that have been - changed/added.""" - cmd = 'svn status --quiet --non-interactive --ignore-externals' - svn_st = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) - svn_st.wait() - output = [line.strip() for line in svn_st.stdout.readlines()] - files = set() - for line in output: - if not line[0] in ('A', 'M'): - continue - line_parts = line.split() - path = line_parts[-1] - if os.path.isfile(path): - files.add(path) - return files - -@status("Fixing whitespace", info=lambda x: "%s files" % x) + """Get the list of changed or added files from the VCS.""" + if os.path.isdir('.hg'): + vcs = 'hg' + cmd = 'hg status --added --modified --no-status' + elif os.path.isdir('.svn'): + vcs = 'svn' + cmd = 'svn status --quiet --non-interactive --ignore-externals' + else: + sys.exit('need a checkout to get modified files') + + st = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) + try: + st.wait() + if vcs == 'hg': + return [x.decode().rstrip() for x in st.stdout] + else: + output = (x.decode().rstrip().rsplit(None, 1)[-1] + for x in st.stdout if x[0] in 'AM') + return set(path for path in output if os.path.isfile(path)) + finally: + st.stdout.close() + + +def report_modified_files(file_paths): + count = len(file_paths) + if count == 0: + return n_files_str(count) + else: + lines = ["{}:".format(n_files_str(count))] + for path in file_paths: + lines.append(" {}".format(path)) + return "\n".join(lines) + + +@status("Fixing whitespace", info=report_modified_files) def normalize_whitespace(file_paths): """Make sure that the whitespace for .py files have been normalized.""" reindent.makebackup = False # No need to create backups. - result = map(reindent.check, (x for x in file_paths if x.endswith('.py'))) - return sum(result) + fixed = [] + for path in (x for x in file_paths if x.endswith('.py')): + if reindent.check(path): + fixed.append(path) + return fixed + + +@status("Fixing C file whitespace", info=report_modified_files) +def normalize_c_whitespace(file_paths): + """Report if any C files """ + fixed = [] + for path in file_paths: + with open(path, 'r') as f: + if '\t' not in f.read(): + continue + untabify.process(path, 8, verbose=False) + fixed.append(path) + return fixed + + +ws_re = re.compile(br'\s+(\r?\n)$') + +@status("Fixing docs whitespace", info=report_modified_files) +def normalize_docs_whitespace(file_paths): + fixed = [] + for path in file_paths: + try: + with open(path, 'rb') as f: + lines = f.readlines() + new_lines = [ws_re.sub(br'\1', line) for line in lines] + if new_lines != lines: + shutil.copyfile(path, path + '.bak') + with open(path, 'wb') as f: + f.writelines(new_lines) + fixed.append(path) + except Exception as err: + print 'Cannot fix %s: %s' % (path, err) + return fixed + @status("Docs modified", modal=True) def docs_modified(file_paths): - """Report if any files in the Docs directory.""" - for path in file_paths: - if path.startswith("Doc"): - return True - return False + """Report if any file in the Doc directory has been changed.""" + return bool(file_paths) + @status("Misc/ACKS updated", modal=True) def credit_given(file_paths): """Check if Misc/ACKS has been changed.""" return 'Misc/ACKS' in file_paths + @status("Misc/NEWS updated", modal=True) def reported_news(file_paths): """Check if Misc/NEWS has been changed.""" @@ -72,14 +132,22 @@ def reported_news(file_paths): def main(): file_paths = changed_files() - # PEP 7/8 verification. - normalize_whitespace(file_paths) + python_files = [fn for fn in file_paths if fn.endswith('.py')] + c_files = [fn for fn in file_paths if fn.endswith(('.c', '.h'))] + doc_files = [fn for fn in file_paths if fn.startswith('Doc')] + special_files = {'Misc/ACKS', 'Misc/NEWS'} & set(file_paths) + # PEP 8 whitespace rules enforcement. + normalize_whitespace(python_files) + # C rules enforcement. + normalize_c_whitespace(c_files) + # Doc whitespace enforcement. + normalize_docs_whitespace(doc_files) # Docs updated. - docs_modified(file_paths) + docs_modified(doc_files) # Misc/ACKS changed. - credit_given(file_paths) + credit_given(special_files) # Misc/NEWS changed. - reported_news(file_paths) + reported_news(special_files) # Test suite run and passed. print diff --git a/Tools/scripts/reindent-rst.py b/Tools/scripts/reindent-rst.py index bf431d9..ceb84bf 100755 --- a/Tools/scripts/reindent-rst.py +++ b/Tools/scripts/reindent-rst.py @@ -3,27 +3,12 @@ # Make a reST file compliant to our pre-commit hook. # Currently just remove trailing whitespace. -from __future__ import with_statement -import sys, re, shutil +import sys -ws_re = re.compile(r'\s+(\r?\n)$') +import patchcheck def main(argv=sys.argv): - rv = 0 - for filename in argv[1:]: - try: - with open(filename, 'rb') as f: - lines = f.readlines() - new_lines = [ws_re.sub(r'\1', line) for line in lines] - if new_lines != lines: - print 'Fixing %s...' % filename - shutil.copyfile(filename, filename + '.bak') - with open(filename, 'wb') as f: - f.writelines(new_lines) - except Exception, err: - print 'Cannot fix %s: %s' % (filename, err) - rv = 1 - return rv + patchcheck.normalize_docs_whitespace(argv[1:]) if __name__ == '__main__': sys.exit(main()) diff --git a/Tools/scripts/untabify.py b/Tools/scripts/untabify.py index 9bdf235..83e73da 100755 --- a/Tools/scripts/untabify.py +++ b/Tools/scripts/untabify.py @@ -23,7 +23,7 @@ def main(): for filename in args: process(filename, tabsize) -def process(filename, tabsize): +def process(filename, tabsize, verbose=True): try: f = open(filename) text = f.read() @@ -43,10 +43,10 @@ def process(filename, tabsize): os.rename(filename, backup) except os.error: pass - f = open(filename, "w") - f.write(newtext) - f.close() - print filename + with open(filename, "w") as f: + f.write(newtext) + if verbose: + print filename if __name__ == '__main__': main() |