worktree list: keep the list sorted
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Mon, 28 Nov 2016 09:36:56 +0000 (16:36 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 28 Nov 2016 21:18:51 +0000 (13:18 -0800)
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>
builtin/worktree.c
t/t2027-worktree-list.sh
worktree.c
worktree.h
index d7d195cd9573f3644eff4b9fad921271c1212ad1..9a97e37a3fa53e730f0963f8f00bbca9f6d6efc6 100644 (file)
@@ -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)
index 98b5f340e5b58136dea9a6a89f5d78295e902801..465eeeacd3de1971c7256c84583377b3b47d520b 100755 (executable)
@@ -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
index ead088e43c674bcc5d1e2de9828e99ab73cc84c4..eb6121263b0d56b6b7ea7c5024e9ceb68256c1c5 100644 (file)
@@ -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;
 }
index 2e68d4ad86ca935703011694d3452880b593bcad..d59ce1fee875800462a1e464592fd9dd01828e17 100644 (file)
@@ -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