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

[PATCH 1/2] [RFC] wt-status: show sparse checkout status as well

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
Jun 16, 2020, 23:33 UTC
Message-ID
<462cee857ef30c413eda0abe655b123f32b3877e.1592350413.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.808.git.git.1592350413.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

Some of the early feedback of folks trying out sparse-checkouts at $dayjob is that sparse checkouts can sometimes be disorienting; users can forget that they had a sparse-checkout and then wonder where files went. Add some output to 'git status' in the form of a simple line that states:

    You are in a sparse checkout with 35% of files present.

where, obviously, the exact figure changes depending on what percentage of files from the index do not have the SKIP_WORKTREE bit set.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 wt-status.c | 35 +++++++++++++++++++++++++++++++++++
 wt-status.h |  1 +
 2 files changed, 36 insertions(+)
diff --git a/wt-status.c b/wt-status.c
index 98dfa6f73f9..687d2ab1ba1 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1484,6 +1484,16 @@ static void show_bisect_in_progress(struct wt_status *s,
 	wt_longstatus_print_trailer(s);
 }
 
+static void show_sparse_checkout_in_use(struct wt_status *s,
+					const char *color)
+{
+	if (s->state.sparse_checkout_percentage != -1)
+		status_printf_ln(s, color,
+				 _("You are in a sparse checkout with %d%% of tracked files present."),
+				 s->state.sparse_checkout_percentage);
+	wt_longstatus_print_trailer(s);
+}
+
 /*
  * Extract branch information from rebase/bisect
  */
@@ -1623,6 +1633,27 @@ int wt_status_check_bisect(const struct worktree *wt,
 	return 0;
 }
 
+static void wt_status_check_sparse_checkout(struct repository *r,
+					    struct wt_status_state *state)
+{
+	int skip_worktree = 0;
+	int i;
+
+	if (!core_apply_sparse_checkout) {
+		state->sparse_checkout_percentage = -1;
+		return;
+	}
+
+	for (i = 0; i < r->index->cache_nr; i++) {
+		struct cache_entry *ce = r->index->cache[i];
+		if (ce_skip_worktree(ce))
+			skip_worktree++;
+	}
+
+	state->sparse_checkout_percentage =
+		100 - (100 * skip_worktree)/r->index->cache_nr;
+}
+
 void wt_status_get_state(struct repository *r,
 			 struct wt_status_state *state,
 			 int get_detached_from)
@@ -1658,6 +1689,7 @@ void wt_status_get_state(struct repository *r,
 	}
 	if (get_detached_from)
 		wt_status_get_detached_from(r, state);
+	wt_status_check_sparse_checkout(r, state);
 }
 
 static void wt_longstatus_print_state(struct wt_status *s)
@@ -1681,6 +1713,9 @@ static void wt_longstatus_print_state(struct wt_status *s)
 		show_revert_in_progress(s, state_color);
 	if (state->bisect_in_progress)
 		show_bisect_in_progress(s, state_color);
+
+	if (state->sparse_checkout_percentage != -1)
+		show_sparse_checkout_in_use(s, state_color);
 }
 
 static void wt_longstatus_print(struct wt_status *s)
diff --git a/wt-status.h b/wt-status.h
index 73ab5d4da1c..4550004003a 100644
--- a/wt-status.h
+++ b/wt-status.h
@@ -90,6 +90,7 @@ struct wt_status_state {
 	int bisect_in_progress;
 	int revert_in_progress;
 	int detached_at;
+	int sparse_checkout_percentage; /* -1 == not in sparse checkout */
 	char *branch;
 	char *onto;
 	char *detached_from;
-- 
gitgitgadget
Previous: Elijah Newren via GitGitGadgetNext: Derrick Stolee
Message 2 of 19 in “Sparse checkout status”
  1. 0/2 Sparse checkout statusElijah Newren via GitGitGadget, Jun 16, 2020
  2. 1/2 [RFC] wt-status: show sparse checkout status as wellElijah Newren via GitGitGadget, Jun 16, 2020
  3. Derrick StoleeJun 17, 2020
  4. Elijah NewrenJun 17, 2020
  5. 2/2 [RFC] git-prompt: include sparsity state as wellElijah Newren via GitGitGadget, Jun 16, 2020
  6. 0/2 Sparse checkout statusElijah Newren via GitGitGadget, Jun 18, 2020
  7. 1/2 wt-status: show sparse checkout status as wellElijah Newren via GitGitGadget, Jun 18, 2020
  8. 2/2 git-prompt: include sparsity state as wellElijah Newren via GitGitGadget, Jun 18, 2020
  9. SZEDER GáborJun 19, 2020
  10. Junio C HamanoJun 19, 2020
  11. Junio C HamanoJun 19, 2020
  12. Junio C HamanoJun 18, 2020
  13. Elijah NewrenJun 18, 2020
  14. Elijah NewrenJun 21, 2020
  15. 0/3 Sparse checkout statusElijah Newren via GitGitGadget, Jun 21, 2020
  16. 1/3 wt-status: show sparse checkout status as wellElijah Newren via GitGitGadget, Jun 21, 2020
  17. 3/3 git-prompt: include sparsity state as wellElijah Newren via GitGitGadget, Jun 21, 2020
  18. Junio C HamanoJun 22, 2020
  19. 2/3 git-prompt: document how in-progress operations affect the promptElijah Newren via GitGitGadget, Jun 21, 2020

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.