threads / rfc / 10999

RFC patchgit-help: add new options -w (for web) and -i (for info)

Subject: [RFC/PATCH] git-help: add new options -w (for web) and -i (for info)

## tl;dr

6 messages between Nov 24, 2007 and Nov 24, 2007. Diffs are folded; open one to read it.

replies: 5people: 5as markdown or json

Christian Couder· Nov 24, 2007, 04:16 UTC · lore
With option -i or --info "git help" will call "info git-XXX".

With option -w or --web "git help" will call a new shell script "git-html-help" that will try to show the HTML version of the man page in your prefered web browser.

This currently works only if the HTML versions of the man page have been installed in "PREFIX/share/doc/git-doc", so new target to do that is added to "Documentation/Makefile".

The code in "git-html-help" is heavily stolen from "git-mergetool". Thanks.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Documentation/Makefile |    4 ++
 Makefile               |    4 +-
 git-html-help.sh       |  125 ++++++++++++++++++++++++++++++++++++++++++++++++
 help.c                 |   48 +++++++++++++++---
 4 files changed, 172 insertions(+), 9 deletions(-)
 create mode 100755 git-html-help.sh
Show changes to 4 files +172 −9

Documentation/Makefile, Makefile, git-html-help.sh, help.c

diff --git a/Documentation/Makefile b/Documentation/Makefile
index d886641..3e01718 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -29,6 +29,7 @@ DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_TXT))
 
 prefix?=$(HOME)
 bindir?=$(prefix)/bin
+htmldir?=$(prefix)/share/doc/git-doc
 mandir?=$(prefix)/share/man
 man1dir=$(mandir)/man1
 man5dir=$(mandir)/man5
@@ -95,6 +96,9 @@ install-info: info
 	  echo "No directory found in $(DESTDIR)$(infodir)" >&2 ; \
 	fi
 
+install-html: html
+	sh ./install-webdoc.sh $(htmldir)
+
 ../GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
 	$(MAKE) -C ../ GIT-VERSION-FILE
 
diff --git a/Makefile b/Makefile
index 313f9a2..6ccf7e7 100644
--- a/Makefile
+++ b/Makefile
@@ -223,7 +223,8 @@ SCRIPT_SH = \
 	git-merge-resolve.sh \
 	git-lost-found.sh git-quiltimport.sh git-submodule.sh \
 	git-filter-branch.sh \
-	git-stash.sh
+	git-stash.sh \
+	git-html-help.sh
 
 SCRIPT_PERL = \
 	git-add--interactive.perl \
@@ -807,6 +808,7 @@ $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
 	    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
 	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
 	    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
+	    -e 's|@@PREFIX@@|$(prefix_SQ)|g' \
 	    $@.sh >$@+ && \
 	chmod +x $@+ && \
 	mv $@+ $@
