# [PATCH 1/2] git-help: add "help.format" config variable.

4 messages from 2007-12-12 to 2007-12-15. Participants: Christian Couder, Junio C Hamano.
Thread: https://gitlist.dev/t/11249

## Christian Couder, 2007-12-12 05:33

Subject: [PATCH 1/2] git-help: add "help.format" config variable.
Message-ID: <20071212063320.3cbb1698.chriscool@tuxfamily.org>
URL: https://gitlist.dev/e/20071212063320.3cbb1698.chriscool%40tuxfamily.org

```
This config variable makes it possible to choose the default format
used to display help. This format will be used only if no option
like -a|--all|-i|--info|-m|--man|-w|--web is passed to "git-help".

The following values are possible for this variable:

	- "man"  --> "man" program is used
	- "info" --> "info" program is used
	- "web"  --> "git-browse-help" is used

By default we still show help using "man".

By the way, this patch also adds -m|--man command line option to
use "man" even if something else is set in the "help.format"
config variable.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/git-help.txt |   13 ++++++++-
 git.c                      |    2 +-
 help.c                     |   61 ++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 72 insertions(+), 4 deletions(-)

diff --git a/Documentation/git-help.txt b/Documentation/git-help.txt
index ac9e15d..af5e5cb 100644
--- a/Documentation/git-help.txt
+++ b/Documentation/git-help.txt
@@ -7,7 +7,7 @@ git-help - display help information about git
 
 SYNOPSIS
 --------
-'git help' [-a|--all|-i|--info|-w|--web] [COMMAND]
+'git help' [-a|--all|-i|--info|-m|--man|-w|--web] [COMMAND]
 
 DESCRIPTION
 -----------
@@ -23,6 +23,12 @@ If a git command is named, a manual page for that command is brought
 up. The 'man' program is used by default for this purpose, but this
 can be overriden by other options.
 
+If no command line option is passed, the 'help.format' configuration
+variable will be checked. Supported values for this variable are
+"man", "info" and "web" (or "html" as a synonym to the latter). This
+makes git-help behave as if a command line option with the same long
+name as been passed to it.
+
 Note that 'git --help ...' is identical as 'git help ...' because the
 former is internally converted into the latter.
 
@@ -36,6 +42,11 @@ OPTIONS
 	Use the 'info' program to display the manual page, instead of
 	the 'man' program that is used by default.
 
+-m|--man::
+	Use the 'man' program to display the manual page. This may be
+	used to override a value set in the 'help.format'
+	configuration variable.
+
 -w|--web::
 	Use a web browser to display the HTML manual page, instead of
 	the 'man' program that is used by default.
diff --git a/git.c b/git.c
index 4f9876e..d46b63d 100644
--- a/git.c
+++ b/git.c
@@ -324,7 +324,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "gc", cmd_gc, RUN_SETUP },
 		{ "get-tar-commit-id", cmd_get_tar_commit_id },
 		{ "grep", cmd_grep, RUN_SETUP | USE_PAGER },
-		{ "help", cmd_help },
+		{ "help", cmd_help, RUN_SETUP },
 #ifndef NO_CURL
 		{ "http-fetch", cmd_http_fetch, RUN_SETUP },
 #endif
diff --git a/help.c b/help.c
index c96b167..af0a433 100644
--- a/help.c
+++ b/help.c
@@ -8,6 +8,44 @@
 #include "exec_cmd.h"
 #include "common-cmds.h"
 
+static const char *help_default_format;
+
+static enum help_format {
+	man_format,
+	info_format,
+	web_format,
+} help_format = man_format;
+
+static void parse_help_format(const char *format)
+{
+	if (!format) {
+		help_format = man_format;
+		return;
+	}
+	if (!strcmp(format, "man")) {
+		help_format = man_format;
+		return;
+	}
+	if (!strcmp(format, "info")) {
+		help_format = info_format;
+		return;
+	}
+	if (!strcmp(format, "web") || !strcmp(format, "html")) {
+		help_format = web_format;
+		return;
+	}
+	die("unrecognized help format '%s'", format);
+}
+
+static int git_help_config(const char *var, const char *value)
+{
+	if (!strcmp(var, "help.format")) {
+		help_default_format = xstrdup(value);
+		return 0;
+	}
+	return git_default_config(var, value);
+}
+
 /* most GUI terminals set COLUMNS (although some don't export it) */
 static int term_columns(void)
 {
@@ -331,8 +369,27 @@ int cmd_help(int argc, const char **argv, const char *prefix)
 		show_info_page(argc > 2 ? argv[2] : NULL);
 	}
 
-	else
-		show_man_page(help_cmd);
+	else if (!strcmp(help_cmd, "--man") || !strcmp(help_cmd, "-m")) {
+		show_man_page(argc > 2 ? argv[2] : NULL);
+	}
+
+	else {
+		git_config(git_help_config);
+		if (help_default_format)
+			parse_help_format(help_default_format);
+
+		switch (help_format) {
+		case man_format:
+			show_man_page(help_cmd);
+			break;
+		case info_format:
+			show_info_page(help_cmd);
+			break;
+		case web_format:
+			show_html_page(help_cmd);
+			break;
+		}
+	}
 
 	return 0;
 }
-- 
1.5.3.7.2270.g786cf-dirty

```

