Skip to content

Commit

Permalink
wt-status: show sparse checkout status as well
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
newren authored and gitster committed Jun 18, 2020
1 parent 101b320 commit 051df3c
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
41 changes: 41 additions & 0 deletions wt-status.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions wt-status.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit 051df3c

Please sign in to comment.