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