#!/usr/bin/env bash
# This script sets iTerm2 user-defined variables describing the state of the git
# repo in the current directory.
#
# For more information on the status bar, see:
# https://www.iterm2.com/3.3/documentation-status-bar.html
#
# Installation instructions for this script:
#
# bash: Place this in .bashrc.
# --------------------------------------------------------------------------------------
# function iterm2_print_user_vars() {
#   it2git
# }

# fish: Place this in ~/.config/fish/config.fish after the line
#       "source ~/.iterm2_shell_integration.fish".
# --------------------------------------------------------------------------------------
# function iterm2_print_user_vars
#   it2git
# end

# tcsh: Place this in .tcshrc
# --------------------------------------------------------------------------------------
# alias get_current_branch "bash -c '((git branch 2> /dev/null) | grep \* | cut -c3-)'"
# alias _iterm2_user_defined_vars 'it2git'

# zsh:Place this in .zshrc after "source /Users/georgen/.iterm2_shell_integration.zsh".
# --------------------------------------------------------------------------------------
# iterm2_print_user_vars() {
#   it2git
# }

GIT_BINARY=/usr/bin/git

dirty() {
    # Outputs "dirty" or "clean"
    OUTPUT=$("$GIT_BINARY" status --porcelain --ignore-submodules -unormal 2>/dev/null)
    if (($?)); then
        echo "clean"
        return
    fi
    if [ -z "$OUTPUT" ]; then
        echo "clean"
    else
        echo "dirty"
    fi
}

counts() {
    OUTPUT=$("$GIT_BINARY" rev-list --left-right --count HEAD...@'{u}' 2>/dev/null)
    if (($?)); then
        echo "error"
        return
    fi
    echo "$OUTPUT"
}

branch() {
    OUTPUT=$("$GIT_BINARY" symbolic-ref -q --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null)
    if (($?)); then
        return
    fi
    echo "$OUTPUT"
}

adds() {
    "${GIT_BINARY}" ls-files --others --exclude-standard | wc -l
}

deletes() {
    "${GIT_BINARY}" ls-files --deleted --exclude-standard | wc -l
}
function iterm2_begin_osc {
  printf "\033]"
}

function iterm2_end_osc {
  printf "\007"
}

function iterm2_set_user_var() {
  iterm2_begin_osc
  printf "1337;SetUserVar=%s=%s" "$1" $(printf "%s" "$2" | base64 | tr -d '\n')
  iterm2_end_osc
}

git_poll () {
    DIRECTORY="$1"
    cd "$DIRECTORY"
    DIRTY=$(dirty)
    COUNTS=$(counts)
    PUSH_COUNT=$(cut -f1 <<< "$COUNTS")
    PULL_COUNT=$(cut -f2 <<< "$COUNTS")
    BRANCH=$(branch)
    ADDS=$(adds)
    DELETES=$(deletes)

    iterm2_set_user_var gitBranch "$BRANCH"
    iterm2_set_user_var gitDirty "$DIRTY"
    iterm2_set_user_var gitPushCount "$PUSH_COUNT"
    iterm2_set_user_var gitPullCount "$PULL_COUNT"
    iterm2_set_user_var gitAdds "$ADDS"
    iterm2_set_user_var gitDeletes "$DELETES"
}

"$GIT_BINARY" rev-parse --git-dir 2>/dev/null >/dev/null
if (($?)); then
    iterm2_set_user_var gitBranch ""
    iterm2_set_user_var gitDirty ""
    iterm2_set_user_var gitPushCount ""
    iterm2_set_user_var gitPullCount ""
    iterm2_set_user_var gitAdds ""
    iterm2_set_user_var gitDeletes ""
else
    git_poll "$PWD"
fi


