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

Re: [PATCH v3 3/4] transport.c: introduce core.alternateRefsCommand

From
Taylor Blau <me@ttaylorr.com>
Date
Oct 2, 2018, 01:56 UTC
Message-ID
<20181002015619.GE96979@syl>
In-Reply-To
<20180929073138.GB2174@sigill.intra.peff.net>
On Sat, Sep 29, 2018 at 03:31:38AM -0400, Jeff King wrote:
Show 54 quoted lines
> On Fri, Sep 28, 2018 at 03:04:10PM -0700, Taylor Blau wrote:
>
> > > Well, you also need to pass the path so it knows which repo to look at.
> > > Which I think is the primary reason we do it, but behaving differently
> > > for each alternate is another option.
> >
> > Yeah. I think that the clearer argument is yours, so I'll amend my copy.
> > I am thinking of:
> >
> >   To find the alternate, pass its absolute path as the first argument.
> >
> > How does that sound?
>
> Sounds good.
>
> > > > +heads, configure `core.alternateRefsCommand` to the path of a script which runs
> > > > +`git --git-dir="$1" for-each-ref --format='%(objectname)' refs/heads`.
> > >
> > > Does that script actually work? Because of the way we invoke shell
> > > commands with arguments, I think we'd end up with:
> > >
> > >   git --git-dir="$1" for-each-ref --format='%(objectname)' refs/heads "$@"
> > [...]
> > ...but this was what I was trying to get across with saying "...to the
> > path of a script which runs...", such that we would get the implicit
> > scoping that you make explicit in your example with "f() { ... }; f".
> >
> > Does that seem OK as-is after the additional context? I think that after
> > reading your response, it seems to be confusing, so perhaps it should be
> > changed...
>
> Ah, OK. I totally missed that "path of a script" part. What you have is
> correct, then, but I do wonder if we could make it less subtle.
>
> Maybe something like:
>
>   For example, if `/path/to/script` runs `git --git-dir="$1"
>   for-each-ref --format='%(objectname)' refs/heads/`, then putting
>   `/path/to/script` in `core.alternateRefsCommand` will show only the
>   branch heads from the alternate.
>
> I dunno. It's certainly clunkier. I wonder if we would be less awkward
> to show the sample script in a fenced block, with the `#!/bin/sh` and
> everything.
>
> Or maybe just keep the text you have and add a note at the end like:
>
>   Note that writing that `for-each-ref` command directly in the config
>   option doesn't quite work, as it has to handle the path argument
>   specially.
>
> I don't think we need to hand-hold a user through the f() shell-snippet
> trickery. I just don't want somebody thinking they can blindly paste
> that into their config.

Yeah, I agree with your later suggestion, and I'm glad that we're on the same page. I certianly don't think that we need to do an extra amount of hand holding through the 'f() { ... }; f' pattern, but I added an extra bit to say that 'git for-each-ref' by itself doesn't work, since you have to handle the path argument.

Show 42 quoted lines
> > > The other alternative is to pass $GIT_DIR in the environment on behalf
> > > of the program. Then writing:
> > >
> > >   git for-each-ref --format='%(objectname)' refs/heads
> > >
> > > would Just Work. But it's a bit subtle, since it is not immediately
> > > obvious that the command is meant to run in a different repository.
> >
> > I think that we discussed this approach a bit off-list, and I had the
> > idea that it was too fragile to work in practice, and that it would be
> > too surprising for callers to suddenly be in a different world.
> >
> > I say this not because it wouldn't make this particular scenario more
> > convenient, which it uncountably would, but because it would make other
> > scenarios _more_ complicated.
> >
> > For example, if a caller uses an alternate reference backed, perhaps,
> > MySQL (or anything that _isn't_ Git), they're not going to want to have
> > these GIT_ environment variable set.
>
> If they're not using Git under the hood, then GIT_* probably isn't
> hurting anything. But it is still pretty subtle. Let's forget I
> mentioned it.  Just chaining for-each-ref with a prefix is pretty
> awkward, but that's why we have the next patch with
> alternateRefsPrefixes.
>
> Your response did make me think of one other thing, though. The
> alternate file points to a directory with objects, and the
> for_each_alternate_ref() code checks to see if that looks vaguely like
> the objects/ directory of a git repo. But would anybody want to run
> something like alternateRefsCommand on _just_ the object directory?
> I.e., you don't have a real git repo there, but your script can
> "somehow" come up with a list of valid tips.
>
> That isn't inconceivable to me for the kind of multi-fork storage we do
> at GitHub. E.g., imagine a shared object directory with no refs, and
> then a script that goes out to the other related forks to look at their
> ref tips. I don't think we have any immediate plans for it, though (and
> there are a lot of subtle bits that I won't go into here that make it
> non-trivial). So I'm OK to punt on it for now. I also think in a pinch
> that you could easily fool the alternates code by just having a dummy
> "refs/" directory.

