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

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

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Aug 1, 2007, 11:53 UTC
Message-ID
<Pine.LNX.4.64.0708011250020.14781@racer.site>
In-Reply-To
<7vvebz7hpw.fsf@assigned-by-dhcp.cox.net>
Hi,
On Wed, 1 Aug 2007, Junio C Hamano wrote:
Show 71 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> 
> > diff --git a/builtin-ls-files.c b/builtin-ls-files.c
> > index 61577ea..d36181a 100644
> > --- a/builtin-ls-files.c
> > +++ b/builtin-ls-files.c
> > @@ -469,9 +469,11 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix)
> >  		break;
> >  	}
> >  
> > -	if (require_work_tree &&
> > -			(!is_inside_work_tree() || is_inside_git_dir()))
> > -		die("This operation must be run in a work tree");
> > +	if (require_work_tree && !is_inside_work_tree()) {
> > +		const char *work_tree = get_git_work_tree();
> > +		if (!work_tree || chdir(work_tree))
> > +			die("This operation must be run in a work tree");
> > +	}
> >  
> >  	pathspec = get_pathspec(prefix, argv + i);
> >  
> 
> Similarly to this change, I am wondering if we would want to fix
> verify_non_filename() in setup.c, which does this:
> 
> /*
>  * Verify a filename that we got as an argument for a pathspec
>  * entry. Note that a filename that begins with "-" never verifies
>  * as true, because even if such a filename were to exist, we want
>  * it to be preceded by the "--" marker (or we want the user to
>  * use a format like "./-filename")
>  */
> void verify_filename(const char *prefix, const char *arg)
> {
> ...
> }
> 
> /*
>  * Opposite of the above: the command line did not have -- marker
>  * and we parsed the arg as a refname.  It should not be interpretable
>  * as a filename.
>  */
> void verify_non_filename(const char *prefix, const char *arg)
> {
>         const char *name;
>         struct stat st;
> 
>         if (!is_inside_work_tree() || is_inside_git_dir())
>                 return;
>         if (*arg == '-')
>                 return; /* flag */
>         name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;
>         if (!lstat(name, &st))
>                 die("ambiguous argument '%s': both revision and filename\n"
>                     "Use '--' to separate filenames from revisions", arg);
>         if (errno != ENOENT)
>                 die("'%s': %s", arg, strerror(errno));
> }
> 
> At this point, we are given an ambiguous parameter, that could
> be naming a path in the work tree.  If we are not in the work
> tree, then it is understandable that we do not have to barf.
> The other check (i.e. "|| is_inside_git_dir()") does not hurt
> (iow, it is not an incorrect check per-se), because if you did
> "cd .git && git log HEAD" then the HEAD parameter cannot be
> naming the path ".git/HEAD" in the work tree, but (1) that is
> already covered by .git/ being "outside of work tree", and (2)
> it is not something this function wants to check anyway
> (i.e. "can the parameter be naming a file in the work tree?").
> 
> Am I mistaken and/or confused?

I think you are completely right. Inside a bare repository, "git log FETCH_HEAD" should not need to complain. And I think that the "is_inside_git_dir()" could be _replaced_ by "!is_inside_work_tree()", since that is the intent of that call.

Ciao, Dscho

Previous: Junio C HamanoNext: Junio C Hamano
Message 27 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.