Re: [PATCH] added -C option to chdir() into another directory first

Previous thread: Git on MSys broken by Nico -telmich- Schottelius on Thursday, February 26, 2009 - 12:56 pm. (3 messages)

Next thread: help with reflog by John Dlugosz on Thursday, February 26, 2009 - 5:07 pm. (3 messages)
From: kevin brintnall
Date: Thursday, February 26, 2009 - 1:11 pm

This allows things like 'git -C /somewhere pull' without specifying both
--work-tree and --git-dir.

Signed-off-by: kevin brintnall <kbrint@rufus.net>
---
 git.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/git.c b/git.c
index c2b181e..b218bfe 100644
--- a/git.c
+++ b/git.c
@@ -5,7 +5,7 @@
 #include "run-command.h"
 
 const char git_usage_string[] =
-	"git [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]";
+	"git [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [-C BASE_DIR] [--help] COMMAND [ARGS]";
 
 const char git_more_info_string[] =
 	"See 'git help COMMAND' for more information on a specific command.";
@@ -116,6 +116,16 @@ static int handle_options(const char*** argv, int* argc, int* envchanged)
 			setenv(GIT_DIR_ENVIRONMENT, getcwd(git_dir, sizeof(git_dir)), 0);
 			if (envchanged)
 				*envchanged = 1;
+		} else if (!strcmp(cmd, "-C")) {
+			char *dir = (*argv)[1];
+			if (*argc < 2) {
+				fprintf(stderr, "No directory given for -C");
+				usage(git_usage_string);
+			}
+			if (chdir(dir))
+				die("Cannot change to %s: %s", dir, strerror(errno));
+			(*argv)++;
+			(*argc)--;
 		} else {
 			fprintf(stderr, "Unknown option: %s\n", cmd);
 			usage(git_usage_string);
-- 
1.6.1.3

--

From: Junio C Hamano
Date: Thursday, February 26, 2009 - 1:35 pm

Where should "git -C sub/dir apply this.patch" find the file "this.patch"?

More generally, when "git -C there cmd arg1 arg2 arg3..." is run, how
should the implementation of cmd learn what to prefix arg$N with?


--

From: kevin brintnall
Date: Thursday, February 26, 2009 - 1:44 pm

Good question..  It should probably come from the original $PWD.  Maybe we

I envisioned these two as equivalent:

	git -C $DIR something
	cd $DIR ; git something

-- 
 kevin brintnall =~ /kbrint@rufus.net/
--

From: Junio C Hamano
Date: Thursday, February 26, 2009 - 2:50 pm

If that is the case then I really do not see the point, other than "there
are _some_ tools like 'tar' that do it".

Sure, there are some tools that do many other things.  So what?
--

From: Michael J Gruber
Date: Friday, February 27, 2009 - 7:21 am

I'm afraid you hit a somewhat reoccurring issue here. chdir'ing looks
simple, but it has many side effects, such as on relative paths (as
Junio pointed out) but also on the order of parsing config. Having -C as
a global git option would require dealing with all of these effects.

On the other hand, a shell function can achieve the same very easily.
The side effects are left to be dealt with by the user then ;)

Michael
--

Previous thread: Git on MSys broken by Nico -telmich- Schottelius on Thursday, February 26, 2009 - 12:56 pm. (3 messages)

Next thread: help with reflog by John Dlugosz on Thursday, February 26, 2009 - 5:07 pm. (3 messages)