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

Re: [PATCH 01/13] delete_ref(): move declaration to refs.h

From
Stefan Beller <sbeller@google.com>
Date
Jun 9, 2015, 16:42 UTC
Message-ID
<CAGZ79kagxZLxFdf4QmiQr7qP6bPm_vZC8FbhmndC6O=AARrrNw@mail.gmail.com>
In-Reply-To
<5576BBB1.5020903@alum.mit.edu>
On Tue, Jun 9, 2015 at 3:10 AM, Michael Haggerty <mhagger@alum.mit.edu> wrote:
Show 39 quoted lines
> On 06/08/2015 06:43 PM, Stefan Beller wrote:
>> On Mon, Jun 8, 2015 at 4:45 AM, Michael Haggerty <mhagger@alum.mit.edu> wrote:
>>> [...]
>>> +/*
>>> + * Delete the specified reference. If old_sha1 is non-NULL and not
>>> + * NULL_SHA1, then verify that the current value of the reference is
>>> + * old_sha1 before deleting it.
>>
>> And here I wondered what the distinction between NULL and non-NULL,
>> but NULL_SHA1
>> is and digging into the code, there is none. (As you can also see in
>> this patch above with
>>     (old_sha1 && !is_null_sha1(old_sha1)) ? old_sha1 : NULL,
>> but when digging deeper, the !is_null_sha1(old_sha1) is an arbitrary
>> limitation (i.e.
>> ref_transaction_delete and ref_transaction_update don't differ between
>> those two cases.)
>>
>> The distinction comes in at lock_ref_sha1_basic, where I think we may
>> want to get rid of
>> the is_null_sha1 check and depend on NULL/non-NULL as the difference
>> for valid and invalid
>> sha1's?
>
> I'm having a little trouble understanding your comment.
>
> The convention for ref_transaction_update() and friends is that
>
> * old_sha1 == NULL
>
>   We don't care whether the reference existed prior to the
>   update, nor what its value was.
>
> * *old_sha1 is NULL_SHA1
>
>   (by which I mean that old_sha1 points at 20 zero bytes; I hope
>   that's clear even though NULL_SHA1 is not actually defined
>   anywhere): The reference must *not* have existed prior to the
>   update.
Ok that's what I was missing.
Show 40 quoted lines
>
> * old_sha1 has some other value
>
>   The reference must have had that value prior to the update.
>
> lock_ref_sha1_basic() distinguishes between { NULL vs. NULL_SHA1 vs.
> other values } in the same way that ref_transaction_update() does.
>
> The delete_ref() function doesn't follow the same convention. It treats
> NULL and NULL_SHA1 identically, as "don't care".
>
> It probably makes sense to change delete_ref() use the same convention
> as ref_transaction_update(), but there are quite a few callers and I
> didn't have the energy to review them all as part of this patch series.
> So I left it unchanged and just documented the status quo better.
>
>> That said, do we want to add another sentence to the doc here saying
>> non-NULL and not
>> NULL_SHA1 are treated the same or is it clear enough?
>> With or without this question addressed:
>> Reviewed-by: Stefan Beller <sbeller@google.com>
>
> In set notation,
>
>     "non-NULL" =
>         "non-NULL and not NULL_SHA1" ∪
>         "non-NULL and equal to NULL_SHA1"
>
> The latter two are *not* treated the same, so I don't see how we can
> claim that "non-NULL" and "not NULL_SHA1" are treated the same. I must
> be misunderstanding you.
>
> Would it help if I changed the comment to
>
>     Delete the specified reference. If old_sha1 is non-NULL and not
>     NULL_SHA1, then verify that the current value of the reference is
>     old_sha1 before deleting it. If old_sha1 is NULL or NULL_SHA1,
>     delete the reference it it exists, regardless of its old value.
>
> ?
This is very clear to me.
Show 7 quoted lines
>
> Michael
>
> --
> Michael Haggerty
> mhagger@alum.mit.edu
>
Previous: Michael HaggertyNext: Michael Haggerty
Message 5 of 30 in “Improve "refs" module encapsulation”
  1. 00/13 Improve "refs" module encapsulationMichael Haggerty, Jun 8, 2015
  2. 01/13 delete_ref(): move declaration to refs.hMichael Haggerty, Jun 8, 2015
  3. Stefan BellerJun 8, 2015
  4. Michael HaggertyJun 9, 2015
  5. Stefan BellerJun 9, 2015
  6. Michael HaggertyJun 13, 2015
  7. 02/13 remove_branches(): remove temporaryMichael Haggerty, Jun 8, 2015
  8. Stefan BellerJun 8, 2015
  9. 03/13 delete_ref(): handle special case more explicitlyMichael Haggerty, Jun 8, 2015
  10. Stefan BellerJun 8, 2015
  11. Michael HaggertyJun 9, 2015
  12. 04/13 delete_refs(): new function for the refs APIMichael Haggerty, Jun 8, 2015
  13. 05/13 delete_refs(): improve error messageMichael Haggerty, Jun 8, 2015
  14. Junio C HamanoJun 9, 2015
  15. 06/13 delete_refs(): convert error message to lower caseMichael Haggerty, Jun 8, 2015
  16. Stefan BellerJun 8, 2015
  17. Michael HaggertyJun 9, 2015
  18. 07/13 prune_remote(): use delete_refs()Michael Haggerty, Jun 8, 2015
  19. Stefan BellerJun 8, 2015
  20. Jeff KingJun 8, 2015
  21. Michael HaggertyJun 9, 2015
  22. Jeff KingJun 9, 2015
  23. 08/13 repack_without_refs(): make function privateMichael Haggerty, Jun 8, 2015
  24. 09/13 initial_ref_transaction_commit(): function for initial ref creationMichael Haggerty, Jun 8, 2015
  25. 10/13 refs: remove some functions from the module's public interfaceMichael Haggerty, Jun 8, 2015
  26. 11/13 initial_ref_transaction_commit(): check for duplicate refsMichael Haggerty, Jun 8, 2015
  27. 12/13 initial_ref_transaction_commit(): check for ref D/F conflictsMichael Haggerty, Jun 8, 2015
  28. 13/13 refs: move the remaining ref module declarations to refs.hMichael Haggerty, Jun 8, 2015
  29. Stefan BellerJun 8, 2015
  30. Junio C HamanoJun 9, 2015

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.