threads / patch / 2925

patchadd strcpy_user_path() and use it in init-db.c and git.c

Subject: [PATCH] add strcpy_user_path() and use it in init-db.c and git.c

## tl;dr

7 messages between Dec 24, 2005 and Dec 30, 2005. Diffs are folded; open one to read it.

replies: 6people: 3as markdown or json

Eric Wong· Dec 24, 2005, 12:20 UTC · lore

strcpy_user_path(dest,src) acts just like strcpy() except tildes in src are expanded appropriately to point to a user's home directory.

The following expansions are supported:
~user/path	reads home directory from getpwnam()
~/path	 	reads home directory from $HOME env,
		or getpwuid() if $HOME is not set

This patch makes it easier for an ordinary user to share compiled binaries across different machines, especially if they have different account names and home directories on those machines.

Hint: build git with: make 'prefix=~'
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
 cache.h   |    1 +
 git.c     |    6 ++++++
 init-db.c |    3 ++-
 path.c    |   41 +++++++++++++++++++++++++++++++++++++++++
 4 files changed, 50 insertions(+), 1 deletions(-)
c46a17b746572e6d16aa026de50d7911eddf8664
Show changes to 4 files +50 −1

cache.h, git.c, init-db.c, path.c

diff --git a/cache.h b/cache.h
index c5ff4b7..041bf94 100644
--- a/cache.h
+++ b/cache.h
@@ -184,6 +184,7 @@ extern const unsigned char null_sha1[20]
 
 int git_mkstemp(char *path, size_t n, const char *template);
 
+char * strcpy_user_path(char *dest, const char *path);
 int safe_create_leading_directories(char *path);
 char *safe_strncpy(char *, const char *, size_t);
 char *enter_repo(char *path, int strict);
diff --git a/git.c b/git.c
index 434a3d9..15f4c69 100644
--- a/git.c
+++ b/git.c
@@ -12,6 +12,8 @@
 #include <termios.h>
 #include "git-compat-util.h"
 
+extern char * strcpy_user_path(char *dest, const char *path);
+
 #ifndef PATH_MAX
 # define PATH_MAX 4096
 #endif
