JMGLTLTFSWLJVKR5AOL2OR7WXI35YZW356OHB3GO4FJI5LAHOGWAC
JROTWG7ECAT5QSN2RT6EQMU246HEVNRV7TWHK7MTV5WTHR55I2EQC
MZHO6Q4N7Z3FWXDFSITA25VMJZT5SKT3FX2HW4WHTWWSMFQXKF2QC
54L5HCFQ6DJMC3RQQ7UANRYQBBIPBFT5XLOT2OVUMOG33SZ2H5MQC
5WFCHG5XRBOE3CWAZODDC4E5GO65X32RVIEOZHDXQ34TAUPA65MAC
AZQERHZXRFQQH4FCLDXLN577EAA4WW6OVXIKFGDEIOEVX462P56AC
QSIH36H4R2A2EDRFRM7R75YNITYZLIA43TFCCAOYVOQ2TEHLTN4AC
JO5NBAQPJX3HKWBE6GQ5LOK4SYO2K5ZIGPT6HRRJB7N5AUQ75UHAC
# Find an awk implementation
# Prefer nawk over mawk and mawk over awk
(( $+commands[mawk] )) && : "${ZSH_PIJUL_PROMPT_AWK_CMD:=mawk}"
(( $+commands[nawk] )) && : "${ZSH_PIJUL_PROMPT_AWK_CMD:=nawk}"
: "${ZSH_PIJUL_PROMPT_AWK_CMD:=awk}"
typeset -g __PIJUL_CHANNEL __PIJUL_REMOTE __PIJUL_STATUS __PIJUL_SECONDARY __PIJUL_FORCE_BLANK
function _zsh_pijul_prompt_pijul_latest_state_cmd() {
command pijul log --state --limit 1 2>/dev/null \
|| echo "fatal: pijul latest state command failed"
echo -n "$(__pijul_element "$ZSH_THEME_PIJUL_PROMPT_PREFIX")"
echo -n "$(__pijul_element "$__PIJUL_CHANNEL")"
echo -n "$(__pijul_element "$__PIJUL_REMOTE")"
echo -n "$(__pijul_element "$ZSH_THEME_PIJUL_PROMPT_SEPARATOR")"
echo -n "$(__pijul_element "$__PIJUL_STATUS")"
echo -n "$(__pijul_element "$ZSH_THEME_PIJUL_PROMPT_SUFFIX")"
function _zsh_pijul_prompt_pijul_remote_cmd() {
command pijul remote 2>/dev/null \
|| echo "fatal: pijul remote command failed"
function __pijul_prompt_secondary() {
__exit_unless_pijul_repo
if [[ -n "$ZSH_PIJUL_PROMPT_ENABLE_SECONDARY" ]]; then
echo -n "$(__pijul_element "$ZSH_THEME_PIJUL_PROMPT_SECONDARY_PREFIX")"
echo -n "$(__pijul_element "$__PIJUL_SECONDARY")"
echo -n "$(__pijul_element "$ZSH_THEME_PIJUL_PROMPT_SECONDARY_SUFFIX")"
fi
function _zsh_pijul_prompt_pijul_status_cmd() {
command pijul diff --short --untracked 2>/dev/null \
|| echo "fatal: pijul status command failed"
function __pijul_channel() {
local element
element=$(command pijul channel 2>/dev/null | sed -n 's/^\* //p')
__pijul_element "$ZSH_THEME_PIJUL_PROMPT_CHANNEL" "$element"
function _zsh_pijul_prompt_pijul_tags_cmd() {
command pijul tag 2>/dev/null \
|| echo "fatal: pijul tags command failed"
function __pijul_channel_completion() {
if [[ "$__PIJUL_CHANNEL" != "$1" ]]; then
__PIJUL_CHANNEL="$1"
zle && { zle reset-prompt; zle -R; }
fi
function _zsh_pijul_prompt_pijul_status() {
emulate -L zsh
local channel
channel=$(_zsh_pijul_prompt_pijul_channel_cmd | sed -n 's/^\* //p')
if [[ -z "$element" ]]; then
__pijul_element "$ZSH_THEME_PIJUL_PROMPT_REMOTE_NO_TRACKING"
elif [[ "$element" == "symbol" ]]; then
__pijul_element "$ZSH_THEME_PIJUL_PROMPT_REMOTE_SYMBOL"
elif [[ "$element" == "full" ]]; then
__pijul_element "$ZSH_THEME_PIJUL_PROMPT_REMOTE_PREFIX" "$element" "$ZSH_THEME_PIJUL_PROMPT_REMOTE_SUFFIX"
fi
}
# Until it's possible to retrieve the default remote, take the first listed.
# This will not necessarily be the default remote, but rather the first remote
# added to the repository.
local remote
remote=$(_zsh_pijul_prompt_pijul_remote_cmd | sed -En 's/^.*: (.*@)?//p' | head -n 1)
_zsh_pijul_prompt_pijul_status_cmd | $ZSH_PIJUL_PROMPT_AWK_CMD \
-v PREFIX="$ZSH_THEME_PIJUL_PROMPT_PREFIX" \
-v SUFFIX="$ZSH_THEME_PIJUL_PROMPT_SUFFIX" \
-v SEPARATOR="$ZSH_THEME_PIJUL_PROMPT_SEPARATOR" \
-v CHANNEL="$ZSH_THEME_PIJUL_PROMPT_CHANNEL" \
-v REMOTE_TYPE="$ZSH_PIJUL_PROMPT_SHOW_REMOTE" \
-v REMOTE_SYMBOL="$ZSH_THEME_PIJUL_PROMPT_REMOTE_SYMBOL" \
-v REMOTE_NO_TRACKING="$ZSH_THEME_PIJUL_PROMPT_REMOTE_NO_TRACKING" \
-v REMOTE_PREFIX="$ZSH_THEME_PIJUL_PROMPT_REMOTE_PREFIX" \
-v REMOTE_SUFFIX="$ZSH_THEME_PIJUL_PROMPT_REMOTE_SUFFIX" \
-v SHOW_LOCAL_COUNTS="$ZSH_PIJUL_PROMPT_SHOW_LOCAL_COUNTS" \
-v CHANGED="$ZSH_THEME_PIJUL_PROMPT_CHANGED" \
-v ADDED="$ZSH_THEME_PIJUL_PROMPT_ADDED" \
-v REMOVED="$ZSH_THEME_PIJUL_PROMPT_REMOVED" \
-v RESURRECTED="$ZSH_THEME_PIJUL_PROMPT_RESURRECTED" \
-v SOLVED="$ZSH_THEME_PIJUL_PROMPT_SOLVED" \
-v UNSOLVED="$ZSH_THEME_PIJUL_PROMPT_UNSOLVED" \
-v UNTRACKED="$ZSH_THEME_PIJUL_PROMPT_UNTRACKED" \
-v CLEAN="$ZSH_THEME_PIJUL_PROMPT_CLEAN" \
-v RC="%{$reset_color%}%b%f%k" \
-v channel="$channel" \
-v remote="$remote" \
'
BEGIN {
ORS = ""
fatal = 0
changed = 0
added = 0
removed = 0
resurrected = 0
solved = 0
unsolved = 0
untracked = 0
}
function __pijul_remote_completion() {
if [[ "$__PIJUL_REMOTE" != "$1" ]]; then
__PIJUL_REMOTE="$1"
zle && { zle reset-prompt; zle -R; }
fi
}
function status_element(prefix, content, suffix, show_conent) {
print(prefix)
function __pijul_status() {
command pijul diff --short --untracked 2>/dev/null | $ZSH_PIJUL_PROMPT_AWK_CMD \
-v SEPARATOR="$ZSH_THEME_PIJUL_PROMPT_SEPARATOR" \
-v CHANNEL="$ZSH_THEME_PIJUL_PROMPT_CHANNEL" \
-v SHOW_LOCAL_COUNTS="$ZSH_PIJUL_PROMPT_SHOW_LOCAL_COUNTS" \
-v CHANGED="$ZSH_THEME_PIJUL_PROMPT_CHANGED" \
-v ADDED="$ZSH_THEME_PIJUL_PROMPT_ADDED" \
-v REMOVED="$ZSH_THEME_PIJUL_PROMPT_REMOVED" \
-v RESURRECTED="$ZSH_THEME_PIJUL_PROMPT_RESURRECTED" \
-v SOLVED="$ZSH_THEME_PIJUL_PROMPT_SOLVED" \
-v UNSOLVED="$ZSH_THEME_PIJUL_PROMPT_UNSOLVED" \
-v UNTRACKED="$ZSH_THEME_PIJUL_PROMPT_UNTRACKED" \
-v CLEAN="$ZSH_THEME_PIJUL_PROMPT_CLEAN" \
-v RESET="%{$reset_color%}%b%f%k" \
'
BEGIN {
ORS = ""
changed = 0
added = 0
removed = 0
resurrected = 0
solved = 0
unsolved = 0
untracked = 0
}
END {
if (fatal == 1) {
exit(1)
END {
if (changed == 0 && added == 0 && removed == 0 && resurrected == 0 && solved == 0 && unsolved == 0 && untracked == 0) {
pijul_element(CLEAN)
} else {
if (changed > 0) {
pijul_element(CHANGED, changed, "", SHOW_LOCAL_COUNTS)
status_element(PREFIX)
status_element(CHANNEL, channel)
if (remote == "") {
status_element(REMOTE_NO_TRACKING)
} else if (REMOTE_TYPE == "symbol") {
status_element(REMOTE_SYMBOL)
} else if (REMOTE_TYPE == "full") {
status_element(REMOTE_PREFIX, remote, REMOTE_SUFFIX)
if (added > 0) {
pijul_element(ADDED, added, "", SHOW_LOCAL_COUNTS)
if (changed == 0 && added == 0 && removed == 0 && resurrected == 0 && solved == 0 && unsolved == 0 && untracked == 0) {
status_element(CLEAN)
} else {
if (changed > 0) {
status_element(CHANGED, changed, "", SHOW_LOCAL_COUNTS)
}
if (added > 0) {
status_element(ADDED, added, "", SHOW_LOCAL_COUNTS)
}
if (removed > 0) {
status_element(REMOVED, removed, "", SHOW_LOCAL_COUNTS)
}
if (resurrected > 0) {
status_element(RESURRECTED, resurrected, "", SHOW_LOCAL_COUNTS)
}
if (removed > 0) {
pijul_element(REMOVED, removed, "", SHOW_LOCAL_COUNTS)
}
local state
state=$(_zsh_pijul_prompt_pijul_latest_state_cmd | $ZSH_PIJUL_PROMPT_AWK_CMD \
'$1 == "State:" { print $2 }')
function __pijul_secondary() {
if [[ -n "$ZSH_PIJUL_PROMPT_ENABLE_SECONDARY" ]]; then
local state
state=$(command pijul log --state --limit 1 2>/dev/null | $ZSH_PIJUL_PROMPT_AWK_CMD \
'$1 == "State:" { print $2 }')
_zsh_pijul_prompt_pijul_tags_cmd | xargs -L 4 | $ZSH_PIJUL_PROMPT_AWK_CMD \
-v PREFIX="$ZSH_THEME_PIJUL_PROMPT_SECONDARY_PREFIX" \
-v SUFFIX="$ZSH_THEME_PIJUL_PROMPT_SECONDARY_SUFFIX" \
command pijul tag 2>/dev/null | xargs -L 4 | $ZSH_PIJUL_PROMPT_AWK_CMD \
function __pijul_secondary_completion() {
if [[ "$__PIJUL_SECONDARY" != "$1" ]]; then
__PIJUL_SECONDARY="$1"
zle && { zle reset-prompt; zle -R; }
fi
}
function __pijul_element() {
echo -n "$1"
echo -n "$2"
echo -n "$3"
echo -n "%{$reset_color%}%b%f%k"
}
# HOOKS ------------------------------------------------------------------------
function __pijul_channel_precmd_hook() {
if [[ -n "$__PIJUL_FORCE_BLANK" ]]; then
__PIJUL_CHANNEL=""
fi
__async __pijul_channel __pijul_channel_completion
}
function __pijul_remote_precmd_hook() {
if [[ -n "$__PIJUL_FORCE_BLANK" ]]; then
__PIJUL_REMOTE=""
fi
__async __pijul_remote __pijul_remote_completion
}
function __pijul_status_precmd_hook() {
if [[ -n "$__PIJUL_FORCE_BLANK" ]]; then
__PIJUL_STATUS=""
fi
__async __pijul_status __pijul_status_completion
}
function __pijul_secondary_precmd_hook() {
if [[ -n "$__PIJUL_FORCE_BLANK" ]]; then
__PIJUL_SECONDARY=""
fi
__async __pijul_secondary __pijul_secondary_completion
}
function __pijul_chpwd_hook() {
__PIJUL_CHANNEL=""
__PIJUL_REMOTE=""
__PIJUL_STATUS=""
__PIJUL_SECONDARY=""
}
# If we've got a pending request, cancel it
if [[ -n "$_ZSH_PIJUL_PROMPT_ASYNC_FD" ]] \
&& { true <&$_ZSH_PIJUL_PROMPT_ASYNC_FD } 2>/dev/null
then
# Close the file descriptor and remove the handler
exec {_ZSH_PIJUL_PROMPT_ASYNC_FD}<&-
zle -F $_ZSH_PIJUL_PROMPT_ASYNC_FD
local fd
local pid
local running_fd="${__fds[$id]}"
local running_pid="${__pids[$id]}"
if [[ -n "$running_fd" ]] && { true <&$running_fd; } 2>/dev/null; then
exec {running_fd}<&-
zle -F "$running_fd"
# Called when new data is ready to be read from the pipe
# First arg will be fd ready for reading
# Second arg will be passed in case of error
_ZSH_PIJUL_PROMPT_STATUS_OUTPUT=""
_ZSH_PIJUL_PROMPT_STATUS_SECONDARY_OUTPUT=""
function __async_completion() {
emulate -L zsh
local old_primary="$_ZSH_PIJUL_PROMPT_STATUS_OUTPUT"
local old_secondary="$_ZSH_PIJUL_PROMPT_STATUS_SECONDARY_OUTPUT"
local fd_data
local -a output
if [[ -z "$2" || "$2" == "hup" ]]; then
for key in ${(k)__pids}
do
if [[ "$fd" == ${__fds[$key]} ]]; then
id=$key
completion=${__completions[$id]}
break
fi
done
if [[ -z "$2" || "$2" == "hup" ]]
then
# Read output from fd
fd_data="$(cat <&$1)"
output=( ${(s:##secondary##:)fd_data} )
_ZSH_PIJUL_PROMPT_STATUS_OUTPUT="${output[1]}"
_ZSH_PIJUL_PROMPT_STATUS_SECONDARY_OUTPUT="${output[2]}"
[[ -z $id ]] && return 1
function _zsh_pijul_prompt_precmd_hook() {
if [[ -n "$ZSH_PIJUL_PROMPT_FORCE_BLANK" ]]
then
_ZSH_PIJUL_PROMPT_STATUS_OUTPUT=""
_ZSH_PIJUL_PROMPT_STATUS_SECONDARY_OUTPUT=""
fi
function __cleanup() {
local id="$1"
&& add-zsh-hook precmd _zsh_pijul_prompt_precmd_hook
&& add-zsh-hook precmd __pijul_channel_precmd_hook \
&& add-zsh-hook precmd __pijul_remote_precmd_hook \
&& add-zsh-hook precmd __pijul_status_precmd_hook \
&& add-zsh-hook precmd __pijul_secondary_precmd_hook \
&& add-zsh-hook chpwd __pijul_chpwd_hook \
ZSH_THEME_PIJUL_PROMPT_CHANGED="%{$fg[magenta]%}∆"
ZSH_THEME_PIJUL_PROMPT_ADDED="%{$fg[green]%}+"
ZSH_THEME_PIJUL_PROMPT_REMOVED="%{$fg[red]%}−"
ZSH_THEME_PIJUL_PROMPT_RESURRECTED="%{$fg[grey]%}✝"
ZSH_THEME_PIJUL_PROMPT_SOLVED="%{$fg[green]%}⛙"
ZSH_THEME_PIJUL_PROMPT_UNSOLVED="%{$fg[red]%}×"
ZSH_THEME_PIJUL_PROMPT_UNTRACKED="%{$fg[yellow]%}…"
ZSH_THEME_PIJUL_PROMPT_CLEAN="%{$fg_bold[green]%}✓"
ZSH_THEME_PIJUL_PROMPT_CHANGED="%F{magenta}∆"
ZSH_THEME_PIJUL_PROMPT_ADDED="%F{green}+"
ZSH_THEME_PIJUL_PROMPT_REMOVED="%F{red}−"
ZSH_THEME_PIJUL_PROMPT_RESURRECTED="\033[38;5;12m✝"
ZSH_THEME_PIJUL_PROMPT_SOLVED="%F{green}⛙"
ZSH_THEME_PIJUL_PROMPT_UNSOLVED="%F{red}×"
ZSH_THEME_PIJUL_PROMPT_UNTRACKED="%F{yellow}…"
ZSH_THEME_PIJUL_PROMPT_CLEAN="%B%F{green}✓"