Merge branch 'js/maint-cvsexport' into maint
* js/maint-cvsexport: cvsexportcommit: be graceful when "cvs status" reorders the arguments Conflicts: t/t9200-git-cvsexportcommit.sh
This commit is contained in:
commit
274d9d3294
@ -197,14 +197,38 @@ if (@canstatusfiles) {
|
||||
my @updated = xargs_safe_pipe_capture([@cvs, 'update'], @canstatusfiles);
|
||||
print @updated;
|
||||
}
|
||||
# "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'], @canstatusfiles);
|
||||
my $matchcount = 0;
|
||||
@cvsoutput = xargs_safe_pipe_capture([@cvs, 'status'], @canstatusfiles2);
|
||||
foreach my $l (@cvsoutput) {
|
||||
chomp $l;
|
||||
if ( $l =~ /^File:/ and $l =~ /Status: (.*)$/ ) {
|
||||
$cvsstat{$canstatusfiles[$matchcount]} = $1;
|
||||
$matchcount++;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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…
Reference in New Issue
Block a user