chiark / gitweb /
git-debrebase: DgitImportUnpatched: defer upstream diff check
[dgit.git] / git-debrebase
index 19beef8c3ffc422eba8e7468e43ac2ccb29ecb6b..ad2672f1cd3e4f7633af0ee3b05874b6f06e80b5 100755 (executable)
@@ -29,6 +29,7 @@
 #    git-debrebase [<options> --] [<git-rebase options...>]
 #    git-debrebase [<options>] analyse
 #    git-debrebase [<options>] launder         # prints breakwater tip etc.
+#    git-debrebase [<options>] stitch [--prose=<for commit message>]
 #    git-debrebase [<options>] downstream-rebase-launder-v0  # experimental
 #
 #    git-debrebase [<options>] gbp2debrebase-v0 \
@@ -441,7 +442,7 @@ sub classify ($) {
        my @overwritten = grep { $_->{Differs} } @p;
        confess "internal error $objid ?" unless @overwritten==1;
        return $classify->(qw(Pseudomerge),
-                          Overwritten => $overwritten[0],
+                          Overwritten => [ $overwritten[0] ],
                           Contributor => $identical[0]);
     }
     if (@p == 2 && @identical == 2) {
@@ -452,7 +453,7 @@ sub classify ($) {
        } @p;
        return $classify->(qw(Pseudomerge),
                           SubType => qw(Ambiguous),
-                          Overwritten => $bytime[0],
+                          Overwritten => [ $bytime[0] ],
                           Contributor => $bytime[1]);
     }
     foreach my $p (@p) {
@@ -626,7 +627,8 @@ sub walk ($;$$) {
                # suite intended by the non-dgit NMUer, and later
                # pseudomerges may represent in-archive copies.
                my $ovwrs = $pm->{Overwritten};
-               printf $report " PM=%s \@Overwr:%d", $pm, (scalar @$ovwrs)
+               printf $report " PM=%s \@Overwr:%d",
+                   $pm->{CommitId}, (scalar @$ovwrs)
                    if $report;
                if (@$ovwrs != 1) {
                     printdebug "*** WALK BOMB DgitImportUnpatched\n";
@@ -649,22 +651,12 @@ sub walk ($;$$) {
                    %$cl,
                    SpecialMethod => 'DgitImportDebianUpdate',
                     $xmsg->("convert dgit import: debian changes")
+               }, {
+                   %$cl,
+                   SpecialMethod => 'DgitImportUpstreamUpdate',
+                    $xmsg->("convert dgit import: upstream update",
+                           " breakwater")
                };
-               my $differs = (get_differs $ovwr, $cl->{Tree});
-               printf $report " Differs=%#x", $differs if $report;
-               if ($differs & D_UPS) {
-                   printf $report " D_UPS" if $report;
-                   # This will also trigger if a non-dgit git-based NMU
-                   # deleted .gitignore (which is a thing that some of
-                   # the existing git tools do if the user doesn't
-                   # somehow tell them not to).  Ah well.
-                   push @brw_cl, {
-                       %$cl,
-                       SpecialMethod => 'DgitImportUpstreamUpdate',
-                       $xmsg->("convert dgit import: upstream changes",
-                               " breakwater")
-                   };
-               }
                $prline->(" Import");
                $rewrite_from_here->();
                $upp_limit //= $#upp_cl; # further, deeper, patches discarded
@@ -747,6 +739,9 @@ sub walk ($;$$) {
                $read_tree_debian->($cltree);
                rm_subdir_cached qw(debian/patches);
            } elsif ($method eq 'DgitImportUpstreamUpdate') {
+               confess unless $rewriting;
+               my $differs = (get_differs $build, $cltree);
+               next unless $differs & D_UPS;
                $read_tree_upstream->($cltree);
                push @parents, map { $_->{CommitId} } @{ $cl->{OrigParents} };
            } else {
@@ -1136,6 +1131,38 @@ sub cmd_record_ffq_prev () {
     }
 }
 
+sub cmd_stitch () {
+    my $prose = '';
+    GetOptions('prose=s', \$prose) or die badusage("bad options to stitch");
+    badusage "no arguments allowed" if @ARGV;
+    my ($status, $message, $current, $ffq_prev) = ffq_prev_branchinfo();
+    if ($status ne 'branch') {
+       fproblem $status, "could not check ffq-prev: $message";
+       fproblems_maybe_bail();
+    }
+    my $prev = $ffq_prev && git_get_ref $ffq_prev;
+    if (!$prev) {
+       fail "No ffq-prev to stitch." unless $opt_noop_ok;
+    }
+    fresh_workarea();
+    my $old_head = get_head();
+    my $new_head = make_commit [ $old_head, $ffq_prev ], [
+       'Declare fast forward / record previous work',
+        "[git-debrebase pseudomerge: stitch$prose]",
+    ];
+    my @upd_cmd = (@git, qw(update-ref --stdin));
+    debugcmd '>|', @upd_cmd;
+    open U, "|-", @upd_cmd or die $!;
+    my $u = <<END;
+update HEAD $new_head $old_head
+delete $ffq_prev $prev
+END
+    printdebug ">= ", $_, "\n" foreach split /\n/, $u;
+    print U $u;
+    printdebug ">\$\n";
+    close U or failedcmd @upd_cmd;
+}
+
 sub cmd_gbp2debrebase () {
     badusage "needs 1 optional argument, the upstream" unless @ARGV<=1;
     my ($upstream_spec) = @ARGV;