git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/2] fetch: allow passing a transaction to `s_update_ref()`

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 8, 2021, 07:18 UTC
Message-ID
<xmqqsg7bj3qs.fsf@gitster.c.googlers.com>
In-Reply-To
<CAP8UFD1YxHGHLEHd_Bx1awSskjM6fHgM52nPWpTG2UHOmaOT9A@mail.gmail.com>
Christian Couder <christian.couder@gmail.com> writes:
Show 9 quoted lines
> Yeah, I think we also don't need the df_conflict variable, and I don't
> like the duplication of the following clean up code:
>
>         ref_transaction_free(transaction_to_free);
>         strbuf_release(&err);
>         free(msg);
>
> Patrick's patch didn't introduce them, but we might still want to get
> rid of them (see below).
Show 16 quoted lines
> diff --git a/builtin/fetch.c b/builtin/fetch.c
> index ecf8537605..8017fc19da 100644
> --- a/builtin/fetch.c
> +++ b/builtin/fetch.c
> @@ -581,6 +581,22 @@ static struct ref *get_ref_map(struct remote *remote,
> #define STORE_REF_ERROR_OTHER 1
> #define STORE_REF_ERROR_DF_CONFLICT 2
>
> +static int do_s_update_ref(struct ref_transaction *transaction,
> ...
> }
>
> static int refcol_width = 10;
> -------------------------------------------------------------------------
>
> After the above patch, Patrick's patch would become:

OK, I think the above as a preliminary clean-up would not hurt, but the "if the caller gave us NULL as the transaction, we are responsible for handling that bogosity" bit feels a bit too magical to my taste. I do understand that your intention is that it releaves the caller ...

Show 12 quoted lines
> @@ -613,9 +615,16 @@ static int s_update_ref(const char *action,
>                rla = default_rla.buf;
>        msg = xstrfmt("%s: %s", rla, action);
>
> -       transaction = ref_transaction_begin(&err);
> +       /*
> +        * If no transaction was passed to us, we manage the
> +        * transaction ourselves. Otherwise, we trust the caller to
> +        * handle the transaction lifecycle.
> +        */
> +       if (!transaction)
> +               transaction = our_transaction = ref_transaction_begin(&err);

... here from having to deal with NULL from ref_transaction_begin(), but I somehow do not see it as a code structure with a good taste.

I dunno.

Without that "if (!transaction ||" bit, I think your do_s_update_ref() is a good clean-up, though.

Thanks.
Show 21 quoted lines
> -       ret = do_s_update_ref(transaction, ref, check_old, &err, msg);
> +       ret = do_s_update_ref(transaction, ref, check_old, !!our_transaction,
> +                             &err, msg);
>        if (ret) {
>                error("%s", err.buf);
>                ret = (ret == TRANSACTION_NAME_CONFLICT)
> @@ -623,7 +632,7 @@ static int s_update_ref(const char *action,
>                        : STORE_REF_ERROR_OTHER;
>        }
>
> -       ref_transaction_free(transaction);
> +       ref_transaction_free(our_transaction);
>        strbuf_release(&err);
>        free(msg);
>        return ret;
> ...
> -------------------------------------------------------------------------
>
> You can find these patches, with Patrick as the author, there:
>
> https://gitlab.com/gitlab-org/gitlab-git/-/commits/cc-improve-s-update-ref/
Previous: Christian CouderNext: Patrick Steinhardt
Message 5 of 41 in “fetch: implement support for atomic reference updates”
  1. 0/2 fetch: implement support for atomic reference updatesPatrick Steinhardt, Jan 7, 2021
  2. 1/2 fetch: allow passing a transaction to `s_update_ref()`Patrick Steinhardt, Jan 7, 2021
  3. Junio C HamanoJan 7, 2021
  4. Christian CouderJan 8, 2021
  5. Junio C HamanoJan 8, 2021
  6. 2/2 fetch: implement support for atomic reference updatesPatrick Steinhardt, Jan 7, 2021
  7. Junio C HamanoJan 8, 2021
  8. 0/4 fetch: implement support for atomic reference updatesPatrick Steinhardt, Jan 8, 2021
  9. 1/4 fetch: extract writing to FETCH_HEADPatrick Steinhardt, Jan 8, 2021
  10. Junio C HamanoJan 8, 2021
  11. Patrick SteinhardtJan 11, 2021
  12. Junio C HamanoJan 11, 2021
  13. 3/4 fetch: allow passing a transaction to `s_update_ref()`Patrick Steinhardt, Jan 8, 2021
  14. Junio C HamanoJan 8, 2021
  15. 2/4 fetch: refactor `s_update_ref` to use common exit pathPatrick Steinhardt, Jan 8, 2021
  16. Junio C HamanoJan 8, 2021
  17. Patrick SteinhardtJan 11, 2021
  18. 4/4 fetch: implement support for atomic reference updatesPatrick Steinhardt, Jan 8, 2021
  19. Junio C HamanoJan 9, 2021
  20. Patrick SteinhardtJan 11, 2021
  21. Junio C HamanoJan 11, 2021
  22. Patrick SteinhardtJan 12, 2021
  23. Patrick SteinhardtJan 12, 2021
  24. Junio C HamanoJan 12, 2021
  25. 0/5 fetch: implement support for atomic reference updatesPatrick Steinhardt, Jan 11, 2021
  26. 1/5 fetch: extract writing to FETCH_HEADPatrick Steinhardt, Jan 11, 2021
  27. Junio C HamanoJan 11, 2021
  28. 2/5 fetch: use strbuf to format FETCH_HEAD updatesPatrick Steinhardt, Jan 11, 2021
  29. Patrick SteinhardtJan 11, 2021
  30. Christian CouderJan 11, 2021
  31. Junio C HamanoJan 11, 2021
  32. 4/5 fetch: allow passing a transaction to `s_update_ref()`Patrick Steinhardt, Jan 11, 2021
  33. 3/5 fetch: refactor `s_update_ref` to use common exit pathPatrick Steinhardt, Jan 11, 2021
  34. 5/5 fetch: implement support for atomic reference updatesPatrick Steinhardt, Jan 11, 2021
  35. Junio C HamanoJan 12, 2021
  36. 0/5 fetch: implement support for atomic reference updatesPatrick Steinhardt, Jan 12, 2021
  37. 3/5 fetch: refactor `s_update_ref` to use common exit pathPatrick Steinhardt, Jan 12, 2021
  38. 1/5 fetch: extract writing to FETCH_HEADPatrick Steinhardt, Jan 12, 2021
  39. 2/5 fetch: use strbuf to format FETCH_HEAD updatesPatrick Steinhardt, Jan 12, 2021
  40. 4/5 fetch: allow passing a transaction to `s_update_ref()`Patrick Steinhardt, Jan 12, 2021
  41. 5/5 fetch: implement support for atomic reference updatesPatrick Steinhardt, Jan 12, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.