X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-cvsimport.perl;h=c0ae00bda74e68f98efc63c093efb73c7ff914f4;hb=4ee6bc99133760531dd25013c7a7165b2feed9cd;hp=8619e7d18382ae41f87b5959b9233718ed99def6;hpb=8fc11b5aa98540f7caab87e22e5aae63512893a2;p=git.git diff --git a/git-cvsimport.perl b/git-cvsimport.perl index 8619e7d1..c0ae00bd 100755 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -29,19 +29,63 @@ use IPC::Open2; $SIG{'PIPE'}="IGNORE"; $ENV{'TZ'}="UTC"; -our($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_P, $opt_s,$opt_m,$opt_M); +our($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_P, $opt_s,$opt_m,$opt_M,$opt_A,$opt_S); +my (%conv_author_name, %conv_author_email); sub usage() { print STDERR <) { + # Expected format is this: + # exon=Andreas Ericsson + if (m/^(\S+?)\s*=\s*(.+?)\s*<(.+)>\s*$/) { + $user = $1; + $conv_author_name{$user} = $2; + $conv_author_email{$user} = $3; + } + # However, we also read from CVSROOT/users format + # to ease migration. + elsif (/^(\w+):(['"]?)(.+?)\2\s*$/) { + my $mapped; + ($user, $mapped) = ($1, $3); + if ($mapped =~ /^\s*(.*?)\s*<(.*)>\s*$/) { + $conv_author_name{$user} = $1; + $conv_author_email{$user} = $2; + } + elsif ($mapped =~ /^?$/) { + $conv_author_name{$user} = $user; + $conv_author_email{$user} = $1; + } + } + # NEEDSWORK: Maybe warn on unrecognized lines? + } + close ($f); +} + +sub write_author_info($) { + my ($file) = @_; + open my $f, '>', $file or + die("Failed to open $file for writing: $!"); + + foreach (keys %conv_author_name) { + print $f "$_=$conv_author_name{$_} <$conv_author_email{$_}>\n"; + } + close ($f); +} + +getopts("hivmkuo:d:p:C:z:s:M:P:A:S:") or usage(); usage if $opt_h; @ARGV <= 1 or usage(); @@ -317,6 +361,7 @@ sub _line { } } } + return undef; } sub file { my($self,$fn,$rev) = @_; @@ -328,19 +373,15 @@ sub file { $self->_file($fn,$rev) and $res = $self->_line($fh); if (!defined $res) { - # retry + print STDERR "Server has gone away while fetching $fn $rev, retrying...\n"; + truncate $fh, 0; $self->conn(); - $self->_file($fn,$rev) - or die "No file command send\n"; + $self->_file($fn,$rev) or die "No file command send"; $res = $self->_line($fh); - die "No input: $fn $rev\n" unless defined $res; + die "Retry failed" unless defined $res; } close ($fh); - if ($res eq '') { - die "Looks like the server has gone away while fetching $fn $rev -- exiting!"; - } - return ($name, $res); } @@ -411,8 +452,8 @@ chdir($git_tree); my $last_branch = ""; my $orig_branch = ""; -my $forward_master = 0; my %branch_date; +my $tip_at_start = undef; my $git_dir = $ENV{"GIT_DIR"} || ".git"; $git_dir = getwd()."/".$git_dir unless $git_dir =~ m#^/#; @@ -447,21 +488,7 @@ unless(-d $git_dir) { $last_branch = "master"; } $orig_branch = $last_branch; - if (-f "$git_dir/CVS2GIT_HEAD") { - die < 32767; $logmsg =~ s/[\s\n]+\z//; + if (@skipped) { + $logmsg .= "\n\n\nSKIPPED:\n\t"; + $logmsg .= join("\n\t", @skipped) . "\n"; + } + print $pw "$logmsg\n" or die "Error writing to git-commit-tree: $!\n"; $pw->close(); @@ -637,11 +677,7 @@ my $commit = sub { waitpid($pid,0); die "Error running git-commit-tree: $?\n" if $?; - open(C,">$git_dir/refs/heads/$branch") - or die "Cannot open branch $branch for update: $!\n"; - print C "$cid\n" - or die "Cannot write branch $branch for update: $!\n"; - close(C) + system("git-update-ref refs/heads/$branch $cid") == 0 or die "Cannot write branch $branch for update: $!\n"; if($tag) { @@ -702,6 +738,9 @@ while() { s/\s+$//; if (/^(.*?)\s+<(.*)>/) { ($author_name, $author_email) = ($1, $2); + } elsif ($conv_author_name{$_}) { + $author_name = $conv_author_name{$_}; + $author_email = $conv_author_email{$_}; } else { $author_name = $author_email = $_; } @@ -777,14 +816,24 @@ while() { my $fn = $1; my $rev = $3; $fn =~ s#^/+##; + if ($opt_S && $fn =~ m/$opt_S/) { + print "SKIPPING $fn v $rev\n"; + push(@skipped, $fn); + next; + } + print "Fetching $fn v $rev\n" if $opt_v; my ($tmpname, $size) = $cvs->file($fn,$rev); 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" + my $pid = open(my $F, '-|'); + die $! unless defined $pid; + if (!$pid) { + exec("git-hash-object", "-w", $tmpname) or die "Cannot create object: $!\n"; + } my $sha = <$F>; chomp $sha; close $F; @@ -822,17 +871,26 @@ if (defined $orig_git_index) { # 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 $?; + print "DONE.\n" if $opt_v; + if ($opt_i) { + exit 0; + } + my $tip_at_end = `git-rev-parse --verify HEAD`; + if ($tip_at_start ne $tip_at_end) { + for ($tip_at_start, $tip_at_end) { chomp; } + print "Fetched into the current branch.\n" if $opt_v; + system(qw(git-read-tree -u -m), + $tip_at_start, $tip_at_end); + die "Fast-forward update failed: $?\n" if $?; + } + else { + system(qw(git-merge cvsimport HEAD), "refs/heads/$opt_o"); + die "Could not merge $opt_o into the current branch.\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") + system("git-update-ref", "refs/heads/master", "refs/heads/$opt_o") unless -f "$git_dir/refs/heads/master"; system('git-update-ref', 'HEAD', "$orig_branch"); unless ($opt_i) { @@ -840,4 +898,3 @@ if($orig_branch) { die "checkout failed: $?\n" if $?; } } -unlink("$git_dir/CVS2GIT_HEAD");