chiark / gitweb /
git-debrebase: merge: Fix a $nomerge message
[dgit.git] / git-debrebase
index 6d51a90ba7c1cd50c7d6d3062a823acb76d24732..1e8de52941e10f68a80dc244642925ac0169cbd4 100755 (executable)
@@ -395,10 +395,8 @@ sub merge_series ($$;@) {
        foreach my $q ($base_q, reverse @input_qs) {
            my $s = $q->{MR}{S};
            gbp_pq_export "p-$s", $q->{SeriesBase}, $q->{SeriesTip};
-           # xxx avoid trying to merge debian/ again here, by
-           # always using debian/ from newbase
+           my @earlier;
            if (open S, $seriesfile) {
-               my @earlier;
                while (my $patch = <S>) {
                    chomp $patch or die $!;
                    $prereq{$patch} //= {};
@@ -426,6 +424,20 @@ sub merge_series ($$;@) {
                 "[git-debrebase merge-innards patch-queue prep:".
                 " $q->{SeriesTip}]"
             ];
+
+           read_tree_debian $newbase;
+           if (@earlier) {
+               read_tree_subdir 'debian/patches', "$pec:debian/patches";
+           } else {
+               rm_subdir_cached 'debian/patches';
+           }
+           $pec = make_commit [ $pec ], [
+ "Update debian/ (excluding patches) to final to avoid re-merging",
+ "debian/ was already merged and we need to just take that.",
+                "[git-debrebase merge-innards patch-queue packaging:".
+                " $q->{SeriesTip}]"
+            ];
+
            printdebug "pec' $pec\n";
             runcmd @git, qw(reset -q --hard), $pec;
            $q->{MR}{PEC} = $pec;
@@ -834,6 +846,8 @@ sub mergedbreakwaters_anchor ($) {
        $best_anchor = $panchor
            if !defined $best_anchor
            or is_fast_fwd $best_anchor, $panchor;
+       fail "inconsistent anchors in merged-breakwaters $p->{CommitId}"
+           unless is_fast_fwd $panchor, $best_anchor;
     }
     return $best_anchor;
 }
@@ -1118,7 +1132,11 @@ sub walk ($;$$$) {
                return $bomb->();
            }
            die "$ty ?";
-       } elsif ($ty eq 'VanillaMerge' or $ty eq 'MergedBreakwaters') {
+       } elsif ($ty eq 'MergedBreakwaters') {
+           $last_anchor = mergedbreakwaters_anchor $cl;
+           $build_start->(' MergedBreakwaters', $cur);
+           last;
+       } elsif ($ty eq 'VanillaMerge') {
            # User may have merged unstitched branch(es).  We will
            # have now lost what ffq-prev was then (since the later
            # pseudomerge may introduce further changes).  The effect
@@ -1154,9 +1172,6 @@ sub walk ($;$$$) {
 
            printdebug "*** MERGE\n";
 
-           # xxx avoid calling walk without nogenerate when
-           # we have a MergedBreakwater; instead call keycommits ?
-
            my @bwbcmd = (@git, qw(merge-base));
            my @ibcmd = (@git, qw(merge-base --all));
            my $might_be_in_bw = 1;
@@ -1184,7 +1199,7 @@ sub walk ($;$$$) {
            foreach my $p (@$ps) {
                $prline->(" VanillaMerge ".$p->{Ix});
                if (!is_fast_fwd $p->{Anchor}, $best_anchor) {
-                   $nomerge->('DivergentAnchor');
+                   $nomerge->('divergent anchors');
                } elsif ($p->{Anchor} eq $best_anchor) {
                    print $report " SameAnchor" if $report;
                } else {
@@ -1202,14 +1217,14 @@ sub walk ($;$$$) {
            }
 
            if ($ok && $might_be_in_bw) {
+               # We could rewrite this to contaion the metadata
+               # declaring it to be MergedBreakwaters, but
+               # unnecessarily rewriting a merge seems unhelpful.
                $prline->(" VanillaMerge MergedBreakwaters");
                $last_anchor = $best_anchor;
                $build_start->('MergedBreakwaters', $cur);
            }
 
-           $nomerge->("alleged merged-breakwater is not a breakwater")
-               unless $ty eq 'VanillaMerge';
-
            my $bwb = cmdoutput @bwbcmd;
 
            # OK, now we have a breakwater base, but we need the merge