threads / patch / 18037

patchadded -C option to chdir() into another directory first

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

## tl;dr

5 messages between Feb 26, 2009 and Feb 27, 2009. Diffs are folded; open one to read it.

replies: 4people: 3as markdown or json

kevin brintnall· Feb 26, 2009, 20:11 UTC · lore

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(-)
Show changes to git.c +11 −1
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
Junio C Hamano· Feb 26, 2009, 20:35 UTC · re: kevin brintnall · lore

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

kevin brintnall <kbrint@rufus.net> writes:
> This allows things like 'git -C /somewhere pull' without specifying both
> --work-tree and --git-dir.
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?

kevin brintnall· Feb 26, 2009, 20:44 UTC · re: Junio C Hamano · lore

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

On Thu, Feb 26, 2009 at 12:35:57PM -0800, Junio C Hamano wrote:
Show 6 quoted lines
> kevin brintnall <kbrint@rufus.net> writes:
> 
> > This allows things like 'git -C /somewhere pull' without specifying both
> > --work-tree and --git-dir.
> 
> Where should "git -C sub/dir apply this.patch" find the file "this.patch"?

Good question.. It should probably come from the original $PWD. Maybe we should have "-C $DIR" simulate "--work-tree=$DIR --git=dir=$DIR/.git" ?

> 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?
I envisioned these two as equivalent:
	git -C $DIR something
	cd $DIR ; git something
-- 
 kevin brintnall =~ /kbrint@rufus.net/
Junio C Hamano· Feb 26, 2009, 21:50 UTC · re: kevin brintnall · lore

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

kevin brintnall <kbrint@rufus.net> writes:
Show 18 quoted lines
> On Thu, Feb 26, 2009 at 12:35:57PM -0800, Junio C Hamano wrote:
>> kevin brintnall <kbrint@rufus.net> writes:
>> 
>> > This allows things like 'git -C /somewhere pull' without specifying both
>> > --work-tree and --git-dir.
>> 
>> Where should "git -C sub/dir apply this.patch" find the file "this.patch"?
>
> Good question..  It should probably come from the original $PWD.  Maybe we
> should have "-C $DIR" simulate "--work-tree=$DIR --git=dir=$DIR/.git" ?
>
>> 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?
>
> I envisioned these two as equivalent:
>
> 	git -C $DIR something
> 	cd $DIR ; git something

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?
Michael J Gruber· Feb 27, 2009, 14:21 UTC · re: kevin brintnall · lore

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

kevin brintnall venit, vidit, dixit 26.02.2009 21:11:
> This allows things like 'git -C /somewhere pull' without specifying both
> --work-tree and --git-dir.
> 

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

← back to recent threads