diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-02-20 16:13:52 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-02-20 16:13:52 -0800 |
commit | 6fe870f032e4a247cdcf2949bb24d103873ff597 (patch) | |
tree | 520a2cdb3b4e07a2c4c7a03e88ca28cf55a74e0a /git-cvsexportcommit.perl | |
parent | 378b2607f07bd2fa0eaa8648e7dc8db636708d74 (diff) | |
parent | fef3a7cc5593d3951a5f95c92986fb9982c2cc86 (diff) | |
download | git-6fe870f032e4a247cdcf2949bb24d103873ff597.tar.gz |
Merge branch 'js/maint-cvsexport'
* js/maint-cvsexport:
cvsexportcommit: be graceful when "cvs status" reorders the arguments
Conflicts:
t/t9200-git-cvsexportcommit.sh
Diffstat (limited to 'git-cvsexportcommit.perl')
-rwxr-xr-x | git-cvsexportcommit.perl | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl index 2a8ad1e9f4..b6036bd4d3 100755 --- a/git-cvsexportcommit.perl +++ b/git-cvsexportcommit.perl @@ -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; + } + } + } } } |