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

Re: [PATCH 4/4] Clean up work-tree handling

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 1, 2007, 05:17 UTC
Message-ID
<7v3az3deac.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.64.0708010129530.14781@racer.site>
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
Show 6 quoted lines
> The old version of work-tree support was an unholy mess, barely readable,
> and not to the point.
>
> For example, why do you have to provide a worktree, when it is not used?
> As in "git status".  Now it works.
> ...

Without continuing with negatives, let's try to define the new, corrected world order.

I do not think the following is exactly what your cleaned-up version tries to perform, but I am writing this down primarily to demonstrate the style and the level of detail I expect to accompany a clean-up patch like this.

----------------------------------------------------------------
Definitions:
 - You can have "checked out" files on the filesystem, and such
   files are said to be in your "work tree".  The directory
   on the filesystem that corresponds to the toplevel entries of
   the index and the tree objects directly contained in the
   commit objects is called "the toplevel of the work tree",
   or simply "work tree" if it is not ambiguous from the
   context.
 - The directory that holds git repository information is called
   "git directory".  This is typically .git directory at the
   toplevel of your work tree, but not necessarily so.
 - You can perform many git operations without a work tree, but
   some operations fundamentally require you to have one
   (e.g. checkout and diff, unless two tree-ishes are given, do
   not make sense without a work tree).

There are four predicates, two interrogators, and two manipulators:

 - is_inside_git_dir(): this returns true if the $cwd is the git
   directory or its subdirectory. [IS THIS STILL NEEDED???]
 - is_inside_work_tree(): this returns true if the $cwd is
   inside work tree (i.e. either at the toplevel of the work
   tree or its subdirectory).  [NEEDSHELP: is .git in the usual
   layout considered "is_inside_work_tree()"?  Should it?]
 - is_bare_repository(): this returns true if no work tree is
   found.  There is a corresponding function usable from the
   scripts.
 - require_work_tree (shell): this is called by scripts that
   needs to have a work tree to operate, and barfs otherwise.
 - get_git_dir(): this returns the location of the git
   directory.  With GIT_DIR environment variable, or --git-dir
   command line option, you can tell git to use a specific
   directory as the git directory.  Otherwise a directory that
   looks like a git directory and whose name is .git is looked
   for, in the $cwd or its parent directory.  If there is no
   such directory, and if the $cwd looks like a git directory,
   $cwd is the git directory.
 - get_git_work_tree(): this returns the location of the work
   tree; it returns NULL if there is none.  The command line
   option --work-tree, or the environment variable GIT_WORK_TREE
   can specify the location; otherwise, git directory is looked
   for so that its configuration file can be read.  If
   core.worktree is there, that specifies the location.
   Otherwise, if the basename of the git directory is .git, it
   is the parent directory of the git directory.  Otherwise, you
   do not have work tree.
 - set_git_dir(): used to set the git directory, internally to
   handle --git-dir option;
 - set_work_tree(): used to set the git directory, internally to
   handle --work-tree option;
----------------------------------------------------------------

After writing the above down, it strikes me odd that we do not have a predicate that says "we know the work tree is there".

If a command wants a work tree, and if you are outside the work tree, then is_inside_work_tree() returns false and get_git_work_tree() returns non NULL, so that is a good pair of interface that can be mixed and matched (e.g. you can chdir to the former to perform the whole tree operation, or refuse to perform, based on is_inside_work_tree being false, cwd relative operations).

Previous: Johannes SchindelinNext: Johannes Schindelin
Message 23 of 30 in “work-tree clean ups”
  1. 0/9 work-tree clean upsJohannes Schindelin, Jul 29, 2007
  2. 1/9 Add is_absolute_path() and make_absolute_path()Johannes Schindelin, Jul 29, 2007
  3. 2/9 Add functions get_relative_cwd() and is_inside_dir()Johannes Schindelin, Jul 29, 2007
  4. 3/9 white space fixes in setup.cJohannes Schindelin, Jul 29, 2007
  5. 4/9 Clean up work-tree handlingJohannes Schindelin, Jul 29, 2007
  6. 5/9 Add set_git_dir() functionJohannes Schindelin, Jul 29, 2007
  7. 6/9 work-trees are allowed inside a git-dirJohannes Schindelin, Jul 29, 2007
  8. 7/9 init: use get_git_work_tree() instead of rolling our ownJohannes Schindelin, Jul 29, 2007
  9. 8/9 Fix t1501 for updated work-tree logicJohannes Schindelin, Jul 29, 2007
  10. 9/9 Fix t1500 for sane work-tree behaviorJohannes Schindelin, Jul 29, 2007
  11. Die if core.bare = true and core.worktree is setJohannes Schindelin, Jul 29, 2007
  12. Johannes SchindelinAug 1, 2007
  13. 1/4 Add is_absolute_path() and make_absolute_path()Johannes Schindelin, Aug 1, 2007
  14. 2/4 Add functions get_relative_cwd() and is_inside_dir()Johannes Schindelin, Aug 1, 2007
  15. Junio C HamanoAug 1, 2007
  16. Junio C HamanoAug 1, 2007
  17. Johannes SchindelinAug 1, 2007
  18. Make get_relative_cwd() not accept NULL for a directoryJohannes Schindelin, Aug 1, 2007
  19. Junio C HamanoAug 1, 2007
  20. get_relative_cwd(): clarify why it handles dir == NULLJohannes Schindelin, Aug 1, 2007
  21. 3/4 Add set_git_dir() functionJohannes Schindelin, Aug 1, 2007
  22. 4/4 Clean up work-tree handlingJohannes Schindelin, Aug 1, 2007
  23. Junio C HamanoAug 1, 2007
  24. Johannes SchindelinAug 1, 2007
  25. Junio C HamanoAug 2, 2007
  26. Junio C HamanoAug 1, 2007
  27. Johannes SchindelinAug 1, 2007
  28. Junio C HamanoAug 1, 2007
  29. Johannes SchindelinAug 1, 2007
  30. Johannes SchindelinAug 1, 2007

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.