From: Junio C Hamano <gitster@pobox.com>
To: Michael Haggerty <mhagger@alum.mit.edu>
Cc: Brad King <brad.king@kitware.com>,
Johan Herland <johan@herland.net>, Jeff King <peff@peff.net>,
Vicent Marti <tanoku@gmail.com>,
git@vger.kernel.org
Subject: Re: [PATCH v2 20/27] update-ref --stdin: Reimplement using reference transactions
Date: Tue, 01 Apr 2014 12:46:11 -0700 [thread overview]
Message-ID: <xmqqppl0zvcs.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1395683820-17304-21-git-send-email-mhagger@alum.mit.edu> (Michael Haggerty's message of "Mon, 24 Mar 2014 18:56:53 +0100")
Michael Haggerty <mhagger@alum.mit.edu> writes:
> This change is mostly clerical: the parse_cmd_*() functions need to
> use local variables rather than a struct ref_update to collect the
> arguments needed for each update, and then call ref_transaction_*() to
> queue the change rather than building up the list of changes at the
> caller side.
>
> Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
> ---
With the implementation of ref_transaction at this point in the
series it does not matter, but the updated code in this patch means
that it is perfectly acceptable to do this sequence:
ref_transaction_begin();
ref_transaction_update();
...
ref_transaction_update();
die();
without ever calling ref_transaction_rollback() API function.
Depending on the future backends, we may want to ensure rollback is
called, no? And if that is the case, we would want to prepare
callers of the API with some at-exit facility to call rollback, no?
Other than that, the code looks straight-forward.
Thanks.
> builtin/update-ref.c | 142 +++++++++++++++++++++++++++------------------------
> 1 file changed, 75 insertions(+), 67 deletions(-)
>
> diff --git a/builtin/update-ref.c b/builtin/update-ref.c
> index bbc04b2..2c8678b 100644
> --- a/builtin/update-ref.c
> +++ b/builtin/update-ref.c
> @@ -12,29 +12,11 @@ static const char * const git_update_ref_usage[] = {
> NULL
> };
>
> -static int updates_alloc;
> -static int updates_count;
> -static struct ref_update **updates;
> +static struct ref_transaction *transaction;
>
> static char line_termination = '\n';
> static int update_flags;
>
> -static struct ref_update *update_alloc(void)
> -{
> - struct ref_update *update;
> -
> - /* Allocate and zero-init a struct ref_update */
> - update = xcalloc(1, sizeof(*update));
> - ALLOC_GROW(updates, updates_count + 1, updates_alloc);
> - updates[updates_count++] = update;
> -
> - /* Store and reset accumulated options */
> - update->flags = update_flags;
> - update_flags = 0;
> -
> - return update;
> -}
> -
> /*
> * Parse one whitespace- or NUL-terminated, possibly C-quoted argument
> * and append the result to arg. Return a pointer to the terminator.
> @@ -196,97 +178,119 @@ static int parse_next_sha1(struct strbuf *input, const char **next,
>
> static const char *parse_cmd_update(struct strbuf *input, const char *next)
> {
> - struct ref_update *update;
> -
> - update = update_alloc();
> + char *refname;
> + unsigned char new_sha1[20];
> + unsigned char old_sha1[20];
> + int have_old;
>
> - update->ref_name = parse_refname(input, &next);
> - if (!update->ref_name)
> + refname = parse_refname(input, &next);
> + if (!refname)
> die("update: missing <ref>");
>
> - if (parse_next_sha1(input, &next, update->new_sha1,
> - "update", update->ref_name,
> + if (parse_next_sha1(input, &next, new_sha1, "update", refname,
> PARSE_SHA1_ALLOW_EMPTY))
> - die("update %s: missing <newvalue>", update->ref_name);
> + die("update %s: missing <newvalue>", refname);
>
> - update->have_old = !parse_next_sha1(input, &next, update->old_sha1,
> - "update", update->ref_name,
> - PARSE_SHA1_OLD);
> + have_old = !parse_next_sha1(input, &next, old_sha1, "update", refname,
> + PARSE_SHA1_OLD);
>
> if (*next != line_termination)
> - die("update %s: extra input: %s", update->ref_name, next);
> + die("update %s: extra input: %s", refname, next);
> +
> + ref_transaction_update(transaction, refname, new_sha1, old_sha1,
> + update_flags, have_old);
> +
> + update_flags = 0;
> + free(refname);
>
> return next;
> }
>
> static const char *parse_cmd_create(struct strbuf *input, const char *next)
> {
> - struct ref_update *update;
> -
> - update = update_alloc();
> + char *refname;
> + unsigned char new_sha1[20];
>
> - update->ref_name = parse_refname(input, &next);
> - if (!update->ref_name)
> + refname = parse_refname(input, &next);
> + if (!refname)
> die("create: missing <ref>");
>
> - if (parse_next_sha1(input, &next, update->new_sha1,
> - "create", update->ref_name, 0))
> - die("create %s: missing <newvalue>", update->ref_name);
> + if (parse_next_sha1(input, &next, new_sha1, "create", refname, 0))
> + die("create %s: missing <newvalue>", refname);
>
> - if (is_null_sha1(update->new_sha1))
> - die("create %s: zero <newvalue>", update->ref_name);
> + if (is_null_sha1(new_sha1))
> + die("create %s: zero <newvalue>", refname);
>
> if (*next != line_termination)
> - die("create %s: extra input: %s", update->ref_name, next);
> + die("create %s: extra input: %s", refname, next);
> +
> + ref_transaction_create(transaction, refname, new_sha1, update_flags);
> +
> + update_flags = 0;
> + free(refname);
>
> return next;
> }
>
> static const char *parse_cmd_delete(struct strbuf *input, const char *next)
> {
> - struct ref_update *update;
> + char *refname;
> + unsigned char old_sha1[20];
> + int have_old;
>
> - update = update_alloc();
> -
> - update->ref_name = parse_refname(input, &next);
> - if (!update->ref_name)
> + refname = parse_refname(input, &next);
> + if (!refname)
> die("delete: missing <ref>");
>
> - if (parse_next_sha1(input, &next, update->old_sha1,
> - "delete", update->ref_name, PARSE_SHA1_OLD)) {
> - update->have_old = 0;
> + if (parse_next_sha1(input, &next, old_sha1, "delete", refname,
> + PARSE_SHA1_OLD)) {
> + have_old = 0;
> } else {
> - if (is_null_sha1(update->old_sha1))
> - die("delete %s: zero <oldvalue>", update->ref_name);
> - update->have_old = 1;
> + if (is_null_sha1(old_sha1))
> + die("delete %s: zero <oldvalue>", refname);
> + have_old = 1;
> }
>
> if (*next != line_termination)
> - die("delete %s: extra input: %s", update->ref_name, next);
> + die("delete %s: extra input: %s", refname, next);
> +
> + ref_transaction_delete(transaction, refname, old_sha1,
> + update_flags, have_old);
> +
> + update_flags = 0;
> + free(refname);
>
> return next;
> }
>
> static const char *parse_cmd_verify(struct strbuf *input, const char *next)
> {
> - struct ref_update *update;
> -
> - update = update_alloc();
> + char *refname;
> + unsigned char new_sha1[20];
> + unsigned char old_sha1[20];
> + int have_old;
>
> - update->ref_name = parse_refname(input, &next);
> - if (!update->ref_name)
> + refname = parse_refname(input, &next);
> + if (!refname)
> die("verify: missing <ref>");
>
> - if (parse_next_sha1(input, &next, update->old_sha1,
> - "verify", update->ref_name, PARSE_SHA1_OLD)) {
> - update->have_old = 0;
> + if (parse_next_sha1(input, &next, old_sha1, "verify", refname,
> + PARSE_SHA1_OLD)) {
> + hashclr(new_sha1);
> + have_old = 0;
> } else {
> - hashcpy(update->new_sha1, update->old_sha1);
> - update->have_old = 1;
> + hashcpy(new_sha1, old_sha1);
> + have_old = 1;
> }
>
> if (*next != line_termination)
> - die("verify %s: extra input: %s", update->ref_name, next);
> + die("verify %s: extra input: %s", refname, next);
> +
> + ref_transaction_update(transaction, refname, new_sha1, old_sha1,
> + update_flags, have_old);
> +
> + update_flags = 0;
> + free(refname);
>
> return next;
> }
> @@ -355,13 +359,17 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
> die("Refusing to perform update with empty message.");
>
> if (read_stdin) {
> + int ret;
> + transaction = ref_transaction_begin();
> +
> if (delete || no_deref || argc > 0)
> usage_with_options(git_update_ref_usage, options);
> if (end_null)
> line_termination = '\0';
> update_refs_stdin();
> - return update_refs(msg, updates, updates_count,
> - UPDATE_REFS_DIE_ON_ERR);
> + ret = ref_transaction_commit(transaction, msg,
> + UPDATE_REFS_DIE_ON_ERR);
> + return ret;
> }
>
> if (end_null)
next prev parent reply other threads:[~2014-04-01 19:46 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-24 17:56 [PATCH v2 00/27] Clean up update-refs --stdin and implement ref_transaction Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 01/27] t1400: Fix name and expected result of one test Michael Haggerty
2014-03-31 21:30 ` Junio C Hamano
2014-03-31 21:49 ` Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 02/27] t1400: Provide more usual input to the command Michael Haggerty
2014-03-31 21:28 ` Junio C Hamano
2014-03-24 17:56 ` [PATCH v2 03/27] parse_arg(): Really test that argument is properly terminated Michael Haggerty
2014-03-31 21:36 ` Junio C Hamano
2014-03-31 22:11 ` Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 04/27] t1400: Add some more tests involving quoted arguments Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 05/27] refs.h: Rename the action_on_err constants Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 06/27] update_refs(): Fix constness Michael Haggerty
2014-03-31 21:40 ` Junio C Hamano
2014-03-31 22:16 ` Michael Haggerty
2014-03-31 22:38 ` Junio C Hamano
2014-03-24 17:56 ` [PATCH v2 07/27] update-ref --stdin: Read the whole input at once Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 08/27] parse_cmd_verify(): Copy old_sha1 instead of evaluating <oldvalue> twice Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 09/27] update-ref.c: Extract a new function, parse_refname() Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 10/27] update-ref --stdin: Improve error messages for invalid values Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 11/27] update-ref --stdin: Make error messages more consistent Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 12/27] update-ref --stdin: Simplify error messages for missing oldvalues Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 13/27] t1400: Test that stdin -z update treats empty <newvalue> as zeros Michael Haggerty
2014-03-31 21:48 ` Junio C Hamano
2014-03-31 22:20 ` Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 14/27] update-ref.c: Extract a new function, parse_next_sha1() Michael Haggerty
2014-03-26 18:39 ` Brad King
2014-03-24 17:56 ` [PATCH v2 15/27] update-ref --stdin -z: Deprecate interpreting the empty string as zeros Michael Haggerty
2014-03-31 21:49 ` Junio C Hamano
2014-03-24 17:56 ` [PATCH v2 16/27] t1400: Test one mistake at a time Michael Haggerty
2014-03-26 18:39 ` Brad King
2014-03-31 21:50 ` Junio C Hamano
2014-03-31 22:32 ` Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 17/27] update-ref --stdin: Improve the error message for unexpected EOF Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 18/27] update-ref --stdin: Harmonize error messages Michael Haggerty
2014-03-31 21:51 ` Junio C Hamano
2014-03-31 22:37 ` Michael Haggerty
2014-04-01 9:29 ` Michael Haggerty
2014-04-02 16:38 ` Junio C Hamano
2014-03-24 17:56 ` [PATCH v2 19/27] refs: Add a concept of a reference transaction Michael Haggerty
2014-03-26 18:39 ` Brad King
2014-03-26 21:42 ` Michael Haggerty
2014-04-01 19:39 ` Junio C Hamano
2014-04-02 4:57 ` Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 20/27] update-ref --stdin: Reimplement using reference transactions Michael Haggerty
2014-04-01 19:46 ` Junio C Hamano [this message]
2014-04-02 5:03 ` Michael Haggerty
2014-04-03 15:57 ` Junio C Hamano
2014-04-04 5:02 ` Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 21/27] refs: Remove API function update_refs() Michael Haggerty
2014-04-01 19:46 ` Junio C Hamano
2014-03-24 17:56 ` [PATCH v2 22/27] struct ref_update: Rename field "ref_name" to "refname" Michael Haggerty
2014-04-01 19:53 ` Junio C Hamano
2014-04-02 5:11 ` Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 23/27] struct ref_update: Store refname as a FLEX_ARRAY Michael Haggerty
2014-04-01 19:54 ` Junio C Hamano
2014-03-24 17:56 ` [PATCH v2 24/27] ref_transaction_commit(): Introduce temporary variables Michael Haggerty
2014-04-01 19:26 ` Junio C Hamano
2014-03-24 17:56 ` [PATCH v2 25/27] struct ref_update: Add a lock member Michael Haggerty
2014-03-24 17:56 ` [PATCH v2 26/27] struct ref_update: Add type field Michael Haggerty
2014-04-01 20:03 ` Junio C Hamano
2014-04-02 10:13 ` Michael Haggerty
2014-04-02 17:44 ` Junio C Hamano
2014-03-24 17:57 ` [PATCH v2 27/27] ref_transaction_commit(): Work with transaction->updates in place Michael Haggerty
2014-03-26 18:39 ` [PATCH v2 00/27] Clean up update-refs --stdin and implement ref_transaction Brad King
2014-03-26 21:47 ` Michael Haggerty
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqppl0zvcs.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=brad.king@kitware.com \
--cc=git@vger.kernel.org \
--cc=johan@herland.net \
--cc=mhagger@alum.mit.edu \
--cc=peff@peff.net \
--cc=tanoku@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.