# [PATCH] Extend runtime prefix computation

11 messages from 2012-11-27 to 2013-10-04. Participants: Michael Weiser, Erik Faye-Lund, Junio C Hamano.
Thread: https://gitlist.dev/t/32210

## Michael Weiser, 2012-11-27 16:30

Subject: [PATCH] Extend runtime prefix computation
Message-ID: <20121127163004.GC7499@science-computing.de>
URL: https://gitlist.dev/e/20121127163004.GC7499%40science-computing.de

```
Support determining the binaries' installation path at runtime even if
called without any path components (i.e. via search path). Implement
fallback to compiled-in prefix if determination fails or is impossible.

Signed-off-by: Michael Weiser <weiser@science-computing.de>
---
- Has two very minor memory leaks - function is called only once per
  program execution. Do we care? Alternative: Use static buffer instead.

 exec_cmd.c |   68 ++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 53 insertions(+), 15 deletions(-)

diff --git a/exec_cmd.c b/exec_cmd.c
index 125fa6f..d50d7f8 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -4,28 +4,22 @@
 #define MAX_ARGS	32
 
 static const char *argv_exec_path;
-static const char *argv0_path;
+static const char *argv0_path = NULL;
 
 const char *system_path(const char *path)
 {
-#ifdef RUNTIME_PREFIX
-	static const char *prefix;
-#else
 	static const char *prefix = PREFIX;
-#endif
 	struct strbuf d = STRBUF_INIT;
 
 	if (is_absolute_path(path))
 		return path;
 
 #ifdef RUNTIME_PREFIX
-	assert(argv0_path);
-	assert(is_absolute_path(argv0_path));
-
-	if (!prefix &&
-	    !(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
-	    !(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
-	    !(prefix = strip_path_suffix(argv0_path, "git"))) {
+	if (!argv0_path ||
+	    !is_absolute_path(argv0_path) ||
+	    (!(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
+	     !(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
+	     !(prefix = strip_path_suffix(argv0_path, "git")))) {
 		prefix = PREFIX;
 		trace_printf("RUNTIME_PREFIX requested, "
 				"but prefix computation failed.  "
@@ -41,20 +35,64 @@ const char *system_path(const char *path)
 const char *git_extract_argv0_path(const char *argv0)
 {
 	const char *slash;
+	char *abs_argv0 = NULL;
 
 	if (!argv0 || !*argv0)
 		return NULL;
 	slash = argv0 + strlen(argv0);
 
+	/* walk to the first slash from the end */
 	while (argv0 <= slash && !is_dir_sep(*slash))
 		slash--;
 
+	/* if there was a slash ... */
 	if (slash >= argv0) {
-		argv0_path = xstrndup(argv0, slash - argv0);
-		return slash + 1;
+		/* ... it's either an absolute path */
+		if (is_absolute_path(argv0)) {
+			/* FIXME: memory leak here */
+			argv0_path = xstrndup(argv0, slash - argv0);
+			return slash + 1;
+		}
+
+		/* ... or a relative path, in which case we have to make it
+		 * absolute first and do the whole thing again */
+		abs_argv0 = xstrdup(real_path(argv0));
+	} else {
+		/* argv0 is no path at all, just a name. Resolve it into a
+		 * path. Unfortunately, this gets system specific. */
+#if defined(__linux__)
+		struct stat st;
+		if (!stat("/proc/self/exe", &st)) {
+			abs_argv0 = xstrdup(real_path("/proc/self/exe"));
+		}
+#elif defined(__APPLE__)
+		/* Mac OS X has realpath, which incidentally allocates its own
+		 * memory, which in turn is why we do all the xstrdup's in the
+		 * other cases. */
+		abs_argv0 = realpath(argv0, NULL);
+#endif
+
+		/* if abs_argv0 is still NULL here, something failed above or
+		 * we are on an unsupported system. system_path() will warn
+		 * and fall back to the static prefix */
+		if (!abs_argv0) {
+			argv0_path = NULL;
+			return argv0;
+		}
 	}
 
-	return argv0;
+	/* abs_argv0 is an absolute path now for which memory was allocated
+	 * with malloc */
+
+	slash = abs_argv0 + strlen(abs_argv0);
+	while (abs_argv0 <= slash && !is_dir_sep(*slash))
+		slash--;
+
+	/* FIXME: memory leaks here */
+	argv0_path = xstrndup(abs_argv0, slash - abs_argv0);
+	slash = xstrdup(slash + 1);
+	free(abs_argv0);
+	return slash;
 }
 
 void git_set_argv_exec_path(const char *exec_path)
-- 
1.7.3.4
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196

```

