[prev in list] [next in list] [prev in thread] [next in thread]
List: git
Subject: Re: [PATCH 2/7] system_path(): Add prefix computation at runtime if RUNTIME_PREFIX set
From: Johannes Sixt <johannes.sixt () telecom ! at>
Date: 2008-08-17 20:43:09
Message-ID: 200808172243.09129.johannes.sixt () telecom ! at
[Download RAW message or body]
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
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic