mirror of
https://github.com/robbyrussell/oh-my-zsh.git
synced 2026-09-29 14:36:04 +02:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8da200b18 | ||
|
|
40323d0e37 |
+11
-42
@@ -38,47 +38,16 @@
|
|||||||
# due to malicious input as a consequence of CVE-2021-45444, which affects
|
# due to malicious input as a consequence of CVE-2021-45444, which affects
|
||||||
# zsh versions from 5.0.3 to 5.8.
|
# zsh versions from 5.0.3 to 5.8.
|
||||||
#
|
#
|
||||||
# The patch is applied when VCS_INFO_formats is first called, since loading
|
autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return 0
|
||||||
# and patching it on every startup costs time in shells that never use
|
|
||||||
# vcs_info. `autoload` doesn't replace an already defined function, so this
|
|
||||||
# wrapper survives a later `autoload -Uz vcs_info` in a theme or .zshrc, and
|
|
||||||
# vcs_info's own `autoload -Uz VCS_INFO_formats`.
|
|
||||||
if (( $+functions[VCS_INFO_formats] )); then
|
|
||||||
() {
|
|
||||||
autoload -Uz +X regexp-replace 2>/dev/null || return 1
|
|
||||||
|
|
||||||
# We use $tmp here because it's already a local variable in VCS_INFO_formats
|
# We use $tmp here because it's already a local variable in VCS_INFO_formats
|
||||||
local PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
|
typeset PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
|
||||||
# Unique string to avoid reapplying the patch if this code gets called twice
|
# Unique string to avoid reapplying the patch if this code gets called twice
|
||||||
local PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
|
typeset PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
|
||||||
# Only patch the VCS_INFO_formats function if not already patched
|
# Only patch the VCS_INFO_formats function if not already patched
|
||||||
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
|
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
|
||||||
regexp-replace 'functions[VCS_INFO_formats]' \
|
regexp-replace 'functions[VCS_INFO_formats]' \
|
||||||
"VCS_INFO_hook 'post-backend'" \
|
"VCS_INFO_hook 'post-backend'" \
|
||||||
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
|
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
|
||||||
fi
|
|
||||||
}
|
|
||||||
else
|
|
||||||
function VCS_INFO_formats {
|
|
||||||
local loaded_function="$(
|
|
||||||
unfunction VCS_INFO_formats 2>/dev/null
|
|
||||||
autoload -Uz +X VCS_INFO_formats 2>/dev/null || return 1
|
|
||||||
print -r -- "$functions[VCS_INFO_formats]"
|
|
||||||
)" || return 1
|
|
||||||
functions[VCS_INFO_formats]="$loaded_function"
|
|
||||||
autoload -Uz +X regexp-replace 2>/dev/null || return 1
|
|
||||||
|
|
||||||
# We use $tmp here because it's already a local variable in VCS_INFO_formats
|
|
||||||
local PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
|
|
||||||
# Unique string to avoid reapplying the patch if this code gets called twice
|
|
||||||
local PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
|
|
||||||
# Only patch the VCS_INFO_formats function if not already patched
|
|
||||||
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
|
|
||||||
regexp-replace 'functions[VCS_INFO_formats]' \
|
|
||||||
"VCS_INFO_hook 'post-backend'" \
|
|
||||||
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
|
|
||||||
fi
|
|
||||||
|
|
||||||
VCS_INFO_formats "$@"
|
|
||||||
}
|
|
||||||
fi
|
fi
|
||||||
|
unset PATCH PATCH_ID
|
||||||
|
|||||||
+45
-1
@@ -110,9 +110,53 @@ if [[ -z "$ZSH_COMPDUMP" ]]; then
|
|||||||
ZSH_COMPDUMP="${ZDOTDIR:-$HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
|
ZSH_COMPDUMP="${ZDOTDIR:-$HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Resolve the commit $ZSH is checked out at into $REPLY by reading the git
|
||||||
|
# directory, so that no git process is forked on every startup.
|
||||||
|
# Handles .git files (worktrees, submodules), worktree common dirs, detached
|
||||||
|
# HEADs and packed refs. Returns 1 if anything is unexpected.
|
||||||
|
_omz_git_head() {
|
||||||
|
local gitdir="$ZSH/.git" common head ref
|
||||||
|
local -a lines
|
||||||
|
REPLY=
|
||||||
|
|
||||||
|
# .git may be a file pointing at the real git dir
|
||||||
|
if [[ -f "$gitdir" ]]; then
|
||||||
|
read -r head 2>/dev/null < "$gitdir" || return 1
|
||||||
|
gitdir="${head#gitdir: }"
|
||||||
|
[[ "$gitdir" = /* ]] || gitdir="$ZSH/$gitdir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# worktrees keep their refs in the common git dir
|
||||||
|
common="$gitdir"
|
||||||
|
if [[ -f "$gitdir/commondir" ]]; then
|
||||||
|
read -r common 2>/dev/null < "$gitdir/commondir" || return 1
|
||||||
|
[[ "$common" = /* ]] || common="$gitdir/$common"
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ -r "$gitdir/HEAD" ]] || return 1
|
||||||
|
read -r head 2>/dev/null < "$gitdir/HEAD" || return 1
|
||||||
|
|
||||||
|
# detached HEAD: the file holds the commit itself
|
||||||
|
[[ "$head" = ref:\ * ]] || { REPLY="$head"; return 0 }
|
||||||
|
|
||||||
|
ref="${head#ref: }"
|
||||||
|
if [[ -r "$common/$ref" ]]; then
|
||||||
|
read -r REPLY 2>/dev/null < "$common/$ref" || return 1
|
||||||
|
[[ "$REPLY" != ref:\ * ]] || return 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ -r "$common/packed-refs" ]] || return 1
|
||||||
|
lines=("${(@f)$(<"$common/packed-refs")}")
|
||||||
|
REPLY="${lines[(r)* ${(b)ref}]%% *}"
|
||||||
|
[[ -n "$REPLY" ]]
|
||||||
|
}
|
||||||
|
|
||||||
# Construct zcompdump OMZ metadata
|
# Construct zcompdump OMZ metadata
|
||||||
zcompdump_revision="#omz revision: $(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)"
|
_omz_git_head || REPLY="$(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)"
|
||||||
|
zcompdump_revision="#omz revision: $REPLY"
|
||||||
zcompdump_fpath="#omz fpath: $fpath"
|
zcompdump_fpath="#omz fpath: $fpath"
|
||||||
|
unset -f _omz_git_head
|
||||||
|
|
||||||
# Delete the zcompdump file if OMZ zcompdump metadata changed
|
# Delete the zcompdump file if OMZ zcompdump metadata changed
|
||||||
if ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null \
|
if ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null \
|
||||||
|
|||||||
Reference in New Issue
Block a user