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

Re: upload-pack/ls-remote: showing non-HEAD symbolic refs?

From
Jeff King <peff@peff.net>
Date
Aug 16, 2016, 16:31 UTC
Message-ID
<20160816163145.mjc726til2daxl3d@sigill.intra.peff.net>
In-Reply-To
<20160816161838.klvjhhoxsftvkfmd@x>
On Tue, Aug 16, 2016 at 09:18:39AM -0700, Josh Triplett wrote:
Show 10 quoted lines
> Commit 5e7dcad771cb873e278a0571b46910d7c32e2f6c in September 2013 added
> support to upload-pack to show the symbolic target of non-HEAD symbolic
> refs.  However, commit d007dbf7d6d647dbcf0f357545f43f36dec46f3b in
> November 2013 reverted that, because it used a capability to transmit
> the information, and capabilities have a limited size (limited by the
> pkt-line format which can't send lines longer than 64k) and can't
> transmit an arbitrary number of symrefs.
> 
> (Incidentally, couldn't the same problem occur if the HEAD points to a
> long enough path to exceed 64k?

Yes. But it's a lot easier to say "your 64k symref is ridiculous; don't do that" than it is to say "oh, you happened to have a lot of symrefs in your repository, so we overflowed and failed".

Besides which, the whole protocol cannot handle refnames larger than 64k, so it's not a new problem.

Show 8 quoted lines
> I'd like to be able to see the targets of non-HEAD symbolic refs for a
> repository (symbolic refs under refs/).  I'm interested in extending
> upload-pack to expose those somehow.  What seems like a sensible format
> to do so?
> 
> Would it make sense to advertise a new capability for symbolic ref
> targets, which would allow the client to send back a dedicated request
> for the targets of all symrefs?

It will definitely require a new capability. You cannot just send a "\0symref=..." trailer after each ref, because older clients treat multiple "\0" trailers as overwriting one another (so it essentially overwrites the old capabilities).

Sadly you cannot use a capability to fix that, because all of this happens before the client agrees to any capabilities (you can find discussion of a "v2" protocol on the list which solves this, but it's sort of languishing in the design phase).

So you are stuck introducing a new phase into the protocol, which is probably rather tricky (especially with the http protocol, which is very sensitive to extra round-trips). I guess the least-invasive way would be to communicate the desires in the "want" phase, and then have the server dump it out with the packfile. Like:

  - server claims "I support symref-wants" in the capability phase
  - during the negotiation phase, in addition to "want" and "have", the
    client may send "symref <ref>" packets. Probably <ref> should be a
    wildcard to avoid having to ask about each ref individually.
  - before outputting the packfile in the final phase, if any "symref"
    wants were sent by the client, the server dumps a list of "symref
    <from> <to>" packets, followed by a flush packet.

That should Just Work over the existing http protocol without requiring an extra request.

-Peff
Previous: Josh TriplettNext: Josh Triplett
Message 2 of 12 in “upload-pack/ls-remote: showing non-HEAD symbolic refs?”
  1. Josh TriplettAug 16, 2016
  2. Jeff KingAug 16, 2016
  3. Josh TriplettAug 16, 2016
  4. Jeff KingAug 16, 2016
  5. Stefan BellerAug 16, 2016
  6. Josh TriplettAug 16, 2016
  7. Josh TriplettAug 16, 2016
  8. Jeff KingAug 16, 2016
  9. Josh TriplettAug 16, 2016
  10. Jeff KingAug 16, 2016
  11. Josh TriplettAug 16, 2016
  12. Jeff KingAug 19, 2016

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.