git_path(): keep "info/sparse-checkout" per work-tree

Currently git_path("info/sparse-checkout") resolves to $GIT_COMMON_DIR/info/sparse-checkout in multiple worktree mode. It makes more sense for the sparse checkout patterns to be per worktree, so you can have multiple checkouts with different parts of the tree. With this, "git checkout --to <new>" on a sparse checkout will create <new> as a full checkout. Which is expected, it's how a new checkout is made. The user can reshape the worktree afterwards. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Nguyễn Thái Ngọc Duy committed Nov 30, 2014 at 15:24 UTC 6cfbdcb2ab70b238fca9b3811f5b58368fd077c6
2 files changed +3 -1
path.c
+2 -1
@@ -103,7 +103,8 @@ static void update_common_dir(struct strbuf *buf, int git_dir_len)
103 char *base = buf->buf + git_dir_len;
104 const char **p;
105
106 - if (is_dir_file(base, "logs", "HEAD"))
106 + if (is_dir_file(base, "logs", "HEAD") ||
107 + is_dir_file(base, "info", "sparse-checkout"))
108 return; /* keep this in $GIT_DIR */
109 for (p = common_list; *p; p++) {
110 const char *path = *p;
t/t0060-path-utils.sh
+1
@@ -270,6 +270,7 @@ test_git_path GIT_COMMON_DIR=bar objects bar/objects
270 test_git_path GIT_COMMON_DIR=bar objects/bar bar/objects/bar
271 test_git_path GIT_COMMON_DIR=bar info/exclude bar/info/exclude
272 test_git_path GIT_COMMON_DIR=bar info/grafts bar/info/grafts
273 +test_git_path GIT_COMMON_DIR=bar info/sparse-checkout .git/info/sparse-checkout
274 test_git_path GIT_COMMON_DIR=bar remotes/bar bar/remotes/bar
275 test_git_path GIT_COMMON_DIR=bar branches/bar bar/branches/bar
276 test_git_path GIT_COMMON_DIR=bar logs/refs/heads/master bar/logs/refs/heads/master