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,15 +197,39 @@ if (@canstatusfiles) {
|
|||||||
my @updated = xargs_safe_pipe_capture([@cvs, 'update'], @canstatusfiles);
|
my @updated = xargs_safe_pipe_capture([@cvs, 'update'], @canstatusfiles);
|
||||||
print @updated;
|
print @updated;
|
||||||
}
|
}
|
||||||
my @cvsoutput;
|
# "cvs status" reorders the parameters, notably when there are multiple
|
||||||
@cvsoutput = xargs_safe_pipe_capture([@cvs, 'status'], @canstatusfiles);
|
# arguments with the same basename. So be precise here.
|
||||||
my $matchcount = 0;
|
|
||||||
foreach my $l (@cvsoutput) {
|
my %added = map { $_ => 1 } @afiles;
|
||||||
chomp $l;
|
my %todo = map { $_ => 1 } @canstatusfiles;
|
||||||
if ( $l =~ /^File:/ and $l =~ /Status: (.*)$/ ) {
|
|
||||||
$cvsstat{$canstatusfiles[$matchcount]} = $1;
|
while (%todo) {
|
||||||
$matchcount++;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user