All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
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 v3 19/27] refs: add a concept of a reference transaction
Date: Tue, 15 Apr 2014 07:41:48 +0200	[thread overview]
Message-ID: <534CC69C.1020503@alum.mit.edu> (raw)
In-Reply-To: <xmqqa9bnmwnk.fsf@gitster.dls.corp.google.com>

On 04/14/2014 11:25 PM, Junio C Hamano wrote:
> Michael Haggerty <mhagger@alum.mit.edu> writes:
> 
>> I forgot to confirm that the callers *do* verify that they don't pass
>> incorrect values to ref_transaction_create() and
>> ref_transaction_delete().  But if they wouldn't, then die("BUG:") would
>> not be appropriate either, would it?  It would have to be die("you silly
>> user...").
> 
> Having the assert() there gives a confused message to the readers
> (at least it did to this reader).
> 
> assert() implies that callers that are not buggy should not give
> input that triggers the condition, which would mean it is the
> callers' responsibility to sanity check the user-input to reject
> creating a ref at 0{40} or deleting a ref whose old value is 0{40},
> which in turn means these input are errors that need to be diagnosed
> and documented.

In v2 of this patch series, I didn't forbid calling create with new_sha
== 0{40}, because, even though it's not what the user would think of as
creating a reference, the code didn't care--it would just verify that
the reference didn't exist before and then leave it undefined.

Then in [1] you commented:

> Sounds a bit crazy that you can ask "create", which verifies the
> absense of the thing, to delete a thing.

I reacted to your comment by changing the documentation to forbid
calling "create" with new_sha1 == 0{40}, and enforced the rule using an
assert().  At the same time I added an analogous restriction that if
"delete" is called with have_old set, then old_sha1 must not be 0{40}.

In retrospect, you might have been objecting more to the misleading
docstring than to the behavior as implemented at the time.  The
docstring implied that create could actually be used to delete a
reference, but that was not true: it always checked that the reference
didn't exist beforehand.  So at worst it could leave a non-existent
reference un-created.  Sorry for the confusion.

> But as you said below...
> 
>> ... even if the preconditions are not met, nothing really crazy
>> happens.
> 
> I agree that it also is perfectly fine to treat such input as
> not-an-input-error.

That was the case in v2.

> It is a signal that these checks are not 'if (...) die()' that the
> code may take that stance.
> 
> I cannot tell which interpretation the code is trying to implement.
> 
> Any one of the following I can understand:
> 
>  (1) drop the assert(), declaring that the user input is perfectly
>      fine;
> 
>  (2) keep the assert(), reject such user input at the callers, and
>      document that these are invalid inputs;
> 
>  (3) replace the assert() with 'if (...) die("you silly user...")',
>      and document that these are invalid inputs; or
> 
>  (4) same as (3) but replace with warn(), declaring such input as
>      suspicious.
> 
> but the current assert() makes the code look "cannot decide" ;-).
> 
> I would consider the first two more sensible than the other two, and
> am leaning slightly towards (1) over (2).

The current status in v3 is that (2) is implemented.

Obviously I don't feel strongly about it, given that I implemented (1)
in v2.  But I think that this restriction makes code at the calling site
easier to understand: "create" now always means "create"; i.e., if the
transaction goes through, then the reference exists afterwards.  And
"delete" always means delete; i.e., afterwards, there is one less
reference in the world.

Michael

[1] http://mid.gmane.org/xmqqtxaczvod.fsf@gitster.dls.corp.google.com

-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/

  reply	other threads:[~2014-04-15  5:41 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-07 13:47 [PATCH v3 00/27] Clean up update-refs --stdin and implement ref_transaction Michael Haggerty
2014-04-07 13:47 ` [PATCH v3 01/27] t1400: fix name and expected result of one test Michael Haggerty
2014-04-07 13:47 ` [PATCH v3 02/27] t1400: provide more usual input to the command Michael Haggerty
2014-04-07 13:47 ` [PATCH v3 03/27] parse_arg(): really test that argument is properly terminated Michael Haggerty
2014-04-07 13:47 ` [PATCH v3 04/27] t1400: add some more tests involving quoted arguments Michael Haggerty
2014-04-07 13:47 ` [PATCH v3 05/27] refs.h: rename the action_on_err constants Michael Haggerty
2014-04-07 13:47 ` [PATCH v3 06/27] update_refs(): fix constness Michael Haggerty
2014-04-07 13:47 ` [PATCH v3 07/27] update-ref --stdin: read the whole input at once Michael Haggerty
2014-04-07 13:47 ` [PATCH v3 08/27] parse_cmd_verify(): copy old_sha1 instead of evaluating <oldvalue> twice Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 09/27] update-ref.c: extract a new function, parse_refname() Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 10/27] update-ref --stdin: improve error messages for invalid values Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 11/27] update-ref --stdin: make error messages more consistent Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 12/27] update-ref --stdin: simplify error messages for missing oldvalues Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 13/27] t1400: test that stdin -z update treats empty <newvalue> as zeros Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 14/27] update-ref.c: extract a new function, parse_next_sha1() Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 15/27] update-ref --stdin -z: deprecate interpreting the empty string as zeros Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 16/27] t1400: test one mistake at a time Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 17/27] update-ref --stdin: improve the error message for unexpected EOF Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 18/27] update-ref --stdin: harmonize error messages Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 19/27] refs: add a concept of a reference transaction Michael Haggerty
2014-04-07 19:13   ` Junio C Hamano
2014-04-14 10:54     ` Michael Haggerty
2014-04-14 21:25       ` Junio C Hamano
2014-04-15  5:41         ` Michael Haggerty [this message]
2014-04-15  7:40           ` Junio C Hamano
2014-04-07 13:48 ` [PATCH v3 20/27] update-ref --stdin: reimplement using reference transactions Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 21/27] refs: remove API function update_refs() Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 22/27] struct ref_update: rename field "ref_name" to "refname" Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 23/27] struct ref_update: store refname as a FLEX_ARRAY Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 24/27] ref_transaction_commit(): simplify code using temporary variables Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 25/27] struct ref_update: add a lock field Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 26/27] struct ref_update: add a type field Michael Haggerty
2014-04-07 13:48 ` [PATCH v3 27/27] ref_transaction_commit(): work with transaction->updates in place Michael Haggerty
2014-04-11 19:57 ` [PATCH v3 00/27] Clean up update-refs --stdin and implement ref_transaction Ronnie Sahlberg

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=534CC69C.1020503@alum.mit.edu \
    --to=mhagger@alum.mit.edu \
    --cc=brad.king@kitware.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=johan@herland.net \
    --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.