[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