chiark / gitweb /
git-debrebase: document that breakwater merges always have single parent
[dgit.git] / git-debrebase
index f55ef4eb59721e1596922b918f637897345d4f2d..5808cf33f7f1b702f29c5e57b1ef01e707a0428f 100755 (executable)
@@ -154,7 +154,8 @@ sub in_workarea ($) {
     my ($sub) = @_;
     changedir $workarea;
     my $r = eval { $sub->(); };
-    changedir $maindir;
+    { local $@; changedir $maindir; }
+    die $@ if $@;
 }
 
 sub fresh_workarea () {
@@ -282,7 +283,7 @@ sub calculate_committer_authline () {
 #
 #   BreakwaterUpstreamMerge
 #     has additional entry in classification result
-#       OrigParents = [ subset of Parents ]
+#       OrigParents = [ subset of Parents ]  # singleton list
 
 sub classify ($) {
     my ($objid) = @_;
@@ -627,9 +628,14 @@ sub walk ($;$$) {
  
     my $committer_authline = calculate_committer_authline();
 
+    printdebug "WALK REBUILD $build ".(scalar @processed)."\n";
+
+    confess "internal error" unless $build eq (pop @processed)->{CommitId};
+
     in_workarea sub {
        mkdir $rd or $!==EEXIST or die $!;
        my $current_method;
+       runcmd @git, qw(read-tree), $build;
        foreach my $cl (qw(Debian), (reverse @brw_cl),
                        { SpecialMethod => 'RecordBreakwaterTip' },
                        qw(Upstream), (reverse @upp_cl)) {
@@ -640,6 +646,8 @@ sub walk ($;$$) {
            my $method = $cl->{SpecialMethod} // $current_method;
            my @parents = ($build);
            my $cltree = $cl->{CommitId};
+           printdebug "WALK BUILD ".($cltree//'undef').
+               " $method (rewriting=$rewriting)\n";
            if ($method eq 'Debian') {
                $read_tree_debian->($cltree);
            } elsif ($method eq 'Upstream') {
@@ -659,7 +667,13 @@ sub walk ($;$$) {
            } else {
                confess "$method ?";
            }
-           $rewriting ||= $cl ne pop @processed;
+           if (!$rewriting) {
+               my $procd = (pop @processed) // 'UNDEF';
+               if ($cl ne $procd) {
+                   $rewriting = 1;
+                   printdebug "WALK REWRITING NOW cl=$cl procd=$procd\n";
+               }
+           }
            my $newtree = cmdoutput @git, qw(write-tree);
            my $ch = $cl->{Hdr};
            $ch =~ s{^tree .*}{tree $newtree}m or confess "$ch ?";
@@ -685,7 +699,7 @@ sub walk ($;$$) {
     };
 
     my $final_check = get_differs $build, $input;
-    die sprintf "internal error %#x", $final_check
+    die sprintf "internal error %#x %s %s", $final_check, $build, $input
        if $final_check & ~D_PAT_ADD;
 
     return ($build, $breakwater);
@@ -711,8 +725,9 @@ sub cmd_launder () {
     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;
+    printf "# working tip\n%s\n", $tip;
 }
 
 sub cmd_analyse () {