I'm not opposed to the idea in general, and I think that it's a good one, but I am opposed to it in this series. I think that the series as-is is concise, and unlocks a path towards implementing this feature at GitHub, and for other users, too.

Certainly we can invent more complicated examples, and I think that many of them (yours included) are worth building the extra support for. But in this initial version, I think that we'd be fine to leave it off.

Show 28 quoted lines
> > > > diff --git a/t/t5410-receive-pack.sh b/t/t5410-receive-pack.sh
> > [...]
> > > > +test_description='git receive-pack test'
> > >
> > > The name of this test file and the description are pretty vague. Can we
> > > say something like "test handling of receive-pack with alternate-refs
> > > config"?
> >
> > I left it intentionally vague, since I'd like for it to contain more
> > tests about 'git receive-pack'-specific things in the future.
> >
> > I'm happy to change the name, though I wonder if we should change the
> > filename accordingly, and if so, to what.
>
> I think we'd want to have a separate script for other receive-pack tests
> that aren't related to alternates. There's some startup overhead to each
> script so we don't want to make them _too_ small, but there are benefits
> to having small test scripts:
>
>  - they're our unit of parallelism, so we want to be able to keep a
>    reasonable number of processors full
>
>  - each test script starts with a clean slate, so there's less chance
>    for unexpected interactions between individual tests (e.g., when
>    modifying or adding a test in the middle of the script)
>
>  - it's less annoying when you're debugging a failing test near the end
>    of a script ;)
All good points, so I'm convinced ;-).
Show 13 quoted lines
> I actually think we'd benefit from splitting up a few of the longer
> scripts. On my quad-core laptop, running the tests in slow-to-fast order
> keeps the processors pretty busy, and the slowest test takes less time
> than the whole suite. But I've also tried running on a 40-core box. It
> burns through the short tests quickly, but you can never get faster than
> the slowest single test, which takes something like 35 seconds. So
> instead of being 10 times faster, it's more like two times faster, as
> most of the processors idle waiting for that one script to finish.
>
> But that's all pretty tangential here. My point is just that this
> probably ought to be remain its own script. :)
>
> I'd probably name it "t5410-receive-pack-alternates" or similar.

Sounds good, I'll do that and update the name of the test to be 'receive-pack with alternate ref filtering'.

> > I'll wait until Monday to re-roll, just to make sure that there isn't
> > any new feedback between now and then.
>
> Sounds good. Thanks for working on this.
It's been my pleasure. Thanks for all of your help.

Thanks, Taylor

