VCSUtils.pm doesn't support SVN 1.7 diff files
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 9 Oct 2012 20:36:23 +0000 (20:36 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 9 Oct 2012 20:36:23 +0000 (20:36 +0000)
<https://bugs.webkit.org/show_bug.cgi?id=80762>

Reviewed by Eric Seidel.

Implement support for the SVN 1.7 diff format.

* Scripts/VCSUtils.pm:
(parseChunkRange): Modified to support parsing an SVN 1.7 chunk range
that begins and ends with "##" (e.g. ## -0,0 +1,7 ##). For comparison,
earlier versions of SVN parsed chunk ranges of the form "@@ -0,0 +1,7 @@".

(parseSvnDiffHeader): Modified to parse an SVN 1.7 binary diff; SVN 1.7
has an unusual display format for a binary diff. It repeats the first
two lines of the diff header.

(parseSvnProperty): Modified to ignore both an SVN 1.7 chunk range and
lines of the form "\ No newline at end of property". SVN 1.7 emits the latter
message after a property value that doesn't end in a newline.

(parseSvnPropertyValue): Stop parsing an SVN property value when we encounter
a line of the form "\ No newline at end of property" (emitted by svn diff as of
SVN 1.7).

* Scripts/webkitperl/VCSUtils_unittest/parseChunkRange.pl:
  - Added the following unit tests:
  "Line count is 0"
  "New line count is 1"

* Scripts/webkitperl/VCSUtils_unittest/parseSvnDiffFooter.pl:
  - Added the following unit tests:
  "svn:executable followed by custom property using SVN 1.7 syntax"
  "svn:executable followed by custom property without newline using SVN 1.7 syntax"

* Scripts/webkitperl/VCSUtils_unittest/parseSvnDiffHeader.pl:
  - Updated test results for test "binary file".
  - Added unit test "binary file using SVN 1.7 syntax".

* Scripts/webkitperl/VCSUtils_unittest/parseSvnProperty.pl:
  - Added the following unit tests:
  "simple: add svn:executable using SVN 1.7 syntax"
  "simple: delete svn:executable using SVN 1.7 syntax"
  "add svn:mime-type and add svn:executable using SVN 1.7 syntax"

* Scripts/webkitperl/VCSUtils_unittest/parseSvnPropertyValue.pl:
  - Added the following unit tests:
  "singe-line '+' change using SVN 1.7 syntax"
  "single-line '-' change using SVN 1.7 syntax"

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@130805 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/Scripts/VCSUtils.pm
Tools/Scripts/webkitperl/VCSUtils_unittest/parseChunkRange.pl
Tools/Scripts/webkitperl/VCSUtils_unittest/parseSvnDiffFooter.pl
Tools/Scripts/webkitperl/VCSUtils_unittest/parseSvnDiffHeader.pl
Tools/Scripts/webkitperl/VCSUtils_unittest/parseSvnProperty.pl
Tools/Scripts/webkitperl/VCSUtils_unittest/parseSvnPropertyValue.pl

index 91701da..a6f8b76 100644 (file)
@@ -1,3 +1,54 @@
+2012-10-09  Daniel Bates  <dbates@webkit.org>
+
+        VCSUtils.pm doesn't support SVN 1.7 diff files
+        <https://bugs.webkit.org/show_bug.cgi?id=80762>
+
+        Reviewed by Eric Seidel.
+
+        Implement support for the SVN 1.7 diff format.
+
+        * Scripts/VCSUtils.pm:
+        (parseChunkRange): Modified to support parsing an SVN 1.7 chunk range
+        that begins and ends with "##" (e.g. ## -0,0 +1,7 ##). For comparison,
+        earlier versions of SVN parsed chunk ranges of the form "@@ -0,0 +1,7 @@".
+
+        (parseSvnDiffHeader): Modified to parse an SVN 1.7 binary diff; SVN 1.7
+        has an unusual display format for a binary diff. It repeats the first
+        two lines of the diff header.
+
+        (parseSvnProperty): Modified to ignore both an SVN 1.7 chunk range and
+        lines of the form "\ No newline at end of property". SVN 1.7 emits the latter
+        message after a property value that doesn't end in a newline.
+
+        (parseSvnPropertyValue): Stop parsing an SVN property value when we encounter
+        a line of the form "\ No newline at end of property" (emitted by svn diff as of
+        SVN 1.7).
+
+        * Scripts/webkitperl/VCSUtils_unittest/parseChunkRange.pl:
+          - Added the following unit tests:
+          "Line count is 0"
+          "New line count is 1"
+
+        * Scripts/webkitperl/VCSUtils_unittest/parseSvnDiffFooter.pl:
+          - Added the following unit tests:
+          "svn:executable followed by custom property using SVN 1.7 syntax"
+          "svn:executable followed by custom property without newline using SVN 1.7 syntax"
+
+        * Scripts/webkitperl/VCSUtils_unittest/parseSvnDiffHeader.pl:
+          - Updated test results for test "binary file".
+          - Added unit test "binary file using SVN 1.7 syntax".
+
+        * Scripts/webkitperl/VCSUtils_unittest/parseSvnProperty.pl:
+          - Added the following unit tests:
+          "simple: add svn:executable using SVN 1.7 syntax"
+          "simple: delete svn:executable using SVN 1.7 syntax"
+          "add svn:mime-type and add svn:executable using SVN 1.7 syntax"
+
+        * Scripts/webkitperl/VCSUtils_unittest/parseSvnPropertyValue.pl:
+          - Added the following unit tests:
+          "singe-line '+' change using SVN 1.7 syntax"
+          "single-line '-' change using SVN 1.7 syntax"
+
 2012-10-09  James Robinson  <jamesr@chromium.org>
 
         Unreviewed, rolling out r128488.
index 6bba774..b27e047 100644 (file)
@@ -1,6 +1,7 @@
 # Copyright (C) 2007, 2008, 2009 Apple Inc.  All rights reserved.
 # Copyright (C) 2009, 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
 # Copyright (C) 2010, 2011 Research In Motion Limited. All rights reserved.
+# Copyright (C) 2012 Daniel Bates (dbates@intudata.com)
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -108,7 +109,8 @@ my $gitDiffStartRegEx = qr#^diff --git (\w/)?(.+) (\w/)?([^\r\n]+)#;
 my $svnDiffStartRegEx = qr#^Index: ([^\r\n]+)#;
 my $svnPropertiesStartRegEx = qr#^Property changes on: ([^\r\n]+)#; # $1 is normally the same as the index path.
 my $svnPropertyStartRegEx = qr#^(Modified|Name|Added|Deleted): ([^\r\n]+)#; # $2 is the name of the property.
-my $svnPropertyValueStartRegEx = qr#^   (\+|-|Merged|Reverse-merged) ([^\r\n]+)#; # $2 is the start of the property's value (which may span multiple lines).
+my $svnPropertyValueStartRegEx = qr#^\s*(\+|-|Merged|Reverse-merged)\s*([^\r\n]+)#; # $2 is the start of the property's value (which may span multiple lines).
+my $svnPropertyValueNoNewlineRegEx = qr#\ No newline at end of property#;
 
 # This method is for portability. Return the system-appropriate exit
 # status of a child process.
@@ -539,6 +541,7 @@ sub firstEOLInFile($)
 #
 # Args:
 #   $line: the line to parse.
+#   $chunkSentinel: the sentinel that surrounds the chunk range information (defaults to "@@").
 #
 # Returns $chunkRangeHashRef
 #   $chunkRangeHashRef: a hash reference representing the parts of a chunk range, as follows--
@@ -546,10 +549,11 @@ sub firstEOLInFile($)
 #     lineCount: the line count in the original file.
 #     newStartingLine: the new starting line in the new file.
 #     newLineCount: the new line count in the new file.
-sub parseChunkRange($)
+sub parseChunkRange($;$)
 {
-    my ($line) = @_;
-    my $chunkRangeRegEx = qr#^\@\@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? \@\@#;
+    my ($line, $chunkSentinel) = @_;
+    $chunkSentinel = "@@" if !$chunkSentinel;
+    my $chunkRangeRegEx = qr#^\Q$chunkSentinel\E -(\d+)(,(\d+))? \+(\d+)(,(\d+))? \Q$chunkSentinel\E#;
     if ($line !~ /$chunkRangeRegEx/) {
         return;
     }
@@ -801,18 +805,33 @@ sub parseSvnDiffHeader($$)
                         "source revision number \"$sourceRevision\".") if ($2 != $sourceRevision);
                 }
             }
-        } elsif (s/^\+\+\+ [^\t\n\r]+/+++ $indexPath/) {
+        } elsif (s/^\+\+\+ [^\t\n\r]+/+++ $indexPath/ || $isBinary && /^$/) {
             $foundHeaderEnding = 1;
         } elsif (/^Cannot display: file marked as a binary type.$/) {
             $isBinary = 1;
-            $foundHeaderEnding = 1;
+            # SVN 1.7 has an unusual display format for a binary diff. It repeats the first
+            # two lines of the diff header. For example:
+            #     Index: test_file.swf
+            #     ===================================================================
+            #     Cannot display: file marked as a binary type.
+            #     svn:mime-type = application/octet-stream
+            #     Index: test_file.swf
+            #     ===================================================================
+            #     --- test_file.swf
+            #     +++ test_file.swf
+            #
+            #     ...
+            #     Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
+            # Therefore, we continue reading the diff header until we either encounter a line
+            # that begins with "+++" (SVN 1.7 or greater) or an empty line (SVN version less
+            # than 1.7).
         }
 
         $svnConvertedText .= "$_$eol"; # Also restore end-of-line characters.
 
         $_ = <$fileHandle>; # Not defined if end-of-file reached.
 
