chiark / gitweb /
dgit.1: drop remark about sbuild not building arch-independent
[dgit.git] / git-debrebase
index 20e5728ec48794bad73ba21fa9ec30df2b19dc53..781435861ecb05b1c816a440364425746abae6f7 100755 (executable)
@@ -3,7 +3,8 @@
 # Script helping make fast-forwarding histories while still rebasing
 # upstream deltas when working on Debian packaging
 #
-# Copyright (C)2017,2018 Ian Jackson
+# Copyright (C)2017-2019 Ian Jackson
+# Copyright (C)2019      Niko Tyni
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -120,7 +121,6 @@ our $playprefix = 'debrebase';
 our $rd;
 our $workarea;
 
-our @git = qw(git);
 our @dgit = qw(dgit);
 
 sub in_workarea ($) {
@@ -144,10 +144,10 @@ sub run_ref_updates_now ($$) {
 
     my @upd_cmd = (git_update_ref_cmd "debrebase: $mrest", qw(--stdin));
     debugcmd '>|', @upd_cmd;
-    open U, "|-", @upd_cmd or confess $!;
+    open U, "|-", @upd_cmd or confess "$!";
     foreach (@$updates) {
        printdebug ">= ", $_, "\n";
-       print U $_, "\n" or confess $!;
+       print U $_, "\n" or confess "$!";
     }
     printdebug ">\$\n";
     close U or failedcmd @upd_cmd;
@@ -355,44 +355,6 @@ sub calculate_committer_authline () {
     return $&;
 }
 
-sub rm_subdir_cached ($) {
-    my ($subdir) = @_;
-    runcmd @git, qw(rm --quiet -rf --cached --ignore-unmatch), $subdir;
-}
-
-sub read_tree_subdir ($$) {
-    my ($subdir, $new_tree_object) = @_;
-    rm_subdir_cached $subdir;
-    runcmd @git, qw(read-tree), "--prefix=$subdir/", $new_tree_object;
-}
-
-sub read_tree_debian ($) {
-    my ($treeish) = @_;
-    read_tree_subdir 'debian', "$treeish:debian";
-    rm_subdir_cached 'debian/patches';
-}
-
-sub read_tree_upstream ($;$$) {
-    my ($treeish, $keep_patches, $tree_with_debian) = @_;
-    # if $tree_with_debian is supplied, will use that for debian/
-    # otherwise will save and restore it.
-    my $debian =
-       $tree_with_debian ? "$tree_with_debian:debian"
-       : cmdoutput @git, qw(write-tree --prefix=debian/);
-    runcmd @git, qw(read-tree), $treeish;
-    read_tree_subdir 'debian', $debian;
-    rm_subdir_cached 'debian/patches' unless $keep_patches;
-};
-
-sub make_commit ($$) {
-    my ($parents, $message_paras) = @_;
-    my $tree = cmdoutput @git, qw(write-tree);
-    my @cmd = (@git, qw(commit-tree), $tree);
-    push @cmd, qw(-p), $_ foreach @$parents;
-    push @cmd, qw(-m), $_ foreach @$message_paras;
-    return cmdoutput @cmd;
-}
-
 our @snag_force_opts;
 sub snag ($$;@) {
     my ($tag,$msg) = @_; # ignores extra args, for benefit of keycommits
@@ -611,7 +573,7 @@ sub merge_series ($$$;@) {
            if ($any) {
                open S, $seriesfile or confess "$seriesfile $!";
                while (my $patch = <S>) {
-                   chomp $patch or confess $!;
+                   chomp $patch or confess "$!";
                    $prereq{$patch} //= {};
                    foreach my $earlier (@earlier) {
                        $prereq{$patch}{$earlier}{$s}++ and confess;
@@ -708,7 +670,7 @@ sub merge_series ($$$;@) {
            };
        };
 
-       open NS, '>', $seriesfile or confess $!;
+       open NS, '>', $seriesfile or confess "$!";
 
        while (keys %prereq) {
            my $best;
@@ -723,7 +685,7 @@ sub merge_series ($$$;@) {
                $best = $try;
            }
            printdebug "merge_series series next $best\n";
-           print NS "$best\n" or confess $!;
+           print NS "$best\n" or confess "$!";
            delete $prereq{$best};
            foreach my $gp (values %prereq) {
                delete $gp->{$best};
@@ -765,10 +727,10 @@ sub merge_series_patchqueue_convert ($$$) {
            my $tree = cmdoutput @git, qw(write-tree);
            $commit =~ s{^parent (\S+)$}{parent $build}m or confess;
            $commit =~ s{^tree (\S+)$}{tree $tree}m      or confess;
-           open C, ">", "../mcommit" or confess $!;
-           print C $commit or confess $!;
-           close C or confess $!;
-           $build = cmdoutput @git, qw(hash-object -w -t commit ../mcommit);
+           open C, ">", "../mcommit" or confess "$!";
+           print C $commit or confess "$!";
+           close C or confess "$!";
+           $build = hash_commit '../mcommit';
        }
        $result = $build;
        mwrecknote($wrecknotes, 'merged-result', $result);
@@ -1586,7 +1548,7 @@ sub walk ($;$$$) {
     confess __ "internal error" unless $build eq (pop @processed)->{CommitId};
 
     in_workarea sub {
-       mkdir $rd or $!==EEXIST or confess $!;
+       mkdir $rd or $!==EEXIST or confess "$!";
        my $current_method;
        my $want_debian = $build;
        my $want_upstream = $build;
@@ -1696,9 +1658,9 @@ sub walk ($;$$$) {
                        or confess "$ch ?";
                }
                my $cf = "$rd/m$rewriting";
-               open CD, ">", $cf or confess $!;
-               print CD $ch, "\n", $cl->{Msg} or confess $!;
-               close CD or confess $!;
+               open CD, ">", $cf or confess "$!";
+               print CD $ch, "\n", $cl->{Msg} or confess "$!";
+               close CD or confess "$!";
                my @cmd = (@git, qw(hash-object));
                push @cmd, qw(-w) if $rewriting;
                push @cmd, qw(-t commit), $cf;
@@ -1811,7 +1773,7 @@ sub cmd_analyse () {
        $old = git_rev_parse 'HEAD';
     }
     my ($dummy,$breakwater) = walk $old, 1,*STDOUT;
-    STDOUT->error and confess $!;
+    STDOUT->error and confess "$!";
 }
 
 sub ffq_check ($;$$) {
@@ -1828,7 +1790,7 @@ sub ffq_check ($;$$) {
     # normally $currentval should be HEAD
     my ($currentval, $ff, $notff) =@_;
 
-    $ff //= sub { print $_[0] or confess $!; };
+    $ff //= sub { print $_[0] or confess "$!"; };
     $notff //= \&snag;
 
     my ($status, $message, $current, $ffq_prev, $gdrlast)
@@ -1994,39 +1956,6 @@ sub do_stitch ($;$) {
     stitch($dangling_head, $ffq_prev, $gdrlast, $ffq_prev_commitish, $prose);
 }
 
-sub upstream_commitish_search ($$) {
-    my ($upstream_version, $tried) = @_;
-    # todo: at some point maybe use git-deborig to do this
-    foreach my $tagpfx ('', 'v', 'upstream/') {
-       my $tag = $tagpfx.(dep14_version_mangle $upstream_version);
-       my $new_upstream = git_get_ref "refs/tags/$tag";
-       push @$tried, $tag;
-       return $new_upstream if length $new_upstream;
-    }
-}
-
-sub resolve_upstream_version ($$) {
-    my ($new_upstream, $upstream_version) = @_;
-
-    my $used = $new_upstream;
-    if (!defined $new_upstream) {
-       my @tried;
-       $new_upstream = upstream_commitish_search $upstream_version, \@tried;
-       if (!length $new_upstream) {
-           fail f_
-               "Could not determine appropriate upstream commitish.\n".
-               " (Tried these tags: %s)\n".
-               " Check version, and specify upstream commitish explicitly.",
-               "@tried";
-       }
-       $used = $tried[-1];
-    }
-    $new_upstream = git_rev_parse $new_upstream;
-
-    return ($new_upstream, $used);
-    # used is a human-readable idea of what we found
-}
-
 sub cmd_new_upstream () {
     # automatically and unconditionally launders before rebasing
     # if rebase --abort is used, laundering has still been done
@@ -2044,7 +1973,7 @@ sub cmd_new_upstream () {
        $new_version = (new Dpkg::Version "$spec_version-1", check => 1);
     }
 
-    my $new_upstream = shift @ARGV;
+    my $new_upstream = (@ARGV && $ARGV[0] !~ m{^-}) ? shift @ARGV : undef;
     my $new_upstream_version = upstreamversion  $new_version;
     my $new_upstream_used;
     ($new_upstream, $new_upstream_used) =
@@ -2261,7 +2190,7 @@ sub cmd_record_ffq_prev () {
     badusage "no arguments allowed" if @ARGV;
     my ($status, $msg) = record_ffq_prev_deferred();
     if ($status eq 'exists' && $opt_noop_ok) {
-       print __ "Previous head already recorded\n" or confess $!;
+       print __ "Previous head already recorded\n" or confess "$!";
     } elsif ($status eq 'deferred') {
        run_deferred_updates 'record-ffq-prev';
     } else {
@@ -2272,13 +2201,13 @@ sub cmd_record_ffq_prev () {
 sub cmd_anchor () {
     badusage __ "no arguments allowed" if @ARGV;
     my ($anchor, $bw) = keycommits +(git_rev_parse 'HEAD'), 0,0;
-    print "$anchor\n" or confess $!;
+    print "$anchor\n" or confess "$!";
 }
 
 sub cmd_breakwater () {
     badusage __ "no arguments allowed" if @ARGV;
     my ($anchor, $bw) = keycommits +(git_rev_parse 'HEAD'), 0,0;
-    print "$bw\n" or confess $!;
+    print "$bw\n" or confess "$!";
 }
 
 sub cmd_status () {
@@ -2311,7 +2240,7 @@ sub cmd_status () {
 
     my $prcommitinfo = sub {
        my ($cid) = @_;
-       flush STDOUT or confess $!;
+       flush STDOUT or confess "$!";
        runcmd @git, qw(--no-pager log -n1),
            '--pretty=format:    %h %s%n',
            $cid;
@@ -2563,7 +2492,7 @@ sub cmd_convert_from_gbp () {
        runcmd @git, qw(--no-pager diff --stat),
            $upstream, $old_head,
            qw( -- :!/debian :/);
-       fail f_ <<END, $upstream_spec, $upstream_spec;
+       fail f_ <<END, $upstream_used, $upstream;
 upstream (%s) and HEAD are not
 identical in upstream files.  See diffstat above, or run
   git diff %s HEAD -- :!/debian :/
@@ -2580,9 +2509,9 @@ END
        if (length $wrong) {
            snag 'unexpected-upstream-changes', f_
                "history between upstream (%s) and HEAD contains direct changes to upstream files - are you sure this is a gbp (patches-unapplied) branch?",
-               $upstream;
+               $upstream_used;
            print STDERR f_ "list expected changes with:  %s\n", 
- "git log --stat --ancestry-path $upstream_spec..HEAD -- :/ ':!/debian'";
+ "git log --stat --ancestry-path $upstream..HEAD -- :/ ':!/debian'";
        }
     }
 
@@ -2674,7 +2603,7 @@ END
     };
 
     complete_convert_from $old_head, $work, $gdrlastinfo, 'convert-from-gbp';
-    print f_ <<END, $us or confess $!;
+    print f_ <<END, $us or confess "$!";
 %s: converted from patched-unapplied (gbp) branch format, OK
 END
 }
@@ -2703,7 +2632,7 @@ sub cmd_convert_to_gbp () {
     }
     snags_maybe_bail();
     update_head_checkout $head, $out, "convert to gbp (v0)";
-    print f_ <<END, $us,$us,$us or confess $!;
+    print f_ <<END, $us,$us,$us or confess "$!";
 %s: converted to git-buildpackage branch format
 %s: WARNING: do not now run "git-debrebase" any more
 %s: WARNING: doing so would drop all upstream patches!
@@ -2733,7 +2662,7 @@ sub cmd_convert_from_dgit_view () {
        my $spec = shift @ARGV;
        my $commit = git_rev_parse "$spec^{commit}";
        push @upstreams, { Commit => $commit,
-                          Source => (f_ "%s, from command line", $ARGV[0]),
+                          Source => (f_ "%s, from command line", $spec),
                           Only => 1,
                         };
     }
@@ -2768,10 +2697,11 @@ END
     if (!@upstreams) {
        if ($do_tags) {
            my @tried;
-           my $ups_tag = upstream_commitish_search $version, \@tried;
-           if ($ups_tag) {
-               my $this = f_ "git tag %s", $tried[-1];
-               push @upstreams, { Commit => $ups_tag,
+           my ($ups_tag, $ups_rev) =
+               upstream_commitish_search $version, \@tried;
+           if ($ups_rev) {
+               my $this = f_ "git tag %s", $ups_tag;
+               push @upstreams, { Commit => $ups_rev,
                                   Source => $this,
                                 };
            } else {
@@ -3020,7 +2950,7 @@ getoptions_main
           'experimental-merge-resolution!', \$opt_merges,
           '-i:s' => sub {
               my ($opt,$val) = @_;
-              badusage f_ "%s: no cuddling to -i for git-rebase", $us
+              badusage f_ "%s: with git-debrebase, get-rebase -i option may only be followed by more options (as separate arguments)", $us
                   if length $val;
               confess if $opt_defaultcmd_interactive; # should not happen
               $opt_defaultcmd_interactive = [ qw(-i) ];
@@ -3030,7 +2960,7 @@ getoptions_main
               push @$opt_defaultcmd_interactive, @ARGV;
               @ARGV=();
           },
-          'help' => sub { print __ $usage_message or confess $!; finish 0; },
+          'help' => sub { print __ $usage_message or confess "$!"; finish 0; },
           );
 
 initdebug('git-debrebase ');