From: Ian Jackson Date: Sun, 25 Mar 2018 16:06:32 +0000 (+0100) Subject: git-debrebase: Rework keycommits out of breakwater_of X-Git-Tag: archive/debian/5.0~94 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=commitdiff_plain;h=b5cd66f2a318d196e4497bd428567826f5c2b5d6 git-debrebase: Rework keycommits out of breakwater_of * Return the anchor too * More flexible special case handling * Call sites adjusted, resulting in fixes to special case handling Signed-off-by: Ian Jackson --- diff --git a/git-debrebase b/git-debrebase index 55fbbd5d..4667e8b1 100755 --- a/git-debrebase +++ b/git-debrebase @@ -494,48 +494,81 @@ sub classify ($) { return $unknown->("complex merge"); } -sub breakwater_of ($;$) { - my ($head, $unclean_fproblem_tag) = @_; - # $head should be laundered; if not, $unclean_fproblem_tag controls: - # if falseish, calls fail; otherwise, calls fproblem and returns undef - my $breakwater; - my $unclean = sub { - my ($why) = @_; +sub keycommits ($;$$$) { + my ($head, $furniture, $unclean, $trouble) = @_; + # => ($anchor, $breakwater) + + # $unclean->("unclean-$tagsfx", $msg) + # $furniture->("unclean-$tagsfx", $msg) + # $dgitimport->("unclean-$tagsfx", $msg) + # is callled for each situation or commit that + # wouldn't be found in a laundered branch + # $furniture is forfurniture commits such as might be found on an + # interchange branch (pseudomerge, d/patches, changelog) + # $trouble is for things whnich prevent the return of + # anchor and breakwater information; if that is ignored, + # then keycommits returns (undef, undef) instead. + # + # If a callback is undef, fail is called instead. + # If a callback is defined but false, the situation is ignored. + # Callbacks may say: + # no warnings qw(exiting); last; + # if the answer is no longer wanted. + + my ($anchor, $breakwater); + my $clogonly; + my $x = sub { + my ($cb, $tagsfx, $why) = @_; my $m = "branch needs laundering (run git-debrebase): $why"; - fail $m unless $unclean_fproblem_tag; - fproblem $unclean_fproblem_tag, $m; - $breakwater = undef; - no warnings qw(exiting); - last; + fail $m unless defined $cb; + return unless $cb; + $cb->("unclean-$tagsfx", $why); }; for (;;) { my $cl = classify $head; my $ty = $cl->{Type}; - if ($ty eq 'Packaging' or - $ty eq 'Changelog') { + if ($ty eq 'Packaging') { + $breakwater //= $clogonly; $breakwater //= $head; + } elsif ($ty eq 'Changelog') { + # this is going to count as the tip of the breakwater + # only if it has no upstream stuff before it + $clogonly //= $head; } elsif ($ty eq 'Anchor' or $ty eq 'TreatAsAnchor' or $ty eq 'BreakwaterStart') { + $anchor = $head; + $breakwater //= $clogonly; $breakwater //= $head; last; } elsif ($ty eq 'Upstream') { - $unclean->("packaging change ($breakwater)". - " follows upstream change (eg $head)") + $x->($unclean, 'ordering', + "packaging change ($breakwater) follows upstream change (eg $head)") if defined $breakwater; + $clogonly = undef; + $breakwater = undef; } elsif ($ty eq 'Mixed') { - $unclean->('found mixed upstream/packaging commit ($head)'); + $x->($unclean, 'mixed', + 'found mixed upstream/packaging commit ($head)'); + $clogonly = undef; + $breakwater = undef; } elsif ($ty eq 'Pseudomerge' or $ty eq 'AddPatches') { - $unclean->("found interchange conversion commit ($ty, $head)"); + $x->($furniture, (lc $ty), + "found interchange bureaucracy commit ($ty, $head)"); } elsif ($ty eq 'DgitImportUnpatched') { - $unclean->("found dgit dsc import ($head)"); + $x->($trouble, 'dgitimport', + "found dgit dsc import ($head)"); + $breakwater = undef; + $anchor = undef; + no warnings qw(exiting); + last; } else { fail "found unprocessable commit, cannot cope: $head; $cl->{Why}"; } $head = $cl->{Parents}[0]{CommitId}; } - return $breakwater; + return ($anchor, $breakwater); } sub walk ($;$$); @@ -1193,7 +1226,7 @@ sub cmd_record_ffq_prev () { sub cmd_breakwater () { badusage "no arguments allowed" if @ARGV; - my $bw = breakwater_of git_rev_parse 'HEAD'; + my ($anchor, $bw) = keycommits +(git_rev_parse 'HEAD'), 0,0; print "$bw\n" or die $!; } @@ -1214,7 +1247,7 @@ sub cmd_stitch () { } my $old_head = get_head(); - breakwater_of $old_head, 'unclean-stitch'; + keycommits $old_head, \&fproblem, \&fproblem, \&fproblem; push @deferred_updates, "delete $ffq_prev $prev"; @@ -1311,7 +1344,7 @@ sub cmd_convert_to_gbp () { badusage "no arguments allowed" if @ARGV; my $head = get_head(); my (undef, undef, undef, $ffq, $drlast) = ffq_prev_branchinfo(); - my $bw = breakwater_of $head; + my ($anchor, $bw) = keycommits $head, 0; fresh_workarea(); my $out; in_workarea sub { diff --git a/git-debrebase.1.pod b/git-debrebase.1.pod index 044d1365..ba603ba5 100644 --- a/git-debrebase.1.pod +++ b/git-debrebase.1.pod @@ -198,7 +198,8 @@ a dropped patch queue! =item git-debrebase breakwater Prints the breakwater tip commitid. -Fails if your HEAD branch is not laundered. +If your HEAD branch is not fully laundered, +prints the tip of the so-far-laundered breakwater. =item git-debrebase analyse