Add github_status and buildkite segments to zsh prompt
This commit is contained in:
parent
ded4db76b3
commit
a35f56f683
@ -6,6 +6,7 @@
|
|||||||
curl
|
curl
|
||||||
|
|
||||||
exa
|
exa
|
||||||
|
jq
|
||||||
] ++ lib.optionals config.deviceSpecific.goodMachine [
|
] ++ lib.optionals config.deviceSpecific.goodMachine [
|
||||||
# steamcmd
|
# steamcmd
|
||||||
# steam
|
# steam
|
||||||
|
@ -82,6 +82,7 @@ in {
|
|||||||
eamodio.gitlens
|
eamodio.gitlens
|
||||||
llvm-vs-code-extensions.vscode-clangd
|
llvm-vs-code-extensions.vscode-clangd
|
||||||
stkb.rewrap
|
stkb.rewrap
|
||||||
|
shardulm94.trailing-spaces
|
||||||
] ++ pkgs.lib.concatMap builtins.attrValues
|
] ++ pkgs.lib.concatMap builtins.attrValues
|
||||||
(builtins.attrValues custom-extensions);
|
(builtins.attrValues custom-extensions);
|
||||||
|
|
||||||
|
@ -41,6 +41,16 @@
|
|||||||
sha256 = "0yhwn6av4q6hz9s34h4m3vdk64ly6s28xfd8ijgdbzic8qawj5p1";
|
sha256 = "0yhwn6av4q6hz9s34h4m3vdk64ly6s28xfd8ijgdbzic8qawj5p1";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
name = "async";
|
||||||
|
file = "async.zsh";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "mafredri";
|
||||||
|
repo = "zsh-async";
|
||||||
|
rev = "3ba6e2d1ea874bfb6badb8522ab86c1ae272923d";
|
||||||
|
sha256 = "3hhZXL8/Ml7UlkkHBPpS5NfUGB5BqgO95UvtpptXf8E=";
|
||||||
|
};
|
||||||
|
}
|
||||||
{
|
{
|
||||||
name = "powerlevel10k-config";
|
name = "powerlevel10k-config";
|
||||||
src = ./.;
|
src = ./.;
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob')
|
[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob')
|
||||||
[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')
|
[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')
|
||||||
'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'
|
'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'
|
||||||
|
|
||||||
() {
|
() {
|
||||||
emulate -L zsh -o extended_glob
|
emulate -L zsh -o extended_glob
|
||||||
|
|
||||||
@ -91,6 +90,8 @@
|
|||||||
xplr # xplr shell (https://github.com/sayanarijit/xplr)
|
xplr # xplr shell (https://github.com/sayanarijit/xplr)
|
||||||
vim_shell # vim shell indicator (:sh)
|
vim_shell # vim shell indicator (:sh)
|
||||||
midnight_commander # midnight commander shell (https://midnight-commander.org/)
|
midnight_commander # midnight commander shell (https://midnight-commander.org/)
|
||||||
|
buildkite
|
||||||
|
github_status
|
||||||
direnv # direnv status (https://direnv.net/)
|
direnv # direnv status (https://direnv.net/)
|
||||||
nix_shell_with_name
|
nix_shell_with_name
|
||||||
# vi_mode # vi mode (you don't need this if you've enabled prompt_char)
|
# vi_mode # vi mode (you don't need this if you've enabled prompt_char)
|
||||||
@ -563,7 +564,7 @@
|
|||||||
#######################[ direnv: direnv status (https://direnv.net/) ]########################
|
#######################[ direnv: direnv status (https://direnv.net/) ]########################
|
||||||
# Direnv color.
|
# Direnv color.
|
||||||
typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=0
|
typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=0
|
||||||
typeset -g POWERLEVEL9K_DIRENV_BACKGROUND=3
|
typeset -g POWERLEVEL9K_DIRENV_BACKGROUND=15
|
||||||
# Custom icon.
|
# Custom icon.
|
||||||
# typeset -g POWERLEVEL9K_DIRENV_VISUAL_IDENTIFIER_EXPANSION='⭐'
|
# typeset -g POWERLEVEL9K_DIRENV_VISUAL_IDENTIFIER_EXPANSION='⭐'
|
||||||
|
|
||||||
@ -1673,7 +1674,7 @@
|
|||||||
|
|
||||||
function prompt_nix_shell_with_name() {
|
function prompt_nix_shell_with_name() {
|
||||||
if [[ -n "${IN_NIX_SHELL-}" ]]; then
|
if [[ -n "${IN_NIX_SHELL-}" ]]; then
|
||||||
if [[ "${name-nix-shell}" != nix-shell ]]; then
|
if [[ "${name-nix-shell}" != nix-shell ]] && [ "${name-shell}" != shell ]; then
|
||||||
p10k segment -b 4 -f 15 -r -i NIX_SHELL_ICON -t "$name"
|
p10k segment -b 4 -f 15 -r -i NIX_SHELL_ICON -t "$name"
|
||||||
else
|
else
|
||||||
p10k segment -b 4 -f 15 -r -i NIX_SHELL_ICON
|
p10k segment -b 4 -f 15 -r -i NIX_SHELL_ICON
|
||||||
@ -1681,6 +1682,174 @@
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typeset -gi _buildkite_scheduled_for
|
||||||
|
|
||||||
|
# Get buildkite status: amount of jobs waiting, running, and failing, for a given commit.
|
||||||
|
# $1: buildkite API key, with at least pipelines and builds permissions
|
||||||
|
# $2: buildkite pipeline slug, <org>/<pipeline>
|
||||||
|
# $3: git commit sha1
|
||||||
|
function get_buildkite_status() {
|
||||||
|
local query="\
|
||||||
|
query(\$pipeline: ID!, \$commit: String!) {\
|
||||||
|
pipeline(slug: \$pipeline) {\
|
||||||
|
builds(commit:[\$commit]) {\
|
||||||
|
edges {\
|
||||||
|
node {\
|
||||||
|
waiting: jobs(state:[WAITING,PENDING,BLOCKED,LIMITING,LIMITED,SCHEDULED,ASSIGNED,ACCEPTED]) { count },\
|
||||||
|
running: jobs(state:RUNNING) { count },\
|
||||||
|
failed: jobs(state:FINISHED, passed: false) { count },\
|
||||||
|
passed: jobs(state:FINISHED, passed: true) { count },\
|
||||||
|
state\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
}"
|
||||||
|
curl -s -H "Authorization: Bearer $1" "https://graphql.buildkite.com/v1" -d '{"query": "'$query'", "variables": { "pipeline": "'$2'", "commit": "'$3'" }}' | tee /dev/stderr \
|
||||||
|
| jq -r '.data.pipeline.builds.edges[0].node as $result | $result.state as $s
|
||||||
|
| if $s != null then ["("+if $s == "SCHEDULED" or $s == "RUNNING" then "⌛" elif $s == "PASSED" then "✔" elif $s == "FAILED" or $s == "FAILING" then "✘" else "?" end+")" ] else [] end
|
||||||
|
+ if $result.waiting.count > 0 then ["⌛",$result.waiting.count|tostring] else [] end
|
||||||
|
+ if $result.running.count > 0 then ["🔨",$result.running.count|tostring] else [] end
|
||||||
|
+ if $result.failed.count > 0 then ["✘",$result.failed.count|tostring] else [] end
|
||||||
|
+ if $result.passed.count > 0 then ["✔",$result.passed.count|tostring] else [] end
|
||||||
|
| join(" ")'
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildkite_unfinished() {
|
||||||
|
[[ "$buildkite_status" =~ "\(⌛\)" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_buildkite_status_after() {
|
||||||
|
sleep "$1"
|
||||||
|
shift
|
||||||
|
get_buildkite_status $@
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildkite_async_callback() {
|
||||||
|
typeset -g buildkite_status="$3"
|
||||||
|
p10k display -r
|
||||||
|
if buildkite_unfinished; then schedule_buildkite_fetch; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function schedule_buildkite_fetch() {
|
||||||
|
if [[ "$_buildkite_scheduled_for" -le "$(date +%s)" ]]; then
|
||||||
|
_buildkite_scheduled_for="$(( $(date +%s) + ${POWERLEVEL9K_BUILDKITE_REFRESH_RATE} ))"
|
||||||
|
async_job buildkite_async_worker get_buildkite_status_after "${POWERLEVEL9K_BUILDKITE_REFRESH_RATE}" "$BUILDKITE_API_KEY" "$BUILDKITE_PIPELINE_SLUG" "$_buildkite_rev"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
async_stop_worker buildkite_async_worker
|
||||||
|
async_start_worker buildkite_async_worker -u
|
||||||
|
async_unregister_callback buildkite_async_worker
|
||||||
|
async_register_callback buildkite_async_worker buildkite_async_callback
|
||||||
|
|
||||||
|
|
||||||
|
function prompt_buildkite() {
|
||||||
|
POWERLEVEL9K_BUILDKITE_REFRESH_RATE="${POWERLEVEL9K_BUILDKITE_REFRESH_RATE-30}"
|
||||||
|
if [[ -n "${BUILDKITE_API_KEY-}" ]] && [[ -n "${BUILDKITE_PIPELINE_SLUG-}" ]] && git rev-parse HEAD > /dev/null 2>/dev/null; then
|
||||||
|
typeset -g buildkite_status
|
||||||
|
_buildkite_rev="$(git rev-parse HEAD)"
|
||||||
|
local url="$BUILDKITE_PIPELINE_SLUG/$_buildkite_rev"
|
||||||
|
if [[ "${buildkite_previous_url-}" != "$url" ]]; then
|
||||||
|
buildkite_previous_url="$url"
|
||||||
|
buildkite_status=""
|
||||||
|
_buildkite_scheduled_for=0
|
||||||
|
fi
|
||||||
|
if [[ "$buildkite_status" =~ "\(✘\)" ]]; then color=1;
|
||||||
|
elif buildkite_unfinished; then color=3
|
||||||
|
elif [[ "$buildkite_status" =~ "\(✔\)" ]]; then color=2;
|
||||||
|
else color=8;
|
||||||
|
fi
|
||||||
|
p10k segment -e -b $color -t '$buildkite_status' -i "↻"
|
||||||
|
if [[ -z "$buildkite_status" ]] || ( [[ "$_buildkite_scheduled_for" -le "$(date +%s)" ]] && buildkite_unfinished ); then
|
||||||
|
async_job buildkite_async_worker get_buildkite_status "$BUILDKITE_API_KEY" "$BUILDKITE_PIPELINE_SLUG" "$_buildkite_rev"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
typeset -gi _github_status_scheduled_for
|
||||||
|
|
||||||
|
# Get github status: amount of jobs waiting, running, and failing, for a given commit.
|
||||||
|
# $1: github API key, with at least pipelines and builds permissions
|
||||||
|
# $2: github repo slug, <org>/<pipeline>
|
||||||
|
# $3: git commit sha1
|
||||||
|
function get_github_status() {
|
||||||
|
local cachefile="$3/$1/$2"
|
||||||
|
|
||||||
|
if [[ -f "$cachefile" ]] && ( ( ! grep -q "\(⌛\)" "$cachefile" ) || [[ "$(( $(stat -c %Y "$cachefile") + 60 ))" -gt "$(date +%s)" ]] ) && [[ -n "$(cat "$cachefile")" ]]; then
|
||||||
|
cat "$cachefile"
|
||||||
|
else
|
||||||
|
mkdir -p "$(dirname "$cachefile")"
|
||||||
|
local url="https://api.github.com/repos/$1/commits/$2/status?per_page=100"
|
||||||
|
if [[ -n "$4" ]];
|
||||||
|
then curl -s -H "Authorization: Bearer $4" "$url"
|
||||||
|
else curl -s "$url"
|
||||||
|
fi | tee /dev/stderr \
|
||||||
|
| jq -r '.state as $state | .statuses as $statuses | $statuses | map (.state) | unique | map(. as $state | {} | .[$state] = ($statuses | map(select(.state == $state)) | length)) | add as $result
|
||||||
|
| if $statuses == [] then ["∅"] else if $state == "pending" then ["(⌛)"] elif $state == "success" then ["(✔)"] elif $state == "failure" then ["(✘)"] else ["(?)"] end
|
||||||
|
+ if $result.pending > 0 then ["⌛",$result.pending|tostring] else [] end
|
||||||
|
+ if $result.success > 0 then ["✔",$result.success|tostring] else [] end
|
||||||
|
+ if $result.failure + $result.error > 0 then ["✘",$result.failure+$result.error|tostring] else [] end end
|
||||||
|
| join(" ")' \
|
||||||
|
| tee "$cachefile"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function github_status_unfinished() {
|
||||||
|
[[ "$github_status" =~ "(⌛)" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_github_status_after() {
|
||||||
|
sleep "$1"
|
||||||
|
shift
|
||||||
|
get_github_status $@
|
||||||
|
}
|
||||||
|
|
||||||
|
function github_status_async_callback() {
|
||||||
|
typeset -g github_status="$3"
|
||||||
|
p10k display -r
|
||||||
|
if github_status_unfinished; then schedule_github_status_fetch; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function schedule_github_status_fetch() {
|
||||||
|
if [[ "$_github_status_scheduled_for" -le "$(date +%s)" ]]; then
|
||||||
|
_github_status_scheduled_for="$(( $(date +%s) + ${POWERLEVEL9K_GITHUB_STATUS_REFRESH_RATE} ))"
|
||||||
|
async_job github_status_async_worker get_github_status_after "${POWERLEVEL9K_GITHUB_STATUS_REFRESH_RATE}" "$_github_status_repo" "$_github_status_rev" "$_github_status_cache" "$GITHUB_TOKEN"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
async_stop_worker github_status_async_worker
|
||||||
|
async_start_worker github_status_async_worker -u
|
||||||
|
async_unregister_callback github_status_async_worker
|
||||||
|
async_register_callback github_status_async_worker github_status_async_callback
|
||||||
|
|
||||||
|
|
||||||
|
function prompt_github_status() {
|
||||||
|
POWERLEVEL9K_GITHUB_STATUS_REFRESH_RATE="${POWERLEVEL9K_GITHUB_STATUS_REFRESH_RATE-30}"
|
||||||
|
if git rev-parse HEAD > /dev/null 2>/dev/null && [[ "$(git remote get-url origin 2>/dev/null)" =~ "github.com" ]]; then
|
||||||
|
_github_status_cache="${ZSH_CACHE_DIR-$HOME/.cache/zsh}/github-status"
|
||||||
|
typeset -g github_status
|
||||||
|
_github_status_rev="$(git rev-parse HEAD)"
|
||||||
|
_github_status_repo="${$(git remote get-url origin)%/}"
|
||||||
|
_github_status_repo="${$(echo "$_github_status_repo" | rev | cut -d/ -f1-2 | rev)%.git}"
|
||||||
|
local url="$repo/$_github_status_rev"
|
||||||
|
if [[ "${github_status_previous_url-}" != "$url" ]]; then
|
||||||
|
github_status_previous_url="$url"
|
||||||
|
github_status=""
|
||||||
|
_github_status_scheduled_for=0
|
||||||
|
fi
|
||||||
|
if [[ "$github_status" =~ "(✘)" ]]; then color=1;
|
||||||
|
elif github_status_unfinished; then color=3
|
||||||
|
elif [[ "$github_status" =~ "(✔)" ]]; then color=2;
|
||||||
|
else color=8;
|
||||||
|
fi
|
||||||
|
p10k segment -e -b $color -t '$github_status' -r -i "VCS_GIT_GITHUB_ICON"
|
||||||
|
if [[ -z "$github_status" ]] || ( [[ "$_github_status_scheduled_for" -le "$(date +%s)" ]] && github_status_unfinished ); then
|
||||||
|
async_job github_status_async_worker get_github_status "$_github_status_repo" "$_github_status_rev" "$_github_status_cache" "$GITHUB_TOKEN"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
# User-defined prompt segments may optionally provide an instant_prompt_* function. Its job
|
# User-defined prompt segments may optionally provide an instant_prompt_* function. Its job
|
||||||
# is to generate the prompt segment for display in instant prompt. See
|
# is to generate the prompt segment for display in instant prompt. See
|
||||||
# https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt.
|
# https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user