From: Junio C Hamano Date: Wed, 20 Jan 2010 22:38:34 +0000 (-0800) Subject: Merge branch 'bk/fix-relative-gitdir-file' X-Git-Tag: v1.7.0-rc0~75 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/bd0d1916de221425fc22b69940ff71b0ce6aad9c?ds=inline;hp=-c Merge branch 'bk/fix-relative-gitdir-file' * bk/fix-relative-gitdir-file: Handle relative paths in submodule .git files Test update-index for a gitlink to a .git file --- bd0d1916de221425fc22b69940ff71b0ce6aad9c diff --combined setup.c index 3a07aa4df7,7fc4251713..710e2f3008 --- a/setup.c +++ b/setup.c @@@ -77,18 -77,6 +77,18 @@@ int check_filename(const char *prefix, die_errno("failed to stat '%s'", arg); } +static void NORETURN die_verify_filename(const char *prefix, const char *arg) +{ + unsigned char sha1[20]; + unsigned mode; + /* try a detailed diagnostic ... */ + get_sha1_with_mode_1(arg, sha1, &mode, 0, prefix); + /* ... or fall back the most general message. */ + die("ambiguous argument '%s': unknown revision or path not in the working tree.\n" + "Use '--' to separate paths from revisions", arg); + +} + /* * Verify a filename that we got as an argument for a pathspec * entry. Note that a filename that begins with "-" never verifies @@@ -102,7 -90,8 +102,7 @@@ void verify_filename(const char *prefix die("bad flag '%s' used after filename", arg); if (check_filename(prefix, arg)) return; - die("ambiguous argument '%s': unknown revision or path not in the working tree.\n" - "Use '--' to separate paths from revisions", arg); + die_verify_filename(prefix, arg); } /* @@@ -263,6 -252,8 +263,8 @@@ static int check_repository_format_gent const char *read_gitfile_gently(const char *path) { char *buf; + char *dir; + const char *slash; struct stat st; int fd; size_t len; @@@ -287,9 -278,23 +289,23 @@@ if (len < 9) die("No path in gitfile: %s", path); buf[len] = '\0'; - if (!is_git_directory(buf + 8)) - die("Not a git repository: %s", buf + 8); - path = make_absolute_path(buf + 8); + dir = buf + 8; + + if (!is_absolute_path(dir) && (slash = strrchr(path, '/'))) { + size_t pathlen = slash+1 - path; + size_t dirlen = pathlen + len - 8; + dir = xmalloc(dirlen + 1); + strncpy(dir, path, pathlen); + strncpy(dir + pathlen, buf + 8, len - 8); + dir[dirlen] = '\0'; + free(buf); + buf = dir; + } + + if (!is_git_directory(dir)) + die("Not a git repository: %s", dir); + path = make_absolute_path(dir); + free(buf); return path; }