export SSH_AUTH_SOCK="${HOME}/.ssh/ssh_auth_sock"

completion_path='/usr/share/bash-completion/bash_completion'
[[ -r "${completion_path}" ]] && . "${completion_path}"

# grc
colorize() {
        local cmds cmd
        cmds=(\
            cc configure cvs df diff dig gcc gmake id ip last lsof make mount \
            mtr netstat ping ping6 ps tcpdump traceroute traceroute6 \
        )
        for cmd in ${cmds[@]}; do
            alias ${cmd}="command grc -es --colour=auto ${cmd}"
        done
}
if [[ -x $(type -P grc) ]]; then
    colorize
    unset -f colorize
fi

# because fuck you thats' why
fuck() { echo 'no, fuck you'; }

# some cool git stuff
gdiff() { /usr/bin/git diff --color "$@"; }

gdf()
{
    local fancydiff='/usr/bin/diff-so-fancy'
    local githighlight='/usr/share/git/diff-highlight/diff-highlight'
    if [[ -x ${fancydiff} ]]; then
        gdiff "$@" | ${fancydiff} | less --tabs=4 -RSFX
    elif [[ -x ${githighlight} ]]; then
        gdiff "$@" | ${githighlight} | less --tabs=4 -RSFX
    else
        gdiff "$@"
    fi
}

is_git_repo()
{
    local curr_dir="$PWD"
    while [[ -n "${curr_dir}" ]]; do
        if [[ -r "${curr_dir}/.git/HEAD" ]]; then
            return 0
        else
            curr_dir="${curr_dir%/*}"
        fi
    done
    return 1
}

git_prompt()
{
    prompt_command

    is_git_repo || return 0

    local raw_status="$(git status --porcelain -bu 2>/dev/null)"
    local branch_info full_status IFS=
    local git_status=''
    local staged_count=0
    local unstaged_count=0
    local untracked_count=0
    local unmerged_count=0

    while read line; do
        [[ "${line:0:2}" == '##'                 ]] && branch_info="${line:3}"
        [[ "${line:0:2}" == '??'                 ]] && (( untracked_count++ ))
        [[ "${line:0:2}" =~ .[MD]                ]] && (( unstaged_count++ ))
        [[ "${line:0:2}" =~ [MDARC].             ]] && (( staged_count++ ))
        [[ "${line:0:2}" =~ (U[ADU]|A[AU]|D[DU]) ]] && (( unmerged_count++ ))
    done <<< "${raw_status}"

    (( unstaged_count     )) && git_status+="${ppurple}~${unstaged_count}"
    (( staged_count       )) && git_status+="${pblue}+${staged_count}"
    (( untracked_count    )) && git_status+="${pred}-${untracked_count}"
    (( unmerged_count     )) && git_status+="${porange}*${unmerged_count}"
    [[ -z "${git_status}" ]] && git_status="${pgreen}ok"

    full_status="{ ${pgray3}${branch_info}${preset} | ${git_status}${preset} }"

    if [[ -n "${OLD_PROMPT}" ]]; then
        PS1="${ps_line1} ${full_status}\n${ps_line2}"
    else
        echo ${full_status}
    fi
}

gitmode()
{
    if [[ -n "${OLD_PROMPT}" ]]; then
        PROMPT_COMMAND=${OLD_PROMPT}
        unset OLD_PROMPT
    else
        OLD_PROMPT=${PROMPT_COMMAND}
        PROMPT_COMMAND=git_prompt
    fi
}

gitmode