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

Re: [PATCHv2 04/10] remote: Reject remote names containing '/'

From
Johan Herland <johan@herland.net>
Date
May 13, 2013, 06:53 UTC
Message-ID
<CALKQrgcry9bwmonaeWA4M7a3k36S_Q3ZQLmv7Ui5r+tdzdMr_A@mail.gmail.com>
In-Reply-To
<7vtxm7scn5.fsf@alter.siamese.dyndns.org>
On Mon, May 13, 2013 at 6:54 AM, Junio C Hamano <gitster@pobox.com> wrote:
Show 30 quoted lines
> Johan Herland <johan@herland.net> writes:
>
>> Although we definitely support and encourage use of multi-level branch
>> names, we have never conciously tried to give support for multi-level
>> remote names. Currently, they are allowed, but there is no evidence that
>> they are commonly used.
>>
>> Now, they do provide a source of problems when trying to expand the
>> "$nick/$name" shorthand notation (where $nick matches a remote name)
>> into a full refname. Consider the shorthand "foo/bar/baz": Does this
>> parse as $nick = foo, $name = bar/baz, or $nick = foo/bar, $name = baz?
>>
>> Since we need to be unambiguous about these things, we hereby declare
>> that a remote name shall never contain a '/' character, and that the
>> only correct way to parse "foo/bar/baz" is $nick = foo, $name = bar/baz.
>
> I know I am guilty of hinting to go in this direction in the earlier
> discussion, but I have to wonder how much more refactoring is needed
> to see if there is only one unique possibility among many.
>
> For a string with N slashes, you have only N possible ways to split
> it into $nick and $name, and if you see a ref "bar/baz" copied from
> remote "foo" but no ref "baz" copied from remote "foo/bar" (or you
> may not even have a remote "foo/bar" in the first place), the user
> is already very unambiguous. The declaration is merely being lazy.
>
> I am not saying we must implement such a back-track to disambiguate
> the user input better.  I am wondering how much more effort on top
> of this series is needed if we want to get there (provided that the
> disambiguation is a good thing to do in the first place).

I feel the problem with multi-level remote names runs a little deeper than merely disambiguation when resolving remote-tracking refs: If you have two remotes "foo" and "foo/bar", and they have branches "bar/baz" and "baz", respectively, then they will (in the default current configuration) end up clobbering eachother due to the overlapping remote-tracking branch (refs/remotes/foo/bar/baz). Although the remote ref namespace coincidentally resolves this by mapping the two to "refs/peers/foo/heads/bar/baz" and "refs/peers/foo/bar/heads/baz" respectively, you can easily create a different (although probably even more unlikely) case where the remote ref namespace causes the same kind of overlap: One remote "foo" with branch "heads/bar", and another remote "foo/heads" with branch "bar" will both end up clobbering eachother at "refs/peers/foo/heads/heads/bar"...

The disambiguation can probably be resolved, although the resulting code will obviously be somewhat more cumbersome and ugly (and IMHO the current code is plenty of that already...). Combine this with the problems of clobbering of the same remote-tracking ref (describe above), and the fact that AFAIK a multi-level remote name has never been observed "in the wild" (none of the people I asked at the Git Merge conference had ever observed multi-level remote names, nor did they directly oppose banning them), I'm not at all sure it's worth bothering about this at all. Simply disallowing multi-level remote names seems like the simpler and naturally ambiguity-resistant approach.

...Johan
-- 
Johan Herland, <johan@herland.net>
www.herland.net
Previous: Junio C HamanoNext: Ramkumar Ramachandra
Message 20 of 31 in “[PATCHv2 00/10] Prepare for alternative remote-tracking branch location”
  1. Johan HerlandMay 11, 2013
  2. 01/10 t7900: Start testing usability of namespaced remote refsJohan Herland, May 11, 2013
  3. 02/10 t7900: Demonstrate failure to expand "$peer/$branch" according to refspecsJohan Herland, May 11, 2013
  4. 03/10 refs.c: Refactor code for mapping between shorthand names and full refnamesJohan Herland, May 11, 2013
  5. Junio C HamanoMay 13, 2013
  6. Johan HerlandMay 13, 2013
  7. Junio C HamanoMay 13, 2013
  8. Junio C HamanoMay 13, 2013
  9. Johan HerlandMay 14, 2013
  10. Junio C HamanoMay 14, 2013
  11. Michael HaggertyMay 15, 2013
  12. Johan HerlandMay 15, 2013
  13. Johan HerlandMay 15, 2013
  14. Junio C HamanoMay 15, 2013
  15. Eric WongMay 15, 2013
  16. 04/10 remote: Reject remote names containing '/'Johan Herland, May 11, 2013
  17. Eric SunshineMay 13, 2013
  18. Johan HerlandMay 13, 2013
  19. Junio C HamanoMay 13, 2013
  20. Johan HerlandMay 13, 2013
  21. Ramkumar RamachandraMay 16, 2013
  22. Johan HerlandMay 16, 2013
  23. Ramkumar RamachandraMay 16, 2013
  24. 05/10 refs.c: Add support for expanding/shortening refs in refs/peers/*Johan Herland, May 11, 2013
  25. 06/10 t7900: Test git branch -r/-a output w/remote-tracking branches in refs/peers/*Johan Herland, May 11, 2013
  26. 07/10 t3203: Add testcase for fix in 1603ade81352a526ccb206f41ff81ecbc855df2dJohan Herland, May 11, 2013
  27. 08/10 builtin/branch.c: Refactor ref_item.name and .dest into strbufsJohan Herland, May 11, 2013
  28. 09/10 builtin/branch.c: Refactor "remotes/" prepending to remote-tracking branchesJohan Herland, May 11, 2013
  29. 10/10 branch: Fix display of remote branches in refs/peers/*Johan Herland, May 11, 2013
  30. Eric SunshineMay 13, 2013
  31. Johan HerlandMay 13, 2013

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.