## Junio C Hamano, 2007-12-12 09:04

Subject: Re: [PATCH 1/2] git-help: add "help.format" config variable.
Message-ID: <7vr6hs8erq.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vr6hs8erq.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <20071212063320.3cbb1698.chriscool@tuxfamily.org>

```
Christian Couder <chriscool@tuxfamily.org> writes:

> diff --git a/git.c b/git.c
> index 4f9876e..d46b63d 100644
> --- a/git.c
> +++ b/git.c
> @@ -324,7 +324,7 @@ static void handle_internal_command(int argc, const char **argv)
>  		{ "gc", cmd_gc, RUN_SETUP },
>  		{ "get-tar-commit-id", cmd_get_tar_commit_id },
>  		{ "grep", cmd_grep, RUN_SETUP | USE_PAGER },
> -		{ "help", cmd_help },
> +		{ "help", cmd_help, RUN_SETUP },
>  #ifndef NO_CURL
>  		{ "http-fetch", cmd_http_fetch, RUN_SETUP },
>  #endif

It would be _NICE_ if we read configuration when we are in a git
repository, but I am afraid this change is unnice -- the users used to
be able to say "git help" from anywhere didn't they?  Now they will get
"Not a git repository".  It needs to do an optional repository
discovery, not a mandatory one RUN_SETUP causes.

```

## Junio C Hamano, 2007-12-13 01:41

Subject: Re: [PATCH 1/2] git-help: add "help.format" config variable.
Message-ID: <7v63z374nf.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7v63z374nf.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <7vr6hs8erq.fsf@gitster.siamese.dyndns.org>

```
Junio C Hamano <gitster@pobox.com> writes:

> Christian Couder <chriscool@tuxfamily.org> writes:
>
>> diff --git a/git.c b/git.c
>> index 4f9876e..d46b63d 100644
>> --- a/git.c
>> +++ b/git.c
>> @@ -324,7 +324,7 @@ static void handle_internal_command(int argc, const char **argv)
>>  		{ "gc", cmd_gc, RUN_SETUP },
>>  		{ "get-tar-commit-id", cmd_get_tar_commit_id },
>>  		{ "grep", cmd_grep, RUN_SETUP | USE_PAGER },
>> -		{ "help", cmd_help },
>> +		{ "help", cmd_help, RUN_SETUP },
>>  #ifndef NO_CURL
>>  		{ "http-fetch", cmd_http_fetch, RUN_SETUP },
>>  #endif
>
> It would be _NICE_ if we read configuration when we are in a git
> repository, but I am afraid this change is unnice -- the users used to
> be able to say "git help" from anywhere didn't they?  Now they will get
> "Not a git repository".  It needs to do an optional repository
> discovery, not a mandatory one RUN_SETUP causes.

It turns out that the earlier git-browse-help is already broken with
respect to this.

-- >8 --
[PATCH] git-help -w: do not require to be in git repository

The users used to be able to say "git help cat-file" from anywhere, but
the browse-help script insisted to be in a git repository, which caused
"git help -w cat-file" to barf outside.  Correct it.

While at it, remove leftover debugging "echo".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 git-browse-help.sh |   13 ++++++++-----
 git-sh-setup.sh    |   45 ++++++++++++++++++++++++++-------------------
 2 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/git-browse-help.sh b/git-browse-help.sh
index 817b379..b465911 100755
--- a/git-browse-help.sh
+++ b/git-browse-help.sh
@@ -17,8 +17,10 @@
 #
 
 USAGE='[--browser=browser|--tool=browser] [cmd to display] ...'
-SUBDIRECTORY_OK=Yes
-OPTIONS_SPEC=
+
+# This must be capable of running outside of git directory, so
+# the vanilla git-sh-setup should not be used.
+NONGIT_OK=Yes
 . git-sh-setup
 
 # Install data.
@@ -37,7 +39,7 @@ valid_tool() {
 }
 
 init_browser_path() {
-	browser_path=`git config browser.$1.path`
+	test -z "$GIT_DIR" || browser_path=`git config browser.$1.path`
 	test -z "$browser_path" && browser_path=$1
 }
 
@@ -69,7 +71,8 @@ do
     shift
 done
 
-if test -z "$browser"; then
+if test -z "$browser" && test -n "$GIT_DIR"
+then
     for opt in "help.browser" "web.browser"
     do
 	browser="`git config $opt`"
@@ -91,7 +94,7 @@ if test -z "$browser" ; then
     else
 	browser_candidates="w3m links lynx"
     fi
-    echo "browser candidates: $browser_candidates"
+
     for i in $browser_candidates; do
 	init_browser_path $i
 	if type "$browser_path" > /dev/null 2>&1; then
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index 5aa62dd..b366761 100755
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -122,26 +122,33 @@ get_author_ident_from_commit () {
 	LANG=C LC_ALL=C sed -ne "$pick_author_script"
 }
 
-# Make sure we are in a valid repository of a vintage we understand.
-if [ -z "$SUBDIRECTORY_OK" ]
+# Make sure we are in a valid repository of a vintage we understand,
+# if we require to be in a git repository.
+if test -n "$NONGIT_OK"
 then
-	: ${GIT_DIR=.git}
-	test -z "$(git rev-parse --show-cdup)" || {
-		exit=$?
-		echo >&2 "You need to run this command from the toplevel of the working tree."
-		exit $exit
-	}
+	if git rev-parse --git-dir >/dev/null 2>&1
+	then
+		: ${GIT_DIR=.git}
+	fi
 else
-	GIT_DIR=$(git rev-parse --git-dir) || {
-	    exit=$?
-	    echo >&2 "Failed to find a valid git directory."
-	    exit $exit
+	if [ -z "$SUBDIRECTORY_OK" ]
+	then
+		: ${GIT_DIR=.git}
+		test -z "$(git rev-parse --show-cdup)" || {
+			exit=$?
+			echo >&2 "You need to run this command from the toplevel of the working tree."
+			exit $exit
+		}
+	else
+		GIT_DIR=$(git rev-parse --git-dir) || {
+		    exit=$?
+		    echo >&2 "Failed to find a valid git directory."
+		    exit $exit
+		}
+	fi
+	test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || {
+		echo >&2 "Unable to determine absolute path of git directory"
+		exit 1
 	}
+	: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
 fi
-
-test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || {
-    echo >&2 "Unable to determine absolute path of git directory"
-    exit 1
-}
-
-: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
-- 
1.5.3.7-1170-g8d08

```

