On Tue, Apr 13, 2021 at 7:01 AM Derrick Stolee via GitGitGadget <gitgitgadget@xxxxxxxxx> wrote: > > From: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > > 'git status' began reporting a percentage of populated paths when > sparse-checkout is enabled in 051df3cf (wt-status: show sparse > checkout status as well, 2020-07-18). This percentage is incorrect when > the index has sparse directories. It would also be expensive to > calculate as we would need to parse trees to count the total number of > possible paths. > > Avoid the expensive computation by simplifying the output to only report > that a sparse checkout exists, without the percentage. Makes sense. The percentage wasn't critical, it was just a nice UI bonus. The critical part is notifying about being in a sparse checkout. It makes me wonder slightly if we'd want to remove the percentage for both modes just to keep them more similar. I'll ask some folks for their thoughts/opinions. Of course, that could always be tweaked later and doesn't necessarily need to go into your series. > This change is the reason we use 'git status --porcelain=v2' in > t1092-sparse-checkout-compatibility.sh. We don't want to ensure that > this message is equal across both modes, but instead just the important > information about staged, modified, and untracked files are compared. > > Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > --- > t/t1092-sparse-checkout-compatibility.sh | 8 ++++++++ > wt-status.c | 14 +++++++++++--- > wt-status.h | 1 + > 3 files changed, 20 insertions(+), 3 deletions(-) > > diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh > index 6598c12a2069..e488ef9bd941 100755 > --- a/t/t1092-sparse-checkout-compatibility.sh > +++ b/t/t1092-sparse-checkout-compatibility.sh > @@ -196,6 +196,14 @@ test_expect_success 'status with options' ' > test_all_match git status --porcelain=v2 -uno > ' > > +test_expect_success 'status reports sparse-checkout' ' > + init_repos && > + git -C sparse-checkout status >full && > + git -C sparse-index status >sparse && > + test_i18ngrep "You are in a sparse checkout with " full && > + test_i18ngrep "You are in a sparse checkout." sparse > +' > + > test_expect_success 'add, commit, checkout' ' > init_repos && > > diff --git a/wt-status.c b/wt-status.c > index 0c8287a023e4..0425169c1895 100644 > --- a/wt-status.c > +++ b/wt-status.c > @@ -1490,9 +1490,12 @@ static void show_sparse_checkout_in_use(struct wt_status *s, > 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); > + if (s->state.sparse_checkout_percentage == SPARSE_CHECKOUT_SPARSE_INDEX) > + status_printf_ln(s, color, _("You are in a sparse checkout.")); > + else > + 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); > } > > @@ -1650,6 +1653,11 @@ static void wt_status_check_sparse_checkout(struct repository *r, > return; > } > > + if (r->index->sparse_index) { > + state->sparse_checkout_percentage = SPARSE_CHECKOUT_SPARSE_INDEX; > + return; > + } > + > for (i = 0; i < r->index->cache_nr; i++) { > struct cache_entry *ce = r->index->cache[i]; > if (ce_skip_worktree(ce)) > diff --git a/wt-status.h b/wt-status.h > index 0d32799b28e1..ab9cc9d8f032 100644 > --- a/wt-status.h > +++ b/wt-status.h > @@ -78,6 +78,7 @@ enum wt_status_format { > }; > > #define SPARSE_CHECKOUT_DISABLED -1 > +#define SPARSE_CHECKOUT_SPARSE_INDEX -2 > > struct wt_status_state { > int merge_in_progress; > -- > gitgitgadget Looks good.