diff options
author | Junio C Hamano <gitster@pobox.com> | 2019-04-25 09:41:16 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2019-04-25 09:41:16 +0200 |
commit | dae82ecf147c58c6862d349fb8421d81f5868616 (patch) | |
tree | 5ef032267002e423398cce3032059e5fc74fd33d /fast-import.c | |
parent | Merge branch 'jt/fetch-no-update-shallow-in-proto-v2' (diff) | |
parent | fast-import: fix erroneous handling of get-mark with empty orphan commits (diff) | |
download | git-dae82ecf147c58c6862d349fb8421d81f5868616.tar.xz git-dae82ecf147c58c6862d349fb8421d81f5868616.zip |
Merge branch 'en/fast-import-parsing-fix'
"git fast-import" update.
* en/fast-import-parsing-fix:
fast-import: fix erroneous handling of get-mark with empty orphan commits
fast-import: only allow cat-blob requests where it makes sense
fast-import: check most prominent commands first
git-fast-import.txt: fix wording about where ls command can appear
t9300: demonstrate bug with get-mark and empty orphan commits
Diffstat (limited to 'fast-import.c')
-rw-r--r-- | fast-import.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/fast-import.c b/fast-import.c index b7ba755c2b..064c55e8be 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1748,8 +1748,6 @@ static int read_next_command(void) } for (;;) { - const char *p; - if (unread_command_buf) { unread_command_buf = 0; } else { @@ -1782,14 +1780,6 @@ static int read_next_command(void) rc->prev->next = rc; cmd_tail = rc; } - if (skip_prefix(command_buf.buf, "get-mark ", &p)) { - parse_get_mark(p); - continue; - } - if (skip_prefix(command_buf.buf, "cat-blob ", &p)) { - parse_cat_blob(p); - continue; - } if (command_buf.buf[0] == '#') continue; return 0; @@ -2254,8 +2244,15 @@ static void file_change_m(const char *p, struct branch *b) strbuf_addstr(&uq, p); p = uq.buf; } - read_next_command(); - parse_and_store_blob(&last_blob, &oid, 0); + while (read_next_command() != EOF) { + const char *v; + if (skip_prefix(command_buf.buf, "cat-blob ", &v)) + parse_cat_blob(v); + else { + parse_and_store_blob(&last_blob, &oid, 0); + break; + } + } } else { enum object_type expected = S_ISDIR(mode) ? OBJ_TREE: OBJ_BLOB; @@ -2627,6 +2624,8 @@ static void parse_new_commit(const char *arg) file_change_deleteall(b); else if (skip_prefix(command_buf.buf, "ls ", &v)) parse_ls(v, b); + else if (skip_prefix(command_buf.buf, "cat-blob ", &v)) + parse_cat_blob(v); else { unread_command_buf = 1; break; @@ -3303,14 +3302,18 @@ int cmd_main(int argc, const char **argv) const char *v; if (!strcmp("blob", command_buf.buf)) parse_new_blob(); - else if (skip_prefix(command_buf.buf, "ls ", &v)) - parse_ls(v, NULL); else if (skip_prefix(command_buf.buf, "commit ", &v)) parse_new_commit(v); else if (skip_prefix(command_buf.buf, "tag ", &v)) parse_new_tag(v); else if (skip_prefix(command_buf.buf, "reset ", &v)) parse_reset_branch(v); + else if (skip_prefix(command_buf.buf, "ls ", &v)) + parse_ls(v, NULL); + else if (skip_prefix(command_buf.buf, "cat-blob ", &v)) + parse_cat_blob(v); + else if (skip_prefix(command_buf.buf, "get-mark ", &v)) + parse_get_mark(v); else if (!strcmp("checkpoint", command_buf.buf)) parse_checkpoint(); else if (!strcmp("done", command_buf.buf)) |