mirror of
https://github.com/robbyrussell/oh-my-zsh.git
synced 2026-10-01 07:26:06 +02:00
fix(git): force C locale only while matching status regexes (#14006)
This commit is contained in:
+22
-11
@@ -39,16 +39,27 @@ function _omz_git_prompt_info() {
|
|||||||
echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref//\%/%%}${upstream//\%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
|
echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref//\%/%%}${upstream//\%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
|
||||||
}
|
}
|
||||||
|
|
||||||
function _omz_git_prompt_status() {
|
# Match an extended regular expression against a subject, forcing the C locale
|
||||||
# OHMYZSH-13330: avoid "regex matching error: illegal byte sequence".
|
# only for the duration of the call.
|
||||||
# zsh's "=~" operator delegates to the C library regex, which aborts with
|
#
|
||||||
# REG_ILLSEQ when the subject contains an invalid byte sequence under a
|
# OHMYZSH-13330: zsh's "=~" operator delegates to the C library regex, which
|
||||||
# multibyte locale (e.g. a filename with non-UTF-8 bytes in `git status`
|
# aborts with REG_ILLSEQ when the subject contains an invalid byte sequence
|
||||||
# output). Forcing the C locale makes every byte a valid character, so the
|
# under a multibyte locale (e.g. a filename with non-UTF-8 bytes in `git
|
||||||
# regex matching below never fails that way. `git status --porcelain` is
|
# status` output). Forcing the C locale makes every byte a valid character,
|
||||||
# locale-independent, so this does not change the parsed output.
|
# so the regex matching never fails that way. `git status --porcelain` is
|
||||||
|
# locale-independent, so this does not change the parsed output.
|
||||||
|
#
|
||||||
|
# OHMYZSH-13985: the locale must be scoped to this function and not set for
|
||||||
|
# the whole caller. Assigning LC_ALL makes zsh re-run setlocale() right away,
|
||||||
|
# so leaving it set while the rest of the caller runs breaks multibyte
|
||||||
|
# handling there — most visibly, `echo` refuses to expand Unicode escapes in
|
||||||
|
# theme prompt symbols ("character not in range").
|
||||||
|
function _omz_git_prompt_status_match() {
|
||||||
local -x LC_ALL=C
|
local -x LC_ALL=C
|
||||||
|
[[ "$1" =~ "$2" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
function _omz_git_prompt_status() {
|
||||||
[[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
|
[[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
|
||||||
|
|
||||||
# Maps a git status prefix to an internal constant
|
# Maps a git status prefix to an internal constant
|
||||||
@@ -113,11 +124,11 @@ function _omz_git_prompt_status() {
|
|||||||
status_lines=("${(@f)${status_text}}")
|
status_lines=("${(@f)${status_text}}")
|
||||||
|
|
||||||
# If the tracking line exists, get and parse it
|
# If the tracking line exists, get and parse it
|
||||||
if [[ "$status_lines[1]" =~ "^## [^ ]+ \[(.*)\]" ]]; then
|
if _omz_git_prompt_status_match "$status_lines[1]" "^## [^ ]+ \[(.*)\]"; then
|
||||||
local branch_statuses
|
local branch_statuses
|
||||||
branch_statuses=("${(@s/,/)match}")
|
branch_statuses=("${(@s/,/)match}")
|
||||||
for branch_status in $branch_statuses; do
|
for branch_status in $branch_statuses; do
|
||||||
if [[ ! $branch_status =~ "(behind|diverged|ahead) ([0-9]+)?" ]]; then
|
if ! _omz_git_prompt_status_match "$branch_status" "(behind|diverged|ahead) ([0-9]+)?"; then
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
local last_parsed_status=$prefix_constant_map[$match[1]]
|
local last_parsed_status=$prefix_constant_map[$match[1]]
|
||||||
@@ -130,7 +141,7 @@ function _omz_git_prompt_status() {
|
|||||||
local status_constant="${prefix_constant_map[$status_prefix]}"
|
local status_constant="${prefix_constant_map[$status_prefix]}"
|
||||||
local status_regex=$'(^|\n)'"$status_prefix"
|
local status_regex=$'(^|\n)'"$status_prefix"
|
||||||
|
|
||||||
if [[ "$status_text" =~ $status_regex ]]; then
|
if _omz_git_prompt_status_match "$status_text" "$status_regex"; then
|
||||||
statuses_seen[$status_constant]=1
|
statuses_seen[$status_constant]=1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|||||||
Reference in New Issue
Block a user