On Mon, Nov 18, 2019 at 7:33 PM Jeff King <peff@xxxxxxxx> wrote: > > 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 I realize I forgot to include the X to my Y :) -- this was a totally silly case that I got as a bug report: https://github.com/pre-commit/pre-commit/issues/1219 I *expected* an error case but didn't get one Anthony