All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Ralf Thielow <ralf.thielow@gmail.com>
Cc: git@vger.kernel.org, larsxschneider@gmail.com, me@jnm2.com,
	philipoakley@iee.org, john@keeping.me.uk
Subject: Re: [PATCH v3] help: make option --help open man pages only for Git commands
Date: Tue, 16 Aug 2016 10:27:35 -0700	[thread overview]
Message-ID: <xmqq60r0ei9k.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <20160816162030.27754-1-ralf.thielow@gmail.com> (Ralf Thielow's message of "Tue, 16 Aug 2016 18:20:30 +0200")

Ralf Thielow <ralf.thielow@gmail.com> writes:

>  builtin/help.c  | 30 +++++++++++++++++++++++-------
>  git.c           | 15 ++++++++++++++-
>  t/t0012-help.sh | 15 +++++++++++++++
>  3 files changed, 52 insertions(+), 8 deletions(-)
>  create mode 100755 t/t0012-help.sh
>
> diff --git a/builtin/help.c b/builtin/help.c
> index 8848013..76f07c7 100644
> --- a/builtin/help.c
> +++ b/builtin/help.c
> @@ -37,7 +37,9 @@ static int show_all = 0;
>  static int show_guides = 0;
>  static unsigned int colopts;
>  static enum help_format help_format = HELP_FORMAT_NONE;
> +static int swapped = 0;

This is not the first offender (show_guides above does so, too), but
please do not initialize static explicitly to 0 or NULL.

>  static struct option builtin_help_options[] = {
> +	OPT_BOOL('s', "swapped", &swapped, "mark as being called by <cmd> --help"),
>  	OPT_BOOL('a', "all", &show_all, N_("print all available commands")),
>  	OPT_BOOL('g', "guides", &show_guides, N_("print list of useful guides")),
>  	OPT_SET_INT('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN),
> @@ -433,10 +435,29 @@ static void list_common_guides_help(void)
>  	putchar('\n');
>  }
>  
> +static const char* check_git_cmd(const char* cmd)

Style: "static const char *check_git_cmd(const char *cmd)".  The
asterisk that turns the base type to a pointer to the base type
sticks to the identifier, not to the type.

> +{
> +	char *alias;
> +
> +	if (is_git_command(cmd))
> +		return cmd;
> +
> +	alias = alias_lookup(cmd);
> +	if (alias) {
> +		printf_ln(_("`git %s' is aliased to `%s'"), cmd, alias);
> +		free(alias);
> +		exit(0);
> +	}
> +
> +	if (swapped)
> +		return help_unknown_cmd(cmd);

I am guilty of suggesting "swapped"; even if we are going to mark
this as OPT_HIDDEN, I think we should be able to think of a better
name.  I think the meaning of this boolean is "we know that this is
not a guide and is meant to be a command.", and I hope we can come
up with a name that concisely expresses that (e.g. "--not-a-guide",
"--must-be-a-command").

> +	return cmd;
> +}
> +
>  int cmd_help(int argc, const char **argv, const char *prefix)
>  {
>  	int nongit;
> -	char *alias;
>  	enum help_format parsed_help_format;
>  
>  	argc = parse_options(argc, argv, prefix, builtin_help_options,
> @@ -476,12 +497,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)
>  	if (help_format == HELP_FORMAT_NONE)
>  		help_format = parse_help_format(DEFAULT_HELP_FORMAT);
>  
> -	alias = alias_lookup(argv[0]);
> -	if (alias && !is_git_command(argv[0])) {
> -		printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias);
> -		free(alias);
> -		return 0;
> -	}
> +	argv[0] = check_git_cmd(argv[0]);
>  
>  	switch (help_format) {
>  	case HELP_FORMAT_NONE:
> diff --git a/git.c b/git.c
> index 0f1937f..71ea983 100644
> --- a/git.c
> +++ b/git.c
> @@ -528,10 +528,23 @@ static void handle_builtin(int argc, const char **argv)
>  	strip_extension(argv);
>  	cmd = argv[0];
>  
> -	/* Turn "git cmd --help" into "git help cmd" */
> +	/* Turn "git cmd --help" into "git help --swapped cmd" */
>  	if (argc > 1 && !strcmp(argv[1], "--help")) {
> +		struct argv_array args;
> +		int i;
> +
>  		argv[1] = argv[0];
>  		argv[0] = cmd = "help";
> +
> +		argv_array_init(&args);
> +		for (i = 0; i < argc; i++) {
> +			argv_array_push(&args, argv[i]);
> +			if (i == 0)

It is more idiomatic to say

			if (!i)

around here.

> +				argv_array_push(&args, "--swapped");

> +		}
> +
> +		argc++;
> +		argv = argv_array_detach(&args);
>  	}
>  
>  	builtin = get_builtin(cmd);

The code does this after it:

	if (builtin)
        	exit(run_builtin(...));

and returns.  If we didn't get builtin, we risk leaking args.argv
here, but we assume argv[0] = cmd = "help" is always a builtin,
which I think is a safe assumption, so the code is OK.  Static
checkers that are only half intelligent may yell at you for not
releasing the resources, though.

> diff --git a/t/t0012-help.sh b/t/t0012-help.sh
> new file mode 100755
> index 0000000..6f700b1
> --- /dev/null
> +++ b/t/t0012-help.sh
> @@ -0,0 +1,15 @@
> +#!/bin/sh
> +
> +test_description='help'
> +
> +. ./test-lib.sh
> +
> +test_expect_success "pass --help to common guide" "
> +	cat <<-EOF >expected &&
> +		git: 'revisions' is not a git command. See 'git --help'.
> +	EOF
> +	(git revisions --help 2>actual || true) &&
> +	test_i18ncmp expected actual
> +"
> +
> +test_done

  parent reply	other threads:[~2016-08-16 17:27 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-12  2:00 `git stash --help` tries to pull up nonexistent file gitstack.html Joseph Musser
2016-08-12 15:48 ` Junio C Hamano
2016-08-12 16:03   ` Lars Schneider
2016-08-12 16:15     ` Joseph Musser
2016-08-12 16:25       ` Junio C Hamano
2016-08-12 18:14         ` Jacob Keller
2016-08-12 20:10         ` [PATCH] help: make option --help open man pages only for Git commands Ralf Thielow
2016-08-12 21:34           ` Junio C Hamano
2016-08-12 22:53             ` Junio C Hamano
2016-08-13  0:08               ` Philip Oakley
2016-08-13 15:31                 ` Junio C Hamano
2016-08-15  5:36           ` [PATCH v2] " Ralf Thielow
2016-08-15 11:25             ` Philip Oakley
2016-08-15 17:57               ` Junio C Hamano
2016-08-15 20:40                 ` Philip Oakley
2016-08-15 22:19                   ` Junio C Hamano
2016-08-16 10:06                   ` John Keeping
2016-08-16 16:20             ` [PATCH v3] " Ralf Thielow
2016-08-16 16:33               ` John Keeping
2016-08-16 16:39                 ` Ralf Thielow
2016-08-16 17:27               ` Junio C Hamano [this message]
2016-08-16 17:57                 ` Ralf Thielow
2016-08-16 19:06                   ` Junio C Hamano
2016-08-18 18:57               ` [PATCH 0/2] " Ralf Thielow
2016-08-18 18:57                 ` [PATCH 1/2] help: introduce option --command-only Ralf Thielow
2016-08-18 18:57                   ` [PATCH 2/2] help: make option --help open man pages only for Git commands Ralf Thielow
2016-08-18 19:51                     ` Junio C Hamano
2016-08-23 17:34                       ` Ralf Thielow
2016-08-18 21:47                   ` [PATCH 1/2] help: introduce option --command-only Philip Oakley
2016-08-19  8:32                   ` Johannes Schindelin
2016-08-19 15:53                     ` Junio C Hamano
2016-08-23 17:41                     ` Ralf Thielow
2016-08-24  7:47                       ` Johannes Schindelin
2016-08-19  8:39                   ` Remi Galan Alfonso
2016-08-23 17:37                     ` Ralf Thielow
2016-08-26 17:58                 ` [PATCH v2 0/3] help: make option --help open man pages only for Git commands Ralf Thielow
2016-08-26 17:58                   ` [PATCH v2 1/3] Revert "display HTML in default browser using Windows' shell API" Ralf Thielow
2016-08-26 17:58                   ` [PATCH v2 2/3] help: introduce option --exclude-guides Ralf Thielow
2016-08-26 19:06                     ` Junio C Hamano
2016-08-26 19:42                       ` Junio C Hamano
2016-08-26 20:03                         ` Ralf Thielow
2016-08-26 20:28                           ` Junio C Hamano
2016-08-26 20:00                       ` Ralf Thielow
2016-08-26 20:20                         ` Junio C Hamano
2016-08-26 20:39                           ` Ralf Thielow
2016-08-26 17:58                   ` [PATCH v2 3/3] help: make option --help open man pages only for Git commands Ralf Thielow

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqq60r0ei9k.fsf@gitster.mtv.corp.google.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=john@keeping.me.uk \
    --cc=larsxschneider@gmail.com \
    --cc=me@jnm2.com \
    --cc=philipoakley@iee.org \
    --cc=ralf.thielow@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.