chiark / gitweb /
git-debrebase: suppress gbp pq export output
[dgit.git] / git-debrebase
index 3cab3ad8837b4a28a4bc51be3bcad29d123ebd20..fd05c6b46a67ab92e2db225e198910d17cb5c9ec 100755 (executable)
@@ -19,6 +19,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 END { $? = $Debian::Dgit::ExitStatus::desired // -1; };
+use Debian::Dgit::GDR;
 use Debian::Dgit::ExitStatus;
 
 use strict;
@@ -33,6 +34,7 @@ use Data::Dumper;
 use Getopt::Long qw(:config posix_default gnu_compat bundling);
 use Dpkg::Version;
 use File::FnMatch qw(:fnmatch);
+use File::Copy;
 
 our ($opt_force, $opt_noop_ok, @opt_anchors);
 our ($opt_defaultcmd_interactive);
@@ -973,19 +975,8 @@ sub cmd_analyse () {
 }
 
 sub ffq_prev_branchinfo () {
-    # => ('status', "message", [$current, $ffq_prev, $gdrlast])
-    # 'status' may be
-    #    branch         message is undef
-    #    weird-symref   } no $current,
-    #    notbranch      }  no $ffq_prev
     my $current = git_get_symref();
-    return ('detached', 'detached HEAD') unless defined $current;
-    return ('weird-symref', 'HEAD symref is not to refs/')
-       unless $current =~ m{^refs/};
-    my $ffq_prev = "refs/$ffq_refprefix/$'";
-    my $gdrlast = "refs/$gdrlast_refprefix/$'";
-    printdebug "ffq_prev_branchinfo branch current $current\n";
-    return ('branch', undef, $current, $ffq_prev, $gdrlast);
+    return gdr_ffq_prev_branchinfo($current);
 }
 
 sub record_ffq_prev_deferred () {
@@ -1029,7 +1020,7 @@ sub record_ffq_prev_deferred () {
        }
        return if $invert;
        my $lrval = git_get_ref $lrref;
-       return unless defined $lrval;
+       return unless length $lrval;
 
        if (is_fast_fwd $lrval, $currentval) {
            print "OK, you are ahead of $lrref\n" or die $!;
@@ -1139,7 +1130,7 @@ sub do_stitch ($;$) {
     stitch($dangling_head, $ffq_prev, $gdrlast, $ffq_prev_commitish, $prose);
 }
 
-sub cmd_new_upstream_v0 () {
+sub cmd_new_upstream () {
     # automatically and unconditionally launders before rebasing
     # if rebase --abort is used, laundering has still been done
 
@@ -1151,7 +1142,23 @@ sub cmd_new_upstream_v0 () {
     my $new_version = (new Dpkg::Version scalar(shift @ARGV), check => 1);
     my $new_upstream_version = $new_version->version();
 
-    my $new_upstream = git_rev_parse (shift @ARGV // 'upstream');
+    my $new_upstream = shift @ARGV;
+    if (!defined $new_upstream) {
+       my @tried;
+       # todo: at some point maybe use git-deborig to do this
+       foreach my $tagpfx ('', 'v', 'upstream/') {
+           my $tag = $tagpfx.(dep14_version_mangle $new_upstream_version);
+           $new_upstream = git_get_ref "refs/tags/$tag";
+           last if length $new_upstream;
+           push @tried, $tag;
+       }
+       if (!length $new_upstream) {
+           fail "Could not determine appropriate upstream commitish.\n".
+               " (Tried these tags: @tried)\n".
+               " Check version, and specify upstream commitish explicitly.";
+       }
+    }
+    $new_upstream = git_rev_parse $new_upstream;
 
     record_ffq_auto();
 
@@ -1210,11 +1217,13 @@ sub cmd_new_upstream_v0 () {
           ) {
            my @oldpieces = (split / /, $1);
            my $old_n_parents = scalar @{ $old_upstream->{Parents} };
-           if (@oldpieces != $old_n_parents) {
+           if ($old_n_parents != @oldpieces &&
+               $old_n_parents != @oldpieces + 1) {
                snag 'upstream-confusing', sprintf
                    "previous upstream combine %s".
-                   " mentions %d pieces (each implying one orig commit)".
-                   " but has %d parents",
+                   " mentions %d pieces (each implying one parent)".
+                   " but has %d parents".
+                   " (one per piece plus maybe a previous combine)",
                    $old_upstream->{CommitId},
                    (scalar @oldpieces),
                    $old_n_parents;
@@ -1227,7 +1236,8 @@ sub cmd_new_upstream_v0 () {
                $oldpieces[0] = '';
                foreach my $i (0..$#oldpieces) {
                    my $n = $oldpieces[$i];
-                   $piece->($n, Old => $old_upstream->{CommitId}.'^'.($i+1));
+                   my $hat = 1 + $i + ($old_n_parents - @oldpieces);
+                   $piece->($n, Old => $old_upstream->{CommitId}.'^'.$hat);
                }
            }
        } else {
@@ -1372,6 +1382,10 @@ sub cmd_breakwater () {
 sub cmd_status () {
     badusage "no arguments allowed" if @ARGV;
 
+    # todo: gdr status should print divergence info
+    # todo: gdr status should print upstream component(s) info
+    # todo: gdr should leave/maintain some refs with this kind of info ?
+
     my $oldest = [ 0 ];
     my $newest;
     my $note = sub {
@@ -1482,7 +1496,12 @@ sub make_patches_staged ($) {
     in_workarea sub {
        runcmd @git, qw(checkout -q -b bw), $secret_bw;
        runcmd @git, qw(checkout -q -b patch-queue/bw), $secret_head;
-       runcmd qw(gbp pq export);
+       my @gbp_cmd = (qw(gbp pq export));
+       my $r = system shell_cmd 'exec >../gbp-pq-err 2>&1', @gbp_cmd;
+       if ($r) {
+           { local ($!,$?); copy('../gbp-pq-err', \*STDERR); }
+           failedcmd @gbp_cmd;
+       }
        runcmd @git, qw(add debian/patches);
     };
 }
@@ -1505,6 +1524,9 @@ sub make_patches ($) {
 }
 
 sub cmd_make_patches () {
+    my $opt_quiet_would_amend;
+    GetOptions('quiet-would-amend!', \$opt_quiet_would_amend)
+       or die badusage("bad options to make-patches");
     badusage "no arguments allowed" if @ARGV;
     my $old_head = get_head();
     my $new = make_patches $old_head;
@@ -1516,9 +1538,12 @@ sub cmd_make_patches () {
        snags_maybe_bail();
        update_head_checkout $old_head, $new, 'make-patches';
     } else {
-       fail "Patch export produced patch amendments".
+       print STDERR failmsg
+           "Patch export produced patch amendments".
            " (abandoned output commit $new).".
-           "  Try laundering first.";
+           "  Try laundering first."
+           unless $opt_quiet_would_amend;
+       finish 7;
     }
 }