Skip to content

Commit

Permalink
Merge branch 'js/maint-cvsexport' into maint
Browse files Browse the repository at this point in the history
* js/maint-cvsexport:
  cvsexportcommit: be graceful when "cvs status" reorders the arguments

Conflicts:

	t/t9200-git-cvsexportcommit.sh
  • Loading branch information
Junio C Hamano committed Mar 8, 2008
2 parents 925ca88 + fef3a7c commit 274d9d3
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 8 deletions.
40 changes: 32 additions & 8 deletions git-cvsexportcommit.perl
Original file line number Diff line number Diff line change
Expand Up @@ -197,15 +197,39 @@
my @updated = xargs_safe_pipe_capture([@cvs, 'update'], @canstatusfiles);
print @updated;
}
my @cvsoutput;
@cvsoutput = xargs_safe_pipe_capture([@cvs, 'status'], @canstatusfiles);
my $matchcount = 0;
foreach my $l (@cvsoutput) {
chomp $l;
if ( $l =~ /^File:/ and $l =~ /Status: (.*)$/ ) {
$cvsstat{$canstatusfiles[$matchcount]} = $1;
$matchcount++;
# "cvs status" reorders the parameters, notably when there are multiple
# arguments with the same basename. So be precise here.

my %added = map { $_ => 1 } @afiles;
my %todo = map { $_ => 1 } @canstatusfiles;

while (%todo) {
my @canstatusfiles2 = ();
my %fullname = ();
foreach my $name (keys %todo) {
my $basename = basename($name);

$basename = "no file " . $basename if (exists($added{$basename}));
chomp($basename);

if (!exists($fullname{$basename})) {
$fullname{$basename} = $name;
push (@canstatusfiles2, $name);
delete($todo{$name});
}
}
my @cvsoutput;
@cvsoutput = xargs_safe_pipe_capture([@cvs, 'status'], @canstatusfiles2);
foreach my $l (@cvsoutput) {
chomp $l;
if ($l =~ /^File:\s+(.*\S)\s+Status: (.*)$/) {
if (!exists($fullname{$1})) {
print STDERR "Huh? Status reported for unexpected file '$1'\n";
} else {
$cvsstat{$fullname{$1}} = $2;
}
}
}
}
}

Expand Down
35 changes: 35 additions & 0 deletions t/t9200-git-cvsexportcommit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -262,4 +262,39 @@ test_expect_success '-w option should work with relative GIT_DIR' '
)
'

test_expect_success 'check files before directories' '
echo Notes > release-notes &&
git add release-notes &&
git commit -m "Add release notes" release-notes &&
id=$(git rev-parse HEAD) &&
git cvsexportcommit -w "$CVSWORK" -c $id &&
echo new > DS &&
echo new > E/DS &&
echo modified > release-notes &&
git add DS E/DS release-notes &&
git commit -m "Add two files with the same basename" &&
id=$(git rev-parse HEAD) &&
git cvsexportcommit -w "$CVSWORK" -c $id &&
check_entries "$CVSWORK/E" "DS/1.1/|newfile5.txt/1.1/" &&
check_entries "$CVSWORK" "DS/1.1/|release-notes/1.2/" &&
diff -u "$CVSWORK/DS" DS &&
diff -u "$CVSWORK/E/DS" E/DS &&
diff -u "$CVSWORK/release-notes" release-notes
'

test_expect_success 'commit a file with leading spaces in the name' '
echo space > " space" &&
git add " space" &&
git commit -m "Add a file with a leading space" &&
id=$(git rev-parse HEAD) &&
git cvsexportcommit -w "$CVSWORK" -c $id &&
check_entries "$CVSWORK" " space/1.1/|DS/1.1/|release-notes/1.2/" &&
diff -u "$CVSWORK/ space" " space"
'

test_done

0 comments on commit 274d9d3

Please sign in to comment.