@@ -234,6 +236,7 @@ int main(int argc, char **argv, char **e
 {
 	char git_command[PATH_MAX + 1];
 	char wd[PATH_MAX + 1];
+	char tmp[PATH_MAX + 1];
 	int i, len, show_help = 0;
 	char *exec_path = getenv("GIT_EXEC_PATH");
 
@@ -269,6 +272,9 @@ int main(int argc, char **argv, char **e
 			cmd_usage(NULL, NULL);
 	}
 
+	strcpy_user_path(tmp, exec_path);
+	exec_path = tmp;
+
 	if (i >= argc || show_help) {
 		if (i >= argc)
 			cmd_usage(exec_path, NULL);
diff --git a/init-db.c b/init-db.c
index ead37b5..468c93a 100644
--- a/init-db.c
+++ b/init-db.c
@@ -119,7 +119,8 @@ static void copy_templates(const char *g
 
 	if (!template_dir)
 		template_dir = DEFAULT_GIT_TEMPLATE_DIR;
-	strcpy(template_path, template_dir);
+	strcpy_user_path(template_path, template_dir);
+	
 	template_len = strlen(template_path);
 	if (template_path[template_len-1] != '/') {
 		template_path[template_len++] = '/';
diff --git a/path.c b/path.c
index 334b2bd..3caa188 100644
--- a/path.c
+++ b/path.c
@@ -131,6 +131,47 @@ int validate_symref(const char *path)
 	return -1;
 }
 
+char * strcpy_user_path(char *dest, const char *path)
+{
+	if (path[0] == '~') {
+		struct passwd *pw;
+
+		if (path[1] == '/' || path[1] == '\0') {
+			char *home;
+			
+			if (!(home = getenv("HOME"))) {
+				pw = getpwuid(getuid());
+				if (pw && pw->pw_dir)
+					home = pw->pw_dir;
+			}
+				
+			strcpy(dest, home);
+			
+			if (path[1] == '/')
+				strcat(dest, path + 1);
+		} else {
+			char *slash;
+			
+			if ((slash = strchr(path,'/'))) {
+				memcpy(pathname, path + 1, slash - path - 1);
+				pathname[slash - path] = '\0';
+				pw = getpwnam(pathname);
+			} else
+				pw = getpwnam(path + 1);
+
+			if (pw && pw->pw_dir) {
+				strcpy(dest, pw->pw_dir);
+				if (slash)
+					strcat(dest,slash);
+			} else
+				strcpy(dest, path);
+		}
+	} else
+		strcpy(dest, path);
+
+	return dest;
+}
+
 static char *user_path(char *buf, char *path, int sz)
 {
 	struct passwd *pw;
-- 
1.0.GIT
Junio C Hamano· Dec 24, 2005, 18:08 UTC · re: Eric Wong · lore

Re: [PATCH] add strcpy_user_path() and use it in init-db.c and git.c

Eric Wong <normalperson@yhbt.net> writes:
> Hint: build git with: make 'prefix=~'

Sorry, I do not see why you would want to do this. I understand "make prefix=~" or "make prefix=$HOME", but "make prefix='~'" and expanding tilde and friends at runtime you need to justify why it helps in which situation.

We are not DOS and do not do argument expansion shell should have done for us ourselves.

Eric Wong· Dec 24, 2005, 19:50 UTC · re: Junio C Hamano · lore

Re: [PATCH] add strcpy_user_path() and use it in init-db.c and git.c

Junio C Hamano <junkio@cox.net> wrote:
Show 11 quoted lines
> Eric Wong <normalperson@yhbt.net> writes:
> 
> > Hint: build git with: make 'prefix=~'
> 
> Sorry, I do not see why you would want to do this.  I understand
> "make prefix=~" or "make prefix=$HOME", but "make prefix='~'"
> and expanding tilde and friends at runtime you need to justify
> why it helps in which situation.
> 
> We are not DOS and do not do argument expansion shell should
> have done for us ourselves.

My home directories have different names on different machines I'm on, and I want to avoid having to recompile git for each one. I don't have root access to some of them, so installing globally in /usr or /usr/local isn't an option, either.

-- 
Eric Wong
Junio C Hamano· Dec 24, 2005, 21:07 UTC · re: Eric Wong · lore

Re: [PATCH] add strcpy_user_path() and use it in init-db.c and git.c

Eric Wong <normalperson@yhbt.net> writes:
> My home directories have different names on different machines I'm
> on, and I want to avoid having to recompile git for each one.
> I don't have root access to some of them, so installing globally in /usr
> or /usr/local isn't an option, either.

Then you probably need to use GIT_EXEC_PATH environment variable.

Eric Wong· Dec 24, 2005, 21:19 UTC · re: Junio C Hamano · lore

Re: [PATCH] add strcpy_user_path() and use it in init-db.c and git.c

Junio C Hamano <junkio@cox.net> wrote:
Show 9 quoted lines
> Eric Wong <normalperson@yhbt.net> writes:
> 
> > My home directories have different names on different machines I'm
> > on, and I want to avoid having to recompile git for each one.
> > I don't have root access to some of them, so installing globally in /usr
> > or /usr/local isn't an option, either.
> 
> Then you probably need to use GIT_EXEC_PATH environment
> variable.

That works with git.c but not init-db. But then again I don't use git-init-db that often. I'll just write a shell script wrapper for the latter if I do.

No need for this patch anymore :)
-- 
Eric Wong
Johannes Schindelin· Dec 26, 2005, 16:40 UTC · re: Eric Wong · lore

Re: [PATCH] add strcpy_user_path() and use it in init-db.c and git.c

Hi,
On Sat, 24 Dec 2005, Eric Wong wrote:
Show 14 quoted lines
> Junio C Hamano <junkio@cox.net> wrote:
> > Eric Wong <normalperson@yhbt.net> writes:
> > 
> > > My home directories have different names on different machines I'm
> > > on, and I want to avoid having to recompile git for each one.
> > > I don't have root access to some of them, so installing globally in /usr
> > > or /usr/local isn't an option, either.
> > 
> > Then you probably need to use GIT_EXEC_PATH environment
> > variable.
> 
> That works with git.c but not init-db.  But then again I don't use
> git-init-db that often.  I'll just write a shell script wrapper for the
> latter if I do.
How about something like this?

--- [PATCH] Introduce environment variable for the path to the templates

The environment variable GIT_TEMPLATE_PATH can override the compiled-in setting, and can be overridden with the '--template=' argument to init-db.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
	Eric said that GIT_EXEC_PATH is enough for most things, but not for
	init-db. I guess he wanted something like this.
 init-db.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
5d95ce750b09a14bcb86e07ba23077ab0825089c
Show changes to init-db.c +1 −1
diff --git a/init-db.c b/init-db.c
index 863ec1a..774a91f 100644
--- a/init-db.c
+++ b/init-db.c
@@ -238,7 +238,7 @@ int main(int argc, char **argv)
 {
 	const char *git_dir;
 	const char *sha1_dir;
-	char *path, *template_dir = NULL;
+	char *path, *template_dir = getenv("GIT_TEMPLATE_PATH");
 	int len, i;
 
 	for (i = 1; i < argc; i++, argv++) {
-- 
1.0.GIT
Eric Wong· Dec 30, 2005, 23:10 UTC · re: Johannes Schindelin · lore

Re: [PATCH] add strcpy_user_path() and use it in init-db.c and git.c

Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
Show 20 quoted lines
> Hi,
> 
> On Sat, 24 Dec 2005, Eric Wong wrote:
> 
> > Junio C Hamano <junkio@cox.net> wrote:
> > > Eric Wong <normalperson@yhbt.net> writes:
> > > 
> > > > My home directories have different names on different machines I'm
> > > > on, and I want to avoid having to recompile git for each one.
> > > > I don't have root access to some of them, so installing globally in /usr
> > > > or /usr/local isn't an option, either.
> > > 
> > > Then you probably need to use GIT_EXEC_PATH environment
> > > variable.
> > 
> > That works with git.c but not init-db.  But then again I don't use
> > git-init-db that often.  I'll just write a shell script wrapper for the
> > latter if I do.
> 
> How about something like this?

Sure, seems reasonable, but I don't feel that strongly towards making my env getting bigger and bigger all the time.

I've also been comtemplating just using my own wrapper instead of the default 'git' wrapper (which being in C, is more difficult to customize on-the-fly than sh or perl). Or have git read a config file from a user's home directory.

Show 30 quoted lines
> ---
> [PATCH] Introduce environment variable for the path to the templates
> 
> The environment variable GIT_TEMPLATE_PATH can override the compiled-in
> setting, and can be overridden with the '--template=' argument to init-db.
> 
> Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
> 
> ---
> 
> 	Eric said that GIT_EXEC_PATH is enough for most things, but not for
> 	init-db. I guess he wanted something like this.
> 
>  init-db.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> 5d95ce750b09a14bcb86e07ba23077ab0825089c
> diff --git a/init-db.c b/init-db.c
> index 863ec1a..774a91f 100644
> --- a/init-db.c
> +++ b/init-db.c
> @@ -238,7 +238,7 @@ int main(int argc, char **argv)
>  {
>  	const char *git_dir;
>  	const char *sha1_dir;
> -	char *path, *template_dir = NULL;
> +	char *path, *template_dir = getenv("GIT_TEMPLATE_PATH");
>  	int len, i;
>  
>  	for (i = 1; i < argc; i++, argv++) {
-- 
Eric Wong

← back to recent threads