Modified: trunk/Tools/Scripts/VCSUtils.pm (191366 => 191367)
--- trunk/Tools/Scripts/VCSUtils.pm 2015-10-21 01:10:32 UTC (rev 191366)
+++ trunk/Tools/Scripts/VCSUtils.pm 2015-10-21 01:41:52 UTC (rev 191367)
@@ -2039,8 +2039,8 @@
# Then, content of the chunk comes. To decode the content, we
# need decode it with base85 first, and then zlib.
my $gitPatchRegExp = '(literal|delta) ([0-9]+)\n([A-Za-z0-9!#$%&()*+-;<=>?@^_`{|}~\\n]*?)\n\n';
- if ($contents !~ m"\nGIT binary patch\n$gitPatchRegExp$gitPatchRegExp\Z") {
- die "$fullPath: unknown git binary patch format"
+ if ($contents !~ m"\nGIT binary patch\n$gitPatchRegExp$gitPatchRegExp(\Z|-- \n)") {
+ return ();
}
my $binaryChunkType = $1;
Modified: trunk/Tools/Scripts/svn-apply (191366 => 191367)
--- trunk/Tools/Scripts/svn-apply 2015-10-21 01:10:32 UTC (rev 191366)
+++ trunk/Tools/Scripts/svn-apply 2015-10-21 01:41:52 UTC (rev 191367)
@@ -250,6 +250,9 @@
my $contents = $diffHashRef->{svnConvertedText};
my ($binaryChunkType, $binaryChunk, $reverseBinaryChunkType, $reverseBinaryChunk) = decodeGitBinaryPatch($contents, $fullPath);
+ if (!$binaryChunkType) {
+ die "$fullPath: unknown git binary patch format";
+ }
my $isFileAddition = $diffHashRef->{isNew};
my $isFileDeletion = $diffHashRef->{isDeletion};
Added: trunk/Tools/Scripts/webkitperl/VCSUtils_unittest/decodeGitBinaryPatch.pl (0 => 191367)
--- trunk/Tools/Scripts/webkitperl/VCSUtils_unittest/decodeGitBinaryPatch.pl (rev 0)
+++ trunk/Tools/Scripts/webkitperl/VCSUtils_unittest/decodeGitBinaryPatch.pl 2015-10-21 01:41:52 UTC (rev 191367)
@@ -0,0 +1,126 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2015 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Unit tests for decodeGitBinaryPatch()
+
+use strict;
+use warnings;
+
+use Test::More;
+use VCSUtils;
+
+my @testCaseHashRefs = (
+{
+ diffName => "Single line chunks",
+ inputText => <<'END',
+index 490e319f550754ff97dbc4d5a69ad7dbc69c85da..7764e296b482c0ff2c9e4f04114cee9fa1f7544f 100644
+GIT binary patch
+delta 12
+Tcmdnzb;WhVcGk^`9I~<iCFlgC
+
+delta 12
+Tcmdnzb;WhVcGk^`9I~<iCFlgC
+
+END
+ fullPath => "foo/bar",
+ expectedReturn => [
+ 'delta',
+ VCSUtils::decodeGitBinaryChunk('Tcmdnzb;WhVcGk^`9I~<iCFlgC', "foo/bar"),
+ 'delta',
+ VCSUtils::decodeGitBinaryChunk('Tcmdnzb;WhVcGk^`9I~<iCFlgC', "foo/bar"),
+ ],
+},
+{
+ diffName => "Multiline line chunks",
+ inputText => <<'END',
+index 490e319f550754ff97dbc4d5a69ad7dbc69c85da..7764e296b482c0ff2c9e4f04114cee9fa1f7544f 100644
+GIT binary patch
+delta 12
+Tcmdnzb;WhVcGk^`9I~<iCFlgC
+
+delta 12
+zuDr5uCY6G+qE&tSt8Hf1`e-KmRHU1=EbP;&Vn8(El#%J`5jjQa<69Qy^WA8twJa=e
+zKA=23zh&X#=9RtE2ev9KEAFrPu53C~W&er+>0h@h?9_e$t9tRYnNwz6%qmv)>r07~
+z(npNQ>6pss-hG-BQ`xUKqyDnCRhen7(g;<(n-~KU(~z0dtcE;ZqD|&MTInj%e{n1M
+z%E0#7lQ5vNzoxn>y*jsW?-djFDBQQ*K3#hs+NZMgm!)^#@~ZxQ`d0Mso6dZV^n)D=
+zZz*ZUS2-6H?wvlpqOj}k?}x6)d~fuM+baq`D*FGwuWD4AqtpM|m2=PUW{)i7Uwi%)
+
+END
+ fullPath => "foo/bar",
+ expectedReturn => [
+ 'delta',
+ VCSUtils::decodeGitBinaryChunk('Tcmdnzb;WhVcGk^`9I~<iCFlgC', "foo/bar"),
+ 'delta',
+ VCSUtils::decodeGitBinaryChunk('zuDr5uCY6G+qE&tSt8Hf1`e-KmRHU1=EbP;&Vn8(El#%J`5jjQa<69Qy^WA8twJa=e
+ zKA=23zh&X#=9RtE2ev9KEAFrPu53C~W&er+>0h@h?9_e$t9tRYnNwz6%qmv)>r07~
+ z(npNQ>6pss-hG-BQ`xUKqyDnCRhen7(g;<(n-~KU(~z0dtcE;ZqD|&MTInj%e{n1M
+ z%E0#7lQ5vNzoxn>y*jsW?-djFDBQQ*K3#hs+NZMgm!)^#@~ZxQ`d0Mso6dZV^n)D=
+ zZz*ZUS2-6H?wvlpqOj}k?}x6)d~fuM+baq`D*FGwuWD4AqtpM|m2=PUW{)i7Uwi%)', "foo/bar"),
+ ],
+},
+{
+ diffName => "Multiline line chunks and as last patch",
+ inputText => <<'END',
+index 490e319f550754ff97dbc4d5a69ad7dbc69c85da..7764e296b482c0ff2c9e4f04114cee9fa1f7544f 100644
+GIT binary patch
+delta 12
+Tcmdnzb;WhVcGk^`9I~<iCFlgC
+
+delta 12
+zuDr5uCY6G+qE&tSt8Hf1`e-KmRHU1=EbP;&Vn8(El#%J`5jjQa<69Qy^WA8twJa=e
+zKA=23zh&X#=9RtE2ev9KEAFrPu53C~W&er+>0h@h?9_e$t9tRYnNwz6%qmv)>r07~
+z(npNQ>6pss-hG-BQ`xUKqyDnCRhen7(g;<(n-~KU(~z0dtcE;ZqD|&MTInj%e{n1M
+z%E0#7lQ5vNzoxn>y*jsW?-djFDBQQ*K3#hs+NZMgm!)^#@~ZxQ`d0Mso6dZV^n)D=
+zZz*ZUS2-6H?wvlpqOj}k?}x6)d~fuM+baq`D*FGwuWD4AqtpM|m2=PUW{)i7Uwi%)
+
+--
+1.7.4.4
+END
+ fullPath => "foo/bar",
+ expectedReturn => [
+ 'delta',
+ VCSUtils::decodeGitBinaryChunk('Tcmdnzb;WhVcGk^`9I~<iCFlgC', "foo/bar"),
+ 'delta',
+ VCSUtils::decodeGitBinaryChunk('zuDr5uCY6G+qE&tSt8Hf1`e-KmRHU1=EbP;&Vn8(El#%J`5jjQa<69Qy^WA8twJa=e
+ zKA=23zh&X#=9RtE2ev9KEAFrPu53C~W&er+>0h@h?9_e$t9tRYnNwz6%qmv)>r07~
+ z(npNQ>6pss-hG-BQ`xUKqyDnCRhen7(g;<(n-~KU(~z0dtcE;ZqD|&MTInj%e{n1M
+ z%E0#7lQ5vNzoxn>y*jsW?-djFDBQQ*K3#hs+NZMgm!)^#@~ZxQ`d0Mso6dZV^n)D=
+ zZz*ZUS2-6H?wvlpqOj}k?}x6)d~fuM+baq`D*FGwuWD4AqtpM|m2=PUW{)i7Uwi%)', "foo/bar"),
+ ],
+}
+);
+
+my $testCasesCount = @testCaseHashRefs;
+plan(tests => $testCasesCount); # Total number of assertions.
+
+foreach my $testCase (@testCaseHashRefs) {
+ my $testNameStart = "decodeGitBinaryPatch(): $testCase->{diffName}: Comparing";
+
+
+ my @got = VCSUtils::decodeGitBinaryPatch($testCase->{inputText}, $testCase->{fullPath});
+ my $expectedReturn = $testCase->{expectedReturn};
+
+ is_deeply(\@got, $expectedReturn, "$testNameStart return value.");
+
+}