diff options
| author | Nick Woolley <nickwoolley@yahoo.co.uk> | 2009-05-29 00:23:33 +0100 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2009-05-28 23:51:03 -0700 | 
| commit | 54d5cc0e126ed4b6cc4b186efd9faf7b93df570f (patch) | |
| tree | f3ae07ac96daa048e6ae2bd65f7873431af9cf2d /git-cvsexportcommit.perl | |
| parent | e57cb0158209ece040a4b873064504efd7d2ec0e (diff) | |
| download | git-54d5cc0e126ed4b6cc4b186efd9faf7b93df570f.tar.gz | |
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>
Diffstat (limited to 'git-cvsexportcommit.perl')
| -rwxr-xr-x | git-cvsexportcommit.perl | 49 | 
1 files changed, 35 insertions, 14 deletions
diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl index 6d9f0ef0f9..9ec1df95c0 100755 --- a/git-cvsexportcommit.perl +++ b/git-cvsexportcommit.perl @@ -225,7 +225,14 @@ if (@canstatusfiles) {        foreach my $name (keys %todo) {  	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+$//; @@ -233,31 +240,45 @@ if (@canstatusfiles) {  	  $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; -	  } -	} +	chomp $l; +	next unless +	    my ($file, $status) = $l =~ /^File:\s+(.*\S)\s+Status: (.*)$/; + +	my $fullname = $fullname{$file}; +	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) { -    if (defined ($cvsstat{$f}) and $cvsstat{$f} ne "Unknown") { -	$dirty = 1; +    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;  	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"; -    }  } +  # ... validate known files.  foreach my $f (@files) {      next if grep { $_ eq $f } @afiles;  | 
