X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-cvsimport-script;h=e3a8e584a562e8e50c5d7316acc653babafcd8ba;hb=1efdd27f54e42746c23944cfe77e568673b2a0fa;hp=3e6d22e74201360fd7520f7b52e91d76e4065572;hpb=fc6e714c838846aad566528f6ada904651c514f9;p=git.git diff --git a/git-cvsimport-script b/git-cvsimport-script index 3e6d22e7..e3a8e584 100755 --- a/git-cvsimport-script +++ b/git-cvsimport-script @@ -28,19 +28,19 @@ use POSIX qw(strftime dup2); $SIG{'PIPE'}="IGNORE"; $ENV{'TZ'}="UTC"; -our($opt_h,$opt_o,$opt_v,$opt_d,$opt_p,$opt_C,$opt_z); +our($opt_h,$opt_o,$opt_v,$opt_k,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s,$opt_m,$opt_M); sub usage() { print STDERR <; chomp $cvs_tree; - close $f + close $f; } else { usage(); } +our @mergerx = (); +if ($opt_m) { + @mergerx = ( qr/\W(?:from|of|merge|merging|merged) (\w+)/i ); +} +if ($opt_M) { + push (@mergerx, qr/$opt_M/); +} + select(STDERR); $|=1; select(STDOUT); @@ -190,7 +199,7 @@ sub conn { $self->{'socketo'}->write("Root $repo\n"); # Trial and error says that this probably is the minimum set - $self->{'socketo'}->write("Valid-responses ok error Valid-requests Mode M Mbinary E F Checked-in Created Updated Merged Removed\n"); + $self->{'socketo'}->write("Valid-responses ok error Valid-requests Mode M Mbinary E Checked-in Created Updated Merged Removed\n"); $self->{'socketo'}->write("valid-requests\n"); $self->{'socketo'}->flush(); @@ -218,8 +227,10 @@ sub _file { my($self,$fn,$rev) = @_; $self->{'socketo'}->write("Argument -N\n") or return undef; $self->{'socketo'}->write("Argument -P\n") or return undef; - # $self->{'socketo'}->write("Argument -ko\n") or return undef; - # -ko: Linus' version doesn't use it + # -kk: Linus' version doesn't use it - defaults to off + if ($opt_k) { + $self->{'socketo'}->write("Argument -kk\n") or return undef; + } $self->{'socketo'}->write("Argument -r\n") or return undef; $self->{'socketo'}->write("Argument $rev\n") or return undef; $self->{'socketo'}->write("Argument --\n") or return undef; @@ -294,6 +305,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"; } @@ -317,6 +334,7 @@ sub file { $res = $self->_line($fh); die "No input: $fn $rev\n" unless defined $res; } + close ($fh); return ($name, $res); } @@ -365,6 +383,22 @@ sub getwd() { return $pwd; } + +sub get_headref($$) { + my $name = shift; + my $git_dir = shift; + my $sha; + + if (open(C,"$git_dir/refs/heads/$name")) { + chomp($sha = ); + close(C); + length($sha) == 40 + or die "Cannot get head id for $name ($sha): $!\n"; + } + return $sha; +} + + -d $git_tree or mkdir($git_tree,0777) or die "Could not create $git_tree: $!"; @@ -372,6 +406,7 @@ chdir($git_tree); my $last_branch = ""; my $orig_branch = ""; +my $forward_master = 0; my %branch_date; my $git_dir = $ENV{"GIT_DIR"} || ".git"; @@ -403,6 +438,21 @@ unless(-d $git_dir) { $last_branch = "master"; } $orig_branch = $last_branch; + if (-f "$git_dir/CVS2GIT_HEAD") { + die <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"; @@ -596,6 +662,7 @@ while() { $state = 4; } elsif($state == 4 and s/^Branch:\s+//) { s/\s+$//; + s/[\/]/$opt_s/g; $branch = $_; $state = 5; } elsif($state == 5 and s/^Ancestor branch:\s+//) { @@ -658,26 +725,32 @@ while() { $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-write-blob $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 /^-+$/) { @@ -695,9 +768,21 @@ while() { unlink($git_index); +if (defined $orig_git_index) { + $ENV{GIT_INDEX_FILE} = $orig_git_index; +} else { + delete $ENV{GIT_INDEX_FILE}; +} + # Now switch back to the branch we were in before all of this happened if($orig_branch) { print "DONE\n" if $opt_v; + system("cp","$git_dir/refs/heads/$opt_o","$git_dir/refs/heads/master") + if $forward_master; + unless ($opt_i) { + system('git-read-tree', '-m', '-u', 'CVS2GIT_HEAD', 'HEAD'); + die "read-tree failed: $?\n" if $?; + } } else { $orig_branch = "master"; print "DONE; creating $orig_branch branch\n" if $opt_v; @@ -705,11 +790,9 @@ if($orig_branch) { unless -f "$git_dir/refs/heads/master"; unlink("$git_dir/HEAD"); symlink("refs/heads/$orig_branch","$git_dir/HEAD"); - if (defined $orig_git_index) { - $ENV{GIT_INDEX_FILE} = $orig_git_index; - } else { - delete $ENV{GIT_INDEX_FILE}; + unless ($opt_i) { + system('git checkout'); + die "checkout failed: $?\n" if $?; } - system('git checkout'); - die "checkout failed: $?\n" if $?; } +unlink("$git_dir/CVS2GIT_HEAD");