summaryrefslogtreecommitdiffstats
path: root/WebKitTools/Scripts/svn-apply
diff options
context:
space:
mode:
authorKristian Monsen <kristianm@google.com>2010-05-21 16:53:46 +0100
committerKristian Monsen <kristianm@google.com>2010-05-25 10:24:15 +0100
commit6c2af9490927c3c5959b5cb07461b646f8b32f6c (patch)
treef7111b9b22befab472616c1d50ec94eb50f1ec8c /WebKitTools/Scripts/svn-apply
parenta149172322a9067c14e8b474a53e63649aa17cad (diff)
downloadexternal_webkit-6c2af9490927c3c5959b5cb07461b646f8b32f6c.zip
external_webkit-6c2af9490927c3c5959b5cb07461b646f8b32f6c.tar.gz
external_webkit-6c2af9490927c3c5959b5cb07461b646f8b32f6c.tar.bz2
Merge WebKit at r59636: Initial merge by git
Change-Id: I59b289c4e6b18425f06ce41cc9d34c522515de91
Diffstat (limited to 'WebKitTools/Scripts/svn-apply')
-rwxr-xr-xWebKitTools/Scripts/svn-apply86
1 files changed, 38 insertions, 48 deletions
diff --git a/WebKitTools/Scripts/svn-apply b/WebKitTools/Scripts/svn-apply
index b49ccec..33b2279 100755
--- a/WebKitTools/Scripts/svn-apply
+++ b/WebKitTools/Scripts/svn-apply
@@ -42,8 +42,7 @@
# Paths from Index: lines are used rather than the paths on the patch lines, which
# makes patches generated by "cvs diff" work (increasingly unimportant since we
# use Subversion now).
-# ChangeLog patches use --fuzz=3 to prevent rejects, and the entry date is set in
-# the patch to today's date using $changeLogTimeZone.
+# ChangeLog patches use --fuzz=3 to prevent rejects.
# Handles binary files (requires patches made by svn-create-patch).
# Handles copied and moved files (requires patches made by svn-create-patch).
# Handles git-diff patches (without binary changes) created at the top-level directory
@@ -80,7 +79,6 @@ sub handleGitBinaryChange($$);
sub isDirectoryEmptyForRemoval($);
sub patch($);
sub removeDirectoriesIfNeeded();
-sub setChangeLogDateAndReviewer($$);
# These should be replaced by an scm class/module:
sub scmKnowsOfFile($);
@@ -88,10 +86,6 @@ sub scmCopy($$);
sub scmAdd($);
sub scmRemove($);
-
-# Project time zone for Cupertino, CA, US
-my $changeLogTimeZone = "PST8PDT";
-
my $merge = 0;
my $showHelp = 0;
my $reviewer;
@@ -117,12 +111,12 @@ my %removeDirectoryIgnoreList = (
'_svn' => 1,
);
+my $epochTime = time(); # This is used to set the date in ChangeLog files.
my $globalExitStatus = 0;
my $repositoryRootPath = determineVCSRoot();
my %checkedDirectories;
-my %copiedFiles;
# Need to use a typeglob to pass the file handle as a parameter,
# otherwise get a bareword error.
@@ -154,8 +148,6 @@ for my $copyDiffHashRef (@copyDiffHashRefs) {
addDirectoriesIfNeeded(dirname($indexPath));
scmCopy($copiedFromPath, $indexPath);
-
- $copiedFiles{$indexPath} = $copiedFromPath;
}
for my $diffHashRef (@nonCopyDiffHashRefs) {
@@ -247,14 +239,16 @@ sub handleBinaryChange($$)
sub handleGitBinaryChange($$)
{
- my ($fullPath, $contents) = @_;
+ my ($fullPath, $diffHashRef) = @_;
+
+ my $contents = $diffHashRef->{svnConvertedText};
my ($binaryChunkType, $binaryChunk, $reverseBinaryChunkType, $reverseBinaryChunk) = decodeGitBinaryPatch($contents, $fullPath);
# FIXME: support "delta" type.
die "only literal type is supported now" if ($binaryChunkType ne "literal" || $reverseBinaryChunkType ne "literal");
- my $isFileAddition = $contents =~ /\nnew file mode \d+\n/;
- my $isFileDeletion = $contents =~ /\ndeleted file mode \d+\n/;
+ my $isFileAddition = $diffHashRef->{isNew};
+ my $isFileDeletion = $diffHashRef->{isDeletion};
my $originalContents = "";
if (open FILE, $fullPath) {
@@ -303,7 +297,10 @@ sub patch($)
{
my ($diffHashRef) = @_;
- my $patch = $diffHashRef->{svnConvertedText};
+ # Make sure $patch is initialized to some value. A deletion can have no
+ # svnConvertedText property in the case of a deletion resulting from a
+ # Git rename.
+ my $patch = $diffHashRef->{svnConvertedText} || "";
my $fullPath = $diffHashRef->{indexPath};
my $isBinary = $diffHashRef->{isBinary};
@@ -312,19 +309,18 @@ sub patch($)
my $deletion = 0;
my $addition = 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 @@/;
+ $addition = 1 if ($diffHashRef->{isNew} || $patch =~ /\n@@ -0,0 .* @@/);
+ $deletion = 1 if ($diffHashRef->{isDeletion} || $patch =~ /\n@@ .* \+0,0 @@/);
if (!$addition && !$deletion && !$isBinary) {
# Standard patch, patch tool can handle this.
if (basename($fullPath) eq "ChangeLog") {
my $changeLogDotOrigExisted = -f "${fullPath}.orig";
- applyPatch(setChangeLogDateAndReviewer(fixChangeLogPatch($patch), $reviewer), $fullPath, ["--fuzz=3"]);
+ my $newPatch = setChangeLogDateAndReviewer(fixChangeLogPatch($patch), $reviewer, $epochTime);
+ applyPatch($newPatch, $fullPath, ["--fuzz=3"]);
unlink("${fullPath}.orig") if (! $changeLogDotOrigExisted);
} else {
- applyPatch($patch, $fullPath);
+ applyPatch($patch, $fullPath) if $patch;
}
} else {
# Either a deletion, an addition or a binary change.
@@ -333,18 +329,17 @@ sub patch($)
if ($isBinary) {
if ($isGit) {
- handleGitBinaryChange($fullPath, $patch);
+ handleGitBinaryChange($fullPath, $diffHashRef);
} else {
- handleBinaryChange($fullPath, $patch);
+ handleBinaryChange($fullPath, $patch) if $patch;
}
} elsif ($deletion) {
- # Deletion
- applyPatch($patch, $fullPath, ["--force"]);
+ applyPatch($patch, $fullPath, ["--force"]) if $patch;
scmRemove($fullPath);
} else {
# Addition
rename($fullPath, "$fullPath.orig") if -e $fullPath;
- applyPatch($patch, $fullPath);
+ applyPatch($patch, $fullPath) if $patch;
unlink("$fullPath.orig") if -e "$fullPath.orig" && checksum($fullPath) eq checksum("$fullPath.orig");
scmAdd($fullPath);
# What is this for?
@@ -364,26 +359,6 @@ sub removeDirectoriesIfNeeded()
}
}
-sub setChangeLogDateAndReviewer($$)
-{
- my $patch = shift;
- my $reviewer = shift;
- my $savedTimeZone = $ENV{'TZ'};
- # Set TZ temporarily so that localtime() is in that time zone
- $ENV{'TZ'} = $changeLogTimeZone;
- my $newDate = strftime("%Y-%m-%d", localtime());
- if (defined $savedTimeZone) {
- $ENV{'TZ'} = $savedTimeZone;
- } else {
- delete $ENV{'TZ'};
- }
- $patch =~ s/(\n\+)\d{4}-[^-]{2}-[^-]{2}( )/$1$newDate$2/;
- if (defined($reviewer)) {
- $patch =~ s/NOBODY \(OOPS!\)/$reviewer/;
- }
- return $patch;
-}
-
# This could be made into a more general "status" call, except svn and git
# have different ideas about "moving" files which might get confusing.
sub scmWillDeleteFile($)
@@ -399,6 +374,22 @@ sub scmWillDeleteFile($)
return 0;
}
+# Return whether the file at the given path is known to Git.
+#
+# This method outputs a message like the following to STDERR when
+# returning false:
+#
+# "error: pathspec 'test.png' did not match any file(s) known to git.
+# Did you forget to 'git add'?"
+sub gitKnowsOfFile($)
+{
+ my $path = shift;
+
+ `git ls-files --error-unmatch -- $path`;
+ my $exitStatus = exitStatus($?);
+ return $exitStatus == 0;
+}
+
sub scmKnowsOfFile($)
{
my ($path) = @_;
@@ -411,9 +402,8 @@ sub scmKnowsOfFile($)
# This does not handle errors well.
return 1;
} elsif (isGit()) {
- `git ls-files --error-unmatch -- $path`;
- my $exitCode = $? >> 8;
- return $exitCode == 0;
+ my @result = callSilently(\&gitKnowsOfFile, $path);
+ return $result[0];
}
}