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

Re: [PATCH] Make is_gitfile a non-static generic function

From
Phil Hord <phil.hord@gmail.com>
Date
Oct 12, 2011, 13:29 UTC
Message-ID
<CABURp0qDH6+S-m4nmPrfOECEVQUoXjsvz9ZQhA5PbVJEuwEL_g@mail.gmail.com>
In-Reply-To
<7vipnvccso.fsf@alter.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> wrote:
Show 9 quoted lines
> Phil Hord <hordp@cisco.com> writes:
>
>> The new is_gitfile is an amalgam of similar functional checks
>> from different places in the code....
>
>
> After looking at this patch and the way the other caller in transport.c
> uses it, I am more and more convinced that "is_gitfile()" is a stupid and
> horrible mistake.

I think it's a simple and low-impact change that fixes a bug with a minimum of disruption. But I also think it is lazy.

Show 9 quoted lines
> The caller in transport.c says "I am about to read from a regular file,
> and usually I would treat it as a bundle, but I want to avoid that
> codepath if that regular file is not a bundle. So I use the codepath only
> when that file is not a gitfile".
>
> It should be saying "Is it a bundle? Then I'd use the codepath to read
> from the bundle" to begin with. Otherwise the code will break when we add
> yet another regular file we can fetch from that is not a bundle nor a
> gitfile.

Yes, and this is part of the kind of distraction that held back my update over the weekend.

When we do add another file type we'll wind up with a half-dozen places that get affected in slightly different ways again. Wouldn't it be nice to have a function to tell us what kind of thing it is we've been asked to look at? Something like git_type(url) that returns GIT_BUNDLE, GIT_DIRECTORY or GIT_FILE, maybe.

Except I didn't see many examples in the code using this sort of enumerated decision function.

> I think the hand-crafted check in builtin/clone.c you removed originated
> from laziness to avoid teaching read_gitfile() to read potential gitfile
> silently (and signal errors by simply returning NULL).

I made a read_gitfile(... , gently) function, but I didn't like it much. When !gently, I think it should be rather explicit about the type of failure. This makes the code look like 20% of it is repeated "if (!gently) die... ;\n return;" sequences. It's almost enough to lead me to macros.

And what about when fopen() fails and we are running silently. Do we just shrug and say "Not a gitfile"? I don't think it's good enough. We need to be able to say all of these:

  It's a gitfile, here's the internal path.
  It's not a gitfile, it is something else.
  It looked like a gitfile until I ran into E_ACCES or some other error.
Making the one function run silently or not complicates the code further.

I tried to find a similar style to mimic elsewhere in the code, but I didn't find any consistency. Pointers to clean examples would be welcome.

I started working on more of an API. But it's still very ugly and not ready for even a strawman discussion.

But I don't know how much time I have for a full writeup atm. Without something, though, I cannot easily fetch from a submodule, because submodules all use gitfiles now, and git:master does not know how to fetch from them.

And that's the itch I had to scratch.
Show 5 quoted lines
> I also suspect the
> codepath may become simpler if we had a way to ask "Is this a bundle?".
>
> I think read_bundle_header() in bundle.c can be refactored to a silent
> interface that allows us to ask "Is this a bundle?" question properly.
I'll take a look at it.  But I won't have much time for it this week.

Thanks, Phil

Previous: Junio C HamanoNext: Phil Hord
Message 4 of 7 in “Make is_gitfile a non-static generic function”
  1. Make is_gitfile a non-static generic functionPhil Hord, Oct 11, 2011
  2. Junio C HamanoOct 11, 2011
  3. Junio C HamanoOct 11, 2011
  4. Phil HordOct 12, 2011
  5. Phil HordOct 12, 2011
  6. Junio C HamanoOct 12, 2011
  7. Phil HordOct 12, 2011

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.