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