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

[PATCHv8 4/6] worktree: check if a submodule uses worktrees

From
Stefan Beller <sbeller@google.com>
Date
Dec 12, 2016, 19:04 UTC
Message-ID
<20161212190435.10358-5-sbeller@google.com>
In-Reply-To
<20161212190435.10358-1-sbeller@google.com>

In a later patch we want to move around the the git directory of a submodule. Both submodules as well as worktrees are involved in placing git directories at unusual places, so their functionality may collide. To react appropriately to situations where worktrees in submodules are in use, offer a new function to query the a submodule if it uses the worktree feature.

An earlier approach:
  "Implement submodule_get_worktrees and just count them", however:
  This can be done cheaply (both in new code to write as well as run time)
  by obtaining the list of worktrees based off that submodules git
  directory. However as we have loaded the variables for the current
  repository, the values in the submodule worktree
  can be wrong, e.g.
  * core.ignorecase may differ between these two repositories
  * the ref resolution is broken (refs/heads/branch in the submodule
    resolves to the sha1 value of the `branch` in the current repository
    that may not exist or have another sha1)

The implementation here is just checking for any files in $GIT_COMMON_DIR/worktrees for the submodule, which ought to be sufficient if the submodule is using the current repository format, which we also check.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 worktree.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 worktree.h |  5 +++++
 2 files changed, 55 insertions(+)
diff --git a/worktree.c b/worktree.c
index eb6121263b..d4606aa8cd 100644
--- a/worktree.c
+++ b/worktree.c
@@ -380,3 +380,53 @@ const struct worktree *find_shared_symref(const char *symref,
 
 	return existing;
 }
+
+int submodule_uses_worktrees(const char *path)
+{
+	char *submodule_gitdir;
+	struct strbuf sb = STRBUF_INIT;
+	DIR *dir;
+	struct dirent *d;
+	int ret;
+	struct repository_format format;
+
+	submodule_gitdir = git_pathdup_submodule(path, "%s", "");
+	if (!submodule_gitdir)
+		return 0;
+
+	/* The env would be set for the superproject. */
+	get_common_dir_noenv(&sb, submodule_gitdir);
+
+	/*
+	 * The check below is only known to be good for repository format
+	 * version 0 at the time of writing this code.
+	 */
+	strbuf_addstr(&sb, "/config");
+	read_repository_format(&format, sb.buf);
+	if (format.version != 0) {
+		strbuf_release(&sb);
+		return 1;
+	}
+
+	/* Replace config by worktrees. */
+	strbuf_setlen(&sb, sb.len - strlen("config"));
+	strbuf_addstr(&sb, "worktrees");
+
+	/* See if there is any file inside the worktrees directory. */
+	dir = opendir(sb.buf);
+	strbuf_release(&sb);
+	free(submodule_gitdir);
+
+	if (!dir)
+		return 0;
+
+	while ((d = readdir(dir)) != NULL) {
+		if (is_dot_or_dotdot(d->d_name))
+			continue;
+
+		ret = 1;
+		break;
+	}
+	closedir(dir);
+	return ret;
+}
diff --git a/worktree.h b/worktree.h
index d59ce1fee8..6bfb985203 100644
--- a/worktree.h
+++ b/worktree.h
@@ -27,6 +27,11 @@ struct worktree {
  */
 extern struct worktree **get_worktrees(unsigned flags);
 
+/*
+ * Returns 1 if linked worktrees exist, 0 otherwise.
+ */
+extern int submodule_uses_worktrees(const char *path);
+
 /*
  * Return git dir of the worktree. Note that the path may be relative.
  * If wt is NULL, git dir of current worktree is returned.
-- 
2.11.0.rc2.49.ge1f3b0c.dirty
Previous: Stefan BellerNext: Stefan Beller
Message 4 of 12 in “[PATCHv7 0/6] submodule absorbgitdirs”
  1. Stefan BellerDec 12, 2016
  2. 1/6 submodule: use absolute path for computing relative path connectingStefan Beller, Dec 12, 2016
  3. 2/6 submodule helper: support super prefixStefan Beller, Dec 12, 2016
  4. 4/6 worktree: check if a submodule uses worktreesStefan Beller, Dec 12, 2016
  5. 5/6 move connect_work_tree_and_git_dir to dir.hStefan Beller, Dec 12, 2016
  6. 3/6 test-lib-functions.sh: teach test_commit -C <dir>Stefan Beller, Dec 12, 2016
  7. 6/6 submodule: add absorb-git-dir functionStefan Beller, Dec 12, 2016
  8. Duy NguyenDec 19, 2016
  9. Stefan BellerDec 19, 2016
  10. Duy NguyenDec 20, 2016
  11. Brandon WilliamsDec 12, 2016
  12. Stefan BellerDec 12, 2016

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.