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

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

From
Johan Herland <johan@herland.net>
Date
May 4, 2013, 23:55 UTC
Message-ID
<1367711749-8812-1-git-send-email-johan@herland.net>

The "$remote/$branch" syntax can be interpreted in two subtly different ways:

 1. A shorthand name for the remote-tracking branch corresponding to a
    specific $branch from a specific $remote.
 2. A refname fragment, which - when appended to "refs/remotes/" -
    yields the remote-tracking branch corresponding to a specific
    $branch from a specific $remote.

For the current default/conventional refspecs, both interpretations are true and equally valid. However, when configuring non-default refspecs (such as the +refs/heads/*:refs/remotes/origin/heads/*), it becomes obvious that the current code follows the latter interpretation: The "$remote/$branch" shorthand will no longer work, and you are forced to use "$remote/heads/$branch" instead.

I argue that the former interpretation is what most users intuitively expect, and that we should work towards making Git follow the same interpretation:

Instead of prepending "refs/remotes/" to convert "$remote/$branch" into a full refname, we should find "$remote" in the repo config, and then map "refs/heads/$branch" through $remote's fetch refspec(s), to find the remote-tracking branch that properly corresponds to the specific $branch in the $remote repo.

This goal is achieved by the final patch in this series, and most of the preceding patches serve as preliminary changes and refactoring to support this.

Patch #1 is the exception in that it is a self-contained bugfix for a scanf-related problem I ran across while working on the patch series.

Patches #2 and #3 introduce a new test intended to verify Git's usability when working with remote ref namespaces (which rely on setting up unconventional refspecs). For now, this test is fairly thin, but it should be expanded as we find more problems with these kinds of setups.

Patches #4 and #5 are pure refactorings to reorganize the code that expands shorthand names to full refnames and vice versa. The idea is to associate the patterns that are used to expand/shorten ref names with the actual function that does the expansion/shortening, so that we can later add patterns that uses different expand/shorten functions.

Patch #6 teaches Git to realize when - in the context of communication with a remote repo - it's expanding shorthand refs into either local refnames, or remote refnames. It is important that any expansion rules relying on local repo configuration are not allowed to expand shorthand names on behalf of the remote repo.

Finally, patch #7 introduces a new rule and associated expand/shorten functions mapping "$remote/$branch"-type shorthand names to/from their remote-tracking branch counterparts, by using the configured refspecs as described above. This rule is obviously only applied to local refs, as it would be wrong for a repo to use its local config to dictate a ref expansion in a remote repo.

The series has been build on recent 'next', and although it also applies cleanly to v1.8.3-rc1, it will cause a test failure in t7900, since it depends on the jh/checkout-auto-tracking topic, which is currently cooking.

Have fun! :)
...Johan
Johan Herland (7):
  shorten_unambiguous_ref(): Allow shortening refs/remotes/origin/HEAD to origin
  t7900: Start testing usability of namespaced remote refs
  t7900: Demonstrate failure to expand "$remote/$branch" according to refspecs
  refs.c: Refactor rules for expanding shorthand names into full refnames
  refs.c: Refactor code for shortening full refnames into shorthand names
  refname_match(): Caller must declare if we're matching local or remote refs
  refs.c: Add rules for resolving refs using remote refspecs
 cache.h                                        |   4 -
 refs.c                                         | 260 +++++++++++++++++--------
 refs.h                                         |  14 ++
 remote.c                                       |  15 +-
 t/t6300-for-each-ref.sh                        |  12 ++
 t/t7900-working-with-namespaced-remote-refs.sh | 133 +++++++++++++
 6 files changed, 342 insertions(+), 96 deletions(-)
 create mode 100755 t/t7900-working-with-namespaced-remote-refs.sh
-- 
1.8.1.3.704.g33f7d4f
Next: Johan Herland
Message 1 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.