## Erik Faye-Lund, 2012-11-30 10:20

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <CABPQNSYhscHdnTFLye=oif_R84kpdaVsrCK+-174v7Ugrae_yQ@mail.gmail.com>
URL: https://gitlist.dev/e/CABPQNSYhscHdnTFLye%3Doif_R84kpdaVsrCK%2B-174v7Ugrae_yQ%40mail.gmail.com
In-Reply-To: <20121127163004.GC7499@science-computing.de>

```
On Tue, Nov 27, 2012 at 5:30 PM, Michael Weiser
<M.Weiser@science-computing.de> wrote:
> Support determining the binaries' installation path at runtime even if
> called without any path components (i.e. via search path). Implement
> fallback to compiled-in prefix if determination fails or is impossible.
>
> Signed-off-by: Michael Weiser <weiser@science-computing.de>
> ---
> - Has two very minor memory leaks - function is called only once per
>   program execution. Do we care? Alternative: Use static buffer instead.
>
>  exec_cmd.c |   68 ++++++++++++++++++++++++++++++++++++++++++++++-------------
>  1 files changed, 53 insertions(+), 15 deletions(-)
>
> diff --git a/exec_cmd.c b/exec_cmd.c
> index 125fa6f..d50d7f8 100644
> --- a/exec_cmd.c
> +++ b/exec_cmd.c
> @@ -4,28 +4,22 @@
>  #define MAX_ARGS       32
>
>  static const char *argv_exec_path;
> -static const char *argv0_path;
> +static const char *argv0_path = NULL;
>
>  const char *system_path(const char *path)
>  {
> -#ifdef RUNTIME_PREFIX
> -       static const char *prefix;
> -#else
>         static const char *prefix = PREFIX;
> -#endif
>         struct strbuf d = STRBUF_INIT;
>
>         if (is_absolute_path(path))
>                 return path;
>
>  #ifdef RUNTIME_PREFIX
> -       assert(argv0_path);
> -       assert(is_absolute_path(argv0_path));
> -
> -       if (!prefix &&
> -           !(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
> -           !(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
> -           !(prefix = strip_path_suffix(argv0_path, "git"))) {
> +       if (!argv0_path ||
> +           !is_absolute_path(argv0_path) ||
> +           (!(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
> +            !(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
> +            !(prefix = strip_path_suffix(argv0_path, "git")))) {
>                 prefix = PREFIX;
>                 trace_printf("RUNTIME_PREFIX requested, "
>                                 "but prefix computation failed.  "
> @@ -41,20 +35,64 @@ const char *system_path(const char *path)
>  const char *git_extract_argv0_path(const char *argv0)
>  {
>         const char *slash;
> +       char *abs_argv0 = NULL;
>
>         if (!argv0 || !*argv0)
>                 return NULL;
>         slash = argv0 + strlen(argv0);
>
> +       /* walk to the first slash from the end */
>         while (argv0 <= slash && !is_dir_sep(*slash))
>                 slash--;
>
> +       /* if there was a slash ... */
>         if (slash >= argv0) {
> -               argv0_path = xstrndup(argv0, slash - argv0);
> -               return slash + 1;
> +               /* ... it's either an absolute path */
> +               if (is_absolute_path(argv0)) {
> +                       /* FIXME: memory leak here */
> +                       argv0_path = xstrndup(argv0, slash - argv0);
> +                       return slash + 1;
> +               }
> +
> +               /* ... or a relative path, in which case we have to make it
> +                * absolute first and do the whole thing again */
> +               abs_argv0 = xstrdup(real_path(argv0));
> +       } else {
> +               /* argv0 is no path at all, just a name. Resolve it into a
> +                * path. Unfortunately, this gets system specific. */
> +#if defined(__linux__)
> +               struct stat st;
> +               if (!stat("/proc/self/exe", &st)) {
> +                       abs_argv0 = xstrdup(real_path("/proc/self/exe"));
> +               }
> +#elif defined(__APPLE__)
> +               /* Mac OS X has realpath, which incidentally allocates its own
> +                * memory, which in turn is why we do all the xstrdup's in the
> +                * other cases. */
> +               abs_argv0 = realpath(argv0, NULL);
> +#endif

...perhaps a "GetModuleFileName(NULL, ...)" for Windows is in place here?

```

