git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 4/5] Support working directory located at root

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Feb 11, 2010, 14:43 UTC
Message-ID
<1265899403-15904-5-git-send-email-pclouds@gmail.com>
In-Reply-To
<1265899403-15904-1-git-send-email-pclouds@gmail.com>

Git should work regardless where the working directory is located, even at root. This patch fixes two places where it assumes working directory always have parent directory.

In setup_git_directory_gently(), when Git goes up to root and finds .git there, it happily sets worktree to "" instead of "/".

In prefix_path(), loosen the outside repo check a little bit. Usually when a path XXX is inside worktree /foo, it must be either "/foo", or "/foo/...". When worktree is simply "/", we can safely ignore the check: we have a slash at the beginning already.

Not related to worktree, but also set gitdir correctly if a bare repo is placed (insanely?) at root.

Thanks João Carlos Mendes Luís for pointing out this problem.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 setup.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/setup.c b/setup.c
index b38cbee..cdad176 100644
--- a/setup.c
+++ b/setup.c
@@ -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 = is_root_path(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 = is_root_path(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 = is_root_path(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)
-- 
1.7.0.rc2.182.g3adef
Previous: Johannes SixtNext: Nguyễn Thái Ngọc Duy
Message 6 of 10 in “Worktree/Gitdir at root directory”
  1. 0/5 Worktree/Gitdir at root directoryNguyễn Thái Ngọc Duy, Feb 11, 2010
  2. 1/5 make_absolute_path(): Do not append redundant slashNguyễn Thái Ngọc Duy, Feb 11, 2010
  3. 2/5 init-db, rev-parse --git-dir: do not append redundant slashNguyễn Thái Ngọc Duy, Feb 11, 2010
  4. 3/5 Add is_root_path()Nguyễn Thái Ngọc Duy, Feb 11, 2010
  5. Johannes SixtFeb 12, 2010
  6. 4/5 Support working directory located at rootNguyễn Thái Ngọc Duy, Feb 11, 2010
  7. 5/5 Add test for using Git at root directoryNguyễn Thái Ngọc Duy, Feb 11, 2010
  8. Johannes SixtFeb 12, 2010
  9. João Carlos Mendes LuísFeb 12, 2010
  10. Johannes SixtFeb 12, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.