--- This patch can be applied to spearce/next The other patch for removing --binary should still be applicable. git-cvsexportcommit.perl | 277 +++++++++++++++++++++++----------------------- 1 files changed, 139 insertions(+), 138 deletions(-) diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl index 6b0123c..9dac7aa 100755 --- a/git-cvsexportcommit.perl +++ b/git-cvsexportcommit.perl @@ -12,7 +12,7 @@ use Data::Dumper; use File::Basename qw(basename dirname); unless ($ENV{GIT_DIR} && -r $ENV{GIT_DIR}){ - die "GIT_DIR is not defined or is unreadable"; + die "GIT_DIR is not defined or is unreadable"; } our ($opt_h, $opt_P, $opt_p, $opt_v, $opt_c, $opt_f, $opt_a, $opt_m, $opt_d, $opt_u); @@ -36,18 +36,18 @@ $commit = pop @ARGV; $commit = safe_pipe_capture('git-rev-parse', '--verify', "$commit^0"); chomp $commit; if ($?) { - die "The commit reference $commit did not resolve!"; + die "The commit reference $commit did not resolve!"; } # resolve what parent we want my $parent; if (@ARGV) { - $parent = pop @ARGV; - $parent = safe_pipe_capture('git-rev-parse', '--verify', "$parent^0"); - chomp $parent; - if ($?) { - die "The parent reference did not resolve!"; - } + $parent = pop @ARGV; + $parent = safe_pipe_capture('git-rev-parse', '--verify', "$parent^0"); + chomp $parent; + if ($?) { + die "The parent reference did not resolve!"; + } } # find parents from the commit itself @@ -60,44 +60,44 @@ my $title; my $msg = ''; foreach my $line (@commit) { - chomp $line; - if ($stage eq 'headers' && $line eq '') { - $stage = 'msg'; - next; - } - - if ($stage eq 'headers') { - if ($line =~ m/^parent (\w{40})$/) { # found a parent - push @parents, $1; - } elsif ($line =~ m/^author (.+) \d+ [-+]\d+$/) { - $author = $1; - } elsif ($line =~ m/^committer (.+) \d+ [-+]\d+$/) { - $committer = $1; + chomp $line; + if ($stage eq 'headers' && $line eq '') { + $stage = 'msg'; + next; } - } else { - $msg .= $line . "\n"; - unless ($title) { - $title = $line; + + if ($stage eq 'headers') { + if ($line =~ m/^parent (\w{40})$/) { # found a parent + push @parents, $1; + } elsif ($line =~ m/^author (.+) \d+ [-+]\d+$/) { + $author = $1; + } elsif ($line =~ m/^committer (.+) \d+ [-+]\d+$/) { + $committer = $1; + } + } else { + $msg .= $line . "\n"; + unless ($title) { + $title = $line; + } } - } } if ($parent) { - my $found; - # double check that it's a valid parent - foreach my $p (@parents) { - if ($p eq $parent) { - $found = 1; - last; - }; # found it - } - die "Did not find $parent in the parents for this commit!" if !$found and !$opt_P; + my $found; + # double check that it's a valid parent + foreach my $p (@parents) { + if ($p eq $parent) { + $found = 1; + last; + }; # found it + } + die "Did not find $parent in the parents for this commit!" if !$found and !$opt_P; } else { # we don't have a parent from the cmdline... - if (@parents == 1) { # it's safe to get it from the commit - $parent = $parents[0]; - } else { # or perhaps not! - die "This commit has more than one parent -- please name the parent you want to use explicitly"; - } + if (@parents == 1) { # it's safe to get it from the commit + $parent = $parents[0]; + } else { # or perhaps not! + die "This commit has more than one parent -- please name the parent you want to use explicitly"; + } } $opt_v && print "Applying to CVS commit $commit from parent $parent\n"; @@ -105,14 +105,14 @@ $opt_v && print "Applying to CVS commit $commit from parent $parent\n"; # grab the commit message open(MSG, ">.msg") or die "Cannot open .msg for writing"; if ($opt_m) { - print MSG $opt_m; + print MSG $opt_m; } print MSG $msg; if ($opt_a) { - print MSG "\n\nAuthor: $author\n"; - if ($author ne $committer) { - print MSG "Committer: $committer\n"; - } + print MSG "\n\nAuthor: $author\n"; + if ($author ne $committer) { + print MSG "Committer: $committer\n"; + } } close MSG; @@ -148,70 +148,71 @@ map { s/\\([0-7]{3})/sprintf('%c',oct $1)/eg } @bfiles,@files; my $dirty; my @dirs; foreach my $p (@afiles) { - my $path = dirname $p; - while (!-d $path and ! grep { $_ eq $path } @dirs) { - unshift @dirs, $path; - $path = dirname $path; - } + my $path = dirname $p; + while (!-d $path and ! grep { $_ eq $path } @dirs) { + unshift @dirs, $path; + $path = dirname $path; + } } # ... check dirs, foreach my $d (@dirs) { - if (-e $d) { - $dirty = 1; - warn "$d exists and is not a directory!\n"; - } + if (-e $d) { + $dirty = 1; + warn "$d exists and is not a directory!\n"; + } } # ... query status of all files that we have a directory for and parse output of 'cvs status' to %cvsstat. my @canstatusfiles; foreach my $f (@files) { - my $path = dirname $f; - next if (grep { $_ eq $path } @dirs); - push @canstatusfiles, $f; + my $path = dirname $f; + next if (grep { $_ eq $path } @dirs); + push @canstatusfiles, $f; } my %cvsstat; if (@canstatusfiles) { - if ($opt_u) { - 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++; - } - } + if ($opt_u) { + 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++; + } + } } # ... validate new files, 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 "Status was: $cvsstat{$f}\n"; - } + 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 "Status was: $cvsstat{$f}\n"; + } } # ... validate known files. foreach my $f (@files) { - next if grep { $_ eq $f } @afiles; - # TODO:we need to handle removed in cvs - unless (defined ($cvsstat{$f}) and $cvsstat{$f} eq "Up-to-date") { - $dirty = 1; - warn "File $f not up to date but has status '$cvsstat{$f}' in your CVS checkout!\n"; - } + next if grep { $_ eq $f } @afiles; + # TODO:we need to handle removed in cvs + unless (defined ($cvsstat{$f}) and $cvsstat{$f} eq "Up-to-date") { + $dirty = 1; + warn "File $f not up to date but has status '$cvsstat{$f}' in your CVS checkout!\n"; + } } if ($dirty) { - if ($opt_f) { warn "The tree is not clean -- forced merge\n"; - $dirty = 0; - } else { - die "Exiting: your CVS tree is not clean for this merge."; - } + if ($opt_f) { + warn "The tree is not clean -- forced merge\n"; + $dirty = 0; + } else { + die "Exiting: your CVS tree is not clean for this merge."; + } } print "Applying\n"; @@ -220,30 +221,30 @@ print "Applying\n"; print "Patch applied successfully. Adding new files and directories to CVS\n"; my $dirtypatch = 0; foreach my $d (@dirs) { - if (system(@cvs,'add',$d)) { - $dirtypatch = 1; - warn "Failed to cvs add directory $d -- you may need to do it manually"; - } + if (system(@cvs,'add',$d)) { + $dirtypatch = 1; + warn "Failed to cvs add directory $d -- you may need to do it manually"; + } } foreach my $f (@afiles) { - if (grep { $_ eq $f } @bfiles) { - system(@cvs, 'add','-kb',$f); - } else { - system(@cvs, 'add', $f); - } - if ($?) { - $dirtypatch = 1; - warn "Failed to cvs add $f -- you may need to do it manually"; - } + if (grep { $_ eq $f } @bfiles) { + system(@cvs, 'add','-kb',$f); + } else { + system(@cvs, 'add', $f); + } + if ($?) { + $dirtypatch = 1; + warn "Failed to cvs add $f -- you may need to do it manually"; + } } foreach my $f (@dfiles) { - system(@cvs, 'rm', '-f', $f); - if ($?) { - $dirtypatch = 1; - warn "Failed to cvs rm -f $f -- you may need to do it manually"; - } + system(@cvs, 'rm', '-f', $f); + if ($?) { + $dirtypatch = 1; + warn "Failed to cvs rm -f $f -- you may need to do it manually"; + } } print "Commit to CVS\n"; @@ -252,25 +253,25 @@ my @commitfiles = map { unless (m/\s/) { '\''.$_.'\''; } else { $_; }; } (@files my $cmd = join(' ', @cvs)." commit -F .msg @commitfiles"; if ($dirtypatch) { - print "NOTE: One or more hunks failed to apply cleanly.\n"; - print "You'll need to apply the patch in .cvsexportcommit.diff manually\n"; - print "using a patch program. After applying the patch and resolving the\n"; - print "problems you may commit using:"; - print "\n $cmd\n\n"; - exit(1); + print "NOTE: One or more hunks failed to apply cleanly.\n"; + print "You'll need to apply the patch in .cvsexportcommit.diff manually\n"; + print "using a patch program. After applying the patch and resolving the\n"; + print "problems you may commit using:"; + print "\n $cmd\n\n"; + exit(1); } if ($opt_c) { - print "Autocommit\n $cmd\n"; - print safe_pipe_capture(@cvs, 'commit', '-F', '.msg', @files); - if ($?) { - die "Exiting: The commit did not succeed"; - } - print "Committed successfully to CVS\n"; - # clean up - unlink(".msg"); + print "Autocommit\n $cmd\n"; + print safe_pipe_capture(@cvs, 'commit', '-F', '.msg', @files); + if ($?) { + die "Exiting: The commit did not succeed"; + } + print "Committed successfully to CVS\n"; + # clean up + unlink(".msg"); } else { - print "Ready for you to commit, just run:\n\n $cmd\n"; + print "Ready for you to commit, just run:\n\n $cmd\n"; } # clean up @@ -292,25 +293,25 @@ END # to work around shell problems with weird characters in arguments # if the exec returns non-zero we die sub safe_pipe_capture { - my @output; - if (my $pid = open my $child, '-|') { - @output = (<$child>); - close $child or die join(' ',@_).": $! $?"; - } else { - exec(@_) or die "$! $?"; # exec() can fail the executable can't be found - } - return wantarray ? @output : join('',@output); + my @output; + if (my $pid = open my $child, '-|') { + @output = (<$child>); + close $child or die join(' ',@_).": $! $?"; + } else { + exec(@_) or die "$! $?"; # exec() can fail the executable can't be found + } + return wantarray ? @output : join('',@output); } sub safe_pipe_capture_blob { - my $output; - if (my $pid = open my $child, '-|') { - local $/; - undef $/; - $output = (<$child>); - close $child or die join(' ',@_).": $! $?"; - } else { - exec(@_) or die "$! $?"; # exec() can fail the executable can't be found - } - return $output; + my $output; + if (my $pid = open my $child, '-|') { + local $/; + undef $/; + $output = (<$child>); + close $child or die join(' ',@_).": $! $?"; + } else { + exec(@_) or die "$! $?"; # exec() can fail the executable can't be found + } + return $output; } -- 1.5.3.4.209.g397ef-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html