From: Nguyễn Thái Ngọc Duy Date: Mon, 30 May 2016 10:49:35 GMT Subject: [PATCH v3 2/6] worktree.c: find_worktree() learns to identify worktrees by basename Message-ID: <20160530104939.28407-3-pclouds@gmail.com> In-Reply-To: <20160530104939.28407-1-pclouds@gmail.com> This allows the user to do something like "worktree lock foo" instead of "worktree lock ". With completion support it could be quite convenient. While this base name search can be done in the same worktree iteration loop, the code is split into a separate function for clarity. Suggested-by: Eric Sunshine Signed-off-by: Nguyễn Thái Ngọc Duy --- worktree.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/worktree.c b/worktree.c index 0782e00..4dd7b77 100644 --- a/worktree.c +++ b/worktree.c @@ -214,12 +214,33 @@ const char *get_worktree_git_dir(const struct worktree *wt) return git_common_path("worktrees/%s", wt->id); } +static struct worktree *find_worktree_by_basename(struct worktree **list, + const char *base_name) +{ + struct worktree *found = NULL; + int nr_found = 0; + + for (; *list && nr_found < 2; list++) { + char *path = xstrdup((*list)->path); + if (!fspathcmp(base_name, basename(path))) { + found = *list; + nr_found++; + } + free(path); + } + return nr_found == 1 ? found : NULL; +} + struct worktree *find_worktree(struct worktree **list, const char *prefix, const char *arg) { + struct worktree *wt; char *path; + if ((wt = find_worktree_by_basename(list, arg))) + return wt; + arg = prefix_filename(prefix, strlen(prefix), arg); path = xstrdup(real_path(arg)); for (; *list; list++) -- 2.8.2.524.g6ff3d78