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

Re: [PATCH/alternative/raw and rough] setup.c: denote repo wide pathspecs by ':'

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 2, 2011, 16:53 UTC
Message-ID
<7vhbblcvl7.fsf@alter.siamese.dyndns.org>
In-Reply-To
<4D6E4246.5080407@drmicha.warpmail.net>
Michael J Gruber <git@drmicha.warpmail.net> writes:
> [*] I keep forgetting that some people may have files whose names begin
> with ":". They are ambiguous now already with "treeish pathspec"
> commands, but not with "pathspec" commands. The latter would change.
Just to make sure I understand that they have easy workarounds:
 - If you have a path foo/:bar, you can say
   git log master -- foo/:bar
   because ':' signals the magic and gets stripped only when it is at the
   beginning (i.e. not affecting foo/:bar); and
 - For :boz at the root level, you can say
   git log master -- '\:boz'
   because the backslash in '\:boz' makes the colon not at the beginning and
   the glob match sees '\:boz' and then matches '\:' with literal ':' at the
   beginning of the pathname ":boz".

In very old times, git used to work only from the top-level of the working tree.

The way we give an illusion that a command is restricted within the current working directory was by learning the "prefix" returned by setup_git_directory() while it chdir(2)'s up to the root level of the working tree, and then by limiting the operation to the pathspec given from the command line (each of whose elements prefixed by "prefix" by calling get_pathspec()).

Your ':'-prefix trick will naturally work very well with this arrangement. Instead of prefixing the "prefix", you would just strip ':' from the front for such a magic pathspec element, and that should be all that is necessary.

There is a small worry, though. Some codepaths have tricks that take advantage of the knowledge of the current behaviour that the resulting pathspec elements all refer to subtree under the "prefix", and try to optimize their tree traversal. I think dir.c:fill_directory()'s use of common_prefix() is safe (it recomputes what is common based on the result of get_pathspec(), not blindly using the original "prefix"), but we need to make sure there isn't a codepath that blindly believes that the original "prefix" defines the extent of the operation. Anything that understands "../" to step outside the cwd should be already safe, so I hopefully am being worried too much.

Earlier, the list consensus was that if we were to aim for uniformity, we should make everything relative to the root of the working tree when there is no pathspec by default, because you can always give a single '.' to restrict the extent of the operation to the cwd, but you cannot extend the extent of the operation without tediously counting "../". Would this ':' trick affect that argument? If a command is relative to the cwd with no pathspec, you can now give a single ':' to affect the whole tree.

As I wrote in my response to Jeff in
  http://thread.gmane.org/gmane.comp.version-control.git/133570/focus=133874

I always thought that it would be the best solution that makes the choice of the default irrelevant, and this ":" trick certainly feels like this is that solution (I also think having a good default matters).

And we can start thinking about deprecating --full-tree option, no? I like that, too ;-).

Previous: Michael J GruberNext: Michael J Gruber
Message 28 of 46 in “git-grep to operate across who repository and not just CWD?”
  1. David ChantersFeb 28, 2011
  2. Michael J GruberFeb 28, 2011
  3. Jay SoffianFeb 28, 2011
  4. Junio C HamanoFeb 28, 2011
  5. Junio C HamanoFeb 28, 2011
  6. Phil HordFeb 28, 2011
  7. Michael J GruberMar 1, 2011
  8. Nguyen Thai Ngoc DuyMar 1, 2011
  9. Michael J GruberMar 1, 2011
  10. Nguyen Thai Ngoc DuyMar 1, 2011
  11. Nguyen Thai Ngoc DuyMar 1, 2011
  12. 0/2 grep --full-treeMichael J Gruber, Mar 1, 2011
  13. 1/2 grep: --full-treeMichael J Gruber, Mar 1, 2011
  14. 2/2 grep: make --full-tree work with pathspecsMichael J Gruber, Mar 1, 2011
  15. Junio C HamanoMar 1, 2011
  16. setup.c: denote repo wide pathspecs by ':'Michael J Gruber, Mar 1, 2011
  17. Nguyen Thai Ngoc DuyMar 1, 2011
  18. Michael J GruberMar 1, 2011
  19. Nguyen Thai Ngoc DuyMar 1, 2011
  20. Michael J GruberMar 1, 2011
  21. Nguyen Thai Ngoc DuyMar 1, 2011
  22. Junio C HamanoMar 1, 2011
  23. Michael J GruberMar 1, 2011
  24. Junio C HamanoMar 1, 2011
  25. Sverre RabbelierMar 2, 2011
  26. Nguyen Thai Ngoc DuyMar 2, 2011
  27. Michael J GruberMar 2, 2011
  28. Junio C HamanoMar 2, 2011
  29. Michael J GruberMar 2, 2011
  30. Miles BaderMar 3, 2011
  31. Junio C HamanoMar 3, 2011
  32. Phil HordMar 3, 2011
  33. Michael J GruberMar 3, 2011
  34. Phil HordMar 1, 2011
  35. James PickensMar 1, 2011
  36. Nguyen Thai Ngoc DuyMar 2, 2011
  37. Phil HordMar 3, 2011
  38. Michael J GruberMar 3, 2011
  39. Michael J GruberMar 1, 2011
  40. Phil HordMar 1, 2011
  41. pathspec: reserve some letters after a colon pathspecNguyễn Thái Ngọc Duy, Mar 23, 2011
  42. Junio C HamanoMar 23, 2011
  43. Michael J GruberMar 24, 2011
  44. Nguyen Thai Ngoc DuyMar 24, 2011
  45. Junio C HamanoMar 24, 2011
  46. Junio C HamanoMar 24, 2011

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.