Re: [PATCH 2/7] system_path(): Add prefix computation at runtime if RUNTIME_PREFIX set
- From
Johannes Sixt <johannes.sixt@telecom.at>
- Date
- Aug 17, 2008, 20:43 UTC
- Message-ID
- <200808172243.09129.johannes.sixt@telecom.at>
- In-Reply-To
- <1218977083-14526-3-git-send-email-prohaska@zib.de>
On Sonntag, 17. August 2008, Steffen Prohaska wrote:
Show 5 quoted lines
> This commit modifies system_path() to compute the prefix at runtime > if explicitly requested to do so. If RUNTIME_PREFIX is defined, > system_path() tries to strip known directories that executables can > be located in from the path of the executable. If the path is > successfully stripped it is used as the prefix.
An example would be helpful. From your description it is difficult to understand what is stripped from where.
Show 18 quoted lines
> diff --git a/exec_cmd.c b/exec_cmd.c
> index ce6741e..1622481 100644
> --- a/exec_cmd.c
> +++ b/exec_cmd.c
> @@ -9,11 +9,51 @@ static const char *argv0_path;
>
> const char *system_path(const char *path)
> {
> - if (!is_absolute_path(path) && argv0_path) {
> - struct strbuf d = STRBUF_INIT;
> - strbuf_addf(&d, "%s/%s", argv0_path, path);
> - path = strbuf_detach(&d, NULL);
> +#ifdef RUNTIME_PREFIX
> + static const char *prefix;
> +
> + if (!argv0_path) {
> + fprintf(stderr, "RUNTIME_PREFIX requested for path '%s', "
> + "but argv0_path not set.\n", path);If this happens, isn't this a logic error: assert(argv0_path)?
Show 27 quoted lines
> + return path;
> + }
> +
> + if (!prefix) {
> + const char *strip[] = {
> + GIT_EXEC_PATH,
> + BINDIR,
> + 0
> + };
> + const char **s;
> +
> + for (s = strip; *s; s++) {
> + const char *sargv = argv0_path + strlen(argv0_path);
> + const char *ss = *s + strlen(*s);
> + while (argv0_path < sargv && *s < ss
> + && (*sargv == *ss ||
> + (is_dir_sep(*sargv) && is_dir_sep(*ss)))) {
> + sargv--;
> + ss--;
> + }
> + if (*s == ss) {
> + struct strbuf d = STRBUF_INIT;
> + strbuf_add(&d, argv0_path, sargv - argv0_path);
> + prefix = strbuf_detach(&d, NULL);
> + break;
> + }
> + }Doesn't this do a thing very similar to longest_ancestor_length() (which still does not work for Windows paths, yet)?
Show 5 quoted lines
> }
> +
> + if (!prefix) {
> + fprintf(stderr, "RUNTIME_PREFIX requested for path '%s', "
> + "but prefix computation failed.\n", path);Again a logic error?
Show 9 quoted lines
> + return path; > + } > + > + struct strbuf d = STRBUF_INIT; > + strbuf_addf(&d, "%s/%s", prefix, path); > + path = strbuf_detach(&d, NULL); > +#endif > return path; > }