@@ -406,7 +406,8 @@ sub cmd_dcommit {
406406 " If these changes depend on each other, re-running " ,
407407 " without --no-rebase will be required."
408408 }
409- foreach my $d (@$linear_refs ) {
409+ while (1) {
410+ my $d = shift @$linear_refs or last ;
410411 unless (defined $last_rev ) {
411412 (undef , $last_rev , undef ) = cmt_metadata(" $d ~1" );
412413 unless (defined $last_rev ) {
@@ -439,14 +440,14 @@ sub cmd_dcommit {
439440
440441 # we always want to rebase against the current HEAD,
441442 # not any head that was passed to us
442- my @diff = command(' diff-tree' , ' HEAD ' ,
443+ my @diff = command(' diff-tree' , $d ,
443444 $gs -> refname, ' --' );
444445 my @finish ;
445446 if (@diff ) {
446447 @finish = rebase_cmd();
447- print STDERR " W: HEAD and " , $gs -> refname,
448+ print STDERR " W: $d and " , $gs -> refname,
448449 " differ, using @finish :\n " ,
449- " @diff " ;
450+ join ( " \n " , @diff ), " \n " ;
450451 } else {
451452 print " No changes between current HEAD and " ,
452453 $gs -> refname,
@@ -455,6 +456,45 @@ sub cmd_dcommit {
455456 @finish = qw/ reset --mixed/ ;
456457 }
457458 command_noisy(@finish , $gs -> refname);
459+ if (@diff ) {
460+ @refs = ();
461+ my ($url_ , $rev_ , $uuid_ , $gs_ ) =
462+ working_head_info($head , \@refs );
463+ my ($linear_refs_ , $parents_ ) =
464+ linearize_history($gs_ , \@refs );
465+ if (scalar (@$linear_refs ) !=
466+ scalar (@$linear_refs_ )) {
467+ fatal " # of revisions changed " ,
468+ " \n before:\n " ,
469+ join (" \n " , @$linear_refs ),
470+ " \n\n after:\n " ,
471+ join (" \n " , @$linear_refs_ ), " \n " ,
472+ ' If you are attempting to commit ' ,
473+ " merges, try running:\n\t " ,
474+ ' git rebase --interactive' ,
475+ ' --preserve-merges ' ,
476+ $gs -> refname,
477+ " \n Before dcommitting" ;
478+ }
479+ if ($url_ ne $url ) {
480+ fatal " URL mismatch after rebase: " ,
481+ " $url_ != $url " ;
482+ }
483+ if ($uuid_ ne $uuid ) {
484+ fatal " uuid mismatch after rebase: " ,
485+ " $uuid_ != $uuid " ;
486+ }
487+ # remap parents
488+ my (%p , @l , $i );
489+ for ($i = 0; $i < scalar @$linear_refs ; $i ++) {
490+ my $new = $linear_refs_ -> [$i ] or next ;
491+ $p {$new } =
492+ $parents -> {$linear_refs -> [$i ]};
493+ push @l , $new ;
494+ }
495+ $parents = \%p ;
496+ $linear_refs = \@l ;
497+ }
458498 $last_rev = $cmt_rev ;
459499 }
460500 }
0 commit comments