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

[PATCH 4/4] worktree: retire special-case normalization of main worktree path

From
Eric Sunshine <sunshine@sunshineco.com>
Date
Jul 31, 2020, 23:32 UTC
Message-ID
<20200731233214.22131-5-sunshine@sunshineco.com>
In-Reply-To
<20200731233214.22131-1-sunshine@sunshineco.com>

In order for "git-worktree list" to present consistent results, get_main_worktree() performs manual normalization on the repository path (returned by get_common_dir()) after passing it through strbuf_add_absolute_path(). In particular, it cleans up the path for three distinct cases when the current working directory is (1) the main worktree, (2) the .git/ subdirectory, or (3) a bare repository.

The need for such special-cases is a direct consequence of employing strbuf_add_absolute_path() which, for the sake of efficiency, doesn't bother normalizing the path (such as folding out redundant path components) after making it absolute. Lack of normalization is not typically a problem since redundant path elements make no difference when working with paths at the filesystem level. However, when preparing paths for presentation, possible redundant path components make it difficult to ensure consistency.

Eliminate the need for these special cases by instead making the path absolute via strbuf_add_real_path() which normalizes the path for us. Once normalized, the only case we need to handle manually is converting it to the path of the main worktree by stripping the "/.git" suffix. This stripping of the "/.git" suffix is a regular idiom in worktree-related code; for instance, it is employed by get_linked_worktree(), as well.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
Notes:
    This is a followup to 5f4ee57ad9 (worktree: avoid dead-code in
    conditional, 2020-06-24) which dropped dead code from the manual
    normalization done by get_main_worktree() but which did not
    eliminate the special cases.
    
    It's also a direct response to Junio's observation[1] that it would
    be better if we didn't have to handle these special cases in the
    first place.
    
    [1]: https://lore.kernel.org/git/xmqqbll8569x.fsf@gitster.c.googlers.com/
 worktree.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/worktree.c b/worktree.c
index 355824bf87..62217b4a6b 100644
--- a/worktree.c
+++ b/worktree.c
@@ -49,10 +49,8 @@ static struct worktree *get_main_worktree(void)
 	struct worktree *worktree = NULL;
 	struct strbuf worktree_path = STRBUF_INIT;
 
-	strbuf_add_absolute_path(&worktree_path, get_git_common_dir());
-	if (!strbuf_strip_suffix(&worktree_path, "/.git/.") && /* in .git */
-	    !strbuf_strip_suffix(&worktree_path, "/.git")) /* in worktree */
-		strbuf_strip_suffix(&worktree_path, "/."); /* in bare repo */
+	strbuf_add_real_path(&worktree_path, get_git_common_dir());
+	strbuf_strip_suffix(&worktree_path, "/.git");
 
 	worktree = xcalloc(1, sizeof(*worktree));
 	worktree->path = strbuf_detach(&worktree_path, NULL);
-- 
2.28.0.203.gce1f2e0ef1
Previous: Eric SunshineNext: Eric Sunshine
Message 4 of 5 in “worktree: cleanups & simplification”
  1. 0/4 worktree: cleanups & simplificationEric Sunshine, Jul 31, 2020
  2. 3/4 worktree: drop bogus and unnecessary path mungingEric Sunshine, Jul 31, 2020
  3. 2/4 worktree: drop unused code from get_linked_worktree()Eric Sunshine, Jul 31, 2020
  4. 4/4 worktree: retire special-case normalization of main worktree pathEric Sunshine, Jul 31, 2020
  5. 1/4 worktree: drop pointless strbuf_release()Eric Sunshine, Jul 31, 2020

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.