Previous: Jeff KingNext: Taylor Blau
Message 72 of 94 in “Filter alternate references”
  1. 0/3 Filter alternate referencesTaylor Blau, Sep 20, 2018
  2. 1/3 transport.c: extract 'fill_alternate_refs_command'Taylor Blau, Sep 20, 2018
  3. 2/3 transport.c: introduce core.alternateRefsCommandTaylor Blau, Sep 20, 2018
  4. Jeff KingSep 20, 2018
  5. Taylor BlauSep 20, 2018
  6. Jeff KingSep 20, 2018
  7. Junio C HamanoSep 21, 2018
  8. Taylor BlauSep 21, 2018
  9. Taylor BlauSep 21, 2018
  10. Junio C HamanoSep 21, 2018
  11. Taylor BlauSep 26, 2018
  12. 3/3 transport.c: introduce core.alternateRefsPrefixesTaylor Blau, Sep 20, 2018
  13. Jeff KingSep 20, 2018
  14. Taylor BlauSep 20, 2018
  15. Eric SunshineSep 21, 2018
  16. Taylor BlauSep 21, 2018
  17. Junio C HamanoSep 21, 2018
  18. Taylor BlauSep 21, 2018
  19. Junio C HamanoSep 21, 2018
  20. Stefan BellerSep 20, 2018
  21. Taylor BlauSep 20, 2018
  22. Jeff KingSep 20, 2018
  23. Jeff KingSep 20, 2018
  24. 0/3 Filter alternate referencesTaylor Blau, Sep 21, 2018
  25. 1/3 transport.c: extract 'fill_alternate_refs_command'Taylor Blau, Sep 21, 2018
  26. 2/3 transport.c: introduce core.alternateRefsCommandTaylor Blau, Sep 21, 2018
  27. Eric SunshineSep 21, 2018
  28. Taylor BlauSep 26, 2018
  29. Junio C HamanoSep 21, 2018
  30. Jeff KingSep 21, 2018
  31. Junio C HamanoSep 21, 2018
  32. Jeff KingSep 21, 2018
  33. Taylor BlauSep 26, 2018
  34. Jeff KingSep 26, 2018
  35. Eric SunshineSep 21, 2018
  36. brian m. carlsonSep 22, 2018
  37. Jeff KingSep 22, 2018
  38. brian m. carlsonSep 23, 2018
  39. Taylor BlauSep 26, 2018
  40. Jeff KingSep 26, 2018
  41. Taylor BlauSep 26, 2018
  42. Jeff KingSep 26, 2018
  43. Taylor BlauSep 28, 2018
  44. 3/3 transport.c: introduce core.alternateRefsPrefixesTaylor Blau, Sep 21, 2018
  45. Junio C HamanoSep 21, 2018
  46. Jeff KingSep 21, 2018
  47. Junio C HamanoSep 21, 2018
  48. Jeff KingSep 21, 2018
  49. Stefan BellerSep 21, 2018
  50. Junio C HamanoSep 24, 2018
  51. Jeff KingSep 24, 2018
  52. Junio C HamanoSep 24, 2018
  53. Jeff KingSep 24, 2018
  54. Jeff KingSep 24, 2018
  55. Junio C HamanoSep 24, 2018
  56. Jeff KingSep 24, 2018
  57. Junio C HamanoSep 25, 2018
  58. Taylor BlauSep 25, 2018
  59. Junio C HamanoSep 25, 2018
  60. Taylor BlauSep 26, 2018
  61. Jeff KingSep 26, 2018
  62. 0/4 Filter alternate referencesTaylor Blau, Sep 28, 2018
  63. 1/4 transport: drop refnames from for_each_alternate_refJeff King, Sep 28, 2018
  64. Jeff KingSep 28, 2018
  65. Taylor BlauSep 28, 2018
  66. 2/4 transport.c: extract 'fill_alternate_refs_command'Taylor Blau, Sep 28, 2018
  67. Jeff KingSep 28, 2018
  68. 3/4 transport.c: introduce core.alternateRefsCommandTaylor Blau, Sep 28, 2018
  69. Jeff KingSep 28, 2018
  70. Taylor BlauSep 28, 2018
  71. Jeff KingSep 29, 2018
  72. Taylor BlauOct 2, 2018
  73. 4/4 transport.c: introduce core.alternateRefsPrefixesTaylor Blau, Sep 28, 2018
  74. Jeff KingSep 28, 2018
  75. Taylor BlauSep 28, 2018
  76. Jeff KingSep 29, 2018
  77. Taylor BlauOct 2, 2018
  78. Taylor BlauOct 2, 2018
  79. 0/4 Filter alternate referencesTaylor Blau, Oct 2, 2018
  80. 1/4 transport: drop refnames from for_each_alternate_refTaylor Blau, Oct 2, 2018
  81. 3/4 transport.c: introduce core.alternateRefsCommandTaylor Blau, Oct 2, 2018
  82. Jeff KingOct 2, 2018
  83. Taylor BlauOct 4, 2018
  84. 2/4 transport.c: extract 'fill_alternate_refs_command'Taylor Blau, Oct 2, 2018
  85. 4/4 transport.c: introduce core.alternateRefsPrefixesTaylor Blau, Oct 2, 2018
  86. Ramsay JonesOct 2, 2018
  87. 4/4 transport.c: introduce core.alternateRefsPrefixesTaylor Blau, Oct 2, 2018
  88. 0/4 Filter alternate referencesTaylor Blau, Oct 8, 2018
  89. 1/4 transport: drop refnames from for_each_alternate_refTaylor Blau, Oct 8, 2018
  90. 2/4 transport.c: extract 'fill_alternate_refs_command'Taylor Blau, Oct 8, 2018
  91. 3/4 transport.c: introduce core.alternateRefsCommandTaylor Blau, Oct 8, 2018
  92. 4/4 transport.c: introduce core.alternateRefsPrefixesTaylor Blau, Oct 8, 2018
  93. Jeff KingOct 9, 2018
  94. Taylor BlauOct 9, 2018

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.