diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2018-02-17 11:47:19 +0000 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2018-06-16 16:03:11 +0100 |
commit | 7ec74423668f93db5107faaae4314f79a2d9d2f0 (patch) | |
tree | 8fa10784a309acd3229c96828d60553c5d2354ef /git-debrebase | |
parent | ca03bca3d0443c539de63050693de56c9b2e0c03 (diff) |
git-debrebase: provide breakwater command
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Diffstat (limited to 'git-debrebase')
-rwxr-xr-x | git-debrebase | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/git-debrebase b/git-debrebase index 3273726..1a62852 100755 --- a/git-debrebase +++ b/git-debrebase @@ -28,6 +28,7 @@ # # git-debrebase [<options> --] [<git-rebase options...>] # git-debrebase [<options>] analyse +# git-debrebase [<options>] breakwater # prints breakwater tip only # git-debrebase [<options>] launder # prints breakwater tip etc. # git-debrebase [<options>] stitch [--prose=<for commit message>] # git-debrebase [<options>] downstream-rebase-launder-v0 # experimental @@ -508,6 +509,42 @@ sub classify ($) { return $unknown->("complex merge"); } +sub breakwater_of ($) { + my ($head) = @_; # must be laundered + my $breakwater; + my $unclean = sub { + my ($why) = @_; + fail "branch needs laundering (run git-debrebase): $why"; + }; + for (;;) { + my $cl = classify $head; + my $ty = $cl->{Type}; + if ($ty eq 'Packaging' or + $ty eq 'Changelog') { + $breakwater //= $head; + } elsif ($ty eq 'BreakwaterUpstreamMerge' or + $ty eq 'BreakwaterStart') { + $breakwater //= $head; + last; + } elsif ($ty eq 'Upstream') { + $unclean->("packaging change ($breakwater)". + " follows upstream change (eg $head)") + if defined $breakwater; + } elsif ($ty eq 'Mixed') { + $unclean->('found mixed upstream/packaging commit ($head)'); + } elsif ($ty eq 'Pseudomerge' or + $ty eq 'AddPatches') { + $unclean->("found interchange conversion commit ($ty, $head)"); + } elsif ($ty eq 'DgitImportUnpatched') { + $unclean->("found dgit dsc import ($head)"); + } else { + fail "found unprocessable commit, cannot cope: $head; $cl->{Why}"; + } + $head = $cl->{Parents}[0]{CommitId}; + } + return $breakwater; +} + sub walk ($;$$); sub walk ($;$$) { my ($input, @@ -1133,6 +1170,12 @@ sub cmd_record_ffq_prev () { } } +sub cmd_breakwater () { + badusage "no arguments allowed" if @ARGV; + my $bw = breakwater_of git_rev_parse 'HEAD'; + print "$bw\n" or die $!; +} + sub cmd_stitch () { my $prose = ''; GetOptions('prose=s', \$prose) or die badusage("bad options to stitch"); |