#!/bin/sh repo_status_git() { BRANCH_NAME="$(git rev-parse --abbrev-ref HEAD)" OUT="$(git status --short --branch --porcelain)" BRANCH_LINE="$(echo "$OUT" | head -n 1)" DIFF_LINES="$(echo "$OUT" | tail -n +2)" IS_AHEAD=false IS_BEHIND=false if echo "$BRANCH_LINE" | grep -q 'ahead'; then IS_AHEAD=true fi if echo "$BRANCH_LINE" | grep -q 'behind'; then IS_BEHIND=true fi LINE='' if [ "$IS_AHEAD" = true ] && [ "$IS_BEHIND" = true ]; then LINE="^^^ $BRANCH_NAME vvv" elif [ "$IS_AHEAD" = true ]; then LINE="^ $BRANCH_NAME ^" elif [ "$IS_BEHIND" = true ]; then LINE="v $BRANCH_NAME v" else LINE="$BRANCH_NAME" fi HAS_DIFF=false HAS_UNTRACKED=false if echo "$DIFF_LINES" | grep -q '^[A|D|M| ][M|D| ]'; then HAS_DIFF=true fi if echo "$DIFF_LINES" | grep -q '^[?][?]'; then HAS_UNTRACKED=true fi if [ "$HAS_DIFF" = true ]; then COLOR_FN=redb LINE="{$LINE}" elif [ "$IS_AHEAD" = true ] || [ "$IS_BEHIND" = true ]; then COLOR_FN=bluei LINE="[$LINE]" elif [ "$HAS_UNTRACKED" = true ]; then COLOR_FN=lightblue LINE="{$LINE}" else COLOR_FN=green LINE="($LINE)" fi color -c "$COLOR_FN" "$LINE" BRANCH_COUNT="$(git branch --list | wc -l)" if [ "$BRANCH_COUNT" -gt 1 ]; then color -c lightblue "<$BRANCH_COUNT>" fi STASH_COUNT="$(git stash list | wc -l)" if [ "$STASH_COUNT" != 0 ]; then color -c red "*$STASH_COUNT" fi color -c blacki " - git/$(git rev-parse HEAD)" } repo_status_fossil() { BRANCH_NAME="$(fossil branch current)" if [ -n "$(fossil extras)" ]; then HAS_UNTRACKED=1 fi BRANCH_MARKER="$BRANCH_NAME" if [ -n "${HAS_UNTRACKED:-}" ]; then COLOR_FN=lightblue LINE="($BRANCH_MARKER)" else COLOR_FN=green LINE="($BRANCH_MARKER)" fi color -c "$COLOR_FN" "$LINE" color -c blacki " - fossil/$(fossil info | awk '/^checkout:/ { print $2 }')" } repo_status_mercurial() { BRANCH_NAME="$(hg branch)" } repo_status() { dir="$(basename "$PWD")" if [ -d .git ]; then repo_status_git elif [ -f "$dir.fossil" ]; then repo_status_fossil elif [ -d .hg ]; then repo_status_mercurial fi } error_marker() { STATUS=$? if [ "$STATUS" != 0 ]; then color -c redb " (!! $STATUS !!) " fi } shell_level() { if [ -n "${SHLVL:-}" ]; then if [ -n "${TMUX:-}" ]; then LVL=$((SHLVL - 1)) else LVL="$SHLVL" fi if [ "$LVL" != 1 ]; then color -c white "[$LVL] " fi fi } timestamp() { color -c blacki '\T' } path() { color -c yellowb '\w/' } guix_env() { if [ "$GUIX_ENVIRONMENT" != '' ]; then printf '\n' color -c blacki '~> ' color -c purple 'guix environment ' printf '(' color -c blueb "$GUIX_ENVIRONMENT" printf ')' fi } in_nix_shell() { if [ "$IN_NIX_SHELL" != '' ]; then printf '\n' color -c blacki '~> ' color -c purpleb "$IN_NIX_SHELL " color -c purple 'nix-shell ' printf '(' color -c blueb "${name:-}" printf ')' fi } PS1='`error_marker`'$(timestamp)' '$(path)' `shell_level``repo_status``guix_env``in_nix_shell` $ ' vcs_status() { git status "$@" } vcs_diff() { git diff "$@" } vcs_diff_staged() { git diff --staged "$@" }