Merge branch 'ph/push-to-delete-nothing'
* ph/push-to-delete-nothing:
receive-pack: don't pass non-existent refs to post-{receive,update} hooks
Conflicts:
builtin/receive-pack.c
This commit is contained in:
@ -154,7 +154,8 @@ static void write_head_info(void)
|
||||
struct command {
|
||||
struct command *next;
|
||||
const char *error_string;
|
||||
unsigned int skip_update;
|
||||
unsigned int skip_update:1,
|
||||
did_not_exist:1;
|
||||
unsigned char old_sha1[20];
|
||||
unsigned char new_sha1[20];
|
||||
char ref_name[FLEX_ARRAY]; /* more */
|
||||
@ -264,6 +265,7 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_sta
|
||||
|
||||
struct receive_hook_feed_state {
|
||||
struct command *cmd;
|
||||
int skip_broken;
|
||||
struct strbuf buf;
|
||||
};
|
||||
|
||||
@ -272,7 +274,8 @@ static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
|
||||
struct receive_hook_feed_state *state = state_;
|
||||
struct command *cmd = state->cmd;
|
||||
|
||||
while (cmd && cmd->error_string)
|
||||
while (cmd &&
|
||||
state->skip_broken && (cmd->error_string || cmd->did_not_exist))
|
||||
cmd = cmd->next;
|
||||
if (!cmd)
|
||||
return -1; /* EOF */
|
||||
@ -288,13 +291,15 @@ static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int run_receive_hook(struct command *commands, const char *hook_name)
|
||||
static int run_receive_hook(struct command *commands, const char *hook_name,
|
||||
int skip_broken)
|
||||
{
|
||||
struct receive_hook_feed_state state;
|
||||
int status;
|
||||
|
||||
strbuf_init(&state.buf, 0);
|
||||
state.cmd = commands;
|
||||
state.skip_broken = skip_broken;
|
||||
if (feed_receive_hook(&state, NULL, NULL))
|
||||
return 0;
|
||||
state.cmd = commands;
|
||||
@ -485,8 +490,13 @@ static const char *update(struct command *cmd)
|
||||
|
||||
if (is_null_sha1(new_sha1)) {
|
||||
if (!parse_object(old_sha1)) {
|
||||
rp_warning("Allowing deletion of corrupt ref.");
|
||||
old_sha1 = NULL;
|
||||
if (ref_exists(name)) {
|
||||
rp_warning("Allowing deletion of corrupt ref.");
|
||||
} else {
|
||||
rp_warning("Deleting a non-existent ref.");
|
||||
cmd->did_not_exist = 1;
|
||||
}
|
||||
}
|
||||
if (delete_ref(namespaced_name, old_sha1, 0)) {
|
||||
rp_error("failed to delete %s", name);
|
||||
@ -517,7 +527,7 @@ static void run_update_post_hook(struct command *commands)
|
||||
struct child_process proc;
|
||||
|
||||
for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
|
||||
if (cmd->error_string)
|
||||
if (cmd->error_string || cmd->did_not_exist)
|
||||
continue;
|
||||
argc++;
|
||||
}
|
||||
@ -528,7 +538,7 @@ static void run_update_post_hook(struct command *commands)
|
||||
|
||||
for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
|
||||
char *p;
|
||||
if (cmd->error_string)
|
||||
if (cmd->error_string || cmd->did_not_exist)
|
||||
continue;
|
||||
p = xmalloc(strlen(cmd->ref_name) + 1);
|
||||
strcpy(p, cmd->ref_name);
|
||||
@ -672,7 +682,7 @@ static void execute_commands(struct command *commands, const char *unpacker_erro
|
||||
0, &cmd))
|
||||
set_connectivity_errors(commands);
|
||||
|
||||
if (run_receive_hook(commands, pre_receive_hook)) {
|
||||
if (run_receive_hook(commands, pre_receive_hook, 0)) {
|
||||
for (cmd = commands; cmd; cmd = cmd->next)
|
||||
cmd->error_string = "pre-receive hook declined";
|
||||
return;
|
||||
@ -940,7 +950,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
|
||||
unlink_or_warn(pack_lockfile);
|
||||
if (report_status)
|
||||
report(commands, unpack_status);
|
||||
run_receive_hook(commands, post_receive_hook);
|
||||
run_receive_hook(commands, post_receive_hook, 1);
|
||||
run_update_post_hook(commands);
|
||||
if (auto_gc) {
|
||||
const char *argv_gc_auto[] = {
|
||||
|
||||
Reference in New Issue
Block a user