-        last if (!defined($_) || /$svnDiffStartRegEx/ || $foundHeaderEnding);
+        last if (!defined($_) || !$isBinary && /$svnDiffStartRegEx/ || $foundHeaderEnding);
     }
 
     if (!$foundHeaderEnding) {
@@ -1189,9 +1208,18 @@ sub parseSvnProperty($$)
 
     $_ = <$fileHandle>; # Not defined if end-of-file reached.
 
+    if (defined($_) && defined(parseChunkRange($_, "##"))) {
+        # FIXME: We should validate the chunk range line that is part of an SVN 1.7
+        #        property diff. For now, we ignore this line.
+        $_ = <$fileHandle>;
+    }
+
     # The "svn diff" command neither inserts newline characters between property values
     # nor between successive properties.
     #
+    # As of SVN 1.7, "svn diff" may insert "\ No newline at end of property" after a
+    # property value that doesn't end in a newline.
+    #
     # FIXME: We do not support property values that contain tailing newline characters
     #        as it is difficult to disambiguate these trailing newlines from the empty
     #        line that precedes the contents of a binary patch.
@@ -1207,6 +1235,7 @@ sub parseSvnProperty($$)
         #        add error checking to prevent '+', '+', ..., '+' and other invalid combinations.
         $propertyValueType = $1;
         ($propertyValue, $_) = parseSvnPropertyValue($fileHandle, $_);
+        $_ = <$fileHandle> if defined($_) && /$svnPropertyValueNoNewlineRegEx/;
     }
 
     if (!$propertyValue) {
@@ -1274,7 +1303,7 @@ sub parseSvnPropertyValue($$)
     }
 
     while (<$fileHandle>) {
-        if (/^[\r\n]+$/ || /$svnPropertyValueStartRegEx/ || /$svnPropertyStartRegEx/) {
+        if (/^[\r\n]+$/ || /$svnPropertyValueStartRegEx/ || /$svnPropertyStartRegEx/ || /$svnPropertyValueNoNewlineRegEx/) {
             # Note, we may encounter an empty line before the contents of a binary patch.
             # Also, we check for $svnPropertyValueStartRegEx because a '-' property may be
             # followed by a '+' property in the case of a "Modified" or "Name" property.
index cda5d28..caee50b 100644 (file)
@@ -2,6 +2,7 @@
 #
 # Copyright (C) 2011 Research In Motion Limited. All rights reserved.
 # Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
+# Copyright (C) 2012 Daniel Bates (dbates@intudata.com)
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -148,6 +149,35 @@ my @testCaseHashRefs = (
 ]
 },
 ###
+#  Simple SVN 1.7 property diff chunk range tests
+##
+{   # New test
+    testName => "Line count is 0",
+    inputText => "## -0,0 +1,4 ##",
+    chunkSentinel => "##",
+    expectedReturn => [
+{
+    startingLine => 0,
+    lineCount => 0,
+    newStartingLine => 1,
+    newLineCount => 4,
+}
+]
+},
+{   # New test
+    testName => "New line count is 1",
+    inputText => "## -0,0 +1 ##",
+    chunkSentinel => "##",
+    expectedReturn => [
+{
+    startingLine => 0,
+    lineCount => 0,
+    newStartingLine => 1,
+    newLineCount => 1,
+}
+]
+},
+###
 #  Chunk range followed by ending junk
 ##
 {   # New test
@@ -230,7 +260,7 @@ plan(tests => $testCasesCount);
 foreach my $testCase (@testCaseHashRefs) {
     my $testNameStart = "parseChunkRange(): $testCase->{testName}: comparing";
 
-    my @got = VCSUtils::parseChunkRange($testCase->{inputText});
+    my @got = VCSUtils::parseChunkRange($testCase->{inputText}, $testCase->{chunkSentinel});
     my $expectedReturn = $testCase->{expectedReturn};
 
     is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
index 4f05431..7c3d98c 100644 (file)
@@ -2,6 +2,7 @@
 #
 # Copyright (C) Research in Motion Limited 2010. All Rights Reserved.
 # Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
+# Copyright (C) 2012 Daniel Bates (dbates@intudata.com)
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -249,6 +250,51 @@ undef],
 },
 {
     # New test
+    diffName => "svn:executable followed by custom property using SVN 1.7 syntax",
+    inputText => <<'END',
+Property changes on: FileA
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Added: documentation
+## -0,0 +1 ##
++This is an example sentence.
+END
+    expectedReturn => [
+{
+    propertyPath => "FileA",
+    executableBitDelta => 1,
+},
+undef],
+    expectedNextLine => undef,
+},
+{
+    # New test
+    diffName => "svn:executable followed by custom property without newline using SVN 1.7 syntax",
+    inputText => <<'END',
+Property changes on: FileA
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Added: documentation
+## -0,0 +1 ##
++This is an example sentence.
+\ No newline at end of property
+END
+    expectedReturn => [
+{
+    propertyPath => "FileA",
+    executableBitDelta => 1,
+},
+undef],
+    expectedNextLine => undef,
+},
+{
+    # New test
     diffName => "custom property followed by svn:executable",
     inputText => <<'END',
 Property changes on: FileA
index 8df04bc..fc357c9 100644 (file)
@@ -1,6 +1,7 @@
 #!/usr/bin/perl -w
 #
 # Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
+# Copyright (C) 2012 Daniel Bates (dbates@intudata.com)
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -216,12 +217,54 @@ END
 Index: test_file.swf
 ===================================================================
 Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+
+END
+    indexPath => "test_file.swf",
+    isBinary => 1,
+},
+"Property changes on: test_file.swf\n"],
+    expectedNextLine => "___________________________________________________________________\n",
+},
+{
+    # New test
+    diffName => "binary file using SVN 1.7 syntax",
+    inputText => <<'END',
+Index: test_file.swf
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: test_file.swf
+===================================================================
+--- test_file.swf
++++ test_file.swf
+
+Property changes on: test_file.swf
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
+
+Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
+END
+    expectedReturn => [
+{
+    svnConvertedText => <<'END',
+Index: test_file.swf
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: test_file.swf
+===================================================================
+--- test_file.swf
++++ test_file.swf
 END
     indexPath => "test_file.swf",
     isBinary => 1,
 },
-"svn:mime-type = application/octet-stream\n"],
-    expectedNextLine => "\n",
+"\n"],
+    expectedNextLine => "Property changes on: test_file.swf\n",
 },
 );
 
