cvsimport: honor -i and non -i upon subsequent imports
authorJunio C Hamano <junkio@cox.net>
Fri, 17 Mar 2006 22:08:39 +0000 (14:08 -0800)
committerJunio C Hamano <junkio@cox.net>
Fri, 17 Mar 2006 22:10:16 +0000 (14:10 -0800)
Documentation says -i is "import only", so without it,
subsequent import should update the current branch and working
tree files in a sensible way.

"A sensible way" defined by this commit is "act as if it is a
git pull from foreign repository which happens to be CVS not
git". So:

- If importing into the current branch (note that cvsimport
requires the tracking branch is pristine -- you checked out
the tracking branch but it is your responsibility not to make
your own commits there), fast forward the branch head and
match the index and working tree using two-way merge, just
like "git pull" does.

- If importing into a separate tracking branch, update that
branch head, and merge it into your current branch, again,
just like "git pull" does.

Signed-off-by: Junio C Hamano <junkio@cox.net>
git-cvsimport.perl
index 02d1928ada5001d938a549bd9a33acd4b9c0f074..6c0f5d29380015fb4fb2c2948bb367e8d493e793 100755 (executable)
@@ -453,6 +453,7 @@ ($$)
 my $last_branch = "";
 my $orig_branch = "";
 my %branch_date;
+my $tip_at_start = undef;
 
 my $git_dir = $ENV{"GIT_DIR"} || ".git";
 $git_dir = getwd()."/".$git_dir unless $git_dir =~ m#^/#;
@@ -487,6 +488,7 @@ ($$)
                $last_branch = "master";
        }
        $orig_branch = $last_branch;
+       $tip_at_start = `git-rev-parse --verify HEAD`;
 
        # populate index
        system('git-read-tree', $last_branch);
@@ -873,7 +875,21 @@ ($$)
 
 # Now switch back to the branch we were in before all of this happened
 if($orig_branch) {
-       print "DONE; you may need to merge manually.\n" if $opt_v;
+       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) {
+               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;