Browse Source

update-ref: move transaction handling into `update_refs_stdin()`

While the actual logic to update the transaction is handled in
`update_refs_stdin()`, the transaction itself is started and committed
in `cmd_update_ref()` itself. This makes it hard to handle transaction
abortion and commits as part of `update_refs_stdin()` itself, which is
required in order to introduce transaction handling features to `git
update-refs --stdin`.

Refactor the code to move all transaction handling into
`update_refs_stdin()` to prepare for transaction handling features.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Patrick Steinhardt 5 years ago committed by Junio C Hamano
parent
commit
de0e0d650a
  1. 27
      builtin/update-ref.c

27
builtin/update-ref.c

@ -332,15 +332,21 @@ static const struct parse_cmd { @@ -332,15 +332,21 @@ static const struct parse_cmd {
{ "option", parse_cmd_option },
};

static void update_refs_stdin(struct ref_transaction *transaction)
static void update_refs_stdin(void)
{
struct strbuf input = STRBUF_INIT;
struct strbuf input = STRBUF_INIT, err = STRBUF_INIT;
struct ref_transaction *transaction;
const char *next;
int i;

if (strbuf_read(&input, 0, 1000) < 0)
die_errno("could not read from stdin");
next = input.buf;

transaction = ref_transaction_begin(&err);
if (!transaction)
die("%s", err.buf);

/* Read each line dispatch its command */
while (next < input.buf + input.len) {
const struct parse_cmd *cmd = NULL;
@ -367,6 +373,11 @@ static void update_refs_stdin(struct ref_transaction *transaction) @@ -367,6 +373,11 @@ static void update_refs_stdin(struct ref_transaction *transaction)
next++;
}

if (ref_transaction_commit(transaction, &err))
die("%s", err.buf);

ref_transaction_free(transaction);
strbuf_release(&err);
strbuf_release(&input);
}

@ -401,21 +412,11 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix) @@ -401,21 +412,11 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
}

if (read_stdin) {
struct strbuf err = STRBUF_INIT;
struct ref_transaction *transaction;

transaction = ref_transaction_begin(&err);
if (!transaction)
die("%s", err.buf);
if (delete || argc > 0)
usage_with_options(git_update_ref_usage, options);
if (end_null)
line_termination = '\0';
update_refs_stdin(transaction);
if (ref_transaction_commit(transaction, &err))
die("%s", err.buf);
ref_transaction_free(transaction);
strbuf_release(&err);
update_refs_stdin();
return 0;
}


Loading…
Cancel
Save