# [RFC/PATCH] git wrapper: add --git-path=<path> and --bare options

7 messages from 2006-07-25 to 2006-07-26. Participants: Johannes Schindelin, Linus Torvalds, Junio C Hamano, Uwe Zeisberger.
Thread: https://gitlist.dev/t/4981

## Johannes Schindelin, 2006-07-25 17:30

Subject: [RFC/PATCH] git wrapper: add --git-path=<path> and --bare options
Message-ID: <Pine.LNX.4.63.0607251926190.29667@wbgn013.biozentrum.uni-wuerzburg.de>
URL: https://gitlist.dev/e/Pine.LNX.4.63.0607251926190.29667%40wbgn013.biozentrum.uni-wuerzburg.de

```

With this, you can say

	git --bare repack -a -d

inside a bare repository, and it will actually work. While at
documenting these options, also document the --paginate option.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
	This is on top of my "allow wrapper options in aliases" patch.

	I hope I did not fsck up the asciidoc formatting; ATM I cannot 
	test that.

	If you agree this is a good approach, should I also move the 
	--version and --exec-path options into handle_options()?

	If you do, I will also make this more user-friendly, i.e.
	it should not crash when saying "git --bare".

 Documentation/git.txt |   12 +++++++++++-
 git.c                 |    9 +++++++++
 2 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/Documentation/git.txt b/Documentation/git.txt
index ce30581..b5da5f9 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -8,7 +8,8 @@ git - the stupid content tracker
 
 SYNOPSIS
 --------
-'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ARGS]
+'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate]
+	[--bare] [--git-dir=GIT_DIR] [--help] COMMAND [ARGS]
 
 DESCRIPTION
 -----------
@@ -41,6 +42,15 @@ OPTIONS
 	environment variable. If no path is given 'git' will print
 	the current setting and then exit.
 
+-p|--paginate::
+	Pipe all output into 'less' (or if set, $PAGER).
+
+--git-path=<path>::
+	Set the path to the repository. This can also be controlled by
+	setting the GIT_DIR environment variable.
+
+--bare::
+	Same as --git-path=`pwd`.
 
 FURTHER DOCUMENTATION
 ---------------------
diff --git a/git.c b/git.c
index 8d7c644..e048f54 100644
--- a/git.c
+++ b/git.c
@@ -46,6 +46,15 @@ static int handle_options(const char*** 
 
 		if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
 			setup_pager();
+		} else if (!strcmp(cmd, "--git-dir") && *argc > 1) {
+			setenv("GIT_DIR", (*argv)[1], 1);
+			(*argv)++;
+			(*argc)--;
+		} else if (!strncmp(cmd, "--git-dir=", 10)) {
+			setenv("GIT_DIR", cmd + 10, 1);
+		} else if (!strcmp(cmd, "--bare")) {
+			static char git_dir[1024];
+			setenv("GIT_DIR", getcwd(git_dir, 1024), 1);
 		} else
 			die ("Unknown option: %s", cmd);
 
-- 
1.4.2.rc1.gf725-dirty

```

## Linus Torvalds, 2006-07-25 17:43

Subject: Re: [RFC/PATCH] git wrapper: add --git-path=<path> and --bare options
Message-ID: <Pine.LNX.4.64.0607251042120.29649@g5.osdl.org>
URL: https://gitlist.dev/e/Pine.LNX.4.64.0607251042120.29649%40g5.osdl.org
In-Reply-To: <Pine.LNX.4.63.0607251926190.29667@wbgn013.biozentrum.uni-wuerzburg.de>

```


On Tue, 25 Jul 2006, Johannes Schindelin wrote:
>  
>  SYNOPSIS
>  --------
> -'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ARGS]
> +'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate]
> +	[--bare] [--git-dir=GIT_DIR] [--help] COMMAND [ARGS]

Here you have "--git-dir"

> @@ -41,6 +42,15 @@ OPTIONS
>  	environment variable. If no path is given 'git' will print
>  	the current setting and then exit.
>  
> +-p|--paginate::
> +	Pipe all output into 'less' (or if set, $PAGER).
> +
> +--git-path=<path>::
> +	Set the path to the repository. This can also be controlled by
> +	setting the GIT_DIR environment variable.

But here you have "--git-path".

> +		} else if (!strcmp(cmd, "--git-dir") && *argc > 1) {
> +			setenv("GIT_DIR", (*argv)[1], 1);
> +			(*argv)++;
> +			(*argc)--;
> +		} else if (!strncmp(cmd, "--git-dir=", 10)) {
> +			setenv("GIT_DIR", cmd + 10, 1);

And here you have "--git-dir" again.

Since "--git-dir" makes more sense than "--git-path", I'd suggest just 
fixing the OPTIONS section ;)

		Linus

```

