git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 05/11] worktree list: keep the list sorted

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Feb 2, 2017, 08:50 UTC
Message-ID
<20170202085007.21418-6-pclouds@gmail.com>
In-Reply-To
<20170202085007.21418-1-pclouds@gmail.com>

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       |  2 +-
 t/t2027-worktree-list.sh | 19 +++++++++++++++++++
 worktree.c               | 14 ++++++++++++++
 worktree.h               |  2 ++
 4 files changed, 36 insertions(+), 1 deletion(-)
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
-- 
2.11.0.157.gd943d85
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 5 of 25 in “nd/worktree-move update”
  1. 00/11 nd/worktree-move updateNguyễn Thái Ngọc Duy, Feb 2, 2017
  2. 01/11 worktree.c: zero new 'struct worktree' on allocationNguyễn Thái Ngọc Duy, Feb 2, 2017
  3. 02/11 worktree: reorder an if statementNguyễn Thái Ngọc Duy, Feb 2, 2017
  4. 03/11 get_worktrees() must return main worktree as first item even on errorNguyễn Thái Ngọc Duy, Feb 2, 2017
  5. 05/11 worktree list: keep the list sortedNguyễn Thái Ngọc Duy, Feb 2, 2017
  6. 04/11 worktree.c: get_worktrees() takes a new flag argumentNguyễn Thái Ngọc Duy, Feb 2, 2017
  7. 06/11 worktree.c: add validate_worktree()Nguyễn Thái Ngọc Duy, Feb 2, 2017
  8. 08/11 worktree move: new commandNguyễn Thái Ngọc Duy, Feb 2, 2017
  9. 07/11 worktree.c: add update_worktree_location()Nguyễn Thái Ngọc Duy, Feb 2, 2017
  10. 09/11 worktree move: accept destination as directoryNguyễn Thái Ngọc Duy, Feb 2, 2017
  11. 11/11 worktree remove: new commandNguyễn Thái Ngọc Duy, Feb 2, 2017
  12. 10/11 worktree move: refuse to move worktrees with submodulesNguyễn Thái Ngọc Duy, Feb 2, 2017
  13. Johannes SchindelinFeb 2, 2017
  14. Duy NguyenFeb 2, 2017
  15. Johannes SchindelinFeb 2, 2017
  16. Duy NguyenFeb 2, 2017
  17. Johannes SchindelinFeb 2, 2017
  18. Duy NguyenFeb 2, 2017
  19. Johannes SchindelinFeb 2, 2017
  20. Johannes SchindelinFeb 2, 2017
  21. Junio C HamanoFeb 2, 2017
  22. Duy NguyenFeb 3, 2017
  23. Junio C HamanoFeb 3, 2017
  24. Junio C HamanoFeb 3, 2017
  25. Duy NguyenFeb 4, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.