diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2016-11-28 10:36:56 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-11-28 22:18:51 +0100 |
commit | 4df1d4d4666eb26b420d5b386010470729846b8c (patch) | |
tree | 3326149c4a7e8c3927d56e1f2a0e04ba0f19c1ee | |
parent | worktree.c: get_worktrees() takes a new flag argument (diff) | |
download | git-4df1d4d4666eb26b420d5b386010470729846b8c.tar.xz git-4df1d4d4666eb26b420d5b386010470729846b8c.zip |
worktree list: keep the list sorted
It makes it easier to write tests for. But it should also be good for
the user since locating a worktree by eye would be easier once they
notice this.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin/worktree.c | 2 | ||||
-rwxr-xr-x | t/t2027-worktree-list.sh | 19 | ||||
-rw-r--r-- | worktree.c | 14 | ||||
-rw-r--r-- | worktree.h | 2 |
4 files changed, 36 insertions, 1 deletions
diff --git a/builtin/worktree.c b/builtin/worktree.c index d7d195cd95..9a97e37a3f 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -447,7 +447,7 @@ static int list(int ac, const char **av, const char *prefix) if (ac) usage_with_options(worktree_usage, options); else { - struct worktree **worktrees = get_worktrees(0); + struct worktree **worktrees = get_worktrees(GWT_SORT_LINKED); int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i; if (!porcelain) diff --git a/t/t2027-worktree-list.sh b/t/t2027-worktree-list.sh index 98b5f340e5..465eeeacd3 100755 --- a/t/t2027-worktree-list.sh +++ b/t/t2027-worktree-list.sh @@ -117,4 +117,23 @@ test_expect_success 'broken main worktree still at the top' ' ) ' +test_expect_success 'linked worktrees are sorted' ' + mkdir sorted && + git init sorted/main && + ( + cd sorted/main && + test_tick && + test_commit new && + git worktree add ../first && + git worktree add ../second && + git worktree list --porcelain | grep ^worktree >actual + ) && + cat >expected <<-EOF && + worktree $(pwd)/sorted/main + worktree $(pwd)/sorted/first + worktree $(pwd)/sorted/second + EOF + test_cmp expected sorted/main/actual +' + test_done diff --git a/worktree.c b/worktree.c index ead088e43c..eb6121263b 100644 --- a/worktree.c +++ b/worktree.c @@ -160,6 +160,13 @@ static void mark_current_worktree(struct worktree **worktrees) 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 **list = NULL; @@ -191,6 +198,13 @@ struct worktree **get_worktrees(unsigned flags) ALLOC_GROW(list, counter + 1, alloc); 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); return list; } diff --git a/worktree.h b/worktree.h index 2e68d4ad86..d59ce1fee8 100644 --- a/worktree.h +++ b/worktree.h @@ -15,6 +15,8 @@ struct worktree { /* 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, * and linked worktrees will be pointed to by 'next' in each subsequent |