[PATCH] Make cvsexportcommit work with filenames containing spaces.

Subsystems: the rest

STALE3736d

4 messages, 2 authors, 2016-06-15 · open the first message on its own page

[PATCH] Make cvsexportcommit work with filenames containing spaces.

From: Robin Rosenberg <hidden>
Date: 2016-06-15 22:42:41

From: Robin Rosenberg <redacted>

Binary files are except to this so far.
---

 git-cvsexportcommit.perl       |   24 +++++++++++++++--
 t/t9200-git-cvsexportcommit.sh |   55 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+), 3 deletions(-)
diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index 99b3dc3..d78100c 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -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;
@@ -217,7 +224,7 @@ foreach my $f (@bfiles) {
     }
 
     # replace with the new file
-     `git-cat-file blob $blob > $f`;
+     `git-cat-file blob $blob > "$f"`;
 
     # TODO: something smart with file modes
 
@@ -231,7 +238,18 @@ ## apply non-binary changes
 my $fuzz = $opt_p ? 0 : 2;
 
 print "Patching non-binary files\n";
-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, "|patch -p1 -F $fuzz" || die "Cannot patch";
+my $delta = <DIFF>;
+close DIFF || die "Could not diff";
+$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;
 if (($? >> 8) == 2) {
diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
new file mode 100755
index 0000000..1041bb6
--- /dev/null
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+test_description='CVS export comit. 
+
+These tests are ad-hoc ones made to test
+some changes, not a complete test.'
+
+. ./test-lib.sh
+
+export CVSROOT=$(dirname $(pwd))/cvsroot
+export CVSWORK=$(dirname $(pwd))/cvswork
+rm -rf $CVSROOT $CVSWORK
+mkdir $CVSROOT
+cvs init
+cvs -Q co -d $CVSWORK .
+export GIT_DIR=$(pwd)/.git
+
+echo >empty &&
+git add empty &&
+git commit -a -m "Initial"
+
+test_expect_success \
+    'New file' \
+    'echo hello >newfile.txt &&
+     git add newfile.txt &&
+     git commit -a -m "Hello" &&
+     id=$(git rev-list --max-count=1 HEAD) &&
+     (cd $CVSWORK &&
+     git cvsexportcommit -c $id &&
+     test $(cat CVS/Entries|wc -l) = 2
+     )'
+
+test_expect_success \
+     'New file with spaces in file name' \
+     'echo ok then >"with spaces.txt" &&
+      git add "with spaces.txt" && \
+      git commit -a -m "With spaces" &&
+      id=$(git rev-list --max-count=1 HEAD) &&
+      (cd $CVSWORK &&
+      git-cvsexportcommit.perl -c $id &&
+      test $(cat CVS/Entries|wc -l) = 3
+      )'
+
+test_expect_success \
+     'Update file with spaces in file name' \
+     'echo Ok then >>"with spaces.txt" &&
+      git add "with spaces.txt" &&
+      git commit -a -m "Update with spaces" &&
+      id=$(git rev-list --max-count=1 HEAD) &&
+      (cd $CVSWORK &&
+      git-cvsexportcommit.perl -c $id &&
+      test $(cat CVS/Entries|wc -l) = 3
+      )'
+     
+test_done

Re: [PATCH] Make cvsexportcommit work with filenames containing spaces.

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:42:41

Robin Rosenberg [off-list ref] writes:
Binary files are except to this so far.
Funny.  This works on my home machine (CVS 1.12.13) while it
does not pass test #2 "with spaces" on another machine that has
CVS 1.11.22.
+. ./test-lib.sh
+
+export CVSROOT=$(dirname $(pwd))/cvsroot
+export CVSWORK=$(dirname $(pwd))/cvswork
You are creating t/{cvsroot,cvswork} directories.  Do not
contaminate outside the test/trash directory your tests is
started in.
+rm -rf $CVSROOT $CVSWORK
People's $(pwd) can contain shell $IFS characters, especially on
Cygwin.   Be careful and quote them when in doubt.

Re: [PATCH] Make cvsexportcommit work with filenames containing spaces.

From: Robin Rosenberg <hidden>
Date: 2016-06-15 22:42:41

lördag 23 september 2006 06:17 skrev Junio C Hamano:
Robin Rosenberg [off-list ref] writes:
quoted
Binary files are except to this so far.
Funny.  This works on my home machine (CVS 1.12.13) while it
does not pass test #2 "with spaces" on another machine that has
CVS 1.11.22.
That must be something else. I've tried with various cvs versions here 
(including plain 1.11.22) on Mandriva and SLES and it works on all with the 
lastest git on master (and 1.4.2.1). 

Could you give me some more info, like the output from -v on the failing 
machine and your perl and patch version numbers and locale? I'm just guessing 
what could matter here.  

Why patch? Well this patch works around (i.e. not perfect) a mismatch between 
what patch eats and git submits. They are not totally, compatible, and I'm 
not sure who to blame yet.  git emits diff's without timestamps, and what 
matters to patch, without a TAB before the file timestamp. When patch sees a 
header like "+++ filename with spaces.txt" it patches "filename". When it 
sees "+++ filename with spaces.txt<TAB>" if patches "filename with 
spaces.txt". The real fix would ofcourse be in git diff or patch sometime in 
the future.
quoted
+. ./test-lib.sh
+
+export CVSROOT=$(dirname $(pwd))/cvsroot
+export CVSWORK=$(dirname $(pwd))/cvswork
acknowledged
You are creating t/{cvsroot,cvswork} directories.  Do not
contaminate outside the test/trash directory your tests is
started in.
quoted
+rm -rf $CVSROOT $CVSWORK
People's $(pwd) can contain shell $IFS characters, especially on
Cygwin.   Be careful and quote them when in doubt.
Considering this is a patch that should improve on whitespace handlung... ok. 
I'll resubmit later.

-- robin

Re: [PATCH] Make cvsexportcommit work with filenames containing spaces.

From: Robin Rosenberg <hidden>
Date: 2016-06-15 22:42:42

Jounio. Thanks for the feedback. It is your fedora patch 2.5.4 that doesn't work. 
It doesn't seem to handle spaces in filenames in any way. Not much I can do about that.

Btw, 2.5.4 is nine years old, but strangely that's the one that's around everywhere on
source mirrors, but most (=the few ones I checked) Linux distros have 2.5.9 (except RH).

-- robin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help