## Michael Weiser, 2012-11-30 10:45

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <20121130104532.GC2640@science-computing.de>
URL: https://gitlist.dev/e/20121130104532.GC2640%40science-computing.de
In-Reply-To: <CABPQNSYhscHdnTFLye=oif_R84kpdaVsrCK+-174v7Ugrae_yQ@mail.gmail.com>

```
Hello Erik,

On Fri, Nov 30, 2012 at 11:20:52AM +0100, Erik Faye-Lund wrote:

> > +#if defined(__linux__)
> > +               struct stat st;
> > +               if (!stat("/proc/self/exe", &st)) {
> > +                       abs_argv0 = xstrdup(real_path("/proc/self/exe"));
> > +               }
> > +#elif defined(__APPLE__)
> > +               /* Mac OS X has realpath, which incidentally allocates its own
> > +                * memory, which in turn is why we do all the xstrdup's in the
> > +                * other cases. */
> > +               abs_argv0 = realpath(argv0, NULL);
> > +#endif
> ...perhaps a "GetModuleFileName(NULL, ...)" for Windows is in place here?

Agreed. However, I do not use git on Windows and don't have a Windows
devel toolchain in place. So I guess this should be added in a separate
patch by someone actually in need of it and in a position to develop and
test it?

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196

```

## Michael Weiser, 2013-03-05 11:58

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <20130305115837.GD21473@science-computing.de>
URL: https://gitlist.dev/e/20130305115837.GD21473%40science-computing.de
In-Reply-To: <20121127163004.GC7499@science-computing.de>

```
Hello,

On Tue, Nov 27, 2012 at 05:30:04PM +0100, Michael Weiser wrote:

> Support determining the binaries' installation path at runtime even if
> called without any path components (i.e. via search path). Implement
> fallback to compiled-in prefix if determination fails or is impossible.

I see this hasn't made it into git, yet. Is there any reason? What can
I do to get it included?

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196

```

## Junio C Hamano, 2013-03-05 16:13

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <7vd2vdvn7l.fsf@alter.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vd2vdvn7l.fsf%40alter.siamese.dyndns.org
In-Reply-To: <20130305115837.GD21473@science-computing.de>

```
Michael Weiser <M.Weiser@science-computing.de> writes:

> On Tue, Nov 27, 2012 at 05:30:04PM +0100, Michael Weiser wrote:
>
>> Support determining the binaries' installation path at runtime even if
>> called without any path components (i.e. via search path). Implement
>> fallback to compiled-in prefix if determination fails or is impossible.
>
> I see this hasn't made it into git, yet. Is there any reason?

Most likely nobody was interested.

The default for any change is not to include it.  Is there any
reason why we want this change?

```

## Michael Weiser, 2013-03-06 08:19

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <20130306081942.GA11151@science-computing.de>
URL: https://gitlist.dev/e/20130306081942.GA11151%40science-computing.de
In-Reply-To: <7vd2vdvn7l.fsf@alter.siamese.dyndns.org>

```
Hello Junio,

On Tue, Mar 05, 2013 at 08:13:50AM -0800, Junio C Hamano wrote:

> >> Support determining the binaries' installation path at runtime even if
> >> called without any path components (i.e. via search path).

> The default for any change is not to include it.  Is there any
> reason why we want this change?

It makes a binary git installation fully relocatable. Seeing how git
already has basic support for it I thought other people might be
interested in this.

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196

```

## Michael Weiser, 2013-04-16 14:56

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <20130416145653.GG12782@science-computing.de>
URL: https://gitlist.dev/e/20130416145653.GG12782%40science-computing.de
In-Reply-To: <20130306081942.GA11151@science-computing.de>

```
Hello Junio,
Hello list,

On Wed, Mar 06, 2013 at 09:19:42AM +0100, Michael Weiser wrote:

> > >> Support determining the binaries' installation path at runtime even if
> > >> called without any path components (i.e. via search path).
> > The default for any change is not to include it.  Is there any
> > reason why we want this change?
> It makes a binary git installation fully relocatable. Seeing how git
> already has basic support for it I thought other people might be
> interested in this.

I am still interested in getting this accepted into git. Where do I push
to get it committed?

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196

```