## Johannes Schindelin, 2006-07-25 17:52

Subject: Re: [RFC/PATCH] git wrapper: add --git-path=<path> and --bare options
Message-ID: <Pine.LNX.4.63.0607251952000.29667@wbgn013.biozentrum.uni-wuerzburg.de>
URL: https://gitlist.dev/e/Pine.LNX.4.63.0607251952000.29667%40wbgn013.biozentrum.uni-wuerzburg.de
In-Reply-To: <Pine.LNX.4.64.0607251042120.29649@g5.osdl.org>

```
Hi,

On Tue, 25 Jul 2006, Linus Torvalds wrote:

> Since "--git-dir" makes more sense than "--git-path", I'd suggest just 
> fixing the OPTIONS section ;)

Will do. Thanks.

Ciao,
Dscho

```

## Johannes Schindelin, 2006-07-25 18:24

Subject: [PATCH] git wrapper: add --git-path=<path> and --bare options
Message-ID: <Pine.LNX.4.63.0607252022370.29667@wbgn013.biozentrum.uni-wuerzburg.de>
URL: https://gitlist.dev/e/Pine.LNX.4.63.0607252022370.29667%40wbgn013.biozentrum.uni-wuerzburg.de
In-Reply-To: <Pine.LNX.4.63.0607251952000.29667@wbgn013.biozentrum.uni-wuerzburg.de>

```

With this, you can say

	git --bare repack -a -d

inside a bare repository, and it will actually work. While at it,
also move the --version, --help and --exec-path options to the
handle_options() function.

While at documenting the new options, also document the --paginate
option.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
	The change in builtin-help.c is not only clean, but is also
	necessary for t0000 on cygwin.

	I have to run off now, but will answer your comments in
	about three hours.

 Documentation/git.txt |   12 ++++++
 builtin-help.c        |    2 +
 git.c                 |   93 +++++++++++++++++++++++++------------------------
 3 files changed, 60 insertions(+), 47 deletions(-)

diff --git a/Documentation/git.txt b/Documentation/git.txt
index ce30581..29aebe9 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -8,7 +8,8 @@ git - the stupid content tracker
 
 SYNOPSIS
 --------
-'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ARGS]
+'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate]
+	[--bare] [--git-dir=GIT_DIR] [--help] COMMAND [ARGS]
 
 DESCRIPTION
 -----------
@@ -41,6 +42,15 @@ OPTIONS
 	environment variable. If no path is given 'git' will print
 	the current setting and then exit.
 
+-p|--paginate::
+	Pipe all output into 'less' (or if set, $PAGER).
+
+--git-dir=<path>::
+	Set the path to the repository. This can also be controlled by
+	setting the GIT_DIR environment variable.
+
+--bare::
+	Same as --git-path=`pwd`.
 
 FURTHER DOCUMENTATION
 ---------------------
diff --git a/builtin-help.c b/builtin-help.c
index 335fe5f..bc1b4da 100644
--- a/builtin-help.c
+++ b/builtin-help.c
@@ -229,7 +229,7 @@ int cmd_version(int argc, const char **a
 
 int cmd_help(int argc, const char **argv, char **envp)
 {
-	const char *help_cmd = argv[1];
+	const char *help_cmd = argc > 1 ? argv[1] : NULL;
 	if (!help_cmd)
 		cmd_usage(0, git_exec_path(), NULL);
 	else if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a"))
diff --git a/git.c b/git.c
index 8d7c644..e4b2174 100644
--- a/git.c
+++ b/git.c
@@ -44,10 +44,44 @@ static int handle_options(const char*** 
 		if (cmd[0] != '-')
 			break;
 
-		if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
+		/*
+		 * For legacy reasons, the "version" and "help"
+		 * commands can be written with "--" prepended
+		 * to make them look like flags.
+		 */
+		if (!strcmp(cmd, "--help") || !strcmp(cmd, "--version"))
+			break;
+
+		/*
+		 * Check remaining flags (which by now must be
+		 * "--exec-path", but maybe we will accept
+		 * other arguments some day)
+		 */
+		if (!strncmp(cmd, "--exec-path", 11)) {
+			cmd += 11;
+			if (*cmd == '=')
+				git_set_exec_path(cmd + 1);
+			else {
+				puts(git_exec_path());
+				exit(0);
+			}
+		} else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
 			setup_pager();
-		} else
-			die ("Unknown option: %s", cmd);
+		} else if (!strcmp(cmd, "--git-dir")) {
+			if (*argc < 1)
+				return -1;
+			setenv("GIT_DIR", (*argv)[1], 1);
+			(*argv)++;
+			(*argc)--;
+		} else if (!strncmp(cmd, "--git-dir=", 10)) {
+			setenv("GIT_DIR", cmd + 10, 1);
+		} else if (!strcmp(cmd, "--bare")) {
+			static char git_dir[1024];
+			setenv("GIT_DIR", getcwd(git_dir, 1024), 1);
+		} else {
+			fprintf(stderr, "Unknown option: %s\n", cmd);
+			cmd_usage(0, NULL, NULL);
+		}
 
 		(*argv)++;
 		(*argc)--;
@@ -294,50 +328,19 @@ int main(int argc, const char **argv, ch
 		die("cannot handle %s internally", cmd);
 	}
 
-	/* Default command: "help" */
-	cmd = "help";
-
 	/* Look for flags.. */
-	while (argc > 1) {
-		argv++;
-		argc--;
-
-		handle_options(&argv, &argc);
-			
-		cmd = *argv;
-
-		if (strncmp(cmd, "--", 2))
-			break;
-
-		cmd += 2;
-
-		/*
-		 * For legacy reasons, the "version" and "help"
-		 * commands can be written with "--" prepended
-		 * to make them look like flags.
-		 */
-		if (!strcmp(cmd, "help"))
-			break;
-		if (!strcmp(cmd, "version"))
-			break;
-
-		/*
-		 * Check remaining flags (which by now must be
-		 * "--exec-path", but maybe we will accept
-		 * other arguments some day)
-		 */
-		if (!strncmp(cmd, "exec-path", 9)) {
-			cmd += 9;
-			if (*cmd == '=') {
-				git_set_exec_path(cmd + 1);
-				continue;
-			}
-			puts(git_exec_path());
-			exit(0);
-		}
-		cmd_usage(0, NULL, NULL);
+	argv++;
+	argc--;
+	handle_options(&argv, &argc);
+	if (argc > 0) {
+		if (!strncmp(argv[0], "--", 2))
+			argv[0] += 2;
+	} else {
+		/* Default command: "help" */
+		argv[0] = "help";
+		argc = 1;
 	}
-	argv[0] = cmd;
+	cmd = argv[0];
 
 	/*
 	 * We search for git commands in the following order:
-- 
1.4.2.rc1.g8b0c5

```

