use strict;
+use Debian::Dgit qw(:DEFAULT :playground);
+setup_sigwarn();
+
use Memoize;
use Carp;
use POSIX;
use Data::Dumper;
use Getopt::Long qw(:config posix_default gnu_compat bundling);
-use Debian::Dgit qw(:DEFAULT :playground);
-
sub badusage ($) {
my ($m) = @_;
die "bad usage: $m\n";
}
die unless s{^debian/patches/}{};
my $ok;
- if ($mode eq 'A' && !m/(?:^|\.)series$/s) {
+ if ($mode eq 'A' && !m/\.series$/s) {
$ok = 1;
} elsif ($mode eq 'M' && $_ eq 'series') {
my $x_s = git_cat_file "$x:debian/patches/series", 'blob';
push @p, {
Ix => $#p,
CommitId => $ph,
- Differs => (get_differs $t, $ph),
+ Differs => (get_differs $ph, $t),
};
}
if ($nogenerate) {
return (undef,undef);
}
- die "commit $cur: Cannot cope with this commit";
+ die "commit $cur: Cannot cope with this commit (d.".
+ (join ' ', map { sprintf "%#x", $_->{Differs} }
+ @{ $cl->{Parents} }). ")";
};
my $build;
} elsif ($ty eq 'Mixed') {
my $queue = sub {
my ($q, $wh) = @_;
- my $cls = { $cl, $xmsg->("split mixed commit: $wh part") };
+ my $cls = { %$cl, $xmsg->("split mixed commit: $wh part") };
push @$q, $cls;
};
$queue->(\@brw_cl, "debian");
$ch =~ s{^tree .*}{tree $newtree}m or confess "$ch ?";
$ch =~ s{^parent .*\n}{}m;
$ch =~ s{(?=^author)}{
- map { "parent $_\n" } @parents
+ join '', map { "parent $_\n" } @parents
}me or confess "$ch ?";
if ($rewriting) {
$ch =~ s{^committer .*$}{$committer_authline}m
}
};
- runcmd @git, qw(diff-tree --quiet), $input, $build;
+ my $final_check = get_differs $build, $input;
+ die sprintf "internal error %#x", $final_check
+ if $final_check & ~D_PAT_ADD;
return ($build, $breakwater);
}
my ($tip,$breakwater) = walk $old;
update_head $old, $tip, 'launder';
# no tree changes except debian/patches
- runcmd @git, qw(rm --quiet -rf debian/patches);
+ runcmd @git, qw(rm --quiet --ignore-unmatch -rf debian/patches);
printf "# breakwater tip\n%s\n", $breakwater;
}
}
sub cmd_downstream_rebase_launder_v0 () {
- badusage "needs 1 argument, the baseline" unless @ARGV=0;
+ badusage "needs 1 argument, the baseline" unless @ARGV==1;
my ($base) = @ARGV;
$base = git_rev_parse $base;
my $old_head = get_head();
my $topmost_keep;
for (;;) {
if ($current eq $base) {
- $topmust_keep //= $current;
- print "$current BASE: stopping\n";
+ $topmost_keep //= $current;
+ print " $current BASE stop\n";
last;
}
my $cl = classify $current;
print " $current $cl->{Type}";
my $keep = 0;
my $p0 = $cl->{Parents}[0]{CommitId};
+ my $next;
if ($cl->{Type} eq 'Pseudomerge') {
- $current = $cl->{Contributor}{CommitId};
print " ^".($cl->{Contributor}{Ix}+1);
+ $next = $cl->{Contributor}{CommitId};
} elsif ($cl->{Type} eq 'AddPatches' or
$cl->{Type} eq 'Changelog') {
print " strip";
- $current = $p0;
+ $next = $p0;
} else {
print " keep";
- $current = $p0;
+ $next = $p0;
$keep = 1;
}
print "\n";
$topmost_keep //= $current;
} else {
die "to-be stripped changes not on top of the branch\n"
- if $topmost_unstripped;
+ if $topmost_keep;
}
+ $current = $next;
}
if ($topmost_keep eq $old_head) {
print "unchanged\n";
} else {
print "updating to $topmost_keep\n";
- update_head $old_head, $topmost_keep, 'downstream-rebase-launder-v0';
+ update_head_checkout
+ $old_head, $topmost_keep,
+ 'downstream-rebase-launder-v0';
}
}