git-cvsexportcommit can't commit files which have been removed from CVS
If a file X is removed from CVS, it goes into the Attic directory, and CVS reports it as 'no file X' but with status 'Up-to-date'. cvsexportcommit misinterprets this as an existing file and tries to commit a file with the same name. Correctly identify these files, so that new files with the same name can be committed. Add a test to t9200-git-cvsexportcommit.sh, which tests that we can re-commit a removed filename which remains in CVS's attic. This adds a file 'attic_gremlin' in CVS, then "removes" it, then tries to commit a file with the same name from git. Signed-off-by: Nick Woolley <git.wu-lee@noodlefactory.co.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e57cb01582
commit
54d5cc0e12
@ -225,7 +225,14 @@ if (@canstatusfiles) {
|
|||||||
foreach my $name (keys %todo) {
|
foreach my $name (keys %todo) {
|
||||||
my $basename = basename($name);
|
my $basename = basename($name);
|
||||||
|
|
||||||
$basename = "no file " . $basename if (exists($added{$basename}));
|
# CVS reports files that don't exist in the current revision as
|
||||||
|
# "no file $basename" in its "status" output, so we should
|
||||||
|
# anticipate that. Totally unknown files will have a status
|
||||||
|
# "Unknown". However, if they exist in the Attic, their status
|
||||||
|
# will be "Up-to-date" (this means they were added once but have
|
||||||
|
# been removed).
|
||||||
|
$basename = "no file $basename" if $added{$basename};
|
||||||
|
|
||||||
$basename =~ s/^\s+//;
|
$basename =~ s/^\s+//;
|
||||||
$basename =~ s/\s+$//;
|
$basename =~ s/\s+$//;
|
||||||
|
|
||||||
@ -239,25 +246,39 @@ if (@canstatusfiles) {
|
|||||||
@cvsoutput = xargs_safe_pipe_capture([@cvs, 'status'], @canstatusfiles2);
|
@cvsoutput = xargs_safe_pipe_capture([@cvs, 'status'], @canstatusfiles2);
|
||||||
foreach my $l (@cvsoutput) {
|
foreach my $l (@cvsoutput) {
|
||||||
chomp $l;
|
chomp $l;
|
||||||
if ($l =~ /^File:\s+(.*\S)\s+Status: (.*)$/) {
|
next unless
|
||||||
if (!exists($fullname{$1})) {
|
my ($file, $status) = $l =~ /^File:\s+(.*\S)\s+Status: (.*)$/;
|
||||||
print STDERR "Huh? Status reported for unexpected file '$1'\n";
|
|
||||||
} else {
|
my $fullname = $fullname{$file};
|
||||||
$cvsstat{$fullname{$1}} = $2;
|
print STDERR "Huh? Status '$status' reported for unexpected file '$file'\n"
|
||||||
}
|
unless defined $fullname;
|
||||||
}
|
|
||||||
|
# This response means the file does not exist except in
|
||||||
|
# CVS's attic, so set the status accordingly
|
||||||
|
$status = "In-attic"
|
||||||
|
if $file =~ /^no file /
|
||||||
|
&& $status eq 'Up-to-date';
|
||||||
|
|
||||||
|
$cvsstat{$fullname{$file}} = $status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# ... validate new files,
|
# ... Validate that new files have the correct status
|
||||||
foreach my $f (@afiles) {
|
foreach my $f (@afiles) {
|
||||||
if (defined ($cvsstat{$f}) and $cvsstat{$f} ne "Unknown") {
|
next unless defined(my $stat = $cvsstat{$f});
|
||||||
|
|
||||||
|
# This means the file has never been seen before
|
||||||
|
next if $stat eq 'Unknown';
|
||||||
|
|
||||||
|
# This means the file has been seen before but was removed
|
||||||
|
next if $stat eq 'In-attic';
|
||||||
|
|
||||||
$dirty = 1;
|
$dirty = 1;
|
||||||
warn "File $f is already known in your CVS checkout -- perhaps it has been added by another user. Or this may indicate that it exists on a different branch. If this is the case, use -f to force the merge.\n";
|
warn "File $f is already known in your CVS checkout -- perhaps it has been added by another user. Or this may indicate that it exists on a different branch. If this is the case, use -f to force the merge.\n";
|
||||||
warn "Status was: $cvsstat{$f}\n";
|
warn "Status was: $cvsstat{$f}\n";
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ... validate known files.
|
# ... validate known files.
|
||||||
foreach my $f (@files) {
|
foreach my $f (@files) {
|
||||||
next if grep { $_ eq $f } @afiles;
|
next if grep { $_ eq $f } @afiles;
|
||||||
|
@ -317,4 +317,22 @@ test_expect_success 'use the same checkout for Git and CVS' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 're-commit a removed filename which remains in CVS attic' '
|
||||||
|
|
||||||
|
(cd "$CVSWORK" &&
|
||||||
|
echo >attic_gremlin &&
|
||||||
|
cvs -Q add attic_gremlin &&
|
||||||
|
cvs -Q ci -m "added attic_gremlin" &&
|
||||||
|
rm attic_gremlin &&
|
||||||
|
cvs -Q rm attic_gremlin &&
|
||||||
|
cvs -Q ci -m "removed attic_gremlin") &&
|
||||||
|
|
||||||
|
echo > attic_gremlin &&
|
||||||
|
git add attic_gremlin &&
|
||||||
|
git commit -m "Added attic_gremlin" &&
|
||||||
|
git cvsexportcommit -w "$CVSWORK" -c HEAD &&
|
||||||
|
(cd "$CVSWORK"; cvs -Q update -d) &&
|
||||||
|
test -f "$CVSWORK/attic_gremlin"
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user