summaryrefslogtreecommitdiff
path: root/worktree.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2020-03-05 18:43:02 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-03-05 18:43:02 (GMT)
commit49e5043b09fffb0411e8bae19d60014e72a36fd0 (patch)
tree5d6afc8117d4bb235bfc36958e1375b0433a69c8 /worktree.c
parent2cbb0586697585995908c325a0c70aad37602274 (diff)
parentbb69b3b009c0093417942dba136b81fbf614c4ed (diff)
downloadgit-49e5043b09fffb0411e8bae19d60014e72a36fd0.zip
git-49e5043b09fffb0411e8bae19d60014e72a36fd0.tar.gz
git-49e5043b09fffb0411e8bae19d60014e72a36fd0.tar.bz2
Merge branch 'es/worktree-avoid-duplication-fix'
In rare cases "git worktree add <path>" could think that <path> was already a registered worktree even when it wasn't and refuse to add the new worktree. This has been corrected. * es/worktree-avoid-duplication-fix: worktree: don't allow "add" validation to be fooled by suffix matching worktree: add utility to find worktree by pathname worktree: improve find_worktree() documentation
Diffstat (limited to 'worktree.c')
-rw-r--r--worktree.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/worktree.c b/worktree.c
index 33c2655..52971f7 100644
--- a/worktree.c
+++ b/worktree.c
@@ -211,7 +211,6 @@ struct worktree *find_worktree(struct worktree **list,
const char *arg)
{
struct worktree *wt;
- char *path;
char *to_free = NULL;
if ((wt = find_worktree_by_suffix(list, arg)))
@@ -219,11 +218,17 @@ struct worktree *find_worktree(struct worktree **list,
if (prefix)
arg = to_free = prefix_filename(prefix, arg);
- path = real_pathdup(arg, 0);
- if (!path) {
- free(to_free);
+ wt = find_worktree_by_path(list, arg);
+ free(to_free);
+ return wt;
+}
+
+struct worktree *find_worktree_by_path(struct worktree **list, const char *p)
+{
+ char *path = real_pathdup(p, 0);
+
+ if (!path)
return NULL;
- }
for (; *list; list++) {
const char *wt_path = real_path_if_valid((*list)->path);
@@ -231,7 +236,6 @@ struct worktree *find_worktree(struct worktree **list,
break;
}
free(path);
- free(to_free);
return *list;
}