diff options
author | Georg Brandl <georg@python.org> | 2010-10-21 12:49:28 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2010-10-21 12:49:28 (GMT) |
commit | a9afb68789cdc2d8d3262afc2ffa209b5d8e224a (patch) | |
tree | f96d010bac97f838068291b4c0ef1f3de9bb0e50 | |
parent | 50de5f56a9eba0e0da6fb48c22b85ee69daac105 (diff) | |
download | cpython-a9afb68789cdc2d8d3262afc2ffa209b5d8e224a.zip cpython-a9afb68789cdc2d8d3262afc2ffa209b5d8e224a.tar.gz cpython-a9afb68789cdc2d8d3262afc2ffa209b5d8e224a.tar.bz2 |
#9095, #8912, #8999: add support in patchcheck for Mercurial checkouts, C file reindenting, and docs whitespace fixing.
-rw-r--r-- | Tools/scripts/patchcheck.py | 75 | ||||
-rwxr-xr-x | Tools/scripts/reindent-rst.py | 21 | ||||
-rwxr-xr-x | Tools/scripts/untabify.py | 5 |
3 files changed, 68 insertions, 33 deletions
diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py index 1e2002f..caffc9d 100644 --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -1,8 +1,11 @@ +import re +import sys +import shutil import os.path import subprocess -import sys import reindent +import untabify def n_files_str(count): @@ -29,17 +32,26 @@ def status(message, modal=False, info=None): @status("Getting the list of files that have been added/changed", - info=lambda x: n_files_str(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 = (x.decode().rstrip().rsplit(None, 1)[-1] - for x in svn_st.stdout if x[0] in b'AM') - return set(path for path in output if os.path.isfile(path)) + """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) + 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 b'AM') + return set(path for path in output if os.path.isfile(path)) def report_modified_files(file_paths): @@ -64,6 +76,39 @@ def normalize_whitespace(file_paths): 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 file in the Doc directory has been changed.""" @@ -86,12 +131,16 @@ def main(): file_paths = changed_files() 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'))] - docs = [fn for fn in file_paths if fn.startswith('Doc')] + 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(docs) + docs_modified(doc_files) # Misc/ACKS changed. credit_given(special_files) # Misc/NEWS changed. diff --git a/Tools/scripts/reindent-rst.py b/Tools/scripts/reindent-rst.py index a19406f..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. +import sys -import sys, re, shutil - -ws_re = re.compile(br'\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(br'\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 as 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 1ad589c..ef63c41 100755 --- a/Tools/scripts/untabify.py +++ b/Tools/scripts/untabify.py @@ -25,7 +25,7 @@ def main(): process(filename, tabsize) -def process(filename, tabsize): +def process(filename, tabsize, verbose=True): try: with open(filename) as f: text = f.read() @@ -46,7 +46,8 @@ def process(filename, tabsize): pass with open(filename, "w") as f: f.write(newtext) - print(filename) + if verbose: + print(filename) if __name__ == '__main__': |