WebKitTools:
authorddkilzer <ddkilzer@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Jul 2006 03:59:42 +0000 (03:59 +0000)
committerddkilzer <ddkilzer@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Jul 2006 03:59:42 +0000 (03:59 +0000)
        Reviewed by Darin.

        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=9875
          Teach svn-apply and svn-unapply to use patch(1) for additions and deletions

        * Scripts/svn-apply:
        (addDirectoriesIfNeeded): Don't try to add a directory that's already in svn.
        (checksum): Added.
        (patch): Use patch(1) for non-binary additions and deletions.
        * Scripts/svn-unapply:
        (checksum): Added.
        (patch): Use patch(1) for reverting non-binary additions and deletions.
        (revertDirectories): Don't try to revert a directory that hasn't changed in svn.

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

WebKitTools/ChangeLog
WebKitTools/Scripts/svn-apply
WebKitTools/Scripts/svn-unapply

index 5ee8dce1271adc5dce4bf955fd091ebe2e5941eb..f805a2c29403643ab7e2dc858300412801ef0b02 100644 (file)
@@ -1,3 +1,19 @@
+2006-07-16  David Kilzer  <ddkilzer@kilzer.net>
+
+        Reviewed by Darin.
+
+        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=9875
+          Teach svn-apply and svn-unapply to use patch(1) for additions and deletions
+
+        * Scripts/svn-apply:
+        (addDirectoriesIfNeeded): Don't try to add a directory that's already in svn.
+        (checksum): Added.
+        (patch): Use patch(1) for non-binary additions and deletions.
+        * Scripts/svn-unapply:
+        (checksum): Added.
+        (patch): Use patch(1) for reverting non-binary additions and deletions.
+        (revertDirectories): Don't try to revert a directory that hasn't changed in svn.
+
 2006-07-13  Mark Rowe  <opendarwin.org@bdash.net.nz>
 
         Reviewed by Timothy.
index d17d672fc7a7e773b96d42d741e7baa3eb4743aa..205875302eacaabab3b447d0661a32cf86d1ac0a 100755 (executable)
@@ -30,9 +30,9 @@
 
 # Differences from invoking "patch -p0":
 #
-#   Handles added files (does a svn add).
+#   Handles added files (does a svn add with logic to handle local changes).
 #   Handles added directories (does a svn add).
-#   Handles removed files (does a svn rm).
+#   Handles removed files (does a svn rm with logic to handle local changes).
 #   Handles removed directories--those with no more files or directories left in them
 #       (does a svn rm).
 #   Has mode where it will roll back to svn version numbers in the patch file so svn
@@ -57,6 +57,7 @@ use strict;
 use warnings;
 
 use Cwd;
+use Digest::MD5;
 use File::Basename;
 use File::Spec;
 use Getopt::Long;
@@ -65,6 +66,7 @@ use POSIX qw(strftime);
 
 sub addDirectoriesIfNeeded($);
 sub applyPatch($$;$);
+sub checksum($);
 sub fixChangeLogPatch($);
 sub handleBinaryChange($$);
 sub isDirectoryEmptyForRemoval($);
@@ -153,7 +155,7 @@ sub addDirectoriesIfNeeded($)
         }
         elsif (-d $dir) {
             my $svnOutput = svnStatus($dir);
-            if ($svnOutput && substr($svnOutput, 0, 1) eq "?") {
+            if ($svnOutput && $svnOutput =~ m#\?\s+$dir\n#) {
                 system "svn", "add", $dir;
             }
             $checkedDirectories{$dir} = 1;
@@ -174,6 +176,16 @@ sub applyPatch($$;$)
     close PATCH;
 }
 
+sub checksum($)
+{
+    my $file = shift;
+    open(FILE, $file) or die "Can't open '$file': $!";
+    binmode(FILE);
+    my $checksum = Digest::MD5->new->addfile(*FILE)->hexdigest();
+    close(FILE);
+    return $checksum;
+}
+
 sub fixChangeLogPatch($)
 {
     my $patch = shift;
@@ -300,23 +312,16 @@ sub patch($)
             # Binary change
             handleBinaryChange($fullPath, $patch);
         } elsif ($deletion) {
-            # Deletion.
-            system "svn", "rm", $fullPath;
+            # Deletion
+            applyPatch($patch, $fullPath, ["--force"]);
+            system "svn", "rm", "--force", $fullPath;
         } else {
-            # Addition.
-            my $contents = $patch;
-            if ($contents !~ s/^(.*\n)*@@[^\n]+@@\n//) {
-                # Empty contents.
-                $contents = "";
-            } else {
-                # Non-empty contents: Remove leading + signs.
-                $contents =~ s/^\+//;
-                $contents =~ s/\n\+/\n/g;
-            }
-            open FILE, ">", $fullPath or die;
-            print FILE $contents;
-            close FILE;
+            # Addition
+            rename($fullPath, "$fullPath.orig") if -e $fullPath;
+            applyPatch($patch, $fullPath);
+            unlink("$fullPath.orig") if -e "$fullPath.orig" && checksum($fullPath) eq checksum("$fullPath.orig");
             system "svn", "add", $fullPath;
+            system "svn", "stat", "$fullPath.orig" if -e "$fullPath.orig";
         }
     }
 }
