зеркало из https://github.com/microsoft/git.git
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:
Родитель
a80c4c2214
Коммит
bb4995fc3f
14
worktree.c
14
worktree.c
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
Загрузка…
Ссылка в новой задаче