chiark / gitweb /
git-debrebase: bomb on totally ambiguous pseudomerges
[dgit.git] / git-debrebase
index c497631c874b8c44391539c618eba04256c32e1d..b69450baaa4f952463e6bbcb925ad0be6a0788e1 100755 (executable)
@@ -33,7 +33,8 @@
 #    git-debrebase [<options>] stitch [--prose=<for commit message>]
 #    git-debrebase [<options>] downstream-rebase-launder-v0  # experimental
 #
-#    git-debrebase [<options>] convert-from-gbp <upstream-git-rev>
+#    git-debrebase [<options>] convert-from-gbp [<upstream-git-rev>]
+#    git-debrebase [<options>] convert-to-gbp
 
 # problems / outstanding questions:
 #
@@ -449,15 +450,23 @@ sub classify ($) {
                           Contributor => $identical[0]);
     }
     if (@p == 2 && @identical == 2) {
-       my @bytime = nsort_by {
-           my ($ph,$pm) = get_commit $_->{CommitId};
+       my $get_t = sub {
+           my ($ph,$pm) = get_commit $_[0]{CommitId};
            $ph =~ m/^committer .* (\d+) [-+]\d+$/m or die "$_->{CommitId} ?";
            $1;
-       } @p;
+       };
+       my @bytime = @p;
+       my $order = $get_t->($bytime[0]) <=> $get_t->($bytime[1]);
+       if ($order > 0) { # newer first
+       } elsif ($order < 0) {
+           @bytime = reverse @bytime;
+       } else {
+           return $unknown->('merge of two identical same-age parents');
+       }
        return $classify->(qw(Pseudomerge),
                           SubType => qw(Ambiguous),
-                          Overwritten => [ $bytime[0] ],
-                          Contributor => $bytime[1]);
+                          Contributor => $bytime[0],
+                          Overwritten => [ $bytime[1] ]);
     }
     foreach my $p (@p) {
        my ($p_h, $p_m) = get_commit $p->{CommitId};
@@ -1277,8 +1286,7 @@ sub cmd_convert_from_gbp () {
     update_head_checkout $old_head, $work, 'convert-from-gbp';
 }
 
-sub cmd_convert_to_gbp_v0 () {
-    # v0 because very raw; does not make pseudomerges or anything
+sub cmd_convert_to_gbp () {
     badusage "no arguments allowed" if @ARGV;
     my $head = get_head();
     my $ffq = (ffq_prev_branchinfo())[3];