diff options
author | 2020-07-06 22:09:13 -0700 | |
---|---|---|
committer | 2020-07-06 22:09:13 -0700 | |
commit | 0cc4dcacb323cfd1cfe6e6a750ecc86eb215180d (patch) | |
tree | b9a8298b085c8805cf944924b4373ae9a654b48e | |
parent | Merge branch 'ps/ref-transaction-hook' (diff) | |
parent | git-prompt: include sparsity state as well (diff) | |
download | tgif-0cc4dcacb323cfd1cfe6e6a750ecc86eb215180d.tar.xz |
Merge branch 'en/sparse-status'
"git status" learned to report the status of sparse checkout.
* en/sparse-status:
git-prompt: include sparsity state as well
git-prompt: document how in-progress operations affect the prompt
wt-status: show sparse checkout status as well
-rw-r--r-- | contrib/completion/git-prompt.sh | 26 | ||||
-rw-r--r-- | wt-status.c | 41 | ||||
-rw-r--r-- | wt-status.h | 2 |
3 files changed, 67 insertions, 2 deletions
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh index 014cd7c3cf..e6cd5464e5 100644 --- a/contrib/completion/git-prompt.sh +++ b/contrib/completion/git-prompt.sh @@ -70,6 +70,15 @@ # state symbols by setting GIT_PS1_STATESEPARATOR. The default separator # is SP. # +# When there is an in-progress operation such as a merge, rebase, +# revert, cherry-pick, or bisect, the prompt will include information +# related to the operation, often in the form "|<OPERATION-NAME>". +# +# When the repository has a sparse-checkout, a notification of the form +# "|SPARSE" will be included in the prompt. This can be shortened to a +# single '?' character by setting GIT_PS1_COMPRESSSPARSESTATE, or omitted +# by setting GIT_PS1_OMITSPARSESTATE. +# # By default, __git_ps1 will compare HEAD to your SVN upstream if it can # find one, or @{upstream} otherwise. Once you have set # GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by @@ -421,6 +430,13 @@ __git_ps1 () return $exit fi + local sparse="" + if [ -z "${GIT_PS1_COMPRESSSPARSESTATE}" ] && + [ -z "${GIT_PS1_OMITSPARSESTATE}" ] && + [ "$(git config --bool core.sparseCheckout)" == "true" ]; then + sparse="|SPARSE" + fi + local r="" local b="" local step="" @@ -492,6 +508,7 @@ __git_ps1 () local i="" local s="" local u="" + local h="" local c="" local p="" @@ -524,6 +541,11 @@ __git_ps1 () u="%${ZSH_VERSION+%}" fi + if [ -n "${GIT_PS1_COMPRESSSPARSESTATE}" ] && + [ "$(git config --bool core.sparseCheckout)" == "true" ]; then + h="?" + fi + if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then __git_ps1_show_upstream fi @@ -542,8 +564,8 @@ __git_ps1 () b="\${__git_ps1_branch_name}" fi - local f="$w$i$s$u" - local gitstring="$c$b${f:+$z$f}$r$p" + local f="$h$w$i$s$u" + local gitstring="$c$b${f:+$z$f}${sparse}$r$p" if [ $pcmode = yes ]; then if [ "${__git_printf_supports_v-}" != yes ]; then 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; |