Re: [PATCH] Make git-cvsexportcommit "status" each file in turn
From: Peter Baumann <hidden>
Date: 2016-06-15 22:43:29
On Wed, Aug 15, 2007 at 02:27:28PM +0100, Alex Bennee wrote:
Hi, It turns out CVS doesn't always give the status output in the order requested. According to my local CVS gurus this is a known CVS issue. The attached patch just makes the script check each file in turn. It's slower but correct. I also slightly formatted the warn output when it detects problems as multiple line wraps with long file paths where making my eyes bleed :-)
I inlined the patch for easier commenting. Please inline further patches.
quoted hunk ↗ jump to hunk
--- git-cvsexportcommit.perl | 30 ++++++++++++++++++++---------- 1 files changed, 20 insertions(+), 10 deletions(-)diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl index e9832d2..ee02c56 100755 --- a/git-cvsexportcommit.perl +++ b/git-cvsexportcommit.perl@@ -182,15 +182,21 @@ if (@canstatusfiles) { my @updated = safe_pipe_capture(@cvs, 'update', @canstatusfiles); print @updated; } - my @cvsoutput; - @cvsoutput= 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++; - } + + # We can't status all the files at once as CVS doesn't gaurentee + # that it will output the status bits in the order requested. + + foreach my $f (@canstatusfiles) + { + my $cvscmd = join(' ', @cvs)." status $f"; + my $cvsoutput = `$cvscmd`; + + # slurp out the status out of the result + my ($status) = $cvsoutput =~ m/.*Status: (\S*)/; + + $opt_v && print "Status of $f is $status\n"; + + $cvsstat{$f} = $status; } }
This is extremly wastefull, because it will spawn a CVS process for each file. A better fix would be to parse the filename from the output of 'cvs status' and use that as input for $cvsstat. (And/or you could use an hash instead of an array for 'cvsoutput', so you could double check that you only get the status for those files you asked for.)
quoted hunk ↗ jump to hunk
@@ -198,10 +204,14 @@ if (@canstatusfiles) { foreach my $f (@afiles) { if (defined ($cvsstat{$f}) and $cvsstat{$f} ne "Unknown") { $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.\n" + warn " Perhaps it has been added by another user.\n" + warn " Or this may indicate that it exists on a different branch.\n" + warn " 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;-- 1.5.2.3
-Peter