diff options
author | Junio C Hamano <gitster@pobox.com> | 2010-03-07 12:47:15 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-03-07 12:47:15 -0800 |
commit | c2b456b8956c2091318edaee362119e0e96b86b7 (patch) | |
tree | dc2fa7fbcc84a8638248cfaaa4b10538efcf5857 /setup.c | |
parent | 000d2c07ef65b19bd9cf30ef44a3018b8f110b2c (diff) | |
parent | 3719b2fe554adc2f7a34a16b90f6894f299aab3c (diff) | |
download | git-c2b456b8956c2091318edaee362119e0e96b86b7.tar.gz git-c2b456b8956c2091318edaee362119e0e96b86b7.tar.xz |
Merge branch 'nd/root-git'
* nd/root-git:
Add test for using Git at root of file system
Support working directory located at root
Move offset_1st_component() to path.c
init-db, rev-parse --git-dir: do not append redundant slash
make_absolute_path(): Do not append redundant slash
Conflicts:
setup.c
sha1_file.c
Diffstat (limited to 'setup.c')
-rw-r--r-- | setup.c | 13 |
1 files changed, 8 insertions, 5 deletions
@@ -18,14 +18,15 @@ const char *prefix_path(const char *prefix, int len, const char *path) if (normalize_path_copy(sanitized, sanitized)) goto error_out; if (is_absolute_path(orig)) { - size_t len, total; + size_t root_len, len, total; const char *work_tree = get_git_work_tree(); if (!work_tree) goto error_out; len = strlen(work_tree); + root_len = offset_1st_component(work_tree); total = strlen(sanitized) + 1; if (strncmp(sanitized, work_tree, len) || - (sanitized[len] != '\0' && sanitized[len] != '/')) { + (len > root_len && sanitized[len] != '\0' && sanitized[len] != '/')) { error_out: die("'%s' is outside repository", orig); } @@ -321,7 +322,7 @@ const char *setup_git_directory_gently(int *nongit_ok) static char cwd[PATH_MAX+1]; const char *gitdirenv; const char *gitfile_dir; - int len, offset, ceil_offset; + int len, offset, ceil_offset, root_len; /* * Let's assume that we are in a git repository. @@ -403,7 +404,8 @@ const char *setup_git_directory_gently(int *nongit_ok) if (!work_tree_env) inside_work_tree = 0; if (offset != len) { - cwd[offset] = '\0'; + root_len = offset_1st_component(cwd); + cwd[offset > root_len ? offset : root_len] = '\0'; set_git_dir(cwd); } else set_git_dir("."); @@ -427,7 +429,8 @@ const char *setup_git_directory_gently(int *nongit_ok) inside_git_dir = 0; if (!work_tree_env) inside_work_tree = 1; - git_work_tree_cfg = xstrndup(cwd, offset); + root_len = offset_1st_component(cwd); + git_work_tree_cfg = xstrndup(cwd, offset > root_len ? offset : root_len); if (check_repository_format_gently(nongit_ok)) return NULL; if (offset == len) |