threads / patch / 11249

patch, 2 partsgit-help: add "help.format" config variable.

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

## tl;dr

4 messages between Dec 12, 2007 and Dec 15, 2007. Diffs are folded; open one to read it.

replies: 3people: 2as markdown or json

Christian Couder· Dec 12, 2007, 05:33 UTC · lore

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(-)
Show changes to 3 files +72 −4

Documentation/git-help.txt, git.c, help.c

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· Dec 12, 2007, 09:04 UTC · re: Christian Couder · lore

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

Christian Couder <chriscool@tuxfamily.org> writes:
Show 13 quoted lines
> 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· Dec 13, 2007, 01:41 UTC · re: Junio C Hamano · lore

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

Junio C Hamano <gitster@pobox.com> writes:
Show 21 quoted lines
> 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(-)
Show changes to 2 files +34 −24

git-browse-help.sh, git-sh-setup.sh

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· Dec 15, 2007, 04:57 UTC · re: Junio C Hamano · lore

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

Le jeudi 13 décembre 2007, Junio C Hamano a écrit :
Show 24 quoted lines
> 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
[...]
Show 8 quoted lines
> @@ -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.
Show 10 quoted lines
> @@ -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.

← back to recent threads