Hi,
Martin Ågren wrote:
> If we are outside a repo and have any arguments left after
> option-parsing, `setup_revisions()` will try to do its job and
> something like this will happen:
>
> $ git shortlog v2.16.0..
> BUG: environment.c:183: git environment hasn't been setup
> Aborted (core dumped)
Yikes. Thanks for fixing it.
[...]
> (So yes, after
> this patch, we will still silently ignore stdin for confused usage such
> as `git log v2.15.0.. | git shortlog v2.16.0..`. But at least that does
> not crash.)
I don't follow here. Are you saying this command should notice that
there is input in stdin? How would it notice?
[...]
> --- a/t/t4201-shortlog.sh
> +++ b/t/t4201-shortlog.sh
> @@ -127,6 +127,11 @@ test_expect_success !MINGW 'shortlog can read
> --format=raw output' '
> test_cmp expect out
> '
>
> +test_expect_success 'shortlog from non-git directory refuses revisions' '
> + test_must_fail env GIT_DIR=non-existing git shortlog HEAD 2>out &&
> + test_i18ngrep "no revisions can be given" out
> +'
\o/
[...]
> --- a/builtin/shortlog.c
> +++ b/builtin/shortlog.c
> @@ -293,6 +293,12 @@ int cmd_shortlog(int argc, const char **argv, const char
> *prefix)
> parse_done:
> argc = parse_options_end(&ctx);
>
> + if (nongit && argc != 1) {
Just curious: would argc ever be 0 here? 'argc <= 1' might be clearer.
> + error(_("no revisions can be given when running "
> + "from outside a repository"));
> + usage_with_options(shortlog_usage, options);
> + }
> +
The error message is
error: no revisions can be given when running from outside a repository
usage: ...
Do we need to dump usage here? I wonder if a simple die() call would
be easier for the user to act on.
Not about this patch: I was a little surprised to see 'error:' instead
of 'usage:' or 'fatal:'. It turns out git is pretty inconsistent
about that: e.g. there is
error(_("no remote specified"));
usage_with_options(builtin_remote_setbranches_usage, options);
Some other callers just use usage_with_options without describing the
error. check-attr has a private error_with_usage() helper to implement
the error() followed by usage_with_options() idiom. Most callers just
use die(), like
die(_("'%s' cannot be used with %s"), "--merge", "--patch");
Documentation/technical/api-error-handling.txt says
- `usage` is for errors in command line usage. After printing its
message, it exits with status 129. (See also `usage_with_options`
in the link:api-parse-options.html[parse-options API].)
which is not prescriptive enough to help.
Separate from that, I wonder if the error message can be made a little
shorter and clearer. E.g.
fatal: shortlog <revs> can only be used inside a git repository
Thanks and hope that helps,
Jonathan