#
# 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
#
-# git-debrebase [<options>] gbp2debrebase-v0 \
-# <upstream>
+# git-debrebase [<options>] convert-from-gbp [<upstream-git-rev>]
+# git-debrebase [<options>] convert-to-gbp
# problems / outstanding questions:
#
# Upstream
# AddPatches
# Mixed
-# Unknown
#
# Pseudomerge
# has additional entres in classification result
# BreakwaterUpstreamMerge
# has additional entry in classification result
# OrigParents = [ subset of Parents ] # singleton list
+#
+# Unknown
+# has additional entry in classification result
+# Why => "prose"
sub parsecommit ($;$) {
my ($objid, $p_ref) = @_;
};
my $unknown = sub {
my ($why) = @_;
- $r = { %$r, Type => qw(Unknown) };
+ $r = { %$r, Type => qw(Unknown), Why => $why };
printdebug " ** Unknown\n";
return $r;
};
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,
next;
} elsif ($method eq 'DgitImportDebianUpdate') {
$read_tree_debian->($cltree);
- rm_subdir_cached qw(debian/patches);
} elsif ($method eq 'DgitImportUpstreamUpdate') {
confess unless $rewriting;
my $differs = (get_differs $build, $cltree);
my $newtree = cmdoutput @git, qw(write-tree);
my $ch = $cl->{Hdr};
$ch =~ s{^tree .*}{tree $newtree}m or confess "$ch ?";
- $ch =~ s{^parent .*\n}{}m;
+ $ch =~ s{^parent .*\n}{}mg;
$ch =~ s{(?=^author)}{
join '', map { "parent $_\n" } @parents
}me or confess "$ch ?";
}
}
+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");
close U or failedcmd @upd_cmd;
}
-sub cmd_gbp2debrebase () {
- badusage "needs 1 optional argument, the upstream" unless @ARGV<=1;
+sub cmd_convert_from_gbp () {
+ badusage "needs 1 optional argument, the upstream git rev"
+ unless @ARGV<=1;
my ($upstream_spec) = @ARGV;
$upstream_spec //= 'refs/heads/upstream';
my $upstream = git_rev_parse $upstream_spec;
runcmd @git, qw(checkout -q gdr-internal~0);
rm_subdir_cached 'debian/patches';
$work = make_commit ['HEAD'], [
- 'git-debrebase import: drop patch queue',
+ 'git-debrebase convert-from-gbp: drop patches from tree',
'Delete debian/patches, as part of converting to git-debrebase format.',
- '[git-debrebase: gbp2debrebase, drop patches]'
+ '[git-debrebase convert-from-gbp: drop patches from tree]'
];
# make the breakwater pseudomerge
# the tree is already exactly right
$work = git_rev_parse 'HEAD';
};
- update_head_checkout $old_head, $work, 'gbp2debrebase';
+ update_head_checkout $old_head, $work, 'convert-from-gbp';
+}
+
+sub cmd_convert_to_gbp () {
+ badusage "no arguments allowed" if @ARGV;
+ my $head = get_head();
+ my $ffq = (ffq_prev_branchinfo())[3];
+ my $bw = breakwater_of $head;
+ fresh_workarea();
+ my $out;
+ in_workarea sub {
+ runcmd @git, qw(checkout -q -b bw), $bw;
+ runcmd @git, qw(checkout -q -b patch-queue/bw), $head;
+ runcmd qw(gbp pq export);
+ runcmd @git, qw(add debian/patches);
+ $out = make_commit ['HEAD'], [
+ 'Commit patch queue (converted from git-debrebase format)',
+ '[git-debrebase convert-to-gbp: commit patches]',
+ ];
+ };
+ if (defined $ffq) {
+ runcmd @git, qw(update-ref -m),
+ "debrebase: converting corresponding main branch to gbp format",
+ $ffq, $git_null_obj;
+ }
+ update_head_checkout $head, $out, "convert to gbp (v0)";
+ print <<END or die $!;
+git-debrebase: converted to git-buildpackage branch format
+git-debrebase: WARNING: do not now run "git-debrebase" any more
+git-debrebase: WARNING: doing so would drop all upstream patches!
+END
}
sub cmd_downstream_rebase_launder_v0 () {