## Junio C Hamano, 2006-07-25 21:01

Subject: Re: [PATCH] git wrapper: add --git-path=<path> and --bare options
Message-ID: <7v4px5e6ux.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7v4px5e6ux.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <Pine.LNX.4.63.0607252022370.29667@wbgn013.biozentrum.uni-wuerzburg.de>

```
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:

> With this, you can say
>
> 	git --bare repack -a -d
>
> inside a bare repository, and it will actually work. While at it,
> also move the --version, --help and --exec-path options to the
> handle_options() function.

Thanks.  Took a liberty cleaning up a few stuff, but will have
both alias-p and this patch in "next" shortly.

```

## Uwe Zeisberger, 2006-07-26 06:18

Subject: Re: [RFC/PATCH] git wrapper: add --git-path=<path> and --bare options
Message-ID: <20060726061825.GA3638@informatik.uni-freiburg.de>
URL: https://gitlist.dev/e/20060726061825.GA3638%40informatik.uni-freiburg.de
In-Reply-To: <Pine.LNX.4.63.0607251952000.29667@wbgn013.biozentrum.uni-wuerzburg.de>

```
Hi,

Johannes Schindelin wrote:
> > Since "--git-dir" makes more sense than "--git-path", I'd suggest just 
> > fixing the OPTIONS section ;)
> 
> Will do. Thanks.

When you're at it, you may want to change the Subject, too.

Oh, you already sent out a new patch with the old Subject :-)

Best regards
Uwe
-- 
Uwe Zeisberger

http://www.google.com/search?q=sin%28pi%2F2%29

```

## Junio C Hamano, 2006-07-26 07:12

Subject: Re: [RFC/PATCH] git wrapper: add --git-path=<path> and --bare options
Message-ID: <7vfygou9ff.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7vfygou9ff.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <20060726061825.GA3638@informatik.uni-freiburg.de>

```
Uwe Zeisberger <zeisberg@informatik.uni-freiburg.de> writes:

> Johannes Schindelin wrote:
>> > Since "--git-dir" makes more sense than "--git-path", I'd suggest just 
>> > fixing the OPTIONS section ;)
>> 
>> Will do. Thanks.
>
> When you're at it, you may want to change the Subject, too.
>
> Oh, you already sent out a new patch with the old Subject :-)

I've fixed things up to replace all --git-path with --git-dir, I
think.

```
