diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-11-03 12:15:08 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-11-03 14:27:04 -0700 |
commit | ee6dfb2d83ba1b057943e705f707fa27e34e47f9 (patch) | |
tree | 538d0e0e2f1cf2e8586bfc671ca61dbea70f5d46 | |
parent | t3200: add test case for 'branch -m' (diff) | |
download | tgif-ee6dfb2d83ba1b057943e705f707fa27e34e47f9.tar.xz |
receive-pack: do not expect object 0{40} to exist
When pushing to delete a ref, it uses 0{40} as an object name to signal
that the request is a deletion. We shouldn't trigger "deletion of a
corrupt ref" warning in such a case, which was designed to notice that a
ref points at an object that is truly missing from the repository.
Reported-by: Stefan Näwe
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin/receive-pack.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 261b610d24..7ec68a1e80 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -634,7 +634,7 @@ static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]) struct command **cmd_list = cb_data; struct command *cmd = *cmd_list; - if (!cmd) + if (!cmd || is_null_sha1(cmd->new_sha1)) return -1; /* end of list */ *cmd_list = NULL; /* this returns only one */ hashcpy(sha1, cmd->new_sha1); @@ -659,11 +659,16 @@ static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20]) struct command **cmd_list = cb_data; struct command *cmd = *cmd_list; - if (!cmd) - return -1; /* end of list */ - *cmd_list = cmd->next; - hashcpy(sha1, cmd->new_sha1); - return 0; + while (cmd) { + if (!is_null_sha1(cmd->new_sha1)) { + hashcpy(sha1, cmd->new_sha1); + *cmd_list = cmd->next; + return 0; + } + cmd = cmd->next; + } + *cmd_list = NULL; + return -1; /* end of list */ } static void execute_commands(struct command *commands, const char *unpacker_error) |