Re: [PATCH] Rework cvsexportcommit to handle binary files for all cases.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



And the updated fix for spaces in file names

-- robin
From bf4030e88bfd5b5f1a84b19a1be36f8178f2b24a Mon Sep 17 00:00:00 2001
From: Robin Rosenberg <robin.rosenberg@xxxxxxxxxx>
Date: Mon, 13 Nov 2006 21:29:06 +0100
Subject: [PATCH] Make cvsexportcommit work with filenames containing spaces.

Binary files are except to this so far.

Signed-off-by: Robin Rosenberg <robin.rosenberg@xxxxxxxxxx>

diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index facb4667eefe79cbd4d29e542ec5e8111a7a973c..017648c8c252e60151320f09a428f0bff6ae46de 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -4,7 +4,7 @@ # Known limitations:
 # - does not propagate permissions
 # - tells "ready for commit" even when things could not be completed
 #   (not sure this is true anymore, maybe more testing is needed)
-# - does not handle whitespace in pathnames at all.
+# - Fedora/RHEL uses patch 2.5.4 which doesn't handles spaces in file names
 
 use strict;
 use Getopt::Std;
@@ -121,7 +121,14 @@ #print @files;
 $? && die "Error in git-diff-tree";
 foreach my $f (@files) {
     chomp $f;
-    my @fields = split(m!\s+!, $f);
+    $f =~ m/^(\S+) (\S+) (\S+) (\S+) (\S+)	(.*)/;
+    my @fields = ();
+    $fields[++$#fields] = $1;
+    $fields[++$#fields] = $2;
+    $fields[++$#fields] = $3;
+    $fields[++$#fields] = $4;
+    $fields[++$#fields] = $5;
+    $fields[++$#fields] = $6;
     if ($fields[4] eq 'A') {
         my $path = $fields[5];
 	push @afiles, $path;
@@ -256,7 +263,19 @@ my $fuzz = $opt_p ? 0 : 2;
 print "Patching non-binary files\n";
 
 if (scalar(@afiles)+scalar(@dfiles)+scalar(@mfiles) != scalar(@bfiles)) {
-    print `(git-diff-tree -p $parent -p $commit | patch -p1 -F $fuzz ) 2>&1`;
+    my $saveslash = $/;
+    undef $/;
+
+    open DIFF, "git-diff-tree -p $parent -p $commit|" || die "Cannot diff";
+    open PATCH, "|tee \$\$.diff|patch -p1 -F $fuzz" || die "Cannot patch";
+    my $delta = <DIFF>;
+    close DIFF || die "Could not diff";
+    unless (defined $ENV{'GIT_CVSEXPORTCOMMIT_NO_SPACES'}) {
+        $delta =~ s/\n(index [^\n]*)\n(--- [^\n]*)\n(\+\+\+ [^\n]*)\n(@@[^\n]*@@)\n/$1\n$2\t\n$3\t\n$4\n/sg
+    }
+    print PATCH $delta;
+    close PATCH || die "Could not patch";
+    $/ = $saveslash;
 }
 
 my $dirtypatch = 0;
diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 0ae03f80694a5d4ca3e61b40f6787a89fe8a496e..bf40d12f27ddde562da8f8526349df1784a48ae8 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -142,4 +142,28 @@ test_expect_success \
      diff F/newfile6.png ../F/newfile6.png
      )' 
 
+test_expect_success \
+     'New file with spaces in file name' \
+     'mkdir G &&
+      echo ok then >"G/with spaces.txt" &&
+      git add "G/with spaces.txt" && \
+      git commit -a -m "With spaces" &&
+      id=$(git rev-list --max-count=1 HEAD) &&
+      (cd "$CVSWORK" &&
+      git-cvsexportcommit -c $id &&
+      test $(cat G/CVS/Entries|wc -l) = 1
+      )'
+
+test_expect_success \
+     'Update file with spaces in file name' \
+     'echo Ok then >>"G/with spaces.txt" &&
+      git add "G/with spaces.txt" &&
+      git commit -a -m "Update with spaces" &&
+      id=$(git rev-list --max-count=1 HEAD) &&
+      (cd "$CVSWORK" &&
+      git-cvsexportcommit -c $id &&
+      test $(cat G/CVS/Entries|wc -l) = 1
+      )'
+     
+
 test_done
-- 
1.4.2


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]