Re: git rev-parse --show-toplevel inside `.git` returns 0 and prints nothing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Nov 19, 2019 at 11:52:54AM +0900, Junio C Hamano wrote:

> If I were designing the feature today, with today's rest-of-git in
> mind, I would say
> 
>  - In a bare repository, exit with non-zero status after giving an
>    error message "no working tree".
> 
>  - In a repository that has a single associated working tree, show
>    the path to the top-level of that working tree and exit with zero
>    status.

Do you mean to do this even in when the cwd is inside .git?

I think that's confusing, because you don't actually have a working tree
at all. E.g.:

  $ git rev-parse --show-toplevel
  /home/peff/tmp
  $ git status -b --short
  ## No commits yet on master

  $ cd .git
  $ git rev-parse --show-toplevel
  $ git status -b --short
  fatal: this operation must be run in a work tree

So internal commands like status accept that we have no working tree in
this situation. But "--show-toplevel" just prints nothing. I'd amend
your second point to be "If we are in the working tree of a repository,
show the path to the top-level of that working tree and exit with zero
status".

And then that leaves another case: we are not in the working tree of the
repository. In which case I think it should be the same as the bare
repository.

And from that, your multi-working-tree case falls out naturally:

> In a repository that has more than one working trees (which is one
> of the things "todasy's rest-of-git" has that did not exist back
> when --show-prefix/--show-toplevel etc. were invented), then what?
> Would it make sense to show the primary working tree?  What if the
> worktree(s) were made off of a bare repository, in which case nobody
> is the primary?

There may be multiple working trees, but we can only be in one of them
at a time. So that's the one that we show.

And the only real change here is that "--show-toplevel" prints an error
and exits non-zero when we won't have a working tree. Something like:

diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 3857fd1b8a..81161f2dfb 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -805,6 +805,8 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				const char *work_tree = get_git_work_tree();
 				if (work_tree)
 					puts(work_tree);
+				else
+					die("this operation must be run in a work tree");
 				continue;
 			}
 			if (!strcmp(arg, "--show-superproject-working-tree")) {


I think the reason this hasn't come up until now is callers are expected
to use require_work_tree() or "rev-parse --is-inside-work-tree" first.

It would probably make sense for the rev-parse documentation to also
clarify what "the top-level directory" is.

-Peff



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux