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

[PATCH 06/11] worktree.c: add validate_worktree()

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Feb 2, 2017, 08:50 UTC
Message-ID
<20170202085007.21418-7-pclouds@gmail.com>
In-Reply-To
<20170202085007.21418-1-pclouds@gmail.com>

This function is later used by "worktree move" and "worktree remove" to ensure that we have a good connection between the repository and the worktree. For example, if a worktree is moved manually, the worktree location recorded in $GIT_DIR/worktrees/.../gitdir is incorrect and we should not move that one.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 worktree.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 worktree.h |  5 +++++
 2 files changed, 68 insertions(+)
diff --git a/worktree.c b/worktree.c
index eb6121263b..929072ad89 100644
--- a/worktree.c
+++ b/worktree.c
@@ -291,6 +291,69 @@ const char *is_worktree_locked(struct worktree *wt)
 	return wt->lock_reason;
 }
 
+static int report(int quiet, const char *fmt, ...)
+{
+	va_list params;
+
+	if (quiet)
+		return -1;
+
+	va_start(params, fmt);
+	vfprintf(stderr, fmt, params);
+	fputc('\n', stderr);
+	va_end(params);
+	return -1;
+}
+
+int validate_worktree(const struct worktree *wt, int quiet)
+{
+	struct strbuf sb = STRBUF_INIT;
+	const char *path;
+	int err;
+
+	if (is_main_worktree(wt)) {
+		/*
+		 * Main worktree using .git file to point to the
+		 * repository would make it impossible to know where
+		 * the actual worktree is if this function is executed
+		 * from another worktree. No .git file support for now.
+		 */
+		strbuf_addf(&sb, "%s/.git", wt->path);
+		if (!is_directory(sb.buf)) {
+			strbuf_release(&sb);
+			return report(quiet, _("'%s/.git' at main worktree is not the repository directory"),
+				      wt->path);
+		}
+		return 0;
+	}
+
+	/*
+	 * Make sure "gitdir" file points to a real .git file and that
+	 * file points back here.
+	 */
+	if (!is_absolute_path(wt->path))
+		return report(quiet, _("'%s' file does not contain absolute path to the worktree location"),
+			      git_common_path("worktrees/%s/gitdir", wt->id));
+
+	strbuf_addf(&sb, "%s/.git", wt->path);
+	if (!file_exists(sb.buf)) {
+		strbuf_release(&sb);
+		return report(quiet, _("'%s/.git' does not exist"), wt->path);
+	}
+
+	path = read_gitfile_gently(sb.buf, &err);
+	strbuf_release(&sb);
+	if (!path)
+		return report(quiet, _("'%s/.git' is not a .git file, error code %d"),
+			      wt->path, err);
+
+	if (fspathcmp(path, real_path(git_common_path("worktrees/%s", wt->id))))
+		return report(quiet, _("'%s' does not point back to"),
+			      wt->path, git_common_path("worktrees/%s", wt->id));
+
+	return 0;
+}
+
 int is_worktree_being_rebased(const struct worktree *wt,
 			      const char *target)
 {
diff --git a/worktree.h b/worktree.h
index d59ce1fee8..4433db2eb3 100644
--- a/worktree.h
+++ b/worktree.h
@@ -53,6 +53,11 @@ extern int is_main_worktree(const struct worktree *wt);
 extern const char *is_worktree_locked(struct worktree *wt);
 
 /*
+ * Return zero if the worktree is in good condition.
+ */
+extern int validate_worktree(const struct worktree *wt, int quiet);
+
+/*
  * Free up the memory for worktree(s)
  */
 extern void free_worktrees(struct worktree **);
-- 
2.11.0.157.gd943d85
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 7 of 25 in “nd/worktree-move update”
  1. 00/11 nd/worktree-move updateNguyễn Thái Ngọc Duy, Feb 2, 2017
  2. 01/11 worktree.c: zero new 'struct worktree' on allocationNguyễn Thái Ngọc Duy, Feb 2, 2017
  3. 02/11 worktree: reorder an if statementNguyễn Thái Ngọc Duy, Feb 2, 2017
  4. 03/11 get_worktrees() must return main worktree as first item even on errorNguyễn Thái Ngọc Duy, Feb 2, 2017
  5. 05/11 worktree list: keep the list sortedNguyễn Thái Ngọc Duy, Feb 2, 2017
  6. 04/11 worktree.c: get_worktrees() takes a new flag argumentNguyễn Thái Ngọc Duy, Feb 2, 2017
  7. 06/11 worktree.c: add validate_worktree()Nguyễn Thái Ngọc Duy, Feb 2, 2017
  8. 08/11 worktree move: new commandNguyễn Thái Ngọc Duy, Feb 2, 2017
  9. 07/11 worktree.c: add update_worktree_location()Nguyễn Thái Ngọc Duy, Feb 2, 2017
  10. 09/11 worktree move: accept destination as directoryNguyễn Thái Ngọc Duy, Feb 2, 2017
  11. 11/11 worktree remove: new commandNguyễn Thái Ngọc Duy, Feb 2, 2017
  12. 10/11 worktree move: refuse to move worktrees with submodulesNguyễn Thái Ngọc Duy, Feb 2, 2017
  13. Johannes SchindelinFeb 2, 2017
  14. Duy NguyenFeb 2, 2017
  15. Johannes SchindelinFeb 2, 2017
  16. Duy NguyenFeb 2, 2017
  17. Johannes SchindelinFeb 2, 2017
  18. Duy NguyenFeb 2, 2017
  19. Johannes SchindelinFeb 2, 2017
  20. Johannes SchindelinFeb 2, 2017
  21. Junio C HamanoFeb 2, 2017
  22. Duy NguyenFeb 3, 2017
  23. Junio C HamanoFeb 3, 2017
  24. Junio C HamanoFeb 3, 2017
  25. Duy NguyenFeb 4, 2017

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.