[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