From: Christian Heimes <christian@python.org>
Date: Thu, 23 Apr 2015 09:24:14 +0000 (+0200)
Subject: Issue #24031: make patchcheck now supports git checkouts, too.
X-Git-Tag: v3.5.0b1~298^2
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d98c6773fa380848b75d55e652b4d5f40ac4d785;p=python

Issue #24031: make patchcheck now supports git checkouts, too.
---

diff --git a/Misc/NEWS b/Misc/NEWS
index 24b515f1b2..3d2e09f1bd 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -225,6 +225,10 @@ Documentation
 
 - Issue #24029: Document the name binding behavior for submodule imports.
 
+Tools/Demos
+-----------
+
+- Issue #24031: make patchcheck now supports git checkouts, too.
 
 What's New in Python 3.4.3?
 ===========================
diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py
index 1b515201a8..58b081a9c5 100755
--- a/Tools/scripts/patchcheck.py
+++ b/Tools/scripts/patchcheck.py
@@ -49,15 +49,31 @@ def mq_patches_applied():
 @status("Getting the list of files that have been added/changed",
         info=lambda x: n_files_str(len(x)))
 def changed_files():
-    """Get the list of changed or added files from Mercurial."""
-    if not os.path.isdir(os.path.join(SRCDIR, '.hg')):
-        sys.exit('need a checkout to get modified files')
-
-    cmd = 'hg status --added --modified --no-status'
-    if mq_patches_applied():
-        cmd += ' --rev qparent'
-    with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st:
-        return [x.decode().rstrip() for x in st.stdout]
+    """Get the list of changed or added files from Mercurial or git."""
+    if os.path.isdir(os.path.join(SRCDIR, '.hg')):
+        cmd = 'hg status --added --modified --no-status'
+        if mq_patches_applied():
+            cmd += ' --rev qparent'
+        with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st:
+            return [x.decode().rstrip() for x in st.stdout]
+    elif os.path.isdir(os.path.join(SRCDIR, '.git')):
+        cmd = 'git status --porcelain'
+        filenames = []
+        with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st:
+            for line in st.stdout:
+                line = line.decode().rstrip()
+                status = set(line[:2])
+                # modified, added or unmerged files
+                if not status.intersection('MAU'):
+                    continue
+                filename = line[3:]
+                if ' -> ' in filename:
+                    # file is renamed
+                    filename = filename.split(' -> ', 2)[1].strip()
+                filenames.append(filename)
+        return filenames
+    else:
+        sys.exit('need a Mercurial or git checkout to get modified files')
 
 
 def report_modified_files(file_paths):