From 4b9de539daea1c590687fcf144b0f36cc99609ed Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 18 Feb 2018 14:34:57 +0000 Subject: [PATCH] git-debrebase: provide --anchor option Signed-off-by: Ian Jackson --- git-debrebase | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/git-debrebase b/git-debrebase index 2b38d4f8..cdd6348a 100755 --- a/git-debrebase +++ b/git-debrebase @@ -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 { -- 2.30.2