diff --git a/git-html-help.sh b/git-html-help.sh
new file mode 100755
index 0000000..286d3b5
--- /dev/null
+++ b/git-html-help.sh
@@ -0,0 +1,125 @@
+#!/bin/sh
+#
+# This program launch a web browser on the html page
+# describing a git command.
+#
+# Copyright (c) 2007 Christian Couder
+# Copyright (c) 2006 Theodore Y. Ts'o
+#
+# This file is heavily stolen from git-mergetool.sh, by
+# Theodore Y. Ts'o (thanks) that is:
+#
+# Copyright (c) 2006 Theodore Y. Ts'o
+#
+# This file is licensed under the GPL v2, or a later version
+# at the discretion of Junio C Hamano or any other official
+# git maintainer.
+#
+
+USAGE='[--tool=tool] [cmd to display] ...'
+SUBDIRECTORY_OK=Yes
+OPTIONS_SPEC=
+. git-sh-setup
+
+valid_tool() {
+	case "$1" in
+		firefox | iceweasel | konqueror | w3m)
+			;; # happy
+		*)
+			return 1
+			;;
+	esac
+}
+
+init_browser_path() {
+	browser_path=`git config webtool.$1.path`
+	test -z "$browser_path" && browser_path=$1
+}
+
+while test $# != 0
+do
+    case "$1" in
+	-t|--tool*)
+	    case "$#,$1" in
+		*,*=*)
+		    browser=`expr "z$1" : 'z-[^=]*=\(.*\)'`
+		    ;;
+		1,*)
+		    usage ;;
+		*)
+		    browser="$2"
+		    shift ;;
+	    esac
+	    ;;
+	--)
+	    break
+	    ;;
+	-*)
+	    usage
+	    ;;
+	*)
+	    break
+	    ;;
+    esac
+    shift
+done
+
+if test -z "$browser"; then
+    browser=`git config web.tool`
+    if test -n "$browser" && ! valid_tool "$browser"; then
+	    echo >&2 "git config option web.tool set to unknown tool: $browser"
+	    echo >&2 "Resetting to default..."
+	    unset browser
+    fi
+fi
+
+if test -z "$browser" ; then
+    if test -n "$DISPLAY"; then
+        browser_candidates="firefox iceweasel konqueror w3m"
+        if test "$KDE_FULL_SESSION" = "true"; then
+            browser_candidates="konqueror $browser_candidates"
+        fi
+    else
+        browser_candidates="w3m"
+    fi
+    echo "browser candidates: $browser_candidates"
+    for i in $browser_candidates; do
+        init_browser_path $i
+	echo "browser path: $browser_path"
+        if type "$browser_path" > /dev/null 2>&1; then
+            browser=$i
+            break
+        fi
+    done
+    test -z "$browser" && die "No known browser available."
+else
+    valid_tool "$browser" || die "Unknown browser $browser"
+
+    init_browser_path "$browser"
+
+    if ! type "$browser_path" > /dev/null 2>&1; then
+        die "The browser $browser is not available as '$browser_path'"
+    fi
+fi
+
+html_dir="@@PREFIX@@/share/doc/git-doc"
+pages=$(for p in "$@"; do echo "$html_dir/$p.html" ; done)
+test -z "$pages" && pages="$html_dir/git.html"
+
+case "$browser" in
+    firefox|iceweasel)
+        # TODO check version (firefox < 2.0 does not support -new-tab)
+        nohup "$browser" -new-tab $pages &
+	;;
+    konqueror)
+        # FIXME: we may want to find an existing konqueror and use
+        # dcop to tell it what to do.
+        nohup "$browser" $pages &
+        ;;
+    w3m)
+        eval "$browser" $pages
+        ;;
+esac
+
+
+
diff --git a/help.c b/help.c
index 37a9c25..a5602a2 100644
--- a/help.c
+++ b/help.c
@@ -239,24 +239,38 @@ void list_common_cmds_help(void)
 	}
 }
 
-static void show_man_page(const char *git_cmd)
+static const char *cmd_to_page(const char *git_cmd)
 {
-	const char *page;
-
 	if (!prefixcmp(git_cmd, "git"))
-		page = git_cmd;
+		return git_cmd;
 	else {
 		int page_len = strlen(git_cmd) + 4;
 		char *p = xmalloc(page_len + 1);
 		strcpy(p, "git-");
 		strcpy(p + 4, git_cmd);
 		p[page_len] = 0;
-		page = p;
+		return p;
 	}
+}
 
+static void show_man_page(const char *git_cmd)
+{
+	const char *page = cmd_to_page(git_cmd);
 	execlp("man", "man", page, NULL);
 }
 
+static void show_info_page(const char *git_cmd)
+{
+	const char *page = cmd_to_page(git_cmd);
+	execlp("info", "info", page, NULL);
+}
+
+static void show_html_page(const char *git_cmd)
+{
+	const char *page = cmd_to_page(git_cmd);
+	execlp("git-html-help", "git-html-help", page, NULL);
+}
+
 void help_unknown_cmd(const char *cmd)
 {
 	fprintf(stderr, "git: '%s' is not a git-command. See 'git --help'.\n", cmd);
@@ -269,10 +283,8 @@ int cmd_version(int argc, const char **argv, const char *prefix)
 	return 0;
 }
 
