Re: [PATCH] setup: translate symlinks in filename when using absolute paths
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Dec 28, 2010, 19:47 UTC
- Message-ID
- <7vr5d1wuh0.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <1293447277-30598-1-git-send-email-carenas@sajinet.com.pe>
Carlo Marcelo Arenas Belon <carenas@sajinet.com.pe> writes:
> otherwise, comparison to validate against work tree will fail when > the path includes a symlink and the name passed is not canonical. > > Signed-off-by: Carlo Marcelo Arenas Belon <carenas@sajinet.com.pe>
I take that "path" and "name passed" refer to the same thing (i.e. "path" parameter) in the above.
I think you are trying to handle the case where:
- you give "/home/carenas/one" from the command line; - $PWD is "/home/carenas"; and - "/home/carenas" is a symlink to "/net/host/home/carenas"
and the scan-from-the-beginning-of-string check done between "/home/carenas/one" and the return value of get_git_work_tree() which presumably is "/net/host/home/carenas" disagrees. I wonder if a more correct solution might be to help get_git_work_tree() to match the notion of where the repository and its worktree are to the idea of where the user thinks they are, i.e. not "/net/host/home/carenas" but "/home/carenas", a bit better?
That would involve tweaking make_absolute_path() I guess?
Note that your patch is the right thing to do either case, i.e. with or without such a change to make_absolute_path(), as the function is used to set up the return value from get_git_work_tree(). Anything we compare with it should have passed make_absolute_path() at least once.
Nguyễn?
Show 28 quoted lines
> ---
> setup.c | 11 +++++++----
> 1 files changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/setup.c b/setup.c
> index 91887a4..e7c0d4d 100644
> --- a/setup.c
> +++ b/setup.c
> @@ -7,10 +7,13 @@ static int inside_work_tree = -1;
> char *prefix_path(const char *prefix, int len, const char *path)
> {
> const char *orig = path;
> - char *sanitized = xmalloc(len + strlen(path) + 1);
> - if (is_absolute_path(orig))
> - strcpy(sanitized, path);
> - else {
> + char *sanitized;
> + if (is_absolute_path(orig)) {
> + const char *temp = make_absolute_path(path);
> + sanitized = xmalloc(len + strlen(temp) + 1);
> + strcpy(sanitized, temp);
> + } else {
> + sanitized = xmalloc(len + strlen(path) + 1);
> if (len)
> memcpy(sanitized, prefix, len);
> strcpy(sanitized + len, path);
> --
> 1.7.3.4.626.g73e7b.dirty