[PATCH] cvsgit fixes: spaces in filenames and CVS server dialog woes
authorMatthias Urlichs <smurf@smurf.noris.de>
Mon, 15 Aug 2005 09:28:19 +0000 (11:28 +0200)
committerJunio C Hamano <junkio@cox.net>
Tue, 16 Aug 2005 19:09:33 +0000 (12:09 -0700)
Problems found while importing dasher's CVS:

* Allow spaces in filenames.
* cvsps may create unnamed branches with revisions that don't really
  exist, which causes the CVS server to return something we haven't
  hitherto expected.
* Report deleted files when being verbose.
* Also, report the commit date.
Signed-off-by: Junio C Hamano <junkio@cox.net>
git-cvsimport-script

index 8f57396c2d815a4209e5b52cfb82465d100c4069..3b1fb052a6a552fdb6a344963f096f9368b60d17 100755 (executable)
@@ -294,6 +294,12 @@ sub _line {
                                return $res;
                        } elsif($line =~ s/^E //) {
                                # print STDERR "S: $line\n";
+                       } elsif($line =~ /^Remove-entry /i) {
+                               $line = $self->readline(); # filename
+                               $line = $self->readline(); # OK
+                               chomp $line;
+                               die "Unknown: $line" if $line ne "ok";
+                               return -1;
                        } else {
                                die "Unknown: $line\n";
                        }
@@ -561,7 +567,7 @@ my $commit = sub {
                or die "Error writing to git-commit-tree: $!\n";
        $pw->close();
 
-       print "Committed patch $patchset ($branch)\n" if $opt_v;
+       print "Committed patch $patchset ($branch ".strftime("%Y-%m-%d %H:%M:%S",gmtime($date)).")\n" if $opt_v;
        chomp(my $cid = <$pr>);
        length($cid) == 40
                or die "Cannot get commit id ($cid): $!\n";
@@ -675,26 +681,32 @@ while(<CVS>) {
                $state = 9;
        } elsif($state == 8) {
                $logmsg .= "$_\n";
-       } elsif($state == 9 and /^\s+(\S+):(INITIAL|\d+(?:\.\d+)+)->(\d+(?:\.\d+)+)\s*$/) {
+       } elsif($state == 9 and /^\s+(.+?):(INITIAL|\d+(?:\.\d+)+)->(\d+(?:\.\d+)+)\s*$/) {
 #      VERSION:1.96->1.96.2.1
                my $init = ($2 eq "INITIAL");
                my $fn = $1;
                my $rev = $3;
                $fn =~ s#^/+##;
                my ($tmpname, $size) = $cvs->file($fn,$rev);
-               print "".($init ? "New" : "Update")." $fn: $size bytes.\n" if $opt_v;
-               open my $F, '-|', "git-hash-object -w $tmpname"
-                       or die "Cannot create object: $!\n";
-               my $sha = <$F>;
-               chomp $sha;
-               close $F;
+               if($size == -1) {
+                       push(@old,$fn);
+                       print "Drop $fn\n" if $opt_v;
+               } else {
+                       print "".($init ? "New" : "Update")." $fn: $size bytes\n" if $opt_v;
+                       open my $F, '-|', "git-hash-object -w $tmpname"
+                               or die "Cannot create object: $!\n";
+                       my $sha = <$F>;
+                       chomp $sha;
+                       close $F;
+                       my $mode = pmode($cvs->{'mode'});
+                       push(@new,[$mode, $sha, $fn]); # may be resurrected!
+               }
                unlink($tmpname);
-               my $mode = pmode($cvs->{'mode'});
-               push(@new,[$mode, $sha, $fn]); # may be resurrected!
-       } elsif($state == 9 and /^\s+(\S+):\d(?:\.\d+)+->(\d(?:\.\d+)+)\(DEAD\)\s*$/) {
+       } elsif($state == 9 and /^\s+(.+?):\d(?:\.\d+)+->(\d(?:\.\d+)+)\(DEAD\)\s*$/) {
                my $fn = $1;
                $fn =~ s#^/+##;
                push(@old,$fn);
+               print "Delete $fn\n" if $opt_v;
        } elsif($state == 9 and /^\s*$/) {
                $state = 10;
        } elsif(($state == 9 or $state == 10) and /^-+$/) {