From git Sun Aug 17 20:43:09 2008 From: Johannes Sixt Date: Sun, 17 Aug 2008 20:43:09 +0000 To: git Subject: Re: [PATCH 2/7] system_path(): Add prefix computation at runtime if RUNTIME_PREFIX set Message-Id: <200808172243.09129.johannes.sixt () telecom ! at> X-MARC-Message: https://marc.info/?l=git&m=121900580222117 On Sonntag, 17. August 2008, Steffen Prohaska wrote: > 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. > 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)? > + 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)? > } > + > + if (!prefix) { > + fprintf(stderr, "RUNTIME_PREFIX requested for path '%s', " > + "but prefix computation failed.\n", path); Again a logic error? > + return path; > + } > + > + struct strbuf d = STRBUF_INIT; > + strbuf_addf(&d, "%s/%s", prefix, path); > + path = strbuf_detach(&d, NULL); > +#endif > return path; > } -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html