chiark / gitweb /
git-debrebase: call setup_sigwarn
[dgit.git] / git-debrebase
index a1d277e54c7a6bf82417eb28c3689ef2063d6432..5d1e9c3dc99bf16ffa3605c1e999303a15e28770 100755 (executable)
 
 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";
@@ -690,7 +691,14 @@ sub get_head () { return git_rev_parse qw(HEAD); }
 
 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 () {
@@ -716,6 +724,55 @@ sub cmd_analyse () {
     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;