## Christian Couder, 2007-12-15 04:57

Subject: Re: [PATCH 1/2] git-help: add "help.format" config variable.
Message-ID: <200712150557.00811.chriscool@tuxfamily.org>
URL: https://gitlist.dev/e/200712150557.00811.chriscool%40tuxfamily.org
In-Reply-To: <7v63z374nf.fsf@gitster.siamese.dyndns.org>

```
Le jeudi 13 décembre 2007, Junio C Hamano a écrit :
> Junio C Hamano <gitster@pobox.com> writes:
> > Christian Couder <chriscool@tuxfamily.org> writes:
> >> diff --git a/git.c b/git.c
> >> index 4f9876e..d46b63d 100644
> >> --- a/git.c
> >> +++ b/git.c
> >> @@ -324,7 +324,7 @@ static void handle_internal_command(int argc,
> >> const char **argv) { "gc", cmd_gc, RUN_SETUP },
> >>  		{ "get-tar-commit-id", cmd_get_tar_commit_id },
> >>  		{ "grep", cmd_grep, RUN_SETUP | USE_PAGER },
> >> -		{ "help", cmd_help },
> >> +		{ "help", cmd_help, RUN_SETUP },
> >>  #ifndef NO_CURL
> >>  		{ "http-fetch", cmd_http_fetch, RUN_SETUP },
> >>  #endif
> >
> > It would be _NICE_ if we read configuration when we are in a git
> > repository, but I am afraid this change is unnice -- the users used to
> > be able to say "git help" from anywhere didn't they?  Now they will get
> > "Not a git repository".  It needs to do an optional repository
> > discovery, not a mandatory one RUN_SETUP causes.
>
> It turns out that the earlier git-browse-help is already broken with
> respect to this.

You are right, I did not test outside a git repository.
I reworked the patch and will send it after this email.

While testing my new patch it seemed to me that some of your changes in the 
patch quoted below prevent some configuration variables to be used when 
they are set in the "global" config file (~/.gitconfig). So I reverted them 
in my new patch. But thanks to your other changes, it seems to work fine 
now.

> -- >8 --
> [PATCH] git-help -w: do not require to be in git repository
[...]
> @@ -37,7 +39,7 @@ valid_tool() {
>  }
>
>  init_browser_path() {
> -	browser_path=`git config browser.$1.path`
> +	test -z "$GIT_DIR" || browser_path=`git config browser.$1.path`
>  	test -z "$browser_path" && browser_path=$1
>  }

This seems to prevent using global configuration when outside a git repo.

> @@ -69,7 +71,8 @@ do
>      shift
>  done
>
> -if test -z "$browser"; then
> +if test -z "$browser" && test -n "$GIT_DIR"
> +then
>      for opt in "help.browser" "web.browser"
>      do
>  	browser="`git config $opt`"

This also.

Thanks,
Christian.

```
