use Data::Dumper;
use Getopt::Long qw(:config posix_default gnu_compat bundling);
-use Debian::Dgit qw(:DEFAULT $wa);
+use Debian::Dgit qw(:DEFAULT :playground);
sub badusage ($) {
my ($m) = @_;
sub get_commit ($) {
my ($objid) = @_;
- my ($type,$data) = git_cat_file $objid;
- die unless $type eq 'commit';
- $data =~ m/(?<=\n)\n/;
+ my $data = git_cat_file $objid, 'commit';
+ $data =~ m/(?<=\n)\n/ or die "$objid ($data) ?";
return ($`,$');
}
sub D_PAT_ADD () { return 0x4; } # debian/patches/ extra patches at end
sub D_PAT_OTH () { return 0x8; } # debian/patches other changes
-our $rd = ".git/git-debrebase";
-our $ud = "$rd/work";
+
+our $playprefix = 'debrebase';
+our $rd;
+
our @git = qw(git);
+sub in_workarea ($) {
+ my ($sub) = @_;
+ changedir "$playground/work";
+ my $r = eval { $sub->(); };
+ changedir $maindir;
+}
+
+sub fresh_workarea () {
+ do {
+ local $playground;
+ fresh_playground "$playprefix/work";
+ };
+ in_workarea sub { playtree_setup };
+}
+
sub get_differs ($$) {
my ($x,$y) = @_;
# This resembles quiltify_trees_differ, in dgit, a bit.
my $differs = 0;
my $rundiff = sub {
- my ($opts, $sfx, $fn) = @_;
- $opts //= [qw(--name-only)];
+ my ($opts, $limits, $fn) = @_;
my @cmd = (@git, qw(diff-tree -z --no-renames));
push @cmd, @$opts;
- push @cmd, "$_:$sfx" foreach $x, $y;
+ push @cmd, "$_:" foreach $x, $y;
+ push @cmd, @$limits;
my $diffs = cmdoutput @cmd;
foreach (split /\0/, $diffs) { $fn->(); }
};
- $rundiff->(undef, '', sub {
+ $rundiff->([qw(--name-only)], [], sub {
$differs |= $_ eq 'debian' ? D_DEB : D_UPS;
});
if ($differs & D_DEB) {
$differs &= ~D_DEB;
- $rundiff->(undef, ':debian', sub {
- $differs |= $_ eq 'patches' ? D_PAT_OTH : D_DEB;
+ $rundiff->([qw(--name-only -r)], [qw(debian)], sub {
+ $differs |= $_ eq m{^debian/patches/} ? D_PAT_OTH : D_DEB;
});
die "mysterious debian changes $x..$y"
unless $differs & (D_PAT_OTH|D_DEB);
$differs |= D_PAT_OTH;
no warnings qw(exiting); last;
};
- $rundiff->([qw(--name-status)], ':debian/patches', sub {
+ $rundiff->([qw(--name-status -r)], [qw(debian/patches/)], sub {
no warnings qw(exiting);
if (!defined $mode) {
$mode = $_; next;
}
+ die unless s{^debian/patches/}{};
my $ok;
if ($mode eq 'A' && !m/(?:^|\.)series$/s) {
$ok = 1;
Contributor => $bytime[1]);
}
foreach my $p (@p) {
- my ($p_h, $p_m) = get_commit $p;
+ my ($p_h, $p_m) = get_commit $p->{CommitId};
$p->{IsOrigin} = $p_h !~ m/^parent \w+$/m;
($p->{IsDgitImport},) = $p_m =~ m/^\[dgit import ([0-9a-z]+) .*\]$/m;
}
my ($stype, $series) = git_cat_file "$t:debian/patches/series";
my $haspatches = $stype ne 'missing' && $series =~ m/^\s*[^#\n\t ]/m;
+@p = reverse @p; #xxx
+
# How to decide about l/r ordering of breakwater merges ? git
# --topo-order prefers to expand 2nd parent first. There's
# already an easy rune to look for debian/ history anyway (git log
$cur = $p0;
next;
} elsif ($ty eq 'Pseudomerge') {
- print $report " Contributor=$cl->{Contributor}" if $report;
+ my $contrib = $cl->{Contributor}{CommitId};
+ print $report " Contributor=$contrib" if $report;
push @pseudomerges, $cl;
$rewrite_from_here->();
- $cur = $ty->{Contributor};
+ $cur = $contrib;
next;
} elsif ($ty eq 'BreakwaterUpstreamMerge') {
$build_start->("PreviousBreakwater", $cur);
# Now we build it back up again
- workarea_fresh();
+ fresh_workarea();
my $rewriting = 0;
my $rm_tree_cached = sub {
my ($subdir) = @_;
- runcmd @git, qw(rm --quiet -rf --cached), $subdir;
+ runcmd @git, qw(rm --quiet -rf --cached --ignore-unmatch), $subdir;
};
my $read_tree_debian = sub {
my ($treeish) = @_;
}
sub cmd_launder () {
- badusage "no arguments to launder allowed";
+ badusage "no arguments to launder allowed" if @ARGV;
my $old = get_head();
my ($tip,$breakwater) = walk $old;
update_head $old, $tip, 'launder';
my $toplevel = cmdoutput @git, qw(rev-parse --show-toplevel);
chdir $toplevel or die "chdir $toplevel: $!";
+fresh_playground $playprefix;
+$rd = ensure_a_playground "playprefix/misc";
+
my $cmd = shift @ARGV;
my $cmdfn = $cmd;
$cmdfn =~ y/-/_/;