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

Re: [PATCH 0/7] Make "$remote/$branch" work with unconventional refspecs

From
Junio C Hamano <gitster@pobox.com>
Date
May 5, 2013, 19:02 UTC
Message-ID
<7v8v3tuu6i.fsf@alter.siamese.dyndns.org>
In-Reply-To
<CALKQrgdp9DVDBLNwCAmQHbEfZDvhdsmSW3sh1BRo1XEnyqPPaA@mail.gmail.com>
Johan Herland <johan@herland.net> writes:
Show 12 quoted lines
> I want to extend the same reasoning to remote-tracking refs, i.e.
> "$remote/$name" could be auto-completed into any of
>
>   refs/remotes/$remote/$name
>   refs/remotes/$remote/tags/$name
>   refs/remotes/$remote/heads/$name
>
> without causing ambiguity in the common case. When there is ambiguity, we
> would resolve that in the same manner as for local refs.
>
> The current series only concerns itself with the branches, but the larger
> intention is to make it work for tags and other refs as well.
Good ;-).
So another issue that remains is the following, I think.

When interpreting $nick/$name, assuming that we can tell where $nick for a remote ends and $name for the ref we take from the remote begins [*1*], how would we determine which refs/remotes/$remote/ is used for $nick?

My gut feeling is that we should ignore any "remote.$nick.fetch" wildcard mapping, e.g.

    [remote "foo"]
        fetch = +refs/heads/*:refs/remotes/bar/heads/*
        fetch = +refs/tags/*:refs/remotes/baz/tags/*

so that we look always in refs/remotes/$nick/ somewhere, for at least two reasons:

 * For sane people, "bar" and "baz" in the above example are both
   "foo", so ignoring remote.foo.fetch mapping is a no-op for them.
 * For people who deliberately wanted to move "foo"'s refs to
   different hierarchies depending on the hierarchies at the origin
   (i.e. branches to "bar", tags to "baz"), they wanted to do so for
   a reason to group related things in "bar" (and "baz") [*2*].  For
   them, mapping with remote.$nick.fetch" means not allowing them to
   use the real name of the group (i.e. "bar") they chose to name
   their refs.
Show 11 quoted lines
>> If the final end result you are shooting for is to introduce an
>> extra level between the remote name and the branch names, i.e.
>> "heads/", any solution needs to at least have a plan (not necessarily
>> a detailed design or implementation) for the other hierarchies.  The
>> possibility to have these other hierarchies per remote is the true
>> progress that the "heads/" at that level can give us; there is not
>> much point to have heads/ after refs/remotes/origin/, if heads/ is
>> the only thing that can come there.
>
> I fully agree. This series was meant as the first step in that direction
> (sorry for not describing my intentions more clearly).

And I do not think we mind terribly if we extend the ref_rev_parse_rules[] used in dwim_ref() to also look at these

	refs/remotes/$nick/$name
	refs/remotes/$nick/tags/$name
	refs/remotes/$nick/heads/$name

(the first of the above is existing "refs/remotes/%.*s"). I think it is going too far if you extend it further to

	refs/remotes/$nick/*/$name

where the code does not control what an acceptable match for '*' is (i.e. origin/foo matching origin/changes/foo might be OK, but matching it with origin/randomstring/foo is not, unless the canned ref_rev_parse_rules[] knows about the "randomstring", or there is a configuration mechanism for the user to tell us she cares about the "randomstring" hierarchy in her project).

[Footnotes]
*1* I offhand do not remember if we even allow multi-level remote
    nicks, but I do know we support multi-level branch names, so it
    may turn out that the only valid split of origin/jh/rbranch is
    topic 'jh/rbranch' from remote 'origin' and not topic 'rbranch'
    from remote 'origin/jh'.
*2* Perhaps "bar" in the above is spelled "topics", and the
    hierarchy may be used to collect non-integration single topic
    branches from more than one remote.  An example that is more in
    line with such a usage might be:
    [remote "jh"]
        fetch = +refs/heads/*:refs/remotes/topics/heads/jh/*
    [remote "jk"]
        fetch = +refs/heads/*:refs/remotes/topics/heads/jk/*
    [remote "fc"]
        fetch = +refs/heads/*:refs/remotes/topics/heads/fc/*
    and I would expect "git merge topics/jh/rbranch" to merge the
    "refs/remotes/topics/heads/jh/rbranch" topic branch.
Previous: Johan HerlandNext: Johan Herland
Message 29 of 39 in “Make "$remote/$branch" work with unconventional refspecs”
  1. 0/7 Make "$remote/$branch" work with unconventional refspecsJohan Herland, May 4, 2013
  2. 1/7 shorten_unambiguous_ref(): Allow shortening refs/remotes/origin/HEAD to originJohan Herland, May 4, 2013
  3. Bert WesargMay 5, 2013
  4. Junio C HamanoMay 6, 2013
  5. Johan HerlandMay 7, 2013
  6. 1/3 t1514: Add tests of shortening refnames in strict/loose modeJohan Herland, May 7, 2013
  7. 2/3 t1514: Demonstrate failure to correctly shorten "refs/remotes/origin/HEAD"Johan Herland, May 7, 2013
  8. 3/3 shorten_unambiguous_ref(): Fix shortening refs/remotes/origin/HEAD to originJohan Herland, May 7, 2013
  9. Junio C HamanoMay 7, 2013
  10. Junio C HamanoMay 7, 2013
  11. Johan HerlandMay 7, 2013
  12. Junio C HamanoMay 7, 2013
  13. Johan HerlandMay 7, 2013
  14. 2/7 t7900: Start testing usability of namespaced remote refsJohan Herland, May 4, 2013
  15. Junio C HamanoMay 7, 2013
  16. Johan HerlandMay 7, 2013
  17. Junio C HamanoMay 7, 2013
  18. 3/7 t7900: Demonstrate failure to expand "$remote/$branch" according to refspecsJohan Herland, May 4, 2013
  19. Junio C HamanoMay 7, 2013
  20. 4/7 refs.c: Refactor rules for expanding shorthand names into full refnamesJohan Herland, May 4, 2013
  21. Junio C HamanoMay 7, 2013
  22. 5/7 refs.c: Refactor code for shortening full refnames into shorthand namesJohan Herland, May 4, 2013
  23. Junio C HamanoMay 7, 2013
  24. 6/7 refname_match(): Caller must declare if we're matching local or remote refsJohan Herland, May 4, 2013
  25. Junio C HamanoMay 7, 2013
  26. 7/7 refs.c: Add rules for resolving refs using remote refspecsJohan Herland, May 4, 2013
  27. Junio C HamanoMay 5, 2013
  28. Johan HerlandMay 5, 2013
  29. Junio C HamanoMay 5, 2013
  30. Johan HerlandMay 5, 2013
  31. Junio C HamanoMay 5, 2013
  32. Santi BéjarMay 6, 2013
  33. Santi BéjarMay 6, 2013
  34. Junio C HamanoMay 6, 2013
  35. Santi BéjarMay 6, 2013
  36. Junio C HamanoMay 6, 2013
  37. Junio C HamanoMay 6, 2013
  38. Johan HerlandMay 6, 2013
  39. Junio C HamanoMay 7, 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.