diff options
author | Junio C Hamano <gitster@pobox.com> | 2020-03-05 21:43:02 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-03-05 21:43:02 +0300 |
commit | 49e5043b09fffb0411e8bae19d60014e72a36fd0 (patch) | |
tree | 5d6afc8117d4bb235bfc36958e1375b0433a69c8 /worktree.c | |
parent | 2cbb0586697585995908c325a0c70aad37602274 (diff) | |
parent | bb69b3b009c0093417942dba136b81fbf614c4ed (diff) |
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.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/worktree.c b/worktree.c index 33c2655534..52971f7082 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; } |