[Python-checkins] r61528 - in python/trunk: Makefile.pre.in Tools/scripts Tools/scripts/patchcheck.py Tools/scripts/reindent.py
brett.cannon
python-checkins at python.org
Tue Mar 18 18:25:14 CET 2008
Author: brett.cannon
Date: Tue Mar 18 18:25:13 2008
New Revision: 61528
Added:
python/trunk/Tools/scripts/patchcheck.py
Modified:
python/trunk/Makefile.pre.in
python/trunk/Tools/scripts/ (props changed)
python/trunk/Tools/scripts/reindent.py
Log:
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.
Modified: python/trunk/Makefile.pre.in
==============================================================================
--- python/trunk/Makefile.pre.in (original)
+++ python/trunk/Makefile.pre.in Tue Mar 18 18:25:13 2008
@@ -1140,6 +1140,10 @@
-o -name MANIFEST \
-o -print
+# Perform some verification checks on any modified files.
+check:
+ ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py
+
# Dependencies
Python/thread.o: @THREADHEADERS@
Added: python/trunk/Tools/scripts/patchcheck.py
==============================================================================
--- (empty file)
+++ python/trunk/Tools/scripts/patchcheck.py Tue Mar 18 18:25:13 2008
@@ -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
+
+ at 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
+
+ at 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)
+
+ at 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
+
+ at 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
+
+ at 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()
Modified: python/trunk/Tools/scripts/reindent.py
==============================================================================
--- python/trunk/Tools/scripts/reindent.py (original)
+++ python/trunk/Tools/scripts/reindent.py Tue Mar 18 18:25:13 2008
@@ -130,9 +130,11 @@
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.
More information about the Python-checkins
mailing list