builtin/receive-pack: report unpack errors via strbuf
When writing packfiles via `unpack()`, error messages are returned directly by the function. In preparation for `unpack()` logic being moved behind a generic ODB transaction interface, update the function to instead write any error messages to a caller provided strbuf and return a negative value on error. Call sites are updated to use the error strbuf accordingly. Signed-off-by: Justin Tobler <jltobler@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>main
parent
255f3a7a53
commit
429dd07aa0
|
|
@ -2015,7 +2015,7 @@ cleanup:
|
|||
}
|
||||
|
||||
static void execute_commands(struct command *commands,
|
||||
const char *unpacker_error,
|
||||
int unpacker_error,
|
||||
struct shallow_info *si,
|
||||
struct odb_transaction *transaction,
|
||||
const struct string_list *push_options)
|
||||
|
|
@ -2340,8 +2340,8 @@ struct unpack_opts {
|
|||
int quiet;
|
||||
};
|
||||
|
||||
static const char *unpack(struct odb_transaction *transaction,
|
||||
const struct unpack_opts *opts)
|
||||
static int unpack(struct odb_transaction *transaction, struct strbuf *err_msg,
|
||||
const struct unpack_opts *opts)
|
||||
{
|
||||
struct pack_header hdr;
|
||||
const char *hdr_err;
|
||||
|
|
@ -2353,7 +2353,8 @@ static const char *unpack(struct odb_transaction *transaction,
|
|||
if (hdr_err) {
|
||||
if (err_fd > 0)
|
||||
close(err_fd);
|
||||
return hdr_err;
|
||||
strbuf_addstr(err_msg, hdr_err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (opts->shallow_file) {
|
||||
|
|
@ -2378,8 +2379,10 @@ static const char *unpack(struct odb_transaction *transaction,
|
|||
child.err = err_fd;
|
||||
child.git_cmd = 1;
|
||||
status = run_command(&child);
|
||||
if (status)
|
||||
return "unpack-objects abnormal exit";
|
||||
if (status) {
|
||||
strbuf_addstr(err_msg, "unpack-objects abnormal exit");
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
char hostname[HOST_NAME_MAX + 1];
|
||||
char *lockfile;
|
||||
|
|
@ -2410,8 +2413,10 @@ static const char *unpack(struct odb_transaction *transaction,
|
|||
child.err = err_fd;
|
||||
child.git_cmd = 1;
|
||||
status = start_command(&child);
|
||||
if (status)
|
||||
return "index-pack fork failed";
|
||||
if (status) {
|
||||
strbuf_addstr(err_msg, "index-pack fork failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* The lockfile filepath is expected to be the final location of
|
||||
|
|
@ -2427,15 +2432,18 @@ static const char *unpack(struct odb_transaction *transaction,
|
|||
close(child.out);
|
||||
|
||||
status = finish_command(&child);
|
||||
if (status)
|
||||
return "index-pack abnormal exit";
|
||||
if (status) {
|
||||
strbuf_addstr(err_msg, "index-pack abnormal exit");
|
||||
return -1;
|
||||
}
|
||||
odb_reprepare(the_repository->objects);
|
||||
}
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *unpack_with_sideband(struct odb_transaction *transaction,
|
||||
const char *shallow_file)
|
||||
static int unpack_with_sideband(struct odb_transaction *transaction,
|
||||
const char *shallow_file,
|
||||
struct strbuf *err_msg)
|
||||
{
|
||||
struct unpack_opts opts = {
|
||||
.fsck_objects = (receive_fsck_objects >= 0
|
||||
|
|
@ -2450,20 +2458,20 @@ static const char *unpack_with_sideband(struct odb_transaction *transaction,
|
|||
.quiet = quiet,
|
||||
};
|
||||
struct async muxer;
|
||||
const char *ret;
|
||||
int ret;
|
||||
|
||||
if (!use_sideband)
|
||||
return unpack(transaction, &opts);
|
||||
return unpack(transaction, err_msg, &opts);
|
||||
|
||||
use_keepalive = KEEPALIVE_AFTER_NUL;
|
||||
memset(&muxer, 0, sizeof(muxer));
|
||||
muxer.proc = copy_to_sideband;
|
||||
muxer.in = -1;
|
||||
if (start_async(&muxer))
|
||||
return NULL;
|
||||
return 0;
|
||||
|
||||
opts.err_fd = muxer.in;
|
||||
ret = unpack(transaction, &opts);
|
||||
ret = unpack(transaction, err_msg, &opts);
|
||||
|
||||
finish_async(&muxer);
|
||||
return ret;
|
||||
|
|
@ -2552,13 +2560,13 @@ static void update_shallow_info(struct command *commands,
|
|||
free(ref_status);
|
||||
}
|
||||
|
||||
static void report(struct command *commands, const char *unpack_status)
|
||||
static void report(struct command *commands, const struct strbuf *unpack_status)
|
||||
{
|
||||
struct command *cmd;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
|
||||
packet_buf_write(&buf, "unpack %s\n",
|
||||
unpack_status ? unpack_status : "ok");
|
||||
unpack_status->len ? unpack_status->buf : "ok");
|
||||
for (cmd = commands; cmd; cmd = cmd->next) {
|
||||
if (!cmd->error_string)
|
||||
packet_buf_write(&buf, "ok %s\n",
|
||||
|
|
@ -2576,14 +2584,14 @@ static void report(struct command *commands, const char *unpack_status)
|
|||
strbuf_release(&buf);
|
||||
}
|
||||
|
||||
static void report_v2(struct command *commands, const char *unpack_status)
|
||||
static void report_v2(struct command *commands, const struct strbuf *unpack_status)
|
||||
{
|
||||
struct command *cmd;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
struct ref_push_report *report;
|
||||
|
||||
packet_buf_write(&buf, "unpack %s\n",
|
||||
unpack_status ? unpack_status : "ok");
|
||||
unpack_status->len ? unpack_status->buf : "ok");
|
||||
for (cmd = commands; cmd; cmd = cmd->next) {
|
||||
int count = 0;
|
||||
|
||||
|
|
@ -2707,8 +2715,8 @@ int cmd_receive_pack(int argc,
|
|||
PACKET_READ_DIE_ON_ERR_PACKET);
|
||||
|
||||
if ((commands = read_head_info(&reader, &shallow))) {
|
||||
const char *unpack_status = NULL;
|
||||
struct string_list push_options = STRING_LIST_INIT_DUP;
|
||||
struct strbuf unpack_status = STRBUF_INIT;
|
||||
|
||||
if (use_push_options)
|
||||
read_push_options(&reader, &push_options);
|
||||
|
|
@ -2728,22 +2736,22 @@ int cmd_receive_pack(int argc,
|
|||
alt_shallow_file = setup_temporary_shallow(si.shallow);
|
||||
|
||||
if (odb_transaction_begin(the_repository->objects, &transaction, ODB_TRANSACTION_RECEIVE))
|
||||
unpack_status = "unable to start object transaction";
|
||||
strbuf_addstr(&unpack_status, "unable to start object transaction");
|
||||
else
|
||||
unpack_status = unpack_with_sideband(transaction, alt_shallow_file);
|
||||
unpack_with_sideband(transaction, alt_shallow_file, &unpack_status);
|
||||
|
||||
update_shallow_info(commands, &si, &ref, alt_shallow_file);
|
||||
}
|
||||
use_keepalive = KEEPALIVE_ALWAYS;
|
||||
execute_commands(commands, unpack_status, &si, transaction,
|
||||
execute_commands(commands, !!unpack_status.len, &si, transaction,
|
||||
&push_options);
|
||||
odb_transaction_finalize(transaction);
|
||||
delete_tempfile(&pack_lockfile);
|
||||
sigchain_push(SIGPIPE, SIG_IGN);
|
||||
if (report_status_v2)
|
||||
report_v2(commands, unpack_status);
|
||||
report_v2(commands, &unpack_status);
|
||||
else if (report_status)
|
||||
report(commands, unpack_status);
|
||||
report(commands, &unpack_status);
|
||||
sigchain_pop(SIGPIPE);
|
||||
run_receive_hook(commands, "post-receive", 1, NULL,
|
||||
&push_options);
|
||||
|
|
@ -2768,6 +2776,7 @@ int cmd_receive_pack(int argc,
|
|||
if (auto_update_server_info)
|
||||
update_server_info(the_repository, 0);
|
||||
clear_shallow_info(&si);
|
||||
strbuf_release(&unpack_status);
|
||||
}
|
||||
if (use_sideband)
|
||||
packet_flush(1);
|
||||
|
|
|
|||
Loading…
Reference in New Issue