diff options
author | Brett Cannon <bcannon@gmail.com> | 2008-03-18 17:25:13 (GMT) |
---|---|---|
committer | Brett Cannon <bcannon@gmail.com> | 2008-03-18 17:25:13 (GMT) |
commit | a8b09fd4c33572a204a80c81e5755cc6d164805d (patch) | |
tree | 2175d5bca3bdc993c63a958831131bef4160f8de /Tools | |
parent | 493894c3e0abb9ec32f51f9c0630ddeee8a06719 (diff) | |
download | cpython-a8b09fd4c33572a204a80c81e5755cc6d164805d.zip cpython-a8b09fd4c33572a204a80c81e5755cc6d164805d.tar.gz cpython-a8b09fd4c33572a204a80c81e5755cc6d164805d.tar.bz2 |
Add Tools/scripts/patchcheck.py. Invoked from ``make check``, the script does
some verification:
- Runs reindent.py on all .py files.
- Checks if any changes in Doc exist.
- Whether Misc/ACKS was changed.
- Whether Misc/NEWS was changed.
The hope is that ``make check`` can become a command anybody can run to get
reminders about what all the requisite steps needed to create a proper
patch/checkin.
Diffstat (limited to 'Tools')
-rw-r--r-- | Tools/scripts/patchcheck.py | 90 | ||||
-rwxr-xr-x | Tools/scripts/reindent.py | 2 |
2 files changed, 92 insertions, 0 deletions
diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py new file mode 100644 index 0000000..cc177e7 --- /dev/null +++ b/Tools/scripts/patchcheck.py @@ -0,0 +1,90 @@ +import os.path +import subprocess +import sys + +import reindent + + +def status(message, modal=False, info=None): + """Decorator to output status info to stdout.""" + def decorated_fxn(fxn): + def call_fxn(*args, **kwargs): + sys.stdout.write(message + ' ... ') + sys.stdout.flush() + result = fxn(*args, **kwargs) + if not modal and not info: + print "done" + elif info: + print info(result) + else: + if result: + print "yes" + else: + print "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)) +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) +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) + +@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 + +@status("Misc/ACKS updated", modal=True) +def credit_given(file_paths): + """Check if Misc/ACKS has been changed.""" + return True if 'Misc/ACKS' in file_paths else False + +@status("Misc/NEWS updated", modal=True) +def reported_news(file_paths): + """Check if Misc/NEWS has been changed.""" + return True if 'Misc/NEWS' in file_paths else False + + +def main(): + file_paths = changed_files() + # PEP 7/8 verification. + normalize_whitespace(file_paths) + # Docs updated. + docs_modified(file_paths) + # Misc/ACKS changed. + credit_given(file_paths) + # Misc/NEWS changed. + reported_news(file_paths) + + # Test suite run and passed. + print + print "Did you run the test suite?" + + +if __name__ == '__main__': + main() diff --git a/Tools/scripts/reindent.py b/Tools/scripts/reindent.py index 0805ef7..65749f0 100755 --- a/Tools/scripts/reindent.py +++ b/Tools/scripts/reindent.py @@ -130,9 +130,11 @@ def check(file): f.close() if verbose: print "wrote new", file + return True else: if verbose: print "unchanged." + return False def _rstrip(line, JUNK='\n \t'): """Return line stripped of trailing spaces, tabs, newlines. |