-int cmd_help(int argc, const char **argv, const char *prefix)
+static void check_help_cmd(const char *help_cmd)
 {
-	const char *help_cmd = argc > 1 ? argv[1] : NULL;
-
 	if (!help_cmd) {
 		printf("usage: %s\n\n", git_usage_string);
 		list_common_cmds_help();
@@ -284,6 +296,26 @@ int cmd_help(int argc, const char **argv, const char *prefix)
 		list_commands();
 		exit(0);
 	}
+}
+
+int cmd_help(int argc, const char **argv, const char *prefix)
+{
+	const char *help_cmd = argc > 1 ? argv[1] : NULL;
+	check_help_cmd(help_cmd);
+
+	if (!strcmp(help_cmd, "--web") || !strcmp(help_cmd, "-w")) {
+		help_cmd = argc > 2 ? argv[2] : NULL;
+		check_help_cmd(help_cmd);
+
+		show_html_page(help_cmd);
+	}
+
+	else if (!strcmp(help_cmd, "--info") || !strcmp(help_cmd, "-i")) {
+		help_cmd = argc > 2 ? argv[2] : NULL;
+		check_help_cmd(help_cmd);
+
+		show_info_page(help_cmd);
+	}
 
 	else
 		show_man_page(help_cmd);
-- 
1.5.3.5.1730.g6d12d-dirty
Jakub Narebski· Nov 24, 2007, 08:52 UTC · re: Christian Couder · lore

Re: [RFC/PATCH] git-help: add new options -w (for web) and -i (for info)

[Cc: Christian Couder <chriscool@tuxfamily.org>, git@vger.kernel.org]
Christian Couder wrote:
> This currently works only if the HTML versions of the man page
> have been installed in "PREFIX/share/doc/git-doc", so new target
> to do that is added to "Documentation/Makefile".

git-core RPM (th git one) installs HTML version of manpages to /usr/share/doc/git-core-$version/

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git
Alex Riesen· Nov 24, 2007, 11:34 UTC · re: Christian Couder · lore

Re: [RFC/PATCH] git-help: add new options -w (for web) and -i (for info)

Christian Couder, Sat, Nov 24, 2007 05:16:50 +0100:
> +valid_tool() {
> +	case "$1" in
> +		firefox | iceweasel | konqueror | w3m)
> +			;; # happy
lynx, links and dillo?
Andreas Ericsson· Nov 24, 2007, 13:03 UTC · re: Alex Riesen · lore

Re: [RFC/PATCH] git-help: add new options -w (for web) and -i (for info)

Alex Riesen wrote:
Show 8 quoted lines
> Christian Couder, Sat, Nov 24, 2007 05:16:50 +0100:
>> +valid_tool() {
>> +	case "$1" in
>> +		firefox | iceweasel | konqueror | w3m)
>> +			;; # happy
> 
> lynx, links and dillo?
> 

Why bother validating it at all? I might be using a script to add some formatting and then pass it through the browser of my choice. A friend of mine who's visually impaired does just that to strip some CSS tags which can make docs quite unreadable for him.

-- 
Andreas Ericsson                   andreas.ericsson@op5.se
OP5 AB                             www.op5.se
Tel: +46 8-230225                  Fax: +46 8-230231
Alex Riesen· Nov 24, 2007, 17:33 UTC · re: Andreas Ericsson · lore

Re: [RFC/PATCH] git-help: add new options -w (for web) and -i (for info)

Andreas Ericsson, Sat, Nov 24, 2007 14:03:18 +0100:
Show 9 quoted lines
> Alex Riesen wrote:
>> Christian Couder, Sat, Nov 24, 2007 05:16:50 +0100:
>>> +valid_tool() {
>>> +	case "$1" in
>>> +		firefox | iceweasel | konqueror | w3m)
>>> +			;; # happy
>> lynx, links and dillo?
>
> Why bother validating it at all? I might be using a script to
Kind of my point
Matthieu Moy· Nov 24, 2007, 18:23 UTC · re: Andreas Ericsson · lore

Re: [RFC/PATCH] git-help: add new options -w (for web) and -i (for info)

Andreas Ericsson <ae@op5.se> writes:
Show 15 quoted lines
> Alex Riesen wrote:
>> Christian Couder, Sat, Nov 24, 2007 05:16:50 +0100:
>>> +valid_tool() {
>>> +	case "$1" in
>>> +		firefox | iceweasel | konqueror | w3m)
>>> +			;; # happy
>>
>> lynx, links and dillo?
>>
>
> Why bother validating it at all? I might be using a script to
> add some formatting and then pass it through the browser of my
> choice. A friend of mine who's visually impaired does just that
> to strip some CSS tags which can make docs quite unreadable for
> him.

In any case, make sure it's consistant with git instaweb, which also runs a web browser (firefox by default, overridable with --browser or instaweb.browser).

-- 
Matthieu

← back to recent threads