"merge $itself" may be used to create commits with previous branch tip being repeated as n-th parent or even moved from being 1-st to be just n-th. This is not a documented use case and doesn't look like a common one. In presence of "from $some" command "merge $itself" acts the same as "merge $some" would. Which is completely undocumented and looks like a bug (caused by parse_from() temporarily rewriting b->sha1 with $some). Just deny "merge $itself" for now. It was a bit broken and btw "from $itself" was and is a forbidden command too. Signed-off-by: Dmitry Ivankov <divanorama@xxxxxxxxx> --- fast-import.c | 12 +++++++++--- t/t9300-fast-import.sh | 13 +++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/fast-import.c b/fast-import.c index f03da1e..781c614 100644 --- a/fast-import.c +++ b/fast-import.c @@ -2611,7 +2611,7 @@ static int parse_from(struct branch *b) return 1; } -static struct hash_list *parse_merge(unsigned int *count) +static struct hash_list *parse_merge(unsigned int *count, struct branch *b) { struct hash_list *list = NULL, *n, *e = e; const char *from; @@ -2622,7 +2622,13 @@ static struct hash_list *parse_merge(unsigned int *count) from = strchr(command_buf.buf, ' ') + 1; n = xmalloc(sizeof(*n)); s = lookup_branch(from); - if (s) + if (b == s) + /* + * Also if there were a 'from' command, b will point to + * 'from' commit, because parse_from stores it there. + */ + die("Can't merge a branch with itself: %s", b->name); + else if (s) hashcpy(n->sha1, s->sha1); else if (*from == ':') { uintmax_t idnum = parse_mark_ref_eol(from); @@ -2686,7 +2692,7 @@ static void parse_new_commit(void) parse_data(&msg, 0, NULL); read_next_command(); parse_from(b); - merge_list = parse_merge(&merge_count); + merge_list = parse_merge(&merge_count, b); /* ensure the branch is active/loaded */ if (!b->branch_tree.tree || !max_active_branches) { diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 6f4c988..79cb72a 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -872,6 +872,19 @@ test_expect_success \ 'git fast-import <input && git rev-parse --verify J5 && test_must_fail git rev-parse --verify J5^' + +cat >input <<INPUT_END +commit refs/heads/J5 +committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE +data <<COMMIT +Merge J5 with itself. +COMMIT +merge refs/heads/J5 + +INPUT_END +test_expect_success \ + 'J: disallow merge with itself' \ + 'test_must_fail git fast-import <input' ### ### series K ### -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html