chiark / gitweb /
git-debrebase: provide --anchor option
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 18 Feb 2018 14:34:57 +0000 (14:34 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 16 Jun 2018 15:06:59 +0000 (16:06 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
git-debrebase

index 2b38d4f..cdd6348 100755 (executable)
@@ -91,7 +91,7 @@ use Getopt::Long qw(:config posix_default gnu_compat bundling);
 use Dpkg::Version;
 use File::FnMatch qw(:fnmatch);
 
-our ($opt_force, $opt_noop_ok);
+our ($opt_force, $opt_noop_ok, @opt_anchors);
 
 our $us = qw(git-debrebase);
 
@@ -356,6 +356,8 @@ sub any_fproblems () {
 #     has additional entry in classification result
 #       OrigParents = [ subset of Parents ]  # singleton list
 #
+#   TreatAsAnchor
+#
 #   BreakwaterStart
 #
 #   Unknown
@@ -424,6 +426,10 @@ sub classify ($) {
        return $r;
     };
 
+    if (grep { $_ eq $objid } @opt_anchors) {
+       return $classify->('TreatAsAnchor');
+    }
+
     my @identical = grep { !$_->{Differs} } @p;
     my ($stype, $series) = git_cat_file "$t:debian/patches/series";
     my $haspatches = $stype ne 'missing' && $series =~ m/^\s*[^#\n\t ]/m;
@@ -545,6 +551,7 @@ sub breakwater_of ($) {
            $ty eq 'Changelog') {
            $breakwater //= $head;
        } elsif ($ty eq 'Anchor' or
+                $ty eq 'TreatAsAnchor' or
                 $ty eq 'BreakwaterStart') {
            $breakwater //= $head;
            last;
@@ -677,7 +684,7 @@ sub walk ($;$$) {
            $rewrite_from_here->(\@upp_cl);
            $cur = $contrib;
            next;
-       } elsif ($ty eq 'Anchor') {
+       } elsif ($ty eq 'Anchor' or $ty eq 'TreatAsAnchor') {
             $last_anchor = $cur;
            $build_start->("Anchor", $cur);
        } elsif ($ty eq 'DgitImportUnpatched') {
@@ -1074,13 +1081,17 @@ sub cmd_new_upstream_v0 () {
 
     my $old_bw_cl = classify $old_bw;
     my $old_anchor_cl = classify $old_anchor;
-    confess unless $old_anchor_cl->{OrigParents};
-    my $old_upstream = parsecommit
-        $old_anchor_cl->{OrigParents}[0]{CommitId};
-
-    $piece->('', Old => $old_upstream->{CommitId});
+    my $old_upstream;
+    if (!$old_anchor_cl->{OrigParents}) {
+       fproblem 'anchor-treated',
+           'old anchor is recognised due to --anchor, cannot check upstream';
+    } else {
+       $old_upstream = parsecommit
+           $old_anchor_cl->{OrigParents}[0]{CommitId};
+       $piece->('', Old => $old_upstream->{CommitId});
+    }
 
-    if ($old_upstream->{Msg} =~ m{^\[git-debrebase }m) {
+    if ($old_upstream && $old_upstream->{Msg} =~ m{^\[git-debrebase }m) {
        if ($old_upstream->{Msg} =~
  m{^\[git-debrebase upstream-combine \.((?: $extra_orig_namepart_re)+)\:.*\]$}m
           ) {
@@ -1098,7 +1109,9 @@ sub cmd_new_upstream_v0 () {
     }
 
     foreach my $pc (values %pieces) {
-       if (!$pc->{Old}) {
+       if (!$old_upstream) {
+           # we have complained already
+       } elsif (!$pc->{Old}) {
            fproblem 'upstream-new-piece',
                "introducing upstream piece \`$pc->{Name}'";
        } elsif (!$pc->{New}) {
@@ -1400,6 +1413,7 @@ sub cmd_downstream_rebase_launder_v0 () {
 GetOptions("D+" => \$debuglevel,
           'noop-ok', => \$opt_noop_ok,
           'f=s' => \@fproblem_force_opts,
+          'anchor=s' => \@opt_anchors,
           'force!') or die badusage "bad options\n";
 initdebug('git-debrebase ');
 enabledebug if $debuglevel;
@@ -1409,6 +1423,8 @@ chdir $toplevel or die "chdir $toplevel: $!";
 
 $rd = fresh_playground "$playprefix/misc";
 
+@opt_anchors = map { git_rev_parse $_ } @opt_anchors;
+
 if (!@ARGV || $ARGV[0] =~ m{^-}) {
     defaultcmd_rebase();
 } else {