git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Robin Rosenberg <robin.rosenberg@dewire.com>
Date
Nov 13, 2006, 20:40 UTC
Message-ID
<200611132140.01578.robin.rosenberg@dewire.com>
In-Reply-To
<7vmz6wark9.fsf@assigned-by-dhcp.cox.net>
And the updated fix for spaces in file names
-- robin
From bf4030e88bfd5b5f1a84b19a1be36f8178f2b24a Mon Sep 17 00:00:00 2001
From: Robin Rosenberg <robin.rosenberg@dewire.com>
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@dewire.com>
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
Previous: Junio C Hamano
Message 7 of 7 in “Rework cvsexportcommit to handle binary files for all cases.”
  1. Rework cvsexportcommit to handle binary files for all cases.Robin Rosenberg, Nov 12, 2006
  2. Junio C HamanoNov 13, 2006
  3. Robin RosenbergNov 13, 2006
  4. Junio C HamanoNov 14, 2006
  5. Robin RosenbergNov 14, 2006
  6. Junio C HamanoNov 14, 2006
  7. Robin RosenbergNov 13, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.