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>
This commit is contained in:
Eric Sunshine 2020-02-24 04:08:47 -05:00 коммит произвёл Junio C Hamano
Родитель a80c4c2214
Коммит bb4995fc3f
2 изменённых файлов: 16 добавлений и 6 удалений

Просмотреть файл

@ -215,7 +215,6 @@ struct worktree *find_worktree(struct worktree **list,
const char *arg) const char *arg)
{ {
struct worktree *wt; struct worktree *wt;
char *path;
char *to_free = NULL; char *to_free = NULL;
if ((wt = find_worktree_by_suffix(list, arg))) if ((wt = find_worktree_by_suffix(list, arg)))
@ -223,11 +222,17 @@ struct worktree *find_worktree(struct worktree **list,
if (prefix) if (prefix)
arg = to_free = prefix_filename(prefix, arg); arg = to_free = prefix_filename(prefix, arg);
path = real_pathdup(arg, 0); wt = find_worktree_by_path(list, arg);
if (!path) { free(to_free);
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; return NULL;
}
for (; *list; list++) { for (; *list; list++) {
const char *wt_path = real_path_if_valid((*list)->path); const char *wt_path = real_path_if_valid((*list)->path);
@ -235,7 +240,6 @@ struct worktree *find_worktree(struct worktree **list,
break; break;
} }
free(path); free(path);
free(to_free);
return *list; return *list;
} }

Просмотреть файл

@ -61,6 +61,12 @@ struct worktree *find_worktree(struct worktree **list,
const char *prefix, const char *prefix,
const char *arg); 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. * Return true if the given worktree is the main one.
*/ */