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';
#
# Types:
# Packaging
+# Changelog
# Upstream
# AddPatches
# Mixed
} elsif ($d & DS_DEB and !($d & ~DS_DEB)) {
my ($ty,$dummy) = git_cat_file "$ph[0]:debian";
if ($ty eq 'tree') {
- return $classify->(qw(Packaging));
+ if ($d == D_DEB_CLOG) {
+ return $classify->(qw(Changelog));
+ } else {
+ return $classify->(qw(Packaging));
+ }
} elsif ($ty eq 'missing') {
return $classify->(qw(BreakwaterStart));
} else {
$cur = $p0;
$rewrite_from_here->();
next;
- } elsif ($ty eq 'Packaging') {
+ } elsif ($ty eq 'Packaging' or $ty eq 'Changelog') {
push @brw_cl, $cl;
$cur = $p0;
next;
sub update_head ($$$) {
my ($old, $new, $mrest) = @_;
- runcmd @git, qw(update-ref -m), "git-debrebase $mrest", $new, $old;
+ runcmd @git, qw(update-ref -m), "debrebase: $mrest", 'HEAD', $new, $old;
+}
+
+sub update_head_checkout ($$$) {
+ my ($old, $new, $mrest) = @_;
+ my $symref = git_get_symref();
+ runcmd @git, qw(checkout), $new, qw(.);
+ update_head $old, $new, $mrest;
}
sub cmd_launder () {
STDOUT->error and die $!;
}
+sub cmd_downstream_rebase_launder_v0 () {
+ badusage "needs 1 argument, the baseline" unless @ARGV==1;
+ my ($base) = @ARGV;
+ $base = git_rev_parse $base;
+ my $old_head = get_head();
+ my $current = $old_head;
+ my $topmost_keep;
+ for (;;) {
+ if ($current eq $base) {
+ $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') {
+ print " ^".($cl->{Contributor}{Ix}+1);
+ $next = $cl->{Contributor}{CommitId};
+ } elsif ($cl->{Type} eq 'AddPatches' or
+ $cl->{Type} eq 'Changelog') {
+ print " strip";
+ $next = $p0;
+ } else {
+ print " keep";
+ $next = $p0;
+ $keep = 1;
+ }
+ print "\n";
+ if ($keep) {
+ $topmost_keep //= $current;
+ } else {
+ die "to-be stripped changes not on top of the branch\n"
+ if $topmost_keep;
+ }
+ $current = $next;
+ }
+ if ($topmost_keep eq $old_head) {
+ print "unchanged\n";
+ } else {
+ print "updating to $topmost_keep\n";
+ update_head_checkout
+ $old_head, $topmost_keep,
+ 'downstream-rebase-launder-v0';
+ }
+}
+
GetOptions("D+" => \$debuglevel) or die badusage "bad options\n";
initdebug('git-debrebase ');
enabledebug if $debuglevel;