git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Baumann <waste.manager@gmx.de>
To: Alex Bennee <kernel-hacker@bennee.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] Make git-cvsexportcommit "status" each file in turn
Date: Wed, 15 Aug 2007 16:04:31 +0200	[thread overview]
Message-ID: <20070815140431.GC4550@xp.machine.xx> (raw)
In-Reply-To: <1187184448.13096.54.camel@murta.transitives.com>

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.

> ---
>  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.)

> 
>  
> @@ -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

  reply	other threads:[~2007-08-15 14:04 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-15 13:27 [PATCH] Make git-cvsexportcommit "status" each file in turn Alex Bennee
2007-08-15 14:04 ` Peter Baumann [this message]
2007-08-15 16:25   ` Alex Bennee
2007-08-15 19:40     ` Robin Rosenberg
2007-08-15 15:47 ` Alex Bennee

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070815140431.GC4550@xp.machine.xx \
    --to=waste.manager@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=kernel-hacker@bennee.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).