]> git.ipfire.org Git - thirdparty/git.git/commitdiff
status: skip sparse-checkout percentage with sparse-index
authorDerrick Stolee <dstolee@microsoft.com>
Wed, 14 Jul 2021 13:12:36 +0000 (13:12 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 Jul 2021 20:42:49 +0000 (13:42 -0700)
'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.

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.

Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t1092-sparse-checkout-compatibility.sh
wt-status.c
wt-status.h

index 2269f44e0333f4a4459019661139a76b7a6c5f3e..375b0d35565f86b1fa313e5fcebcd2379c27d01c 100755 (executable)
@@ -218,6 +218,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 &&
 
index 42b673571696bd398fea34b969853975de2a010b..96db3e74962ea9810c2cc471d5793a8c6ed7025e 100644 (file)
@@ -1493,9 +1493,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);
 }
 
@@ -1653,6 +1656,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))
index 0d32799b28e19af1a274acc5bd975dcf6dc3b44d..ab9cc9d8f032b77fbf6bfd5882c45a801a28fa09 100644 (file)
@@ -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;