index 5dfc77f6c2f23b11cf7a63dca2a6546ca29a088e..2e7eec31002adb65e8137aadb02a92c2ae1721b0 100755 (executable)
@@ -30,9 +30,9 @@
 
 # Differences from invoking "patch -p0 -R":
 #
-#   Handles added files (does a svn rm). 
-#   Handles added directories (does a svn rm and a rmdir).
-#   Handles removed files (does a svn revert). 
+#   Handles added files (does a svn revert with additional logic to handle local changes). 
+#   Handles added directories (does a svn revert and a rmdir).
+#   Handles removed files (does a svn revert with additional logic to handle local changes). 
 #   Handles removed directories (does a svn revert). 
 #   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
@@ -55,11 +55,14 @@ use strict;
 use warnings;
 
 use Cwd;
+use Digest::MD5;
 use Fcntl qw(:DEFAULT :seek);
 use File::Basename;
 use File::Spec;
+use File::Temp qw(tempfile);
 use Getopt::Long;
 
+sub checksum($);
 sub fixChangeLogPatch($);
 sub patch($);
 sub revertDirectories();
@@ -103,6 +106,16 @@ revertDirectories();
 
 exit 0;
 
+sub checksum($)
+{
+    my $file = shift;
+    open(FILE, $file) or die "Can't open '$file': $!";
+    binmode(FILE);
+    my $checksum = Digest::MD5->new->addfile(*FILE)->hexdigest();
+    close(FILE);
+    return $checksum;
+}
+
 sub fixChangeLogPatch($)
 {
     my $patch = shift;
@@ -183,11 +196,42 @@ sub patch($)
     } else {
         # Either a deletion, an addition or a binary change.
 
-        # Reverse change by deleting current copy if it exists first
-        unlink($fullPath) if (-e $fullPath);
+        if ($isBinary) {
+            # Reverse binary change
+            unlink($fullPath) if (-e $fullPath);
+            system "svn", "revert", $fullPath;
+        } elsif ($deletion) {
+            # Reverse deletion
+            rename($fullPath, "$fullPath.orig") if -e $fullPath;
+
+            unapplyPatch($patch, $fullPath);
+
+            # If we don't ask for the filehandle here, we always get a warning.
+            my ($fh, $tempPath) = tempfile(basename($fullPath) . "-XXXXXXXX",
+                                           DIR => dirname($fullPath), UNLINK => 1);
+            close($fh);
 
-        # Then run svn revert
-        system "svn", "revert", $fullPath;
+            # Keep the version from the patch in case it's different from svn.
+            rename($fullPath, $tempPath);
+            system "svn", "revert", $fullPath;
+            rename($tempPath, $fullPath);
+
+            # This works around a bug in the svn client.
+            # [Issue 1960] file modifications get lost due to FAT 2s time resolution
+            # http://subversion.tigris.org/issues/show_bug.cgi?id=1960
+            system "touch", $fullPath;
+
+            # Remove $fullPath.orig if it is the same as $fullPath
+            unlink("$fullPath.orig") if -e "$fullPath.orig" && checksum($fullPath) eq checksum("$fullPath.orig");
+
+            # Show status if the file is modifed
+            system "svn", "stat", $fullPath;
+        } else {
+            # Reverse addition
+            unapplyPatch($patch, $fullPath, ["--force"]);
+            unlink($fullPath) if -z $fullPath;
+            system "svn", "revert", $fullPath;
+        }
     }
 }
 
@@ -202,11 +246,11 @@ sub revertDirectories()
             next if (exists $checkedDirectories{$dir});
             if (-d $dir) {
                 my $svnOutput = svnStatus($dir);
-                if ($svnOutput && substr($svnOutput, 0, 1) eq "A") {
+                if ($svnOutput && $svnOutput =~ m#A\s+$dir\n#) {
                    system "svn", "revert", $dir;
                    rmdir $dir;
                 }
-                elsif ($svnOutput && substr($svnOutput, 0, 1) eq "D") {
+                elsif ($svnOutput && $svnOutput =~ m#D\s+$dir\n#) {
                    system "svn", "revert", $dir;
                 }
                 else {