summaryrefslogtreecommitdiff
path: root/builtin/update-ref.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2020-04-02 07:09:53 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-04-02 18:09:48 (GMT)
commitde0e0d650a1c2afc81a4c5e8d37d266ffa2b8ccf (patch)
treedb7c29b7f3be626bb60d4ae6b3b22212d3dcb909 /builtin/update-ref.c
parent804dba54f5abdb35b5d15eed63625581c82697fb (diff)
downloadgit-de0e0d650a1c2afc81a4c5e8d37d266ffa2b8ccf.zip
git-de0e0d650a1c2afc81a4c5e8d37d266ffa2b8ccf.tar.gz
git-de0e0d650a1c2afc81a4c5e8d37d266ffa2b8ccf.tar.bz2
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>
Diffstat (limited to 'builtin/update-ref.c')
-rw-r--r--builtin/update-ref.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/builtin/update-ref.c b/builtin/update-ref.c
index 381d347..0f34b68 100644
--- a/builtin/update-ref.c
+++ b/builtin/update-ref.c
@@ -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)
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)
}
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;
}