diff options
author | Eric Sunshine <sunshine@sunshineco.com> | 2020-02-24 09:08:47 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-02-24 21:04:30 (GMT) |
commit | bb4995fc3fab35b56f1ca48cda9187bcf340e643 (patch) | |
tree | c160a434298ff0fa78f16bb745b3b7ade472d066 | |
parent | a80c4c22147bae6d9f9b907b81ab3f4d129ab690 (diff) | |
download | git-bb4995fc3fab35b56f1ca48cda9187bcf340e643.zip git-bb4995fc3fab35b56f1ca48cda9187bcf340e643.tar.gz git-bb4995fc3fab35b56f1ca48cda9187bcf340e643.tar.bz2 |
worktree: add utility to find worktree by pathname
find_worktree() employs heuristics to match user provided input -- which
may be a pathname or some sort of shorthand -- with an actual worktree.
Although this convenience allows a user to identify a worktree with
minimal typing, the black-box nature of these heuristics makes it
potentially difficult for callers which already know the exact path of a
worktree to be confident that the correct worktree will be returned for
any specific pathname (particularly a relative one), especially as the
heuristics are enhanced and updated.
Therefore, add a companion function, find_worktree_by_path(), which
deterministically identifies a worktree strictly by pathname with no
interpretation and no magic matching.
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | worktree.c | 16 | ||||
-rw-r--r-- | worktree.h | 6 |
2 files changed, 16 insertions, 6 deletions
@@ -215,7 +215,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))) @@ -223,11 +222,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); @@ -235,7 +240,6 @@ struct worktree *find_worktree(struct worktree **list, break; } free(path); - free(to_free); return *list; } @@ -62,6 +62,12 @@ struct worktree *find_worktree(struct worktree **list, const char *arg); /* + * Return the worktree corresponding to `path`, or NULL if no such worktree + * exists. + */ +struct worktree *find_worktree_by_path(struct worktree **, const char *path); + +/* * Return true if the given worktree is the main one. */ int is_main_worktree(const struct worktree *wt); |