Add a test case for deep symlinking into a repo, which breaks with the old relative output of --show-cdup. Signed-off-by: Steven Grimm <koreth@xxxxxxxxxxxxx> --- I have a symlink pointing to a subdirectory of a repo of mine. If I cd to that symlink, some shell-script git commands don't work. Shell scripts use the PWD environment variable as the working directory, and the chain of "../"s from git-rev-parse --show-cdup just peels entries off that variable. That's fine when PWD is a real path, but not so great when it's a reference to a symlink from an outside directory. A typical failure case: $ git clone git://whatever.git foobar $ ln -s foobar/src/tools/misc/myapp myapp $ cd myapp $ git pull fatal: Not a git repository This patch adds a test for the problem (fails in the current git build) and a proposed fix: making git-rev-parse --show-cdup output an absolute path. It's possible that'll break something somewhere, but all the tests in the test suite pass, so I think the breakage can't be *too* severe if there's any at all. builtin-rev-parse.c | 18 +++++++++--------- t/t6102-rev-parse-cdup.sh | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) create mode 100755 t/t6102-rev-parse-cdup.sh diff --git a/builtin-rev-parse.c b/builtin-rev-parse.c index 37addb2..99a95eb 100644 --- a/builtin-rev-parse.c +++ b/builtin-rev-parse.c @@ -320,15 +320,15 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) continue; } if (!strcmp(arg, "--show-cdup")) { - const char *pfx = prefix; - while (pfx) { - pfx = strchr(pfx, '/'); - if (pfx) { - pfx++; - printf("../"); - } - } - putchar('\n'); + char cwd[PATH_MAX]; + /* + * The prefix computation does chdir("..") until it + * reaches the top level, so the current directory + * is actually the thing we want to output. + */ + if (!getcwd(cwd, PATH_MAX)) + die("unable to get current working directory"); + printf("%s/\n", cwd); continue; } if (!strcmp(arg, "--git-dir")) { diff --git a/t/t6102-rev-parse-cdup.sh b/t/t6102-rev-parse-cdup.sh new file mode 100755 index 0000000..233d9cf --- /dev/null +++ b/t/t6102-rev-parse-cdup.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Copyright (c) 2007 Steven Grimm +# + +test_description='Test git-rev-parse --show-cdup' + +. ./test-lib.sh +. ../t6000lib.sh # t6xxx specific functions + +# Make a subdirectory and a symbolic link pointing to it from outside the repo. +mkdir subdir +ln -s `pwd`/subdir /tmp/git-test.$$ +cd /tmp/git-test.$$ + +test_expect_success 'shell pwd references symlink' "pwd | grep git-test.$$" +test_expect_success 'cdup goes to top level of repo' ' + cd `git-rev-parse --show-cdup` && + test -d .git' + +rm /tmp/git-test.$$ + +test_done + -- 1.5.2.rc0.1.g2cc31 - 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