index 6914051..a613bde 100644 (file)
@@ -2,6 +2,7 @@
 #
 # Copyright (C) Research in Motion Limited 2010. All Rights Reserved.
 # Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
+# Copyright (C) 2012 Daniel Bates (dbates@intudata.com)
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -175,6 +176,67 @@ undef],
     expectedNextLine => undef,
 },
 ####
+# Using SVN 1.7 syntax
+##
+{
+    # New test
+    diffName => "simple: add svn:executable using SVN 1.7 syntax",
+    inputText => <<'END',
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+END
+    expectedReturn => [
+{
+    name => "svn:executable",
+    propertyChangeDelta => 1,
+    value => "*",
+},
+undef],
+    expectedNextLine => undef,
+},
+{
+    # New test
+    diffName => "simple: delete svn:executable using SVN 1.7 syntax",
+    inputText => <<'END',
+Deleted: svn:executable
+## -1 +0,0 ##
+-*
+\ No newline at end of property
+END
+    expectedReturn => [
+{
+    name => "svn:executable",
+    propertyChangeDelta => -1,
+    value => "*",
+},
+undef],
+    expectedNextLine => undef,
+},
+{
+    # New test
+    diffName => "add svn:mime-type and add svn:executable using SVN 1.7 syntax",
+    inputText => <<'END',
+Added: svn:mime-type
+## -0,0 +1 ##
++image/png
+\ No newline at end of property
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+END
+    expectedReturn => [
+{
+    name => "svn:mime-type",
+    propertyChangeDelta => 1,
+    value => "image/png",
+},
+"Added: svn:executable\n"],
+    expectedNextLine => "## -0,0 +1 ##\n",
+},
+####
 # Property value followed by empty line and start of next diff
 ##
 {
index 2de8ae3..33da14a 100644 (file)
@@ -2,6 +2,7 @@
 #
 # Copyright (C) Research in Motion Limited 2010. All Rights Reserved.
 # Copyright (C) 2010 Chris Jerdonek (chris.jerdonek@gmail.com)
+# Copyright (C) 2012 Daniel Bates (dbates@intudata.com)
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are
@@ -211,6 +212,29 @@ END
     expectedReturn => ["/trunk/Makefile:r33020", "   Reverse-merged /trunk/Makefile.shared:r58350\n"],
     expectedNextLine => "   Merged /trunk/ChangeLog:r64190\n",
 },
+##
+# Using SVN 1.7 syntax
+##
+{
+    # New test
+    diffName => "singe-line '+' change using SVN 1.7 syntax",
+    inputText => <<'END',
++*
+\ No newline at end of property
+END
+    expectedReturn => ["*", "\\ No newline at end of property\n"],
+    expectedNextLine => undef,
+},
+{
+    # New test
+    diffName => "single-line '-' change using SVN 1.7 syntax",
+    inputText => <<'END',
+-*
+\ No newline at end of property
+END
+    expectedReturn => ["*", "\\ No newline at end of property\n"],
+    expectedNextLine => undef,
+},
 );
 
 my $testCasesCount = @testCaseHashRefs;