## Erik Faye-Lund, 2013-04-16 15:18

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <CABPQNSbd_baEe7pstZPSdNQQCAUMBCgV2FGcszy-8zoeuD+M5w@mail.gmail.com>
URL: https://gitlist.dev/e/CABPQNSbd_baEe7pstZPSdNQQCAUMBCgV2FGcszy-8zoeuD%2BM5w%40mail.gmail.com
In-Reply-To: <20130306081942.GA11151@science-computing.de>

```
On Wed, Mar 6, 2013 at 9:19 AM, Michael Weiser
<M.Weiser@science-computing.de> wrote:
> Hello Junio,
>
> On Tue, Mar 05, 2013 at 08:13:50AM -0800, Junio C Hamano wrote:
>
>> >> Support determining the binaries' installation path at runtime even if
>> >> called without any path components (i.e. via search path).
>
>> The default for any change is not to include it.  Is there any
>> reason why we want this change?
>
> It makes a binary git installation fully relocatable. Seeing how git
> already has basic support for it I thought other people might be
> interested in this.

I think the motivation for the feature in the first place is Windows,
where the installation path isn't known at build-time. In the
unix-world, this is generally known (/usr/bin or something like that).
What's the reason you want it on other platforms?

```

## Junio C Hamano, 2013-04-16 18:23

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <7vvc7ml4he.fsf@alter.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vvc7ml4he.fsf%40alter.siamese.dyndns.org
In-Reply-To: <20130416145653.GG12782@science-computing.de>

```
nobody writes:

> Hello Junio,
> Hello list,
>
> On Wed, Mar 06, 2013 at 09:19:42AM +0100, Michael Weiser wrote:
>
>> > >> Support determining the binaries' installation path at runtime even if
>> > >> called without any path components (i.e. via search path).
>> > The default for any change is not to include it.  Is there any
>> > reason why we want this change?
>> It makes a binary git installation fully relocatable. Seeing how git
>> already has basic support for it I thought other people might be
>> interested in this.
>
> I am still interested in getting this accepted into git. Where do I push
> to get it committed?

I do not have a strong objection to what it tries to achieve, but
I'd prefer to see no "#ifdef platform" code in a very generic part
of the system like exec_cmd.

```

## Michael Weiser, 2013-04-17 06:06

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <20130417060647.GA66718@science-computing.de>
URL: https://gitlist.dev/e/20130417060647.GA66718%40science-computing.de
In-Reply-To: <CABPQNSbd_baEe7pstZPSdNQQCAUMBCgV2FGcszy-8zoeuD+M5w@mail.gmail.com>

```
Hello Erik,

On Tue, Apr 16, 2013 at 05:18:49PM +0200, Erik Faye-Lund wrote:

> >> >> Support determining the binaries' installation path at runtime even if
> >> >> called without any path components (i.e. via search path).
> I think the motivation for the feature in the first place is Windows,
> where the installation path isn't known at build-time. In the
> unix-world, this is generally known (/usr/bin or something like that).
> What's the reason you want it on other platforms?

It's part of an in-house development toolchain featuring git that I want
to hand to users as a binary installation for a number of platforms but
give them the choice where to install it.

Secondly, once the infrastructure is in place, it's easier to do or
enhance relocatability support for other platforms such as Windows.

Finally: Others do it. Perl's done it and I've already needed that as
well - on Mac OS X.

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196

```

## Michael Weiser, 2013-10-04 13:32

Subject: Re: [PATCH] Extend runtime prefix computation
Message-ID: <20131004133217.GA85032@science-computing.de>
URL: https://gitlist.dev/e/20131004133217.GA85032%40science-computing.de
In-Reply-To: <20130417060647.GA66718@science-computing.de>

```
Hi,

On Wed, Apr 17, 2013 at 08:06:47AM +0200, Michael Weiser wrote:

> > >> >> Support determining the binaries' installation path at runtime even if
> > >> >> called without any path components (i.e. via search path).

> > What's the reason you want it on other platforms?

> It's part of an in-house development toolchain featuring git that I want
> to hand to users as a binary installation for a number of platforms but
> give them the choice where to install it.

I'd still like to have this included in mainline git. What can I do to
get it there?

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196

```
