summaryrefslogtreecommitdiffstats
path: root/WebKitTools/Scripts/svn-apply
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-05-11 18:35:50 +0100
committerBen Murdoch <benm@google.com>2010-05-14 10:23:05 +0100
commit21939df44de1705786c545cd1bf519d47250322d (patch)
treeef56c310f5c0cdc379c2abb2e212308a3281ce20 /WebKitTools/Scripts/svn-apply
parent4ff1d8891d520763f17675827154340c7c740f90 (diff)
downloadexternal_webkit-21939df44de1705786c545cd1bf519d47250322d.zip
external_webkit-21939df44de1705786c545cd1bf519d47250322d.tar.gz
external_webkit-21939df44de1705786c545cd1bf519d47250322d.tar.bz2
Merge Webkit at r58956: Initial merge by Git.
Change-Id: I1d9fb60ea2c3f2ddc04c17a871acdb39353be228
Diffstat (limited to 'WebKitTools/Scripts/svn-apply')
-rwxr-xr-xWebKitTools/Scripts/svn-apply118
1 files changed, 44 insertions, 74 deletions
diff --git a/WebKitTools/Scripts/svn-apply b/WebKitTools/Scripts/svn-apply
index 61d193d..b49ccec 100755
--- a/WebKitTools/Scripts/svn-apply
+++ b/WebKitTools/Scripts/svn-apply
@@ -123,72 +123,43 @@ my $repositoryRootPath = determineVCSRoot();
my %checkedDirectories;
my %copiedFiles;
-my @patches;
-my %versions;
-
-my $copiedFromPath;
-my $filter;
-my $indexPath;
-my $patch;
-while (<>) {
- s/([\n\r]+)$//mg;
- my $eol = $1;
- if (!defined($indexPath) && m#^diff --git \w/#) {
- $filter = \&gitdiff2svndiff;
- }
- $_ = &$filter($_) if $filter;
- if (/^Index: (.+)/) {
- $indexPath = $1;
- if ($patch) {
- if (!$copiedFromPath) {
- push @patches, $patch;
- }
- $copiedFromPath = "";
- $patch = "";
- }
- }
- if ($indexPath) {
- # Fix paths on diff, ---, and +++ lines to match preceding Index: line.
- s/\S+$/$indexPath/ if /^diff/;
- s/^--- \S+/--- $indexPath/;
- if (/^--- .+\(from (\S+):(\d+)\)$/) {
- $copiedFromPath = $1;
- $copiedFiles{$indexPath} = $copiedFromPath;
- $versions{$copiedFromPath} = $2 if ($2 != 0);
- }
- elsif (/^--- .+\(revision (\d+)\)$/) {
- $versions{$indexPath} = $1 if ($1 != 0);
- }
- if (s/^\+\+\+ \S+/+++ $indexPath/) {
- $indexPath = "";
- }
- }
- $patch .= $_;
- $patch .= $eol;
-}
-if ($patch && !$copiedFromPath) {
- push @patches, $patch;
-}
+# Need to use a typeglob to pass the file handle as a parameter,
+# otherwise get a bareword error.
+my @diffHashRefs = parsePatch(*ARGV);
+
+print "Parsed " . @diffHashRefs . " diffs from patch file(s).\n";
+
+my $preparedPatchHash = prepareParsedPatch($force, @diffHashRefs);
+
+my @copyDiffHashRefs = @{$preparedPatchHash->{copyDiffHashRefs}};
+my @nonCopyDiffHashRefs = @{$preparedPatchHash->{nonCopyDiffHashRefs}};
+my %sourceRevisions = %{$preparedPatchHash->{sourceRevisionHash}};
if ($merge) {
die "--merge is currently only supported for SVN" unless isSVN();
# How do we handle Git patches applied to an SVN checkout here?
- for my $file (sort keys %versions) {
- my $version = $versions{$file};
+ for my $file (sort keys %sourceRevisions) {
+ my $version = $sourceRevisions{$file};
print "Getting version $version of $file\n";
system("svn", "update", "-r", $version, $file) == 0 or die "Failed to run svn update -r $version $file.";
}
}
-# Handle copied and moved files first since moved files may have their source deleted before the move.
-for my $file (keys %copiedFiles) {
- addDirectoriesIfNeeded(dirname($file));
- scmCopy($copiedFiles{$file}, $file);
+# Handle copied and moved files first since moved files may have their
+# source deleted before the move.
+for my $copyDiffHashRef (@copyDiffHashRefs) {
+ my $indexPath = $copyDiffHashRef->{indexPath};
+ my $copiedFromPath = $copyDiffHashRef->{copiedFromPath};
+
+ addDirectoriesIfNeeded(dirname($indexPath));
+ scmCopy($copiedFromPath, $indexPath);
+
+ $copiedFiles{$indexPath} = $copiedFromPath;
}
-for $patch (@patches) {
- patch($patch);
+for my $diffHashRef (@nonCopyDiffHashRefs) {
+ patch($diffHashRef);
}
removeDirectoriesIfNeeded();
@@ -326,30 +297,27 @@ sub isDirectoryEmptyForRemoval($)
return $directoryIsEmpty;
}
+# Args:
+# $diffHashRef: a diff hash reference of the type returned by parsePatch().
sub patch($)
{
- my ($patch) = @_;
- return if !$patch;
-
- unless ($patch =~ m|^Index: ([^\r\n]+)|) {
- my $separator = '-' x 67;
- warn "Failed to find 'Index:' in:\n$separator\n$patch\n$separator\n";
- die unless $force;
- return;
- }
- my $fullPath = $1;
+ my ($diffHashRef) = @_;
+
+ my $patch = $diffHashRef->{svnConvertedText};
+
+ my $fullPath = $diffHashRef->{indexPath};
+ my $isBinary = $diffHashRef->{isBinary};
+ my $isGit = $diffHashRef->{isGit};
my $deletion = 0;
my $addition = 0;
- my $isBinary = 0;
- my $isGitBinary = 0;
+ # FIXME: This information should be extracted from the diff file as
+ # part of the parsing stage, i.e. the call to parsePatch().
$addition = 1 if ($patch =~ /\n--- .+\(revision 0\)\r?\n/ || $patch =~ /\n@@ -0,0 .* @@/) && !exists($copiedFiles{$fullPath});
$deletion = 1 if $patch =~ /\n@@ .* \+0,0 @@/;
- $isBinary = 1 if $patch =~ /\nCannot display: file marked as a binary type\./;
- $isGitBinary = 1 if $patch =~ /\nGIT binary patch\n/;
- if (!$addition && !$deletion && !$isBinary && !$isGitBinary) {
+ if (!$addition && !$deletion && !$isBinary) {
# Standard patch, patch tool can handle this.
if (basename($fullPath) eq "ChangeLog") {
my $changeLogDotOrigExisted = -f "${fullPath}.orig";
@@ -364,11 +332,11 @@ sub patch($)
addDirectoriesIfNeeded(dirname($fullPath));
if ($isBinary) {
- # Binary change
- handleBinaryChange($fullPath, $patch);
- } elsif ($isGitBinary) {
- # Git binary change
- handleGitBinaryChange($fullPath, $patch);
+ if ($isGit) {
+ handleGitBinaryChange($fullPath, $patch);
+ } else {
+ handleBinaryChange($fullPath, $patch);
+ }
} elsif ($deletion) {
# Deletion
applyPatch($patch, $fullPath, ["--force"]);
@@ -383,6 +351,8 @@ sub patch($)
system("svn", "stat", "$fullPath.orig") if isSVN() && -e "$fullPath.orig";
}
}
+
+ scmToggleExecutableBit($fullPath, $diffHashRef->{executableBitDelta}) if defined($diffHashRef->{executableBitDelta});
}
sub removeDirectoriesIfNeeded()