[PATCH v2 3/3] fast-import: disallow "merge $itself" command
From: Dmitry Ivankov <hidden>
Date: 2016-06-15 22:54:11
Subsystem:
the rest · Maintainer:
Linus Torvalds
"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 <redacted> --- 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