summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2018-06-16 11:50:17 +0100
committerIan Jackson <ijackson@chiark.greenend.org.uk>2018-06-16 22:40:14 +0100
commite5fa171de2df26246f6bc1efeb6b101d1588d700 (patch)
treec5ec557102899fdb5530fdca29c59910769e668b
parent8fa9dd51a4602b965d16b970611e04538e08967d (diff)
git-debrebase: Fix multi-orig handling
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
-rwxr-xr-xgit-debrebase28
1 files changed, 22 insertions, 6 deletions
diff --git a/git-debrebase b/git-debrebase
index d9ceb20..fbf2a58 100755
--- a/git-debrebase
+++ b/git-debrebase
@@ -1202,13 +1202,29 @@ sub cmd_new_upstream_v0 () {
if ($old_upstream && $old_upstream->{Msg} =~ m{^\[git-debrebase }m) {
if ($old_upstream->{Msg} =~
- m{^\[git-debrebase upstream-combine \.((?: $extra_orig_namepart_re)+)\:.*\]$}m
+ m{^\[git-debrebase upstream-combine (\.(?: $extra_orig_namepart_re)+)\:.*\]$}m
) {
- my @oldpieces = ('', split / /, $1);
- my $parentix = -1 + scalar @{ $old_upstream->{Parents} };
- foreach my $i (0..$#oldpieces) {
- my $n = $oldpieces[$i];
- $piece->($n, Old => $old_upstream->{CommitId}.'^'.$parentix);
+ my @oldpieces = (split / /, $1);
+ my $old_n_parents = scalar @{ $old_upstream->{Parents} };
+ if (@oldpieces != $old_n_parents) {
+ snag 'upstream-confusing', sprintf
+ "previous upstream combine %s".
+ " mentions %d pieces (each implying one orig commit)".
+ " but has %d parents",
+ $old_upstream->{CommitId},
+ (scalar @oldpieces),
+ $old_n_parents;
+ } elsif ($oldpieces[0] ne '.') {
+ snag 'upstream-confusing', sprintf
+ "previous upstream combine %s".
+ " first piece is not \`.'",
+ $oldpieces[0];
+ } else {
+ $oldpieces[0] = '';
+ foreach my $i (0..$#oldpieces) {
+ my $n = $oldpieces[$i];
+ $piece->($n, Old => $old_upstream->{CommitId}.'^'.($i+1));
+ }
}
} else {
snag 'upstream-confusing',