worktree.c: find_worktree() search by path suffix
[gitweb.git] / worktree.c
index 2bcfff3850203dbb283ff40455f0c97694fff7e5..2107c0625daa892299c7b2695a9c9b9acef16e4b 100644 (file)
@@ -219,12 +219,41 @@ const char *get_worktree_git_dir(const struct worktree *wt)
                return git_common_path("worktrees/%s", wt->id);
 }
 
+static struct worktree *find_worktree_by_suffix(struct worktree **list,
+                                               const char *suffix)
+{
+       struct worktree *found = NULL;
+       int nr_found = 0, suffixlen;
+
+       suffixlen = strlen(suffix);
+       if (!suffixlen)
+               return NULL;
+
+       for (; *list && nr_found < 2; list++) {
+               const char      *path    = (*list)->path;
+               int              pathlen = strlen(path);
+               int              start   = pathlen - suffixlen;
+
+               /* suffix must start at directory boundary */
+               if ((!start || (start > 0 && is_dir_sep(path[start - 1]))) &&
+                   !fspathcmp(suffix, path + start)) {
+                       found = *list;
+                       nr_found++;
+               }
+       }
+       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_suffix(list, arg)))
+               return wt;
+
        arg = prefix_filename(prefix, strlen(prefix), arg);
        path = xstrdup(real_path(arg));
        for (; *list; list++)