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 | |
parent | The third batch (diff) | |
download | tgif-051df3cfe8ed7d113197636f860edea14f283037.tar.xz |
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>
-rw-r--r-- | wt-status.c | 41 | ||||
-rw-r--r-- | wt-status.h | 2 |
2 files changed, 43 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) diff --git a/wt-status.h b/wt-status.h index 73ab5d4da1..f1fa0ec1a7 100644 --- a/wt-status.h +++ b/wt-status.h @@ -79,6 +79,7 @@ enum wt_status_format { #define HEAD_DETACHED_AT _("HEAD detached at ") #define HEAD_DETACHED_FROM _("HEAD detached from ") +#define SPARSE_CHECKOUT_DISABLED -1 struct wt_status_state { int merge_in_progress; @@ -90,6 +91,7 @@ struct wt_status_state { int bisect_in_progress; int revert_in_progress; int detached_at; + int sparse_checkout_percentage; /* SPARSE_CHECKOUT_DISABLED if not sparse */ char *branch; char *onto; char *detached_from; |