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

Re: [PATCH v4 08/27] refs.c: change ref_transaction_update() to do error checking and return status

From
Ronnie Sahlberg <sahlberg@google.com>
Date
Apr 29, 2014, 16:05 UTC
Message-ID
<CAL=YDW=R5LpG-w9zAo9eeop7QqnspcVb8OQmdTOg35sJi9fMyA@mail.gmail.com>
In-Reply-To
<CAPig+cQM-5_N5caoJVRY0+VcPXO0qhnv7hetdanOoqRQJkm3jQ@mail.gmail.com>
On Mon, Apr 28, 2014 at 5:51 PM, Eric Sunshine <sunshine@sunshineco.com> wrote:
Show 71 quoted lines
> On Mon, Apr 28, 2014 at 6:54 PM, Ronnie Sahlberg <sahlberg@google.com> wrote:
>> Update ref_transaction_update() do some basic error checking and return
>> true on error. Update all callers to check ref_transaction_update() for error.
>>
>> Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
>> ---
>>  builtin/update-ref.c | 10 ++++++----
>>  refs.c               |  9 +++++++--
>>  refs.h               | 10 +++++-----
>>  3 files changed, 18 insertions(+), 11 deletions(-)
>>
>> diff --git a/builtin/update-ref.c b/builtin/update-ref.c
>> index 2bef2a0..59c4d6b 100644
>> --- a/builtin/update-ref.c
>> +++ b/builtin/update-ref.c
>> @@ -197,8 +197,9 @@ static const char *parse_cmd_update(struct strbuf *input, const char *next)
>>         if (*next != line_termination)
>>                 die("update %s: extra input: %s", refname, next);
>>
>> -       ref_transaction_update(transaction, refname, new_sha1, old_sha1,
>> -                              update_flags, have_old);
>> +       if (ref_transaction_update(transaction, refname, new_sha1, old_sha1,
>> +                                  update_flags, have_old))
>> +               die("update %s: failed", refname);
>>
>>         update_flags = 0;
>>         free(refname);
>> @@ -286,8 +287,9 @@ static const char *parse_cmd_verify(struct strbuf *input, const char *next)
>>         if (*next != line_termination)
>>                 die("verify %s: extra input: %s", refname, next);
>>
>> -       ref_transaction_update(transaction, refname, new_sha1, old_sha1,
>> -                              update_flags, have_old);
>> +       if (ref_transaction_update(transaction, refname, new_sha1, old_sha1,
>> +                                  update_flags, have_old))
>> +               die("failed transaction update for %s", refname);
>>
>>         update_flags = 0;
>>         free(refname);
>> diff --git a/refs.c b/refs.c
>> index 308e13e..1a903fb 100644
>> --- a/refs.c
>> +++ b/refs.c
>> @@ -3333,19 +3333,24 @@ static struct ref_update *add_update(struct ref_transaction *transaction,
>>         return update;
>>  }
>>
>> -void ref_transaction_update(struct ref_transaction *transaction,
>> +int ref_transaction_update(struct ref_transaction *transaction,
>>                             const char *refname,
>>                             const unsigned char *new_sha1,
>>                             const unsigned char *old_sha1,
>>                             int flags, int have_old)
>>  {
>> -       struct ref_update *update = add_update(transaction, refname);
>> +       struct ref_update *update;
>> +
>> +       if (have_old && !old_sha1)
>> +               die("have_old is true but old_sha1 is NULL");
>>
>> +       update = add_update(transaction, refname);
>>         hashcpy(update->new_sha1, new_sha1);
>>         update->flags = flags;
>>         update->have_old = have_old;
>>         if (have_old)
>>                 hashcpy(update->old_sha1, old_sha1);
>> +       return 0;
>
> Am I misreading? The commit message talks about returning true on
> error, but this code seems to only ever die() or return 0 (false).
>

I have updated the commit message to be more precise. The function returns true on error but there are currently no checks that actually do return failure in this function. Such checks will be added in the future. Also having it return an int instead of void allows us to use the pattern

if(!transaction ||
  ref_transaction_update(transaction, ...) |||
  ref_transaction_commit(transaction, ...)) {
eventhough we do not yet have any conditions where _update will fail.
Show 26 quoted lines
>>  }
>>
>>  void ref_transaction_create(struct ref_transaction *transaction,
>> diff --git a/refs.h b/refs.h
>> index bc7715e..0364a3e 100644
>> --- a/refs.h
>> +++ b/refs.h
>> @@ -237,11 +237,11 @@ void ref_transaction_rollback(struct ref_transaction *transaction);
>>   * that the reference should have had before the update, or zeros if
>>   * it must not have existed beforehand.
>>   */
>> -void ref_transaction_update(struct ref_transaction *transaction,
>> -                           const char *refname,
>> -                           const unsigned char *new_sha1,
>> -                           const unsigned char *old_sha1,
>> -                           int flags, int have_old);
>> +int ref_transaction_update(struct ref_transaction *transaction,
>> +                          const char *refname,
>> +                          const unsigned char *new_sha1,
>> +                          const unsigned char *old_sha1,
>> +                          int flags, int have_old);
>>
>>  /*
>>   * Add a reference creation to transaction.  new_sha1 is the value
>> --
>> 1.9.1.528.g98b8868.dirty
Previous: Eric SunshineNext: Ronnie Sahlberg
Message 11 of 38 in “Use ref transactions for all ref updates”
  1. 00/27 Use ref transactions for all ref updatesRonnie Sahlberg, Apr 28, 2014
  2. 01/27 refs.c: constify the sha arguments for ref_transaction_create|delete|updateRonnie Sahlberg, Apr 28, 2014
  3. 02/27 refs.c: allow passing NULL to ref_transaction_freeRonnie Sahlberg, Apr 28, 2014
  4. 03/27 refs.c: add a strbuf argument to ref_transaction_commit for error loggingRonnie Sahlberg, Apr 28, 2014
  5. 04/27 refs.c: make ref_update_reject_duplicates take a strbuf argument for errorsRonnie Sahlberg, Apr 28, 2014
  6. 05/27 update-ref.c: log transaction error from the update_refRonnie Sahlberg, Apr 28, 2014
  7. 06/27 refs.c: make update_ref_write update a strbuf on failureRonnie Sahlberg, Apr 28, 2014
  8. 07/27 refs.c: remove the onerr argument to ref_transaction_commitRonnie Sahlberg, Apr 28, 2014
  9. 08/27 refs.c: change ref_transaction_update() to do error checking and return statusRonnie Sahlberg, Apr 28, 2014
  10. Eric SunshineApr 29, 2014
  11. Ronnie SahlbergApr 29, 2014
  12. 09/27 refs.c: change ref_transaction_create to do error checking and return statusRonnie Sahlberg, Apr 28, 2014
  13. 10/27 refs.c: ref_transaction_delete to check for error and return statusRonnie Sahlberg, Apr 28, 2014
  14. 11/27 tag.c: use ref transactions when doing updatesRonnie Sahlberg, Apr 28, 2014
  15. 12/27 replace.c: use the ref transaction functions for updatesRonnie Sahlberg, Apr 28, 2014
  16. Eric SunshineApr 29, 2014
  17. Ronnie SahlbergApr 29, 2014
  18. Eric SunshineApr 29, 2014
  19. 13/27 commit.c: use ref transactions for updatesRonnie Sahlberg, Apr 28, 2014
  20. 14/27 sequencer.c: use ref transactions for all ref updatesRonnie Sahlberg, Apr 28, 2014
  21. 15/27 fast-import.c: change update_branch to use ref transactionsRonnie Sahlberg, Apr 28, 2014
  22. Eric SunshineApr 29, 2014
  23. Ronnie SahlbergApr 29, 2014
  24. Junio C HamanoApr 29, 2014
  25. 16/27 branch.c: use ref transaction for all ref updatesRonnie Sahlberg, Apr 28, 2014
  26. 17/27 refs.c: change update_ref to use a transactionRonnie Sahlberg, Apr 28, 2014
  27. 18/27 refs.c: free the transaction before returning when number of updates is 0Ronnie Sahlberg, Apr 28, 2014
  28. 19/27 refs.c: ref_transaction_commit should not free the transactionRonnie Sahlberg, Apr 28, 2014
  29. 20/27 fetch.c: clear errno before calling functions that might set itRonnie Sahlberg, Apr 28, 2014
  30. 21/27 fetch.c: change s_update_ref to use a ref transactionRonnie Sahlberg, Apr 28, 2014
  31. 22/27 fetch.c: use a single ref transaction for all ref updatesRonnie Sahlberg, Apr 28, 2014
  32. 23/27 receive-pack.c: use a reference transaction for updating the refsRonnie Sahlberg, Apr 28, 2014
  33. 24/27 fast-import.c: use a ref transaction when dumping tagsRonnie Sahlberg, Apr 28, 2014
  34. 25/27 walker.c: use ref transaction for ref updatesRonnie Sahlberg, Apr 28, 2014
  35. 26/27 refs.c: make write_ref_sha1 staticRonnie Sahlberg, Apr 28, 2014
  36. 27/27 refs.c: make lock_ref_sha1 staticRonnie Sahlberg, Apr 28, 2014
  37. Junio C HamanoApr 29, 2014
  38. Ronnie SahlbergApr 29, 2014

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.