summaryrefslogtreecommitdiff
path: root/worktree.c
diff options
context:
space:
mode:
authorEric Sunshine <sunshine@sunshineco.com>2020-06-24 19:05:41 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-06-25 00:39:28 (GMT)
commit5f4ee57ad9513f96db8d936816f5ce916b4eddcd (patch)
treee40486e62a04adeb1028f0f5b1b593729aed5297 /worktree.c
parentaf6b65d45ef179ed52087e80cb089f6b2349f4ec (diff)
downloadgit-5f4ee57ad9513f96db8d936816f5ce916b4eddcd.zip
git-5f4ee57ad9513f96db8d936816f5ce916b4eddcd.tar.gz
git-5f4ee57ad9513f96db8d936816f5ce916b4eddcd.tar.bz2
worktree: avoid dead-code in conditional
get_worktrees() retrieves a list of all worktrees associated with a repository, including the main worktree. The location of the main worktree is determined by get_main_worktree() which needs to handle three distinct cases for the main worktree after absolute-path conversion: * <bare-repository>/. * <main-worktree>/.git/. (when $CWD is .git) * <main-worktree>/.git (when $CWD is any worktree) They all need to be normalized to just the <path> portion, dropping any "/." or "/.git" suffix. It turns out, however, that get_main_worktree() was only handling the first and last cases, i.e.: if (!strip_suffix(path, "/.git")) strip_suffix(path, "/."); This shortcoming was addressed by 45f274fbb1 (get_main_worktree(): allow it to be called in the Git directory, 2020-02-23) by changing the logic to: strip_suffix(path, "/."); if (!strip_suffix(path, "/.git")) strip_suffix(path, "/."); which makes the final strip_suffix() invocation dead-code. Fix this oversight by enumerating the three distinct cases explicitly rather than attempting to strip the suffix(es) incrementally. Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'worktree.c')
-rw-r--r--worktree.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/worktree.c b/worktree.c
index eba4fd3..8d77336 100644
--- a/worktree.c
+++ b/worktree.c
@@ -50,9 +50,9 @@ static struct worktree *get_main_worktree(void)
struct strbuf worktree_path = STRBUF_INIT;
strbuf_add_absolute_path(&worktree_path, get_git_common_dir());
- strbuf_strip_suffix(&worktree_path, "/.");
- if (!strbuf_strip_suffix(&worktree_path, "/.git"))
- strbuf_strip_suffix(&worktree_path, "/.");
+ 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 */
worktree = xcalloc(1, sizeof(*worktree));
worktree->path = strbuf_detach(&worktree_path, NULL);