X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=git-cvsimport-script;h=8f57396c2d815a4209e5b52cfb82465d100c4069;hb=b7e438f951f68be704b001343811e9ff89da07f7;hp=cc684602f389f39c33380daef21208b25280d0f7;hpb=2eb6d82eaa869a1faf4ba3326fd628f76f9f93a8;p=git.git diff --git a/git-cvsimport-script b/git-cvsimport-script index cc684602..8f57396c 100755 --- a/git-cvsimport-script +++ b/git-cvsimport-script @@ -16,6 +16,8 @@ use strict; use warnings; use Getopt::Std; +use File::Spec; +use File::Temp qw(tempfile); use File::Path qw(mkpath); use File::Basename qw(basename dirname); use Time::Local; @@ -26,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); +our($opt_h,$opt_o,$opt_v,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i); sub usage() { print STDERR <_line($fh); die "No input: $fn $rev\n" unless defined $res; } + close ($fh); return ($name, $res); } @@ -357,8 +360,6 @@ sub pmode($) { return $m; } -my $tmpcv = "/var/cache/cvs"; - sub getwd() { my $pwd = `pwd`; chomp $pwd; @@ -372,11 +373,18 @@ chdir($git_tree); my $last_branch = ""; my $orig_branch = ""; +my $forward_master = 0; my %branch_date; my $git_dir = $ENV{"GIT_DIR"} || ".git"; $git_dir = getwd()."/".$git_dir unless $git_dir =~ m#^/#; $ENV{"GIT_DIR"} = $git_dir; +my $orig_git_index; +$orig_git_index = $ENV{GIT_INDEX_FILE} if exists $ENV{GIT_INDEX_FILE}; +my ($git_ih, $git_index) = tempfile('gitXXXXXX', SUFFIX => '.idx', + DIR => File::Spec->tmpdir()); +close ($git_ih); +$ENV{GIT_INDEX_FILE} = $git_index; unless(-d $git_dir) { system("git-init-db"); die "Cannot init the GIT db at $git_tree: $?\n" if $?; @@ -397,6 +405,25 @@ unless(-d $git_dir) { $last_branch = "master"; } $orig_branch = $last_branch; + if (-f "$git_dir/CVS2GIT_HEAD") { + die <new(); - my $pw = IO::Pipe->new(); + my $pr = IO::Pipe->new() or die "Cannot open pipe: $!\n"; + my $pw = IO::Pipe->new() or die "Cannot open pipe: $!\n"; $pid = fork(); die "Fork: $!\n" unless defined $pid; unless($pid) { @@ -640,18 +668,14 @@ while() { } if(($ancestor || $branch) ne $last_branch) { print "Switching from $last_branch to $branch\n" if $opt_v; - system("git-read-tree","-m","$last_branch","$branch"); + system("git-read-tree", $branch); die "read-tree failed: $?\n" if $?; } - if($branch ne $last_branch) { - unlink("$git_dir/HEAD"); - symlink("refs/heads/$branch","$git_dir/HEAD"); - $last_branch = $branch; - } + $last_branch = $branch if $branch ne $last_branch; $state = 9; } elsif($state == 8) { $logmsg .= "$_\n"; - } elsif($state == 9 and /^\s+(\S+):(INITIAL|\d(?:\.\d+)+)->(\d(?:\.\d+)+)\s*$/) { + } elsif($state == 9 and /^\s+(\S+):(INITIAL|\d+(?:\.\d+)+)->(\d+(?:\.\d+)+)\s*$/) { # VERSION:1.96->1.96.2.1 my $init = ($2 eq "INITIAL"); my $fn = $1; @@ -659,7 +683,7 @@ while() { $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" + open my $F, '-|', "git-hash-object -w $tmpname" or die "Cannot create object: $!\n"; my $sha = <$F>; chomp $sha; @@ -686,26 +710,33 @@ while() { } &$commit() if $branch and $state != 11; +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; switching back to $orig_branch\n" if $opt_v; + 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; system("cp","$git_dir/refs/heads/$opt_o","$git_dir/refs/heads/master") unless -f "$git_dir/refs/heads/master"; + unlink("$git_dir/HEAD"); + symlink("refs/heads/$orig_branch","$git_dir/HEAD"); + unless ($opt_i) { + system('git checkout'); + die "checkout failed: $?\n" if $?; + } } - -if ($orig_branch) { - system("git-read-tree",$last_branch); - die "read-tree failed: $?\n" if $?; -} else { - system('git-read-tree', $orig_branch); - die "read-tree failed: $?\n" if $?; - system('git-checkout-cache', '-a'); - die "checkout-cache failed: $?\n" if $?; -} - -unlink("$git_dir/HEAD"); -symlink("refs/heads/$orig_branch","$git_dir/HEAD"); - +unlink("$git_dir/CVS2GIT_HEAD");