worktree: drop get_worktrees() special-purpose sorting option

Of all the clients of get_worktrees(), only "git worktree list" wants
the list sorted in a very specific way; other clients simply don't care
about the order. Rather than imbuing get_worktrees() with special
knowledge about how various clients -- now and in the future -- may want
the list sorted, drop the sorting capability altogether and make it the
client's responsibility to sort the list if needed.

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-06-19 19:35:43 -04:00 коммит произвёл Junio C Hamano
Родитель 810382ed37
Коммит d9c54c2bbf
3 изменённых файлов: 23 добавлений и 22 удалений

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

@ -694,6 +694,23 @@ static void measure_widths(struct worktree **wt, int *abbrev, int *maxlen)
} }
} }
static int pathcmp(const void *a_, const void *b_)
{
const struct worktree *const *a = a_;
const struct worktree *const *b = b_;
return fspathcmp((*a)->path, (*b)->path);
}
static void pathsort(struct worktree **wt)
{
int n = 0;
struct worktree **p = wt;
while (*p++)
n++;
QSORT(wt, n, pathcmp);
}
static int list(int ac, const char **av, const char *prefix) static int list(int ac, const char **av, const char *prefix)
{ {
int porcelain = 0; int porcelain = 0;
@ -707,9 +724,12 @@ static int list(int ac, const char **av, const char *prefix)
if (ac) if (ac)
usage_with_options(worktree_usage, options); usage_with_options(worktree_usage, options);
else { else {
struct worktree **worktrees = get_worktrees(GWT_SORT_LINKED); struct worktree **worktrees = get_worktrees(0);
int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i; int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i;
/* sort worktrees by path but keep main worktree at top */
pathsort(worktrees + 1);
if (!porcelain) if (!porcelain)
measure_widths(worktrees, &abbrev, &path_maxlen); measure_widths(worktrees, &abbrev, &path_maxlen);

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

@ -123,13 +123,6 @@ static void mark_current_worktree(struct worktree **worktrees)
free(git_dir); free(git_dir);
} }
static int compare_worktree(const void *a_, const void *b_)
{
const struct worktree *const *a = a_;
const struct worktree *const *b = b_;
return fspathcmp((*a)->path, (*b)->path);
}
struct worktree **get_worktrees(unsigned flags) struct worktree **get_worktrees(unsigned flags)
{ {
struct worktree **list = NULL; struct worktree **list = NULL;
@ -161,13 +154,6 @@ struct worktree **get_worktrees(unsigned flags)
ALLOC_GROW(list, counter + 1, alloc); ALLOC_GROW(list, counter + 1, alloc);
list[counter] = NULL; list[counter] = NULL;
if (flags & GWT_SORT_LINKED)
/*
* don't sort the first item (main worktree), which will
* always be the first
*/
QSORT(list + 1, counter - 1, compare_worktree);
mark_current_worktree(list); mark_current_worktree(list);
return list; return list;
} }

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

@ -18,17 +18,12 @@ struct worktree {
int lock_reason_valid; /* private */ int lock_reason_valid; /* private */
}; };
/* Functions for acting on the information about worktrees. */
#define GWT_SORT_LINKED (1 << 0) /* keeps linked worktrees sorted */
/* /*
* Get the worktrees. The primary worktree will always be the first returned, * Get the worktrees. The primary worktree will always be the first returned,
* and linked worktrees will be pointed to by 'next' in each subsequent * and linked worktrees will follow in no particular order.
* worktree. No specific ordering is done on the linked worktrees.
* *
* The caller is responsible for freeing the memory from the returned * The caller is responsible for freeing the memory from the returned
* worktree(s). * worktrees by calling free_worktrees().
*/ */
struct worktree **get_worktrees(unsigned flags); struct worktree **get_worktrees(unsigned flags);