diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-03-08 02:13:52 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-03-08 02:13:52 -0800 |
commit | 274d9d329444705ba771e548352918699e6bb557 (patch) | |
tree | 84840a0fd3c48ff360478fac43f3f4369ad0c57f /git-cvsexportcommit.perl | |
parent | 925ca887b8ade2a5de6b50652008d0ee1fff3215 (diff) | |
parent | fef3a7cc5593d3951a5f95c92986fb9982c2cc86 (diff) | |
download | git-274d9d329444705ba771e548352918699e6bb557.tar.gz git-274d9d329444705ba771e548352918699e6bb557.tar.xz |
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
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 2a8ad1e9f..b6036bd4d 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; + } + } + } } } |