diff --git a/README.md b/README.md index 98e227e..5c3d316 100644 --- a/README.md +++ b/README.md @@ -198,6 +198,21 @@ Example of a compact prompt: #### Specific features +**DOTMATRIX_VCS_AHEAD_THRESHOLD** *integer = 5* + +Number of unpushed local commits above which the prompt should use the warning color to display the "push" section. + + +**DOTMATRIX_VCS_BEHIND_THRESHOLD** *integer = 5* + +Number of unpulled remote commits above which the prompt should use the warning color to display the "pull" section. + + +**DOTMATRIX_VCS_DIFF_THRESHOLD** *integer = 300* + +Number of modified lines above which the prompt should use the warning color to display the "commit" section. + + **DOTMATRIX_ENABLE_HISTORY** *boolean = 1* Enable the history sections displayed on the right side of the middle line. diff --git a/dotmatrix.theme b/dotmatrix.theme index 3e2bbed..81c2e2c 100644 --- a/dotmatrix.theme +++ b/dotmatrix.theme @@ -25,6 +25,13 @@ _lp_dotmatrix_theme_activate() { DOTMATRIX_HISTORY_LAST_LEN_MARK=${DOTMATRIX_HISTORY_LAST_LEN_MARK:-"[…]"} DOTMATRIX_HISTORY_MOST_BACK=${DOTMATRIX_HISTORY_MOST_BACK:-100} + # Thresholds based on 75th quantile for: + # nb of commits in PR on Github and added+removed lines. + # See: https://promyze.com/observations-on-10000-pull-requests-on-github/ + DOTMATRIX_VCS_AHEAD_THRESHOLD=${DOTMATRIX_VCS_AHEAD_THRESHOLD:-5} + DOTMATRIX_VCS_BEHIND_THRESHOLD=${DOTMATRIX_VCS_BEHIND_THRESHOLD:-5} + DOTMATRIX_VCS_DIFF_THRESHOLD=${DOTMATRIX_VCS_DIFF_THRESHOLD:-300} + # Sets of characters DOTMATRIX_VARIANT=${DOTMATRIX_VARIANT:-"dotmatrix"} if [[ "${DOTMATRIX_VARIANT}" == "dotmatrix" ]] ; then @@ -804,6 +811,7 @@ __dotmatrix_directory_path() { __dotmatrix_prompt_vcs() { if _lp_find_vcs ; then local lp_vcs_details_color + local color= _lp_smart_mark @@ -814,11 +822,16 @@ __dotmatrix_prompt_vcs() { # Remote segment. if [[ "$lp_vcs_commit_behind" -ne "0" ]]; then # NOTE remote segment. + if [[ "$lp_vcs_commit_behind" -ge "${DOTMATRIX_VCS_BEHIND_THRESHOLD}" ]]; then + color=${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"} + else + color=${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + fi if (( LP_ENABLE_VCS_DIFFSTATS )) ; then - __dotmatrix_make_field "${DOTMATRIX_VCS}${lp_smart_mark} +${lp_vcs_commit_behind}" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "${DOTMATRIX_VCS}${lp_smart_mark} +${lp_vcs_commit_behind}" ${color[@]} _DOTMATRIX_VCS+="$dotmatrix_field" else - __dotmatrix_make_field "${DOTMATRIX_VCS}${lp_smart_mark} ${DOTMATRIX_DIFF}" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "${DOTMATRIX_VCS}${lp_smart_mark} ${DOTMATRIX_DIFF}" ${color[@]} _DOTMATRIX_VCS+="$dotmatrix_field" fi @@ -826,26 +839,36 @@ __dotmatrix_prompt_vcs() { __dotmatrix_make_field "${DOTMATRIX_VCS}${lp_smart_mark}" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} _DOTMATRIX_VCS+="$dotmatrix_field" fi - __dotmatrix_make_sep_link ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + if [[ "$lp_vcs_commit_ahead" -ge "${DOTMATRIX_VCS_AHEAD_THRESHOLD}" ]]; then + color=${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"} + else + color=${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + fi + __dotmatrix_make_sep_link ${color[@]} _DOTMATRIX_VCS+="$dotmatrix_sep" # Local segment. if [[ "$lp_vcs_commit_ahead" -ne "0" ]]; then # NOTE local segment. + if [[ "$lp_vcs_commit_ahead" -ge "${DOTMATRIX_VCS_AHEAD_THRESHOLD}" ]]; then + color=${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"} + else + color=${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + fi if (( LP_ENABLE_VCS_DIFFSTATS )) ; then - __dotmatrix_make_field "+$lp_vcs_commit_ahead" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "+$lp_vcs_commit_ahead" ${color[@]} _DOTMATRIX_VCS+="$dotmatrix_field" else - __dotmatrix_make_field "$DOTMATRIX_DIFF" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "$DOTMATRIX_DIFF" ${color[@]} _DOTMATRIX_VCS+="$dotmatrix_field" fi __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} _DOTMATRIX_VCS+="$dotmatrix_sep" - else # LITE local segment. + else # 0 commit ahead => LITE local segment. __dotmatrix_make_sep_plug ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} _DOTMATRIX_VCS+="$dotmatrix_sep" fi - else # There is no space between remote and branch. + else # No commits off remote => There is no space between remote and branch. __dotmatrix_make_field "${DOTMATRIX_VCS}${lp_smart_mark}" ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} _DOTMATRIX_VCS+="$dotmatrix_field" __dotmatrix_make_sep_mid ${DOTMATRIX_COLOR_LITE[@]+"${DOTMATRIX_COLOR_LITE[@]}"} @@ -884,23 +907,29 @@ __dotmatrix_prompt_vcs() { # Diff stats local ret has_lines= if _lp_vcs_uncommitted_files; then - __dotmatrix_make_sep_link ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + _lp_vcs_unstaged_lines; ret=$? + _lp_vcs_uncommitted_lines + if [[ $((ret+lp_vcs_uncommitted_i_lines+lp_vcs_uncommitted_d_lines)) -gt "${DOTMATRIX_VCS_DIFF_THRESHOLD}" ]]; then + color=${DOTMATRIX_COLOR_WARN[@]+"${DOTMATRIX_COLOR_WARN[@]}"} + else + color=${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + fi + __dotmatrix_make_sep_link ${color[@]} _DOTMATRIX_VCS+="$dotmatrix_sep" - _lp_vcs_unstaged_lines; ret=$? # Only show unstaged changes if the VCS supports staging, otherwise # show uncommitted changes if (( ret == 0 )); then if [[ "$lp_vcs_unstaged_i_lines" == "$lp_vcs_unstaged_d_lines" ]] ; then # If same number of lines inserted and deleted: display a single number. - __dotmatrix_make_field "±$lp_vcs_unstaged_i_lines" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "±$lp_vcs_unstaged_i_lines" ${color[@]} has_lines="$dotmatrix_field" else - __dotmatrix_make_field "+$lp_vcs_unstaged_i_lines" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "+$lp_vcs_unstaged_i_lines" ${color[@]} has_lines="$dotmatrix_field" __dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"} has_lines+="$dotmatrix_sep" - __dotmatrix_make_field "-$lp_vcs_unstaged_d_lines" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "-$lp_vcs_unstaged_d_lines" ${color[@]} has_lines+="$dotmatrix_field" fi @@ -908,23 +937,22 @@ __dotmatrix_prompt_vcs() { __dotmatrix_make_field "±0" ${DOTMATRIX_COLOR_DARK[@]+"${DOTMATRIX_COLOR_DARK[@]}"} has_lines="+${dotmatrix_field}" else - _lp_vcs_uncommitted_lines if [[ "$lp_vcs_uncommitted_i_lines" == "$lp_vcs_uncommitted_d_lines" ]] ; then - __dotmatrix_make_field "±$lp_vcs_uncommitted_i_lines" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "±$lp_vcs_uncommitted_i_lines" ${color[@]} has_lines="$dotmatrix_field" else - __dotmatrix_make_field "+$lp_vcs_uncommitted_i_lines" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "+$lp_vcs_uncommitted_i_lines" ${color[@]} has_lines="$dotmatrix_field" __dotmatrix_make_sep_soft ${DOTMATRIX_COLOR_SEP_LITE[@]+"${DOTMATRIX_COLOR_SEP_LITE[@]}"} has_lines+="$dotmatrix_sep" - __dotmatrix_make_field "-$lp_vcs_uncommitted_d_lines" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "-$lp_vcs_uncommitted_d_lines" ${color[@]} has_lines+="$dotmatrix_field" fi fi if (( LP_ENABLE_VCS_DIFFSTATS )) ; then _DOTMATRIX_VCS+="$has_lines" else - __dotmatrix_make_field "$DOTMATRIX_DIFF" ${DOTMATRIX_COLOR_NOTE[@]+"${DOTMATRIX_COLOR_NOTE[@]}"} + __dotmatrix_make_field "$DOTMATRIX_DIFF" ${color[@]} _DOTMATRIX_VCS+="$dotmatrix_field" fi # LP_ENABLE_VCS_DIFFSTATS fi # uncommitted files