Browse Source

Merge branch 'js/maint-cvsexport'

* js/maint-cvsexport:
  cvsexportcommit: be graceful when "cvs status" reorders the arguments

Conflicts:

	t/t9200-git-cvsexportcommit.sh
maint
Junio C Hamano 17 years ago
parent
commit
6fe870f032
  1. 40
      git-cvsexportcommit.perl
  2. 35
      t/t9200-git-cvsexportcommit.sh

40
git-cvsexportcommit.perl

@ -197,15 +197,39 @@ if (@canstatusfiles) { @@ -197,15 +197,39 @@ if (@canstatusfiles) {
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;
}
}
}
}
}


35
t/t9200-git-cvsexportcommit.sh

@ -262,4 +262,39 @@ test_expect_success '-w option should work with relative GIT_DIR' ' @@ -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

Loading…
Cancel
Save