WebKitTools:
[WebKit-https.git] / WebKitTools / Scripts / svn-unapply
index 14fa4f0d2f6c9f57b518161f2486af911517c3c5..7e04ff90b7c476655d3f09c4eeff2318d55fe759 100755 (executable)
 #       makes patches generated by "cvs diff" work (increasingly unimportant since we
 #       use Subversion now).
 #   ChangeLog patches use --fuzz=3 to prevent rejects.
+#   Handles binary files (requires patches made by svn-create-patch).
 #
 # Missing features:
 #
 #   Handle property changes.
-#   Handle binary files (requires patches made by svn-create-patch).
 #   Handle file moves (requires patches made by svn-create-patch).
 #   Use version numbers in the patch file and do a 3-way merge.
 #   When reversing an addition, check that the file matches what's being removed.
@@ -97,35 +97,34 @@ sub patch
 
     my $deletion = 0;
     my $addition = 0;
+    my $isBinary = 0;
 
     $addition = 1 if $patch =~ /\n--- .+\(revision 0\)\n/;
     $deletion = 1 if $patch =~ /\n@@ .* \+0,0 @@/;
+    $isBinary = 1 if $patch =~ /\nCannot display: file marked as a binary type\./;
 
-    if (!$addition && !$deletion) {
+    if (!$addition && !$deletion && !$isBinary) {
         # Standard patch, patch tool can handle this.
         if ($base eq "ChangeLog") {
             my $changeLogDotOrigExisted = -f "${fullpath}.orig";
             unapplyPatch($patch, $fullpath, ["--fuzz=3"]);
             unlink("${fullpath}.orig") if (! $changeLogDotOrigExisted);
-        }
-        else {
+        } else {
             unapplyPatch($patch, $fullpath);
         }
     } else {
-        # Either a deletion or an addition.
+        # Either a deletion, an addition or a binary change.
 
         # Change directory down into the directory in question.
         if ($prefix) {
             chdir $prefix or die "Failed to chdir to $prefix";
         }
 
-        if ($deletion) {
-            # Reverse a deletion.
-            system "svn", "revert", "$base";
-        } else {
-            # Reverse an addition.
-            system "svn", "rm", "--force", $base;
-        }
+        # Reverse change by deleting current copy if it exists first
+        unlink($base) if (-e $base);
+
+        # Then run svn revert
+        system "svn", "revert", "$base";
 
         chdir $startDir or die;
     }