chiark / gitweb /
git-debrebase: launder: fix
[dgit.git] / git-debrebase
index c3ff3afba33178f8b4d297327838e7a0c8996af7..ee074f98cdecaf401cc26a38333dc458e83a8e52 100755 (executable)
@@ -690,7 +690,14 @@ sub get_head () { return git_rev_parse qw(HEAD); }
 
 sub update_head ($$$) {
     my ($old, $new, $mrest) = @_;
-    runcmd @git, qw(update-ref -m), "git-debrebase $mrest", $new, $old;
+    runcmd @git, qw(update-ref -m), "debrebase: $mrest", 'HEAD', $new, $old;
+}
+
+sub update_head_checkout ($$$) {
+    my ($old, $new, $mrest) = @_;
+    my $symref = git_get_symref();
+    runcmd @git, qw(checkout), $new, qw(.);
+    update_head $old, $new, $mrest;
 }
 
 sub cmd_launder () {
@@ -717,7 +724,7 @@ sub cmd_analyse () {
 }
 
 sub cmd_downstream_rebase_launder_v0 () {
-    badusage "needs 1 argument, the baseline" unless @ARGV=0;
+    badusage "needs 1 argument, the baseline" unless @ARGV==1;
     my ($base) = @ARGV;
     $base = git_rev_parse $base;
     my $old_head = get_head();
@@ -725,24 +732,25 @@ sub cmd_downstream_rebase_launder_v0 () {
     my $topmost_keep;
     for (;;) {
        if ($current eq $base) {
-           $topmust_keep //= $current;
-           print "$current BASE: stopping\n";
+           $topmost_keep //= $current;
+           print " $current BASE stop\n";
            last;
        }
        my $cl = classify $current;
        print " $current $cl->{Type}";
        my $keep = 0;
        my $p0 = $cl->{Parents}[0]{CommitId};
+       my $next;
        if ($cl->{Type} eq 'Pseudomerge') {
-           $current = $cl->{Contributor}{CommitId};
            print " ^".($cl->{Contributor}{Ix}+1);
+           $next = $cl->{Contributor}{CommitId};
        } elsif ($cl->{Type} eq 'AddPatches' or
                 $cl->{Type} eq 'Changelog') {
            print " strip";
-           $current = $p0;
+           $next = $p0;
        } else {
            print " keep";
-           $current = $p0;
+           $next = $p0;
            $keep = 1;
        }
        print "\n";
@@ -750,14 +758,17 @@ sub cmd_downstream_rebase_launder_v0 () {
            $topmost_keep //= $current;
        } else {
            die "to-be stripped changes not on top of the branch\n"
-               if $topmost_unstripped;
+               if $topmost_keep;
        }
+       $current = $next;
     }
     if ($topmost_keep eq $old_head) {
        print "unchanged\n";
     } else {
        print "updating to $topmost_keep\n";
-       update_head $old_head, $topmost_keep, 'downstream-rebase-launder-v0';
+       update_head_checkout
+           $old_head, $topmost_keep,
+           'downstream-rebase-launder-v0';
     }
 }