Re: [PATCH] attr: attr.allowInvalidSource config to allow invalid revision

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Peff,

On 21 Sep 2023, at 0:15, Jeff King wrote:

> On Wed, Sep 20, 2023 at 09:06:46AM -0700, Junio C Hamano wrote:
>
>>> With empty repositories however, HEAD does not point to a valid treeish,
>>> causing Git to die. This means we would need to check for a valid
>>> treeish each time.
>>
>> Naturally.
>>
>>> To avoid this, let's add a configuration that allows
>>> Git to simply ignore --attr-source if it does not resolve to a valid
>>> tree.
>>
>> Not convincing at all as to the reason why we want to do anything
>> "to avoid this".  "git log" in a repository whose HEAD does not
>> point to a valid treeish.  "git blame" dies with "no such ref:
>> HEAD".  An empty repository (more precisely, an unborn history)
>> needs special casing if you want to present it if you do not want to
>> spew underlying error messages to the end users *anyway*.  It is
>> unclear why seeing what commit the HEAD pointer points at (or which
>> branch it points at for that matter) is *an* *extra* and *otherwise*
>> *unnecessary* overhead that need to be avoided.
>
> In an empty repository, "git log" will die anyway. So I think the more
> interesting case is "I have a repository with stuff in it, but HEAD
> points to an unborn branch". So:
>
>   git --attr-source=HEAD diff foo^ foo
>
> And there you really are saying "if there are attributes in HEAD, use
> them; otherwise, don't worry about it". This is exactly what we do with
> mailmap.blob: in a bare repository it is set to HEAD by default, but if
> HEAD does not resolve, we just ignore it (just like a HEAD that does not
> contain a .mailmap file). And those match the non-bare cases, where we'd
> read those files from the working tree instead.
>
> So I think the same notion applies here. You want to be able to point it
> at HEAD by default, but if there is no HEAD, that is the same as if HEAD
> simply did not contain any attributes. If we had attr.blob, that is
> exactly how I would expect it to work.

You captured this quite well!

>
> My gut feeling is that --attr-source should do the same, and just
> quietly ignore a ref that does not resolve. But I think an argument can
> be made that because the caller explicitly gave us a ref, they expect it
> to work (and that would catch misspellings, etc). Like:
>
>   git --attr-source=my-barnch diff foo^ foo
>
> So I'm OK with not changing that behavior.
>
> But what is weird about this patch is that we are using a config option
> to change how a command-line option is interpreted. If the idea is that
> some invocations care about the validity of the source and some do not,
> then the config option is much too blunt. It is set once long ago, but
> it can't distinguish between times you care about invalid sources and
> times you don't.
>
> It would make much more sense to me to have another command-line option,
> like:
>
>   git --attr-source=HEAD --allow-invalid-attr-source
>
> Obviously that is horrible to type, but I think the point is that you'd
> only do this from a script anyway (because it's those automated cases
> where you want to say "use HEAD only if it exists").

Yeah, I see the point about using a config to change default behavior of a
command leading to confusion.

>
> If there were an attr.blob config option and it complained about an
> invalid HEAD, _then_ I think attr.allowInvalidSource might make sense
> (though again, I would just argue for switching the behavior by
> default). And I really think attr.blob is a better match for what GitLab
> is trying to do here, because it is set once and applies to all
> commands, rather than having to teach every invocation to pass it
> (though I guess maybe they use it as an environment variable).

In retrospect perhaps a config would have been better here. I think this
patch started with improving an existing command line flag [1] by making
it global. So I think we were just thinking about command line flags and
didn't consider configs.

That being said, for GitLab at least there's not a lot of difference since
we pass in configs through the commandline anyways rather than relying on the config
state itself on disk for our bare server-side repositories.


1. https://lore.kernel.org/git/pull.1470.git.git.1679109928556.gitgitgadget@xxxxxxxxx/

>
> Of course I would think that, as the person who solved GitHub's exact
> same problem for mailmap by adding mailmap.blob. So you may ingest the
> appropriate grain of salt. :)
>
> -Peff


thanks
John





[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux