On Tue, Dec 04, 2007 at 02:52:15PM -0800, Linus Torvalds wrote: > IOW, that whole thing is simply a bug waiting to happen. The fact that it > apparently *always* runs whether needed or not just seems to make it worse > (ie if we already know our cwd, and the absolute path we have already has > that as a prefix, just strip it off, don't try to do anything complex, and > leave the complex and fragile cases for the odd-ball when the simple > approach doesn't work) Fair enough. Something like this then? It gets called only as a last-ditch (though I think the 'return path' should simply be a die -- what is the point of getting a pathspec that isn't in the repo?). --- diff --git a/setup.c b/setup.c index 4ee8024..fbb956e 100644 --- a/setup.c +++ b/setup.c @@ -5,13 +5,17 @@ static int inside_git_dir = -1; static int inside_work_tree = -1; static -const char *strip_work_tree_path(const char *prefix, int len, const char *path) +const char *strip_work_tree_path(const char *prefix, int len, const char *path, + int canonicalized) { const char *work_tree = get_git_work_tree(); int n = strlen(work_tree); if (strncmp(path, work_tree, n)) - return path; + return canonicalized ? + path : + strip_work_tree_path(prefix, len, + xstrdup(make_absolute_path(path)), 1); if (!prefix && !path[n]) return path + n; @@ -58,7 +62,7 @@ const char *prefix_path(const char *prefix, int len, const char *path) { const char *orig = path; if (is_absolute_path(path)) - path = strip_work_tree_path(prefix, len, path); + path = strip_work_tree_path(prefix, len, path, 0); for (;;) { char c; - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html