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

Re: [PATCH 03/26] t1400: Pass a legitimate <newvalue> to update command

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Mar 10, 2014, 21:38 UTC
Message-ID
<531E30D7.40208@alum.mit.edu>
In-Reply-To
<531DF079.9050909@kitware.com>
Brad,
Thanks for your feedback.
On 03/10/2014 06:03 PM, Brad King wrote:
Show 25 quoted lines
> On 03/10/2014 08:46 AM, Michael Haggerty wrote:
>> This test is trying to test a few ways to delete references using "git
>> update-ref -z --stdin".  The third line passed in is
>>
>>     update SP /refs/heads/c NUL NUL <sha1> NUL
>>
>> , which is not a correct way to delete a reference according to the
>> documentation (the new value should be zeros, not empty).  Pass zeros
>> instead as the new value to test the code correctly.
> 
> In my original work on this feature, an empty <newvalue> is allowed.
> Since newvalue is not optional an empty value can be treated as zero.
> The relevant documentation is:
> 
>  update::
>          Set <ref> to <newvalue> after verifying <oldvalue>, if given.
>          Specify a zero <newvalue> to ensure the ref does not exist
> 
>  ...
> 
>  Use 40 "0" or the empty string to specify a zero value, except that
>  with `-z` an empty <oldvalue> is considered missing.
> 
> The two together say that <newvalue> can be the empty string instead
> of a literal zero.

OK, with your explanation and after reading the docs a couple more times, I can see your reading. Your rules as I now understand them:

* Without -z
  * 0{40} or the empty string represents zeros
  * No preceding SP delimiter indicates that the value is missing
    (as are any following values)
* With -z
  * For <newvalue>
    * 0{40} or the empty string represents zeros (the value is
      not allowed to be missing)
  * For <oldvalue>
    * 0{40} represents zeros
    * The empty string indicates that the value is missing
I implemented the slightly simpler rules
* Without -z
  * 0{40} or the empty string represents zeros
  * No preceding delimiter indicates that the value is missing (as
    are any following values)
* With -z
  * 0{40} represents zeros
  * The empty string indicates that the value is missing

It seems to me that "-z" input will nearly always be machine-generated, so there is not much reason to accept the empty string as shorthand for zeros. So I think that my version of the rules, being simpler to explain, is a slight improvement. But your version is already out in the wild, so backwards-compatibility is also a consideration, even though it is rather a fine point in a rather unlikely usage (why use update rather than delete to delete a reference?).

I don't know. I'm willing to rewrite the code to go back to your rules, or rewrite the documentation to describe my rules.

Neutral bystanders *cough*Junio*cough*, what do you prefer?
Michael
-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
Previous: Brad KingNext: Brad King
Message 6 of 38 in “Clean up update-refs --stdin and implement ref_transaction”
  1. 00/26 Clean up update-refs --stdin and implement ref_transactionMichael Haggerty, Mar 10, 2014
  2. 01/26 t1400: Fix name and expected result of one testMichael Haggerty, Mar 10, 2014
  3. 02/26 t1400: Provide sensible input to the commandMichael Haggerty, Mar 10, 2014
  4. 03/26 t1400: Pass a legitimate <newvalue> to update commandMichael Haggerty, Mar 10, 2014
  5. Brad KingMar 10, 2014
  6. Michael HaggertyMar 10, 2014
  7. Brad KingMar 11, 2014
  8. Junio C HamanoMar 11, 2014
  9. Brad KingMar 11, 2014
  10. Michael HaggertyMar 20, 2014
  11. 04/26 parse_arg(): Really test that argument is properly terminatedMichael Haggerty, Mar 10, 2014
  12. 05/26 t1400: Add some more tests involving quoted argumentsMichael Haggerty, Mar 10, 2014
  13. Johan HerlandMar 10, 2014
  14. 06/26 refs.h: Rename the action_on_err constantsMichael Haggerty, Mar 10, 2014
  15. 07/26 update_refs(): Fix constnessMichael Haggerty, Mar 10, 2014
  16. 08/26 update-ref --stdin: Read the whole input at onceMichael Haggerty, Mar 10, 2014
  17. 09/26 parse_cmd_verify(): Copy old_sha1 instead of evaluating <oldvalue> twiceMichael Haggerty, Mar 10, 2014
  18. 10/26 update-ref.c: Extract a new function, parse_refname()Michael Haggerty, Mar 10, 2014
  19. 11/26 update-ref --stdin: Improve error messages for invalid valuesMichael Haggerty, Mar 10, 2014
  20. 12/26 update-ref --stdin: Make error messages more consistentMichael Haggerty, Mar 10, 2014
  21. 13/26 update-ref --stdin: Simplify error messages for missing oldvaluesMichael Haggerty, Mar 10, 2014
  22. Brad KingMar 10, 2014
  23. Brad KingMar 10, 2014
  24. 14/26 update-ref.c: Extract a new function, parse_next_sha1()Michael Haggerty, Mar 10, 2014
  25. 15/26 update-ref --stdin: Improve the error message for unexpected EOFMichael Haggerty, Mar 10, 2014
  26. 16/26 update-ref --stdin: Harmonize error messagesMichael Haggerty, Mar 10, 2014
  27. 17/26 refs: Add a concept of a reference transactionMichael Haggerty, Mar 10, 2014
  28. 18/26 update-ref --stdin: Reimplement using reference transactionsMichael Haggerty, Mar 10, 2014
  29. 19/26 refs: Remove API function update_refs()Michael Haggerty, Mar 10, 2014
  30. 20/26 struct ref_update: Rename field "ref_name" to "refname"Michael Haggerty, Mar 10, 2014
  31. 21/26 struct ref_update: Store refname as a FLEX_ARRAY.Michael Haggerty, Mar 10, 2014
  32. 22/26 commit_ref_transaction(): Introduce temporary variablesMichael Haggerty, Mar 10, 2014
  33. 23/26 struct ref_update: Add a lock memberMichael Haggerty, Mar 10, 2014
  34. 24/26 struct ref_update: Add type fieldMichael Haggerty, Mar 10, 2014
  35. 25/26 commit_ref_transaction(): Also free the ref_transactionMichael Haggerty, Mar 10, 2014
  36. 26/26 commit_ref_transaction(): Work with transaction->updates in placeMichael Haggerty, Mar 10, 2014
  37. Brad KingMar 10, 2014
  38. Michael HaggertyMar 10, 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.