Title: [140775] trunk/Tools
Revision
140775
Author
[email protected]
Date
2013-01-24 21:06:31 -0800 (Thu, 24 Jan 2013)

Log Message

Fixing the diff_parser to correctly identify git diffs even with leading comments.
https://bugs.webkit.org/show_bug.cgi?id=107871

Patch by Tim 'mithro' Ansell <[email protected]> on 2013-01-24
Reviewed by Eric Seidel.

* Scripts/webkitpy/common/checkout/diff_parser.py:
* Scripts/webkitpy/common/checkout/diff_parser_unittest.py:
* Scripts/webkitpy/tool/steps/haslanded.py:

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (140774 => 140775)


--- trunk/Tools/ChangeLog	2013-01-25 04:57:00 UTC (rev 140774)
+++ trunk/Tools/ChangeLog	2013-01-25 05:06:31 UTC (rev 140775)
@@ -1,3 +1,14 @@
+2013-01-24  Tim 'mithro' Ansell  <[email protected]>
+
+        Fixing the diff_parser to correctly identify git diffs even with leading comments.
+        https://bugs.webkit.org/show_bug.cgi?id=107871
+
+        Reviewed by Eric Seidel.
+
+        * Scripts/webkitpy/common/checkout/diff_parser.py:
+        * Scripts/webkitpy/common/checkout/diff_parser_unittest.py:
+        * Scripts/webkitpy/tool/steps/haslanded.py:
+
 2013-01-24  James Robinson  <[email protected]>
 
         [chromium] Remove dead transitional code from WebViewImpl

Modified: trunk/Tools/Scripts/webkitpy/common/checkout/diff_parser.py (140774 => 140775)


--- trunk/Tools/Scripts/webkitpy/common/checkout/diff_parser.py	2013-01-25 04:57:00 UTC (rev 140774)
+++ trunk/Tools/Scripts/webkitpy/common/checkout/diff_parser.py	2013-01-25 05:06:31 UTC (rev 140775)
@@ -69,20 +69,28 @@
     return line
 
 
+# This function exists so we can unittest get_diff_converter function
+def svn_diff_to_svn_diff(line):
+    return line
+
+
 # FIXME: This method belongs on DiffParser
-def get_diff_converter(first_diff_line):
+def get_diff_converter(lines):
     """Gets a converter function of diff lines.
 
     Args:
-      first_diff_line: The first filename line of a diff file.
-                       If this line is git formatted, we'll return a
-                       converter from git to SVN.
+      lines: The lines of a diff file.
+             If this line is git formatted, we'll return a
+             converter from git to SVN.
     """
-    if match(r"^diff --git \w/", first_diff_line):
-        return git_diff_to_svn_diff
-    return lambda input: input
+    for i, line in enumerate(lines[:-1]):
+        # Stop when we find the first patch
+        if line[:3] == "+++" and lines[i + 1] == "---":
+            break
+        if match(r"^diff --git \w/", line):
+            return git_diff_to_svn_diff
+    return svn_diff_to_svn_diff
 
-
 _INITIAL_STATE = 1
 _DECLARED_FILE_PATH = 2
 _PROCESSING_CHUNK = 3
@@ -142,10 +150,9 @@
         current_file = None
         old_diff_line = None
         new_diff_line = None
+        transform_line = get_diff_converter(diff_input)
         for line in diff_input:
             line = line.rstrip("\n")
-            if state == _INITIAL_STATE:
-                transform_line = get_diff_converter(line)
             line = transform_line(line)
 
             file_declaration = match(r"^Index: (?P<FilePath>.+)", line)

Modified: trunk/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py (140774 => 140775)


--- trunk/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py	2013-01-25 04:57:00 UTC (rev 140774)
+++ trunk/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py	2013-01-25 05:06:31 UTC (rev 140775)
@@ -78,6 +78,42 @@
         self.assertEqual(1, len(diff.lines))
         self.assertEqual((0, 1), diff.lines[0][0:2])
 
+    def test_diff_converter(self):
+        comment_lines = [
+            "Hey guys,\n",
+            "\n",
+            "See my awesome patch below!\n",
+            "\n",
+            " - Cool Hacker\n",
+            "\n",
+            ]
+
+        revision_lines = [
+            "Subversion Revision 289799\n",
+            ]
+
+        svn_diff_lines = [
+            "Index: Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "===================================================================\n",
+            "--- Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "+++ Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "@@ -59,6 +59,7 @@ def git_diff_to_svn_diff(line):\n",
+            ]
+        self.assertEqual(diff_parser.get_diff_converter(svn_diff_lines), diff_parser.svn_diff_to_svn_diff)
+        self.assertEqual(diff_parser.get_diff_converter(comment_lines + svn_diff_lines), diff_parser.svn_diff_to_svn_diff)
+        self.assertEqual(diff_parser.get_diff_converter(revision_lines + svn_diff_lines), diff_parser.svn_diff_to_svn_diff)
+
+        git_diff_lines = [
+            "diff --git a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "index 3c5b45b..0197ead 100644\n",
+            "--- a/Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "+++ b/Tools/Scripts/webkitpy/common/checkout/diff_parser.py\n",
+            "@@ -59,6 +59,7 @@ def git_diff_to_svn_diff(line):\n",
+            ]
+        self.assertEqual(diff_parser.get_diff_converter(git_diff_lines), diff_parser.git_diff_to_svn_diff)
+        self.assertEqual(diff_parser.get_diff_converter(comment_lines + git_diff_lines), diff_parser.git_diff_to_svn_diff)
+        self.assertEqual(diff_parser.get_diff_converter(revision_lines + git_diff_lines), diff_parser.git_diff_to_svn_diff)
+
     def test_git_mnemonicprefix(self):
         p = re.compile(r' ([a|b])/')
 

Modified: trunk/Tools/Scripts/webkitpy/tool/steps/haslanded.py (140774 => 140775)


--- trunk/Tools/Scripts/webkitpy/tool/steps/haslanded.py	2013-01-25 04:57:00 UTC (rev 140774)
+++ trunk/Tools/Scripts/webkitpy/tool/steps/haslanded.py	2013-01-25 05:06:31 UTC (rev 140775)
@@ -46,7 +46,7 @@
     @classmethod
     def convert_to_svn(cls, diff):
         lines = StringIO.StringIO(diff).readlines()
-        convert = diff_parser.get_diff_converter(lines[0])
+        convert = diff_parser.get_diff_converter(lines)
         return "".join(convert(x) for x in lines)
 
     @classmethod
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to