diff options
author | Elijah Newren <newren@gmail.com> | 2020-06-18 20:49:57 +0000 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-06-18 14:12:28 -0700 |
commit | 051df3cfe8ed7d113197636f860edea14f283037 (patch) | |
tree | 09a2af475e33e75965cd601f9bec3fedb1c8371e /wt-status.c | |
parent | 101b3204f37606972b40fc17dec84560c22f69f6 (diff) | |
download | git-051df3cfe8ed7d113197636f860edea14f283037.tar.gz |
wt-status: show sparse checkout status as well
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'wt-status.c')
-rw-r--r-- | wt-status.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/wt-status.c b/wt-status.c index 98dfa6f73f..c560cbe860 100644 --- a/wt-status.c +++ b/wt-status.c @@ -1484,6 +1484,18 @@ 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 == SPARSE_CHECKOUT_DISABLED) + return; + + 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 +1635,31 @@ 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 || r->index->cache_nr == 0) { + /* + * Don't compute percentage of checked out files if we + * aren't in a sparse checkout or would get division by 0. + */ + state->sparse_checkout_percentage = SPARSE_CHECKOUT_DISABLED; + 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 +1695,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 +1719,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 != SPARSE_CHECKOUT_DISABLED) + show_sparse_checkout_in_use(s, state_color); } static void wt_longstatus_print(struct wt_status *s) |