Merge branch 'master' into cc/help
authorJunio C Hamano <gitster@pobox.com>
Mon, 10 Dec 2007 09:22:42 +0000 (01:22 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 10 Dec 2007 09:22:42 +0000 (01:22 -0800)
This is to primarily pull in MANPATH tweak and help.txt formatting fix
from the master branch.

Documentation/Makefile
Documentation/git-help.txt
Documentation/git-instaweb.txt
Documentation/git.txt
Makefile
git-browse-help.sh [new file with mode: 0755]
git-instaweb.sh
help.c
index 1b5802456dea9dec329cba19eddb6ef6ea45a090..9f0f9d70f6decd721141b48f9be2f0a8da429bcb 100644 (file)
@@ -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
@@ -98,6 +99,9 @@ install-info: info
          echo "No directory found in $(DESTDIR)$(infodir)" >&2 ; \
        fi
 
+install-html: html
+       sh ./install-webdoc.sh $(DESTDIR)$(htmldir)
+
 ../GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
        $(MAKE) -C ../ GIT-VERSION-FILE
 
index 7ddbf467dfdf1d5a7825836d951cd54b336265b0..ac9e15d7748a17bdd552acfb0c690ffea459a87c 100644 (file)
@@ -7,7 +7,7 @@ git-help - display help information about git
 
 SYNOPSIS
 --------
-'git help' [-a|--all] [COMMAND]
+'git help' [-a|--all|-i|--info|-w|--web] [COMMAND]
 
 DESCRIPTION
 -----------
@@ -20,7 +20,8 @@ If the option '--all' or '-a' is given, then all available commands are
 printed on the standard output.
 
 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.
+up. The 'man' program is used by default for this purpose, but this
+can be overriden by other options.
 
 Note that 'git --help ...' is identical as 'git help ...' because the
 former is internally converted into the latter.
@@ -28,10 +29,31 @@ former is internally converted into the latter.
 OPTIONS
 -------
 -a|--all::
-
        Prints all the available commands on the standard output. This
        option superseeds any other option.
 
+-i|--info::
+       Use the 'info' program to display the manual page, instead of
+       the 'man' program that is used by default.
+
+-w|--web::
+       Use a web browser to display the HTML manual page, instead of
+       the 'man' program that is used by default.
++
+The web browser can be specified using the configuration variable
+'help.browser', or 'web.browser' if the former is not set. If none of
+these config variables is set, the 'git-browse-help' script (called by
+'git-help') will pick a suitable default.
++
+You can explicitly provide a full path to your prefered browser by
+setting the configuration variable 'browser.<tool>.path'. For example,
+you can configure the absolute path to firefox by setting
+'browser.firefox.path'. Otherwise, 'git-browse-help' assumes the tool
+is available in PATH.
++
+Note that the script tries, as much as possible, to display the HTML
+page in a new tab on an already opened browser.
+
 Author
 ------
 Written by Junio C Hamano <gitster@pobox.com> and the git-list
index 735008c1ab172cda93e6f98b75b401c37f1cd22f..d2ce7790e61126d1f3256dfc207311a0d6d27e56 100644 (file)
@@ -71,6 +71,9 @@ You may specify configuration in your .git/config
 
 -----------------------------------------------------------------------
 
+If the configuration variable 'instaweb.browser' is not set,
+'web.browser' will be used instead if it is defined.
+
 Author
 ------
 Written by Eric Wong <normalperson@yhbt.net>
index 1574ecd77eccc586c62b745465bffb80baf67ce7..a29b634e7a8d86a3e03f7d90ca81a9e86b068730 100644 (file)
@@ -104,6 +104,11 @@ OPTIONS
        commands. If the option '--all' or '-a' is given then all
        available commands are printed. If a git command is named this
        option will bring up the manual page for that command.
++
+Other options are available to control how the manual page is
+displayed. See gitlink:git-help[1] for more information,
+because 'git --help ...' is converted internally into 'git
+help ...'.
 
 --exec-path::
        Path to wherever your core git programs are installed.
index 4cdb84ba6242595a5e0e4765a16497aad53a56f3..429bc1ddb55f502b5c7ed51515aa7600599b2f15 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -158,6 +158,7 @@ mandir = $(prefix)/share/man
 gitexecdir = $(bindir)
 sharedir = $(prefix)/share
 template_dir = $(sharedir)/git-core/templates
+htmldir=$(sharedir)/doc/git-doc
 ifeq ($(prefix),/usr)
 sysconfdir = /etc
 else
@@ -184,7 +185,7 @@ GITWEB_FAVICON = git-favicon.png
 GITWEB_SITE_HEADER =
 GITWEB_SITE_FOOTER =
 
-export prefix bindir gitexecdir sharedir template_dir sysconfdir
+export prefix bindir gitexecdir sharedir template_dir htmldir sysconfdir
 
 CC = gcc
 AR = ar
@@ -224,7 +225,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-browse-help.sh
 
 SCRIPT_PERL = \
        git-add--interactive.perl \
@@ -750,6 +752,7 @@ bindir_SQ = $(subst ','\'',$(bindir))
 mandir_SQ = $(subst ','\'',$(mandir))
 gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
 template_dir_SQ = $(subst ','\'',$(template_dir))
+htmldir_SQ = $(subst ','\'',$(htmldir))
 prefix_SQ = $(subst ','\'',$(prefix))
 
 SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
@@ -814,6 +817,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|@@HTMLDIR@@|$(htmldir_SQ)|g' \
            $@.sh >$@+ && \
        chmod +x $@+ && \
        mv $@+ $@
diff --git a/git-browse-help.sh b/git-browse-help.sh
new file mode 100755 (executable)
index 0000000..817b379
--- /dev/null
@@ -0,0 +1,146 @@
+#!/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='[--browser=browser|--tool=browser] [cmd to display] ...'
+SUBDIRECTORY_OK=Yes
+OPTIONS_SPEC=
+. git-sh-setup
+
+# Install data.
+html_dir="@@HTMLDIR@@"
+
+test -f "$html_dir/git.html" || die "No documentation directory found."
+
+valid_tool() {
+       case "$1" in
+               firefox | iceweasel | konqueror | w3m | links | lynx | dillo)
+                       ;; # happy
+               *)
+                       return 1
+                       ;;
+       esac
+}
+
+init_browser_path() {
+       browser_path=`git config browser.$1.path`
+       test -z "$browser_path" && browser_path=$1
+}
+
+while test $# != 0
+do
+    case "$1" in
+       -b|--browser*|-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
+    for opt in "help.browser" "web.browser"
+    do
+       browser="`git config $opt`"
+       test -z "$browser" || break
+    done
+    if test -n "$browser" && ! valid_tool "$browser"; then
+           echo >&2 "git config option $opt set to unknown browser: $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 links lynx dillo"
+       if test "$KDE_FULL_SESSION" = "true"; then
+           browser_candidates="konqueror $browser_candidates"
+       fi
+    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
+           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
+
+pages=$(for p in "$@"; do echo "$html_dir/$p.html" ; done)
+test -z "$pages" && pages="$html_dir/git.html"
+
+case "$browser" in
+    firefox|iceweasel)
+       # Check version because firefox < 2.0 does not support "-new-tab".
+       vers=$(expr "$($browser_path -version)" : '.* \([0-9][0-9]*\)\..*')
+       NEWTAB='-new-tab'
+       test "$vers" -lt 2 && NEWTAB=''
+       nohup "$browser_path" $NEWTAB $pages &
+       ;;
+    konqueror)
+       case "$(basename "$browser_path")" in
+           konqueror)
+               # It's simpler to use kfmclient to open a new tab in konqueror.
+               browser_path="$(echo "$browser_path" | sed -e 's/konqueror$/kfmclient/')"
+               type "$browser_path" > /dev/null 2>&1 || die "No '$browser_path' found."
+               eval "$browser_path" newTab $pages
+               ;;
+           kfmclient)
+               eval "$browser_path" newTab $pages
+               ;;
+           *)
+               nohup "$browser_path" $pages &
+               ;;
+       esac
+       ;;
+    w3m|links|lynx)
+       eval "$browser_path" $pages
+       ;;
+    dillo)
+       nohup "$browser_path" $pages &
+       ;;
+esac
index 8503ae40309e6c8b1547289c9950d99f4bf736b5..42d8d7fc6ee33546d6d7113c1c9025f90ef4db06 100755 (executable)
@@ -24,6 +24,7 @@ fqgitdir="$GIT_DIR"
 local="`git config --bool --get instaweb.local`"
 httpd="`git config --get instaweb.httpd`"
 browser="`git config --get instaweb.browser`"
+test -z "$browser" && browser="`git config --get web.browser`"
 port=`git config --get instaweb.port`
 module_path="`git config --get instaweb.modulepath`"
 
diff --git a/help.c b/help.c
index f935887d34f2d766120a2628ee13e074b76a6c17..56477f4506a94905c58dad09543bfbb68db61d91 100644 (file)
--- a/help.c
+++ b/help.c
@@ -239,6 +239,22 @@ void list_common_cmds_help(void)
        }
 }
 
+static const char *cmd_to_page(const char *git_cmd)
+{
+       if (!git_cmd)
+               return "git";
+       else if (!prefixcmp(git_cmd, "git"))
+               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;
+               return p;
+       }
+}
+
 static void setup_man_path(void)
 {
        struct strbuf new_path;
@@ -262,23 +278,23 @@ static void setup_man_path(void)
 
 static void show_man_page(const char *git_cmd)
 {
-       const char *page;
-
-       if (!prefixcmp(git_cmd, "git"))
-               page = 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;
-       }
-
+       const char *page = cmd_to_page(git_cmd);
        setup_man_path();
        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);
+       execl_git_cmd("browse-help", page, NULL);
+}
+
 void help_unknown_cmd(const char *cmd)
 {
        fprintf(stderr, "git: '%s' is not a git-command. See 'git --help'.\n", cmd);
@@ -293,18 +309,25 @@ int cmd_version(int argc, const char **argv, const char *prefix)
 
 int cmd_help(int argc, const char **argv, const char *prefix)
 {
-       const char *help_cmd = argc > 1 ? argv[1] : NULL;
+       const char *help_cmd = argv[1];
 
-       if (!help_cmd) {
+       if (argc < 2) {
                printf("usage: %s\n\n", git_usage_string);
                list_common_cmds_help();
                exit(0);
        }
 
-       else if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a")) {
+       if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a")) {
                printf("usage: %s\n\n", git_usage_string);
                list_commands();
-               exit(0);
+       }
+
+       else if (!strcmp(help_cmd, "--web") || !strcmp(help_cmd, "-w")) {
+               show_html_page(argc > 2 ? argv[2] : NULL);
+       }
+
+       else if (!strcmp(help_cmd, "--info") || !strcmp(help_cmd, "-i")) {
+               show_info_page(argc > 2 ? argv[2] : NULL);
        }
 
        else