]> git.zndr.dk Git - dotfiles.git/commitdiff
Rename bash folder to rc
authorJannik ZANDER <jzander@grundfos.com>
Sat, 21 May 2016 19:23:46 +0000 (21:23 +0200)
committerJannik ZANDER <jzander@grundfos.com>
Sat, 21 May 2016 19:23:46 +0000 (21:23 +0200)
27 files changed:
.config/bash/bashrc
.config/bash/profile.d/aliases [deleted file]
.config/bash/profile.d/completion [deleted file]
.config/bash/profile.d/exports [deleted file]
.config/bash/profile.d/extra [deleted file]
.config/bash/profile.d/functions [deleted file]
.config/bash/profile.d/fzf.bash [deleted file]
.config/bash/profile.d/fzf.functions [deleted file]
.config/bash/profile.d/git-completion.bash [deleted file]
.config/bash/profile.d/git-prompt.sh [deleted file]
.config/bash/profile.d/options [deleted file]
.config/bash/profile.d/paths [deleted file]
.config/bash/profile.d/prompt [deleted file]
.config/bash/profile.d/solarized [deleted file]
.config/bash/rc/aliases [new file with mode: 0644]
.config/bash/rc/completion [new file with mode: 0644]
.config/bash/rc/exports [new file with mode: 0644]
.config/bash/rc/extra [new file with mode: 0644]
.config/bash/rc/functions [new file with mode: 0644]
.config/bash/rc/fzf.bash [new file with mode: 0644]
.config/bash/rc/fzf.functions [new file with mode: 0644]
.config/bash/rc/git-completion.bash [new file with mode: 0644]
.config/bash/rc/git-prompt.sh [new file with mode: 0644]
.config/bash/rc/options [new file with mode: 0644]
.config/bash/rc/paths [new file with mode: 0644]
.config/bash/rc/prompt [new file with mode: 0644]
.config/bash/rc/solarized [new file with mode: 0644]

index 5c2c08cf13a8a54fa2ae4020878eaa667eb82908..66122c720dff15145148ae676d21732360b58023 100644 (file)
@@ -22,9 +22,9 @@ echo Now running on $PLATFORM platform
 
 
 # Load settings
-for file in ${HOME}/.config/bash/profile.d/*; do
+for file in ${HOME}/.config/bash/rc/*; do
     [ -f "$file" ] && source "$file";
 done;
 
 # Local/private settings
-[ -f "${HOME}/.bashrc_local" ] && source "${HOME}/.bashrc_local"
+[ -f "${HOME}/.config/bash/bashrc_local" ] && source "${HOME}/.config/bash/bashrc_local"
diff --git a/.config/bash/profile.d/aliases b/.config/bash/profile.d/aliases
deleted file mode 100644 (file)
index 75eaa0c..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-# Easier navigation: .., ..., ...., ....., ~ and -
-alias ..="cd .."
-alias ...="cd ../.."
-alias ....="cd ../../.."
-alias .....="cd ../../../.."
-alias ~="cd ~" # `cd` is probably faster to type though
-alias -- -="cd -"
-alias cd=cd_func
-alias -- --="cd --"
-alias -- -0="cd -0"
-alias -- -1="cd -1"
-alias -- -2="cd -2"
-alias -- -3="cd -3"
-alias -- -4="cd -4"
-alias -- -5="cd -5"
-alias -- -6="cd -6"
-alias -- -7="cd -7"
-alias -- -8="cd -8"
-alias -- -9="cd -9"
-
-# Secure settings
-alias rm='rm -i'
-alias cp='cp -i'
-alias mv='mv -i'
-
-alias info='info --vi-keys'
-#alias less='less -rX'                         # raw control characters, don't clear the screen after quitting
-alias whence='type -a'                        # where, of a sort
-alias grep='grep --color'                     # show differences in color
-alias egrep='egrep --color=auto'              # show differences in color
-alias fgrep='fgrep --color=auto'              # show differences in color
-
-# Shortcuts
-alias g="git"
-alias h="history"
-alias j="jobs"
-
-LS_COMMON="-hF"
-#LS_COMMON="$LS_COMMON -I NTUSER.\* -I ntuser.\*"
-
-# Detect which `ls` flavor is in use
-if whence dircolors > /dev/null 2>&1; then # GNU `ls`
-       eval $(dircolors -b $HOME/.dir_colors)
-       colorflag="--color"
-else # OS X `ls`
-       #eval $(gdircolors $HOME/.dircolors)
-       export CLICOLOR=1
-       colorflag="-G"
-fi
-
-# Always list colorized
-LS_COMMON="$LS_COMMON $colorflag"
-alias ls="command ls $LS_COMMON"
-
-# List all files excl. dotfiles
-alias l="ls"
-
-# List all files in long format excl. dotfiles
-alias ll="ls -l"
-
-# List all files in long format, incl. dotfiles
-alias la="ls -la"
-
-# List only directories
-alias lsd="ls -l | grep --color=never '^d'"
-
-# List only dotfiles
-alias l.="ls -d .*"
-
-# Enable aliases to be sudo'ed
-alias sudo='sudo '
-
-# Get week number
-alias week='date +%V'
-
-# Stopwatch
-alias timer='echo "Timer started. Stop with Ctrl-D." && date && time cat && date'
-
-# Intuitive map function
-# For example, to list all directories that contain a certain file:
-# find . -name .gitattributes | map dirname
-alias map="xargs -n1"
-
-for method in GET HEAD POST PUT DELETE TRACE OPTIONS; do
-       alias "$method"="lwp-request -m '$method'"
-done
-
-# Reload the shell (i.e. invoke as a login shell)
-alias reload="exec $SHELL -l"
-
-# alias bashhere='chere -il -t mintty -s bash'
-alias newterm='mintty /bin/env CHERE_INVOKING=1 /bin/bash -l &'
-alias gtypist='gtypist -wi'
-alias startxwin='run /usr/bin/bash.exe -l -c "/usr/bin/startxwin -- -nolock -unixkill"'
-alias sumatra='startSumatra.sh'
-alias lynx='lynx -use_mouse'
-alias startvnc='vncserver -geometry 1870x980 -depth 24'
-alias startvnc4='vnc4server -geometry 1870x980 -depth 24'
-alias python='/usr/local/bin/python3'
-alias git_local='git --git-dir=.git_local'
diff --git a/.config/bash/profile.d/completion b/.config/bash/profile.d/completion
deleted file mode 100644 (file)
index 11c6d16..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# Add tab completion for many Bash commands
-
-[ ! -f /etc/bash_completion ] || . /etc/bash_completion
-
-# Enable tab completion for `g` by marking it as an alias for `git`
-if type _git &> /dev/null; then
-       complete -o default -o nospace -F _git g;
-fi;
-
-# Add tab completion for SSH hostnames based on ~/.ssh/config, ignoring wildcards
-if [ -e "$HOME/.ssh/config" ]; then
-  complete -o "default" -o "nospace" -W "$(grep "^Host" ~/.ssh/config | grep -v "[?*]" | cut -d " " -f2 | tr ' ' '\n')" scp sftp ssh;
-fi;
diff --git a/.config/bash/profile.d/exports b/.config/bash/profile.d/exports
deleted file mode 100644 (file)
index c9b413c..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-
-# Make vim the default editor
-export EDITOR="vim";
-export VISUAL="vim";
-export MYVIMRC="$HOME/.config/vim/vimrc"
-
-# Larger bash history (allow 32³ entries; default is 500)
-export HISTSIZE=32768;
-export HISTFILESIZE=$HISTSIZE;
-export HISTCONTROL=ignoreboth;
-# Make some commands not show up in history
-export HISTIGNORE="ls:cd:cd -:pwd:exit:date:* --help";
-export HISTFILE="$HOME/.cache/bash/history";
-# Whenever displaying the prompt, write the previous line to disk
-export PROMPT_COMMAND="history -a";
-
-# Prefer US English and use UTF-8
-# export LANG=$(locale -uU)
-export LANG="en_US.UTF-8";
-export LC_ALL="en_US.UTF-8";
-
-# Highlight section titles in manual pages
-export LESS_TERMCAP_md="${yellow}";
-
-# Don’t clear the screen after quitting a manual page
-export MANPAGER="less -X";
-
-# Always enable colored `grep` output
-#export GREP_OPTIONS="--color=auto";
-
-# Set up syntax highlighting for 'less' (requires source-highlight package)
-# See http://www.gnu.org/software/src-highlite/source-highlight.html
-# export LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s"
-export LESS=-eFRX
-
-# Tell lynx where the color settings are that were adjusted for the
-# Solarized color scheme
-export LYNX_LSS=$HOME/.config/lynx.lss
-
diff --git a/.config/bash/profile.d/extra b/.config/bash/profile.d/extra
deleted file mode 100644 (file)
index 944ac72..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-# Platform specific
-if [ "$PLATFORM" == "Msys" ]; then
-  # Mount the portable Documents folder, if it isn't already
-  if [ ! -d Documents ]; then
-    mount "${USBDRV}\Documents" "${HOME}/Documents";
-  fi
-fi
-
-if [ "$PLATFORM" == "Cygwin" ]; then
-  # Mount the portable Documents folder, if it isn't already
-  if [ ! -d Documents ]; then
-    mount -f -o noacl,posix=0 ${USBDRV}/Documents ${HOME}/Documents;
-  fi
-fi
diff --git a/.config/bash/profile.d/functions b/.config/bash/profile.d/functions
deleted file mode 100644 (file)
index eac18eb..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-# Create a new directory and enter it
-function mkd() {
-       mkdir -p "$@" && cd "$@";
-}
-
-# Change working directory to the top-most Finder window location
-function cdf() { # short for `cdfinder`
-       cd "$(osascript -e 'tell app "Finder" to POSIX path of (insertion location as alias)')";
-}
-
-# Create a .tar.gz archive, using `zopfli`, `pigz` or `gzip` for compression
-function targz() {
-       local tmpFile="${@%/}.tar";
-       tar -cvf "${tmpFile}" --exclude=".DS_Store" "${@}" || return 1;
-
-       size=$(
-               stat -f"%z" "${tmpFile}" 2> /dev/null; # OS X `stat`
-               stat -c"%s" "${tmpFile}" 2> /dev/null # GNU `stat`
-       );
-
-       local cmd="";
-       if (( size < 52428800 )) && hash zopfli 2> /dev/null; then
-               # the .tar file is smaller than 50 MB and Zopfli is available; use it
-               cmd="zopfli";
-       else
-               if hash pigz 2> /dev/null; then
-                       cmd="pigz";
-               else
-                       cmd="gzip";
-               fi;
-       fi;
-
-       echo "Compressing .tar using \`${cmd}\`\85";
-       "${cmd}" -v "${tmpFile}" || return 1;
-       [ -f "${tmpFile}" ] && rm "${tmpFile}";
-       echo "${tmpFile}.gz created successfully.";
-}
-
-# Determine size of a file or total size of a directory
-function fs() {
-       if du -b /dev/null > /dev/null 2>&1; then
-               local arg=-sbh;
-       else
-               local arg=-sh;
-       fi
-       if [[ -n "$@" ]]; then
-               du $arg -- "$@";
-       else
-               du $arg .[^.]* *;
-       fi;
-}
-
-# Use Git\92s colored diff when available
-hash git &>/dev/null;
-if [ $? -eq 0 ]; then
-       function diff() {
-               git diff --no-index --color-words "$@";
-       }
-fi;
-
-# Create a data URL from a file
-function dataurl() {
-       local mimeType=$(file -b --mime-type "$1");
-       if [[ $mimeType == text/* ]]; then
-               mimeType="${mimeType};charset=utf-8";
-       fi
-       echo "data:${mimeType};base64,$(openssl base64 -in "$1" | tr -d '\n')";
-}
-
-# Create a git.io short URL
-function gitio() {
-       if [ -z "${1}" -o -z "${2}" ]; then
-               echo "Usage: \`gitio slug url\`";
-               return 1;
-       fi;
-       curl -i http://git.io/ -F "url=${2}" -F "code=${1}";
-}
-
-# Start an HTTP server from a directory, optionally specifying the port
-function server() {
-       local port="${1:-8000}";
-       sleep 1 && open "http://localhost:${port}/" &
-       # Set the default Content-Type to `text/plain` instead of `application/octet-stream`
-       # And serve everything as UTF-8 (although not technically correct, this doesn\92t break anything for binary files)
-       python -c $'import SimpleHTTPServer;\nmap = SimpleHTTPServer.SimpleHTTPRequestHandler.extensions_map;\nmap[""] = "text/plain";\nfor key, value in map.items():\n\tmap[key] = value + ";charset=UTF-8";\nSimpleHTTPServer.test();' "$port";
-}
-
-# Start a PHP server from a directory, optionally specifying the port
-# (Requires PHP 5.4.0+.)
-function phpserver() {
-       local port="${1:-4000}";
-       local ip=$(ipconfig getifaddr en1);
-       sleep 1 && open "http://${ip}:${port}/" &
-       php -S "${ip}:${port}";
-}
-
-# Compare original and gzipped file size
-function gz() {
-       local origsize=$(wc -c < "$1");
-       local gzipsize=$(gzip -c "$1" | wc -c);
-       local ratio=$(echo "$gzipsize * 100 / $origsize" | bc -l);
-       printf "orig: %d bytes\n" "$origsize";
-       printf "gzip: %d bytes (%2.2f%%)\n" "$gzipsize" "$ratio";
-}
-
-# Syntax-highlight JSON strings or files
-# Usage: `json '{"foo":42}'` or `echo '{"foo":42}' | json`
-function json() {
-       if [ -t 0 ]; then # argument
-               python -mjson.tool <<< "$*" | pygmentize -l javascript;
-       else # pipe
-               python -mjson.tool | pygmentize -l javascript;
-       fi;
-}
-
-# Run `dig` and display the most useful info
-function digga() {
-       dig +nocmd "$1" any +multiline +noall +answer;
-}
-
-# UTF-8-encode a string of Unicode symbols
-function escape() {
-       printf "\\\x%s" $(printf "$@" | xxd -p -c1 -u);
-       # print a newline unless we\92re piping the output to another program
-       if [ -t 1 ]; then
-               echo ""; # newline
-       fi;
-}
-
-# Decode \x{ABCD}-style Unicode escape sequences
-function unidecode() {
-       perl -e "binmode(STDOUT, ':utf8'); print \"$@\"";
-       # print a newline unless we\92re piping the output to another program
-       if [ -t 1 ]; then
-               echo ""; # newline
-       fi;
-}
-
-# Get a character\92s Unicode code point
-function codepoint() {
-       perl -e "use utf8; print sprintf('U+%04X', ord(\"$@\"))";
-       # print a newline unless we\92re piping the output to another program
-       if [ -t 1 ]; then
-               echo ""; # newline
-       fi;
-}
-
-# Show all the names (CNs and SANs) listed in the SSL certificate
-# for a given domain
-function getcertnames() {
-       if [ -z "${1}" ]; then
-               echo "ERROR: No domain specified.";
-               return 1;
-       fi;
-
-       local domain="${1}";
-       echo "Testing ${domain}\85";
-       echo ""; # newline
-
-       local tmp=$(echo -e "GET / HTTP/1.0\nEOT" \
-               | openssl s_client -connect "${domain}:443" 2>&1);
-
-       if [[ "${tmp}" = *"-----BEGIN CERTIFICATE-----"* ]]; then
-               local certText=$(echo "${tmp}" \
-                       | openssl x509 -text -certopt "no_header, no_serial, no_version, \
-                       no_signame, no_validity, no_issuer, no_pubkey, no_sigdump, no_aux");
-                       echo "Common Name:";
-                       echo ""; # newline
-                       echo "${certText}" | grep "Subject:" | sed -e "s/^.*CN=//";
-                       echo ""; # newline
-                       echo "Subject Alternative Name(s):";
-                       echo ""; # newline
-                       echo "${certText}" | grep -A 1 "Subject Alternative Name:" \
-                               | sed -e "2s/DNS://g" -e "s/ //g" | tr "," "\n" | tail -n +2;
-                       return 0;
-       else
-               echo "ERROR: Certificate not found.";
-               return 1;
-       fi;
-}
-
-# `s` with no arguments opens the current directory in Sublime Text, otherwise
-# opens the given location
-function s() {
-       if [ $# -eq 0 ]; then
-               subl .;
-       else
-               subl "$@";
-       fi;
-}
-
-# `a` with no arguments opens the current directory in Atom Editor, otherwise
-# opens the given location
-function a() {
-       if [ $# -eq 0 ]; then
-               atom .;
-       else
-               atom "$@";
-       fi;
-}
-
-# `v` with no arguments opens the current directory in Vim, otherwise opens the
-# given location
-function v() {
-       if [ $# -eq 0 ]; then
-               vim .;
-       else
-               vim "$@";
-       fi;
-}
-
-# `o` with no arguments opens the current directory, otherwise opens the given
-# location
-function o() {
-       if [ $# -eq 0 ]; then
-               open .;
-       else
-               open "$@";
-       fi;
-}
-
-# `tre` is a shorthand for `tree` with hidden files and color enabled, ignoring
-# the `.git` directory, listing directories first. The output gets piped into
-# `less` with options to preserve color and line numbers, unless the output is
-# small enough for one screen.
-function tre() {
-       tree -aC -I '.git|node_modules|bower_components' --dirsfirst "$@" | less -FRNX;
-}
-
-repo_co ()
-{
-  repo forall -c 'pwd; git checkout '$1
-}
-
-git_getproj ()
-{
-  git remote -v | head -n1 | awk '{print $2}' | sed 's/.*29418\///'
-}
-
-# This function defines a 'cd' replacement function capable of keeping,
-# displaying and accessing history of visited directories, up to 10 entries.
-# To use it, uncomment it, source this file and try 'cd --'.
-# acd_func 1.0.5, 10-nov-2004
-# Petar Marinov, http:/geocities.com/h2428, this is public domain
-
-cd_func()
-{
-  local x2 the_new_dir adir index
-  local -i cnt
-
-  if [[ $1 ==  "--" ]]; then
-    dirs -v
-    return 0
-  fi
-
-  the_new_dir=$1
-  [[ -z $1 ]] && the_new_dir=$HOME
-
-  if [[ ${the_new_dir:0:1} == '-' ]]; then
-    #
-    # Extract dir N from dirs
-    index=${the_new_dir:1}
-    [[ -z $index ]] && index=1
-    adir=$(dirs +$index)
-    [[ -z $adir ]] && return 1
-    the_new_dir=$adir
-  fi
-
-  #
-  # '~' has to be substituted by ${HOME}
-  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"
-
-  #
-  # Now change to the new dir and add to the top of the stack
-  pushd "${the_new_dir}" > /dev/null
-  [[ $? -ne 0 ]] && return 1
-  the_new_dir=$(pwd)
-
-  #
-  # Trim down everything beyond 11th entry
-  popd -n +11 2>/dev/null 1>/dev/null
-
-  #
-  # Remove any other occurence of this dir, skipping the top of the stack
-  for ((cnt=1; cnt <= 10; cnt++)); do
-    x2=$(dirs +${cnt} 2>/dev/null)
-    [[ $? -ne 0 ]] && return 0
-    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
-    if [[ "${x2}" == "${the_new_dir}" ]]; then
-      popd -n +$cnt 2>/dev/null 1>/dev/null
-      cnt=cnt-1
-    fi
-  done
-
-  return 0
-}
diff --git a/.config/bash/profile.d/fzf.bash b/.config/bash/profile.d/fzf.bash
deleted file mode 100644 (file)
index 77d2e66..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# Setup fzf
-# ---------
-
-
-if [ -d "/usr/local/opt/fzf" ]; then
-
-if [[ ! "$PATH" == */usr/local/opt/fzf/bin* ]]; then
-  export PATH="$PATH:/usr/local/opt/fzf/bin"
-fi
-
-# Man path
-# --------
-if [[ ! "$MANPATH" == */usr/local/opt/fzf/man* && -d "/usr/local/opt/fzf/man" ]]; then
-  export MANPATH="$MANPATH:/usr/local/opt/fzf/man"
-fi
-
-# Auto-completion
-# ---------------
-[[ $- == *i* ]] && source "/usr/local/opt/fzf/shell/completion.bash" 2> /dev/null
-
-# Key bindings
-# ------------
-source "/usr/local/opt/fzf/shell/key-bindings.bash"
-
-
-fi
diff --git a/.config/bash/profile.d/fzf.functions b/.config/bash/profile.d/fzf.functions
deleted file mode 100644 (file)
index 03db9cc..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-export FZF_DEFAULT_OPTS='-m'
-
-fe() {
-    # fe - Open the selected files with the default editor
-    local files=$(fzf --query="$1" --select-1 --exit-0 | sed -e "s/\(.*\)/\'\1\'/")
-    local command="${EDITOR:-vim} -p $files"
-    [ -n "$files" ] && eval $command
-}
-
-fd() {
-    # fd - cd to selected directory
-    local dir
-    dir=$(find ${1:-*} -path '*/\.*' -prune -o -type d -print 2> /dev/null | fzf +m) &&
-    cd "$dir"
-}
-
-fh() {
-    # fh - repeat history
-    eval $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//')
-}
-
-fkill() {
-    # fkill - kill process
-    pid=$(ps -ef | sed 1d | fzf -m | awk '{print $2}')
-    if [ "x$pid" != "x" ]
-    then
-        kill -${1:-9} $pid
-    fi
-}
diff --git a/.config/bash/profile.d/git-completion.bash b/.config/bash/profile.d/git-completion.bash
deleted file mode 100644 (file)
index 1ce3c51..0000000
+++ /dev/null
@@ -1,2777 +0,0 @@
-# bash/zsh completion support for core Git.
-#
-# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
-# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
-# Distributed under the GNU General Public License, version 2.0.
-#
-# The contained completion routines provide support for completing:
-#
-#    *) local and remote branch names
-#    *) local and remote tag names
-#    *) .git/remotes file names
-#    *) git 'subcommands'
-#    *) git email aliases for git-send-email
-#    *) tree paths within 'ref:path/to/file' expressions
-#    *) file paths within current working directory and index
-#    *) common --long-options
-#
-# To use these routines:
-#
-#    1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
-#    2) Add the following line to your .bashrc/.zshrc:
-#        source ~/.git-completion.bash
-#    3) Consider changing your PS1 to also show the current branch,
-#       see git-prompt.sh for details.
-#
-# If you use complex aliases of form '!f() { ... }; f', you can use the null
-# command ':' as the first command in the function body to declare the desired
-# completion style.  For example '!f() { : git commit ; ... }; f' will
-# tell the completion to use commit completion.  This also works with aliases
-# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
-
-case "$COMP_WORDBREAKS" in
-*:*) : great ;;
-*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
-esac
-
-# __gitdir accepts 0 or 1 arguments (i.e., location)
-# returns location of .git repo
-__gitdir ()
-{
-  if [ -z "${1-}" ]; then
-    if [ -n "${__git_dir-}" ]; then
-      echo "$__git_dir"
-    elif [ -n "${GIT_DIR-}" ]; then
-      test -d "${GIT_DIR-}" || return 1
-      echo "$GIT_DIR"
-    elif [ -d .git ]; then
-      echo .git
-    else
-      git rev-parse --git-dir 2>/dev/null
-    fi
-  elif [ -d "$1/.git" ]; then
-    echo "$1/.git"
-  else
-    echo "$1"
-  fi
-}
-
-# The following function is based on code from:
-#
-#   bash_completion - programmable completion functions for bash 3.2+
-#
-#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
-#             © 2009-2010, Bash Completion Maintainers
-#                     <bash-completion-devel@lists.alioth.debian.org>
-#
-#   This program is free software; you can redistribute it and/or modify
-#   it under the terms of the GNU General Public License as published by
-#   the Free Software Foundation; either version 2, or (at your option)
-#   any later version.
-#
-#   This program is distributed in the hope that it will be useful,
-#   but WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#   GNU General Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License
-#   along with this program; if not, write to the Free Software Foundation,
-#   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-#   The latest version of this software can be obtained here:
-#
-#   http://bash-completion.alioth.debian.org/
-#
-#   RELEASE: 2.x
-
-# This function can be used to access a tokenized list of words
-# on the command line:
-#
-# __git_reassemble_comp_words_by_ref '=:'
-# if test "${words_[cword_-1]}" = -w
-# then
-#   ...
-# fi
-#
-# The argument should be a collection of characters from the list of
-# word completion separators (COMP_WORDBREAKS) to treat as ordinary
-# characters.
-#
-# This is roughly equivalent to going back in time and setting
-# COMP_WORDBREAKS to exclude those characters.  The intent is to
-# make option types like --date=<type> and <rev>:<path> easy to
-# recognize by treating each shell word as a single token.
-#
-# It is best not to set COMP_WORDBREAKS directly because the value is
-# shared with other completion scripts.  By the time the completion
-# function gets called, COMP_WORDS has already been populated so local
-# changes to COMP_WORDBREAKS have no effect.
-#
-# Output: words_, cword_, cur_.
-
-__git_reassemble_comp_words_by_ref()
-{
-  local exclude i j first
-  # Which word separators to exclude?
-  exclude="${1//[^$COMP_WORDBREAKS]}"
-  cword_=$COMP_CWORD
-  if [ -z "$exclude" ]; then
-    words_=("${COMP_WORDS[@]}")
-    return
-  fi
-  # List of word completion separators has shrunk;
-  # re-assemble words to complete.
-  for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
-    # Append each nonempty word consisting of just
-    # word separator characters to the current word.
-    first=t
-    while
-      [ $i -gt 0 ] &&
-      [ -n "${COMP_WORDS[$i]}" ] &&
-      # word consists of excluded word separators
-      [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
-    do
-      # Attach to the previous token,
-      # unless the previous token is the command name.
-      if [ $j -ge 2 ] && [ -n "$first" ]; then
-        ((j--))
-      fi
-      first=
-      words_[$j]=${words_[j]}${COMP_WORDS[i]}
-      if [ $i = $COMP_CWORD ]; then
-        cword_=$j
-      fi
-      if (($i < ${#COMP_WORDS[@]} - 1)); then
-        ((i++))
-      else
-        # Done.
-        return
-      fi
-    done
-    words_[$j]=${words_[j]}${COMP_WORDS[i]}
-    if [ $i = $COMP_CWORD ]; then
-      cword_=$j
-    fi
-  done
-}
-
-if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
-_get_comp_words_by_ref ()
-{
-  local exclude cur_ words_ cword_
-  if [ "$1" = "-n" ]; then
-    exclude=$2
-    shift 2
-  fi
-  __git_reassemble_comp_words_by_ref "$exclude"
-  cur_=${words_[cword_]}
-  while [ $# -gt 0 ]; do
-    case "$1" in
-    cur)
-      cur=$cur_
-      ;;
-    prev)
-      prev=${words_[$cword_-1]}
-      ;;
-    words)
-      words=("${words_[@]}")
-      ;;
-    cword)
-      cword=$cword_
-      ;;
-    esac
-    shift
-  done
-}
-fi
-
-__gitcompappend ()
-{
-  local x i=${#COMPREPLY[@]}
-  for x in $1; do
-    if [[ "$x" == "$3"* ]]; then
-      COMPREPLY[i++]="$2$x$4"
-    fi
-  done
-}
-
-__gitcompadd ()
-{
-  COMPREPLY=()
-  __gitcompappend "$@"
-}
-
-# Generates completion reply, appending a space to possible completion words,
-# if necessary.
-# It accepts 1 to 4 arguments:
-# 1: List of possible completion words.
-# 2: A prefix to be added to each possible completion word (optional).
-# 3: Generate possible completion matches for this word (optional).
-# 4: A suffix to be appended to each possible completion word (optional).
-__gitcomp ()
-{
-  local cur_="${3-$cur}"
-
-  case "$cur_" in
-  --*=)
-    ;;
-  *)
-    local c i=0 IFS=$' \t\n'
-    for c in $1; do
-      c="$c${4-}"
-      if [[ $c == "$cur_"* ]]; then
-        case $c in
-        --*=*|*.) ;;
-        *) c="$c " ;;
-        esac
-        COMPREPLY[i++]="${2-}$c"
-      fi
-    done
-    ;;
-  esac
-}
-
-# Variation of __gitcomp_nl () that appends to the existing list of
-# completion candidates, COMPREPLY.
-__gitcomp_nl_append ()
-{
-  local IFS=$'\n'
-  __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
-}
-
-# Generates completion reply from newline-separated possible completion words
-# by appending a space to all of them.
-# It accepts 1 to 4 arguments:
-# 1: List of possible completion words, separated by a single newline.
-# 2: A prefix to be added to each possible completion word (optional).
-# 3: Generate possible completion matches for this word (optional).
-# 4: A suffix to be appended to each possible completion word instead of
-#    the default space (optional).  If specified but empty, nothing is
-#    appended.
-__gitcomp_nl ()
-{
-  COMPREPLY=()
-  __gitcomp_nl_append "$@"
-}
-
-# Generates completion reply with compgen from newline-separated possible
-# completion filenames.
-# It accepts 1 to 3 arguments:
-# 1: List of possible completion filenames, separated by a single newline.
-# 2: A directory prefix to be added to each possible completion filename
-#    (optional).
-# 3: Generate possible completion matches for this word (optional).
-__gitcomp_file ()
-{
-  local IFS=$'\n'
-
-  # XXX does not work when the directory prefix contains a tilde,
-  # since tilde expansion is not applied.
-  # This means that COMPREPLY will be empty and Bash default
-  # completion will be used.
-  __gitcompadd "$1" "${2-}" "${3-$cur}" ""
-
-  # use a hack to enable file mode in bash < 4
-  compopt -o filenames +o nospace 2>/dev/null ||
-  compgen -f /non-existing-dir/ > /dev/null
-}
-
-# Execute 'git ls-files', unless the --committable option is specified, in
-# which case it runs 'git diff-index' to find out the files that can be
-# committed.  It return paths relative to the directory specified in the first
-# argument, and using the options specified in the second argument.
-__git_ls_files_helper ()
-{
-  if [ "$2" == "--committable" ]; then
-    git -C "$1" diff-index --name-only --relative HEAD
-  else
-    # NOTE: $2 is not quoted in order to support multiple options
-    git -C "$1" ls-files --exclude-standard $2
-  fi 2>/dev/null
-}
-
-
-# __git_index_files accepts 1 or 2 arguments:
-# 1: Options to pass to ls-files (required).
-# 2: A directory path (optional).
-#    If provided, only files within the specified directory are listed.
-#    Sub directories are never recursed.  Path must have a trailing
-#    slash.
-__git_index_files ()
-{
-  local dir="$(__gitdir)" root="${2-.}" file
-
-  if [ -d "$dir" ]; then
-    __git_ls_files_helper "$root" "$1" |
-    while read -r file; do
-      case "$file" in
-      ?*/*) echo "${file%%/*}" ;;
-      *) echo "$file" ;;
-      esac
-    done | sort | uniq
-  fi
-}
-
-__git_heads ()
-{
-  local dir="$(__gitdir)"
-  if [ -d "$dir" ]; then
-    git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
-      refs/heads
-    return
-  fi
-}
-
-__git_tags ()
-{
-  local dir="$(__gitdir)"
-  if [ -d "$dir" ]; then
-    git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
-      refs/tags
-    return
-  fi
-}
-
-# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
-# presence of 2nd argument means use the guess heuristic employed
-# by checkout for tracking branches
-__git_refs ()
-{
-  local i hash dir="$(__gitdir "${1-}")" track="${2-}"
-  local format refs
-  if [ -d "$dir" ]; then
-    case "$cur" in
-    refs|refs/*)
-      format="refname"
-      refs="${cur%/*}"
-      track=""
-      ;;
-    *)
-      for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
-        if [ -e "$dir/$i" ]; then echo $i; fi
-      done
-      format="refname:short"
-      refs="refs/tags refs/heads refs/remotes"
-      ;;
-    esac
-    git --git-dir="$dir" for-each-ref --format="%($format)" \
-      $refs
-    if [ -n "$track" ]; then
-      # employ the heuristic used by git checkout
-      # Try to find a remote branch that matches the completion word
-      # but only output if the branch name is unique
-      local ref entry
-      git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
-        "refs/remotes/" | \
-      while read -r entry; do
-        eval "$entry"
-        ref="${ref#*/}"
-        if [[ "$ref" == "$cur"* ]]; then
-          echo "$ref"
-        fi
-      done | sort | uniq -u
-    fi
-    return
-  fi
-  case "$cur" in
-  refs|refs/*)
-    git ls-remote "$dir" "$cur*" 2>/dev/null | \
-    while read -r hash i; do
-      case "$i" in
-      *^{}) ;;
-      *) echo "$i" ;;
-      esac
-    done
-    ;;
-  *)
-    echo "HEAD"
-    git for-each-ref --format="%(refname:short)" -- \
-      "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
-    ;;
-  esac
-}
-
-# __git_refs2 requires 1 argument (to pass to __git_refs)
-__git_refs2 ()
-{
-  local i
-  for i in $(__git_refs "$1"); do
-    echo "$i:$i"
-  done
-}
-
-# __git_refs_remotes requires 1 argument (to pass to ls-remote)
-__git_refs_remotes ()
-{
-  local i hash
-  git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
-  while read -r hash i; do
-    echo "$i:refs/remotes/$1/${i#refs/heads/}"
-  done
-}
-
-__git_remotes ()
-{
-  local d="$(__gitdir)"
-  test -d "$d/remotes" && ls -1 "$d/remotes"
-  git --git-dir="$d" remote
-}
-
-__git_list_merge_strategies ()
-{
-  git merge -s help 2>&1 |
-  sed -n -e '/[Aa]vailable strategies are: /,/^$/{
-    s/\.$//
-    s/.*://
-    s/^[  ]*//
-    s/[   ]*$//
-    p
-  }'
-}
-
-__git_merge_strategies=
-# 'git merge -s help' (and thus detection of the merge strategy
-# list) fails, unfortunately, if run outside of any git working
-# tree.  __git_merge_strategies is set to the empty string in
-# that case, and the detection will be repeated the next time it
-# is needed.
-__git_compute_merge_strategies ()
-{
-  test -n "$__git_merge_strategies" ||
-  __git_merge_strategies=$(__git_list_merge_strategies)
-}
-
-__git_complete_revlist_file ()
-{
-  local pfx ls ref cur_="$cur"
-  case "$cur_" in
-  *..?*:*)
-    return
-    ;;
-  ?*:*)
-    ref="${cur_%%:*}"
-    cur_="${cur_#*:}"
-    case "$cur_" in
-    ?*/*)
-      pfx="${cur_%/*}"
-      cur_="${cur_##*/}"
-      ls="$ref:$pfx"
-      pfx="$pfx/"
-      ;;
-    *)
-      ls="$ref"
-      ;;
-    esac
-
-    case "$COMP_WORDBREAKS" in
-    *:*) : great ;;
-    *)   pfx="$ref:$pfx" ;;
-    esac
-
-    __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
-        | sed '/^100... blob /{
-                   s,^.*  ,,
-                   s,$, ,
-               }
-               /^120000 blob /{
-                   s,^.*  ,,
-                   s,$, ,
-               }
-               /^040000 tree /{
-                   s,^.*  ,,
-                   s,$,/,
-               }
-               s/^.*  //')" \
-      "$pfx" "$cur_" ""
-    ;;
-  *...*)
-    pfx="${cur_%...*}..."
-    cur_="${cur_#*...}"
-    __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
-    ;;
-  *..*)
-    pfx="${cur_%..*}.."
-    cur_="${cur_#*..}"
-    __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
-    ;;
-  *)
-    __gitcomp_nl "$(__git_refs)"
-    ;;
-  esac
-}
-
-
-# __git_complete_index_file requires 1 argument:
-# 1: the options to pass to ls-file
-#
-# The exception is --committable, which finds the files appropriate commit.
-__git_complete_index_file ()
-{
-  local pfx="" cur_="$cur"
-
-  case "$cur_" in
-  ?*/*)
-    pfx="${cur_%/*}"
-    cur_="${cur_##*/}"
-    pfx="${pfx}/"
-    ;;
-  esac
-
-  __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
-}
-
-__git_complete_file ()
-{
-  __git_complete_revlist_file
-}
-
-__git_complete_revlist ()
-{
-  __git_complete_revlist_file
-}
-
-__git_complete_remote_or_refspec ()
-{
-  local cur_="$cur" cmd="${words[1]}"
-  local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
-  if [ "$cmd" = "remote" ]; then
-    ((c++))
-  fi
-  while [ $c -lt $cword ]; do
-    i="${words[c]}"
-    case "$i" in
-    --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
-    --all)
-      case "$cmd" in
-      push) no_complete_refspec=1 ;;
-      fetch)
-        return
-        ;;
-      *) ;;
-      esac
-      ;;
-    -*) ;;
-    *) remote="$i"; break ;;
-    esac
-    ((c++))
-  done
-  if [ -z "$remote" ]; then
-    __gitcomp_nl "$(__git_remotes)"
-    return
-  fi
-  if [ $no_complete_refspec = 1 ]; then
-    return
-  fi
-  [ "$remote" = "." ] && remote=
-  case "$cur_" in
-  *:*)
-    case "$COMP_WORDBREAKS" in
-    *:*) : great ;;
-    *)   pfx="${cur_%%:*}:" ;;
-    esac
-    cur_="${cur_#*:}"
-    lhs=0
-    ;;
-  +*)
-    pfx="+"
-    cur_="${cur_#+}"
-    ;;
-  esac
-  case "$cmd" in
-  fetch)
-    if [ $lhs = 1 ]; then
-      __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
-    else
-      __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
-    fi
-    ;;
-  pull|remote)
-    if [ $lhs = 1 ]; then
-      __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
-    else
-      __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
-    fi
-    ;;
-  push)
-    if [ $lhs = 1 ]; then
-      __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
-    else
-      __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
-    fi
-    ;;
-  esac
-}
-
-__git_complete_strategy ()
-{
-  __git_compute_merge_strategies
-  case "$prev" in
-  -s|--strategy)
-    __gitcomp "$__git_merge_strategies"
-    return 0
-  esac
-  case "$cur" in
-  --strategy=*)
-    __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
-    return 0
-    ;;
-  esac
-  return 1
-}
-
-__git_commands () {
-  if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
-  then
-    printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
-  else
-    git help -a|egrep '^  [a-zA-Z0-9]'
-  fi
-}
-
-__git_list_all_commands ()
-{
-  local i IFS=" "$'\n'
-  for i in $(__git_commands)
-  do
-    case $i in
-    *--*)             : helper pattern;;
-    *) echo $i;;
-    esac
-  done
-}
-
-__git_all_commands=
-__git_compute_all_commands ()
-{
-  test -n "$__git_all_commands" ||
-  __git_all_commands=$(__git_list_all_commands)
-}
-
-__git_list_porcelain_commands ()
-{
-  local i IFS=" "$'\n'
-  __git_compute_all_commands
-  for i in $__git_all_commands
-  do
-    case $i in
-    *--*)             : helper pattern;;
-    applymbox)        : ask gittus;;
-    applypatch)       : ask gittus;;
-    archimport)       : import;;
-    cat-file)         : plumbing;;
-    check-attr)       : plumbing;;
-    check-ignore)     : plumbing;;
-    check-mailmap)    : plumbing;;
-    check-ref-format) : plumbing;;
-    checkout-index)   : plumbing;;
-    column)           : internal helper;;
-    commit-tree)      : plumbing;;
-    count-objects)    : infrequent;;
-    credential)       : credentials;;
-    credential-*)     : credentials helper;;
-    cvsexportcommit)  : export;;
-    cvsimport)        : import;;
-    cvsserver)        : daemon;;
-    daemon)           : daemon;;
-    diff-files)       : plumbing;;
-    diff-index)       : plumbing;;
-    diff-tree)        : plumbing;;
-    fast-import)      : import;;
-    fast-export)      : export;;
-    fsck-objects)     : plumbing;;
-    fetch-pack)       : plumbing;;
-    fmt-merge-msg)    : plumbing;;
-    for-each-ref)     : plumbing;;
-    hash-object)      : plumbing;;
-    http-*)           : transport;;
-    index-pack)       : plumbing;;
-    init-db)          : deprecated;;
-    local-fetch)      : plumbing;;
-    ls-files)         : plumbing;;
-    ls-remote)        : plumbing;;
-    ls-tree)          : plumbing;;
-    mailinfo)         : plumbing;;
-    mailsplit)        : plumbing;;
-    merge-*)          : plumbing;;
-    mktree)           : plumbing;;
-    mktag)            : plumbing;;
-    pack-objects)     : plumbing;;
-    pack-redundant)   : plumbing;;
-    pack-refs)        : plumbing;;
-    parse-remote)     : plumbing;;
-    patch-id)         : plumbing;;
-    prune)            : plumbing;;
-    prune-packed)     : plumbing;;
-    quiltimport)      : import;;
-    read-tree)        : plumbing;;
-    receive-pack)     : plumbing;;
-    remote-*)         : transport;;
-    rerere)           : plumbing;;
-    rev-list)         : plumbing;;
-    rev-parse)        : plumbing;;
-    runstatus)        : plumbing;;
-    sh-setup)         : internal;;
-    shell)            : daemon;;
-    show-ref)         : plumbing;;
-    send-pack)        : plumbing;;
-    show-index)       : plumbing;;
-    ssh-*)            : transport;;
-    stripspace)       : plumbing;;
-    symbolic-ref)     : plumbing;;
-    unpack-file)      : plumbing;;
-    unpack-objects)   : plumbing;;
-    update-index)     : plumbing;;
-    update-ref)       : plumbing;;
-    update-server-info) : daemon;;
-    upload-archive)   : plumbing;;
-    upload-pack)      : plumbing;;
-    write-tree)       : plumbing;;
-    var)              : infrequent;;
-    verify-pack)      : infrequent;;
-    verify-tag)       : plumbing;;
-    *) echo $i;;
-    esac
-  done
-}
-
-__git_porcelain_commands=
-__git_compute_porcelain_commands ()
-{
-  test -n "$__git_porcelain_commands" ||
-  __git_porcelain_commands=$(__git_list_porcelain_commands)
-}
-
-# Lists all set config variables starting with the given section prefix,
-# with the prefix removed.
-__git_get_config_variables ()
-{
-  local section="$1" i IFS=$'\n'
-  for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
-    echo "${i#$section.}"
-  done
-}
-
-__git_pretty_aliases ()
-{
-  __git_get_config_variables "pretty"
-}
-
-__git_aliases ()
-{
-  __git_get_config_variables "alias"
-}
-
-# __git_aliased_command requires 1 argument
-__git_aliased_command ()
-{
-  local word cmdline=$(git --git-dir="$(__gitdir)" \
-    config --get "alias.$1")
-  for word in $cmdline; do
-    case "$word" in
-    \!gitk|gitk)
-      echo "gitk"
-      return
-      ;;
-    \!*)  : shell command alias ;;
-    -*) : option ;;
-    *=*)  : setting env ;;
-    git)  : git itself ;;
-    \(\))   : skip parens of shell function definition ;;
-    {)  : skip start of shell helper function ;;
-    :)  : skip null command ;;
-    \'*)  : skip opening quote after sh -c ;;
-    *)
-      echo "$word"
-      return
-    esac
-  done
-}
-
-# __git_find_on_cmdline requires 1 argument
-__git_find_on_cmdline ()
-{
-  local word subcommand c=1
-  while [ $c -lt $cword ]; do
-    word="${words[c]}"
-    for subcommand in $1; do
-      if [ "$subcommand" = "$word" ]; then
-        echo "$subcommand"
-        return
-      fi
-    done
-    ((c++))
-  done
-}
-
-__git_has_doubledash ()
-{
-  local c=1
-  while [ $c -lt $cword ]; do
-    if [ "--" = "${words[c]}" ]; then
-      return 0
-    fi
-    ((c++))
-  done
-  return 1
-}
-
-# Try to count non option arguments passed on the command line for the
-# specified git command.
-# When options are used, it is necessary to use the special -- option to
-# tell the implementation were non option arguments begin.
-# XXX this can not be improved, since options can appear everywhere, as
-# an example:
-# git mv x -n y
-#
-# __git_count_arguments requires 1 argument: the git command executed.
-__git_count_arguments ()
-{
-  local word i c=0
-
-  # Skip "git" (first argument)
-  for ((i=1; i < ${#words[@]}; i++)); do
-    word="${words[i]}"
-
-    case "$word" in
-      --)
-        # Good; we can assume that the following are only non
-        # option arguments.
-        ((c = 0))
-        ;;
-      "$1")
-        # Skip the specified git command and discard git
-        # main options
-        ((c = 0))
-        ;;
-      ?*)
-        ((c++))
-        ;;
-    esac
-  done
-
-  printf "%d" $c
-}
-
-__git_whitespacelist="nowarn warn error error-all fix"
-
-_git_am ()
-{
-  local dir="$(__gitdir)"
-  if [ -d "$dir"/rebase-apply ]; then
-    __gitcomp "--skip --continue --resolved --abort"
-    return
-  fi
-  case "$cur" in
-  --whitespace=*)
-    __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
-    return
-    ;;
-  --*)
-    __gitcomp "
-      --3way --committer-date-is-author-date --ignore-date
-      --ignore-whitespace --ignore-space-change
-      --interactive --keep --no-utf8 --signoff --utf8
-      --whitespace= --scissors
-      "
-    return
-  esac
-}
-
-_git_apply ()
-{
-  case "$cur" in
-  --whitespace=*)
-    __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
-    return
-    ;;
-  --*)
-    __gitcomp "
-      --stat --numstat --summary --check --index
-      --cached --index-info --reverse --reject --unidiff-zero
-      --apply --no-add --exclude=
-      --ignore-whitespace --ignore-space-change
-      --whitespace= --inaccurate-eof --verbose
-      "
-    return
-  esac
-}
-
-_git_add ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "
-      --interactive --refresh --patch --update --dry-run
-      --ignore-errors --intent-to-add
-      "
-    return
-  esac
-
-  # XXX should we check for --update and --all options ?
-  __git_complete_index_file "--others --modified --directory --no-empty-directory"
-}
-
-_git_archive ()
-{
-  case "$cur" in
-  --format=*)
-    __gitcomp "$(git archive --list)" "" "${cur##--format=}"
-    return
-    ;;
-  --remote=*)
-    __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
-    return
-    ;;
-  --*)
-    __gitcomp "
-      --format= --list --verbose
-      --prefix= --remote= --exec=
-      "
-    return
-    ;;
-  esac
-  __git_complete_file
-}
-
-_git_bisect ()
-{
-  __git_has_doubledash && return
-
-  local subcommands="start bad good skip reset visualize replay log run"
-  local subcommand="$(__git_find_on_cmdline "$subcommands")"
-  if [ -z "$subcommand" ]; then
-    if [ -f "$(__gitdir)"/BISECT_START ]; then
-      __gitcomp "$subcommands"
-    else
-      __gitcomp "replay start"
-    fi
-    return
-  fi
-
-  case "$subcommand" in
-  bad|good|reset|skip|start)
-    __gitcomp_nl "$(__git_refs)"
-    ;;
-  *)
-    ;;
-  esac
-}
-
-_git_branch ()
-{
-  local i c=1 only_local_ref="n" has_r="n"
-
-  while [ $c -lt $cword ]; do
-    i="${words[c]}"
-    case "$i" in
-    -d|-m)  only_local_ref="y" ;;
-    -r) has_r="y" ;;
-    esac
-    ((c++))
-  done
-
-  case "$cur" in
-  --set-upstream-to=*)
-    __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
-    ;;
-  --*)
-    __gitcomp "
-      --color --no-color --verbose --abbrev= --no-abbrev
-      --track --no-track --contains --merged --no-merged
-      --set-upstream-to= --edit-description --list
-      --unset-upstream
-      "
-    ;;
-  *)
-    if [ $only_local_ref = "y" -a $has_r = "n" ]; then
-      __gitcomp_nl "$(__git_heads)"
-    else
-      __gitcomp_nl "$(__git_refs)"
-    fi
-    ;;
-  esac
-}
-
-_git_bundle ()
-{
-  local cmd="${words[2]}"
-  case "$cword" in
-  2)
-    __gitcomp "create list-heads verify unbundle"
-    ;;
-  3)
-    # looking for a file
-    ;;
-  *)
-    case "$cmd" in
-      create)
-        __git_complete_revlist
-      ;;
-    esac
-    ;;
-  esac
-}
-
-_git_checkout ()
-{
-  __git_has_doubledash && return
-
-  case "$cur" in
-  --conflict=*)
-    __gitcomp "diff3 merge" "" "${cur##--conflict=}"
-    ;;
-  --*)
-    __gitcomp "
-      --quiet --ours --theirs --track --no-track --merge
-      --conflict= --orphan --patch
-      "
-    ;;
-  *)
-    # check if --track, --no-track, or --no-guess was specified
-    # if so, disable DWIM mode
-    local flags="--track --no-track --no-guess" track=1
-    if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
-      track=''
-    fi
-    __gitcomp_nl "$(__git_refs '' $track)"
-    ;;
-  esac
-}
-
-_git_cherry ()
-{
-  __gitcomp_nl "$(__git_refs)"
-}
-
-_git_cherry_pick ()
-{
-  local dir="$(__gitdir)"
-  if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
-    __gitcomp "--continue --quit --abort"
-    return
-  fi
-  case "$cur" in
-  --*)
-    __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
-    ;;
-  *)
-    __gitcomp_nl "$(__git_refs)"
-    ;;
-  esac
-}
-
-_git_clean ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "--dry-run --quiet"
-    return
-    ;;
-  esac
-
-  # XXX should we check for -x option ?
-  __git_complete_index_file "--others --directory"
-}
-
-_git_clone ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "
-      --local
-      --no-hardlinks
-      --shared
-      --reference
-      --quiet
-      --no-checkout
-      --bare
-      --mirror
-      --origin
-      --upload-pack
-      --template=
-      --depth
-      --single-branch
-      --branch
-      "
-    return
-    ;;
-  esac
-}
-
-_git_commit ()
-{
-  case "$prev" in
-  -c|-C)
-    __gitcomp_nl "$(__git_refs)" "" "${cur}"
-    return
-    ;;
-  esac
-
-  case "$cur" in
-  --cleanup=*)
-    __gitcomp "default scissors strip verbatim whitespace
-      " "" "${cur##--cleanup=}"
-    return
-    ;;
-  --reuse-message=*|--reedit-message=*|\
-  --fixup=*|--squash=*)
-    __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
-    return
-    ;;
-  --untracked-files=*)
-    __gitcomp "all no normal" "" "${cur##--untracked-files=}"
-    return
-    ;;
-  --*)
-    __gitcomp "
-      --all --author= --signoff --verify --no-verify
-      --edit --no-edit
-      --amend --include --only --interactive
-      --dry-run --reuse-message= --reedit-message=
-      --reset-author --file= --message= --template=
-      --cleanup= --untracked-files --untracked-files=
-      --verbose --quiet --fixup= --squash=
-      "
-    return
-  esac
-
-  if git rev-parse --verify --quiet HEAD >/dev/null; then
-    __git_complete_index_file "--committable"
-  else
-    # This is the first commit
-    __git_complete_index_file "--cached"
-  fi
-}
-
-_git_describe ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "
-      --all --tags --contains --abbrev= --candidates=
-      --exact-match --debug --long --match --always
-      "
-    return
-  esac
-  __gitcomp_nl "$(__git_refs)"
-}
-
-__git_diff_algorithms="myers minimal patience histogram"
-
-__git_diff_common_options="--stat --numstat --shortstat --summary
-      --patch-with-stat --name-only --name-status --color
-      --no-color --color-words --no-renames --check
-      --full-index --binary --abbrev --diff-filter=
-      --find-copies-harder
-      --text --ignore-space-at-eol --ignore-space-change
-      --ignore-all-space --ignore-blank-lines --exit-code
-      --quiet --ext-diff --no-ext-diff
-      --no-prefix --src-prefix= --dst-prefix=
-      --inter-hunk-context=
-      --patience --histogram --minimal
-      --raw --word-diff --word-diff-regex=
-      --dirstat --dirstat= --dirstat-by-file
-      --dirstat-by-file= --cumulative
-      --diff-algorithm=
-"
-
-_git_diff ()
-{
-  __git_has_doubledash && return
-
-  case "$cur" in
-  --diff-algorithm=*)
-    __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
-    return
-    ;;
-  --*)
-    __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
-      --base --ours --theirs --no-index
-      $__git_diff_common_options
-      "
-    return
-    ;;
-  esac
-  __git_complete_revlist_file
-}
-
-__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
-      tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
-"
-
-_git_difftool ()
-{
-  __git_has_doubledash && return
-
-  case "$cur" in
-  --tool=*)
-    __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
-    return
-    ;;
-  --*)
-    __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
-      --base --ours --theirs
-      --no-renames --diff-filter= --find-copies-harder
-      --relative --ignore-submodules
-      --tool="
-    return
-    ;;
-  esac
-  __git_complete_revlist_file
-}
-
-__git_fetch_recurse_submodules="yes on-demand no"
-
-__git_fetch_options="
-  --quiet --verbose --append --upload-pack --force --keep --depth=
-  --tags --no-tags --all --prune --dry-run --recurse-submodules=
-"
-
-_git_fetch ()
-{
-  case "$cur" in
-  --recurse-submodules=*)
-    __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
-    return
-    ;;
-  --*)
-    __gitcomp "$__git_fetch_options"
-    return
-    ;;
-  esac
-  __git_complete_remote_or_refspec
-}
-
-__git_format_patch_options="
-  --stdout --attach --no-attach --thread --thread= --no-thread
-  --numbered --start-number --numbered-files --keep-subject --signoff
-  --signature --no-signature --in-reply-to= --cc= --full-index --binary
-  --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
-  --inline --suffix= --ignore-if-in-upstream --subject-prefix=
-  --output-directory --reroll-count --to= --quiet --notes
-"
-
-_git_format_patch ()
-{
-  case "$cur" in
-  --thread=*)
-    __gitcomp "
-      deep shallow
-      " "" "${cur##--thread=}"
-    return
-    ;;
-  --*)
-    __gitcomp "$__git_format_patch_options"
-    return
-    ;;
-  esac
-  __git_complete_revlist
-}
-
-_git_fsck ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "
-      --tags --root --unreachable --cache --no-reflogs --full
-      --strict --verbose --lost-found
-      "
-    return
-    ;;
-  esac
-}
-
-_git_gc ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "--prune --aggressive"
-    return
-    ;;
-  esac
-}
-
-_git_gitk ()
-{
-  _gitk
-}
-
-__git_match_ctag() {
-  awk "/^${1//\//\\/}/ { print \$1 }" "$2"
-}
-
-_git_grep ()
-{
-  __git_has_doubledash && return
-
-  case "$cur" in
-  --*)
-    __gitcomp "
-      --cached
-      --text --ignore-case --word-regexp --invert-match
-      --full-name --line-number
-      --extended-regexp --basic-regexp --fixed-strings
-      --perl-regexp
-      --threads
-      --files-with-matches --name-only
-      --files-without-match
-      --max-depth
-      --count
-      --and --or --not --all-match
-      "
-    return
-    ;;
-  esac
-
-  case "$cword,$prev" in
-  2,*|*,-*)
-    if test -r tags; then
-      __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
-      return
-    fi
-    ;;
-  esac
-
-  __gitcomp_nl "$(__git_refs)"
-}
-
-_git_help ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "--all --guides --info --man --web"
-    return
-    ;;
-  esac
-  __git_compute_all_commands
-  __gitcomp "$__git_all_commands $(__git_aliases)
-    attributes cli core-tutorial cvs-migration
-    diffcore everyday gitk glossary hooks ignore modules
-    namespaces repository-layout revisions tutorial tutorial-2
-    workflows
-    "
-}
-
-_git_init ()
-{
-  case "$cur" in
-  --shared=*)
-    __gitcomp "
-      false true umask group all world everybody
-      " "" "${cur##--shared=}"
-    return
-    ;;
-  --*)
-    __gitcomp "--quiet --bare --template= --shared --shared="
-    return
-    ;;
-  esac
-}
-
-_git_ls_files ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "--cached --deleted --modified --others --ignored
-      --stage --directory --no-empty-directory --unmerged
-      --killed --exclude= --exclude-from=
-      --exclude-per-directory= --exclude-standard
-      --error-unmatch --with-tree= --full-name
-      --abbrev --ignored --exclude-per-directory
-      "
-    return
-    ;;
-  esac
-
-  # XXX ignore options like --modified and always suggest all cached
-  # files.
-  __git_complete_index_file "--cached"
-}
-
-_git_ls_remote ()
-{
-  __gitcomp_nl "$(__git_remotes)"
-}
-
-_git_ls_tree ()
-{
-  __git_complete_file
-}
-
-# Options that go well for log, shortlog and gitk
-__git_log_common_options="
-  --not --all
-  --branches --tags --remotes
-  --first-parent --merges --no-merges
-  --max-count=
-  --max-age= --since= --after=
-  --min-age= --until= --before=
-  --min-parents= --max-parents=
-  --no-min-parents --no-max-parents
-"
-# Options that go well for log and gitk (not shortlog)
-__git_log_gitk_options="
-  --dense --sparse --full-history
-  --simplify-merges --simplify-by-decoration
-  --left-right --notes --no-notes
-"
-# Options that go well for log and shortlog (not gitk)
-__git_log_shortlog_options="
-  --author= --committer= --grep=
-  --all-match --invert-grep
-"
-
-__git_log_pretty_formats="oneline short medium full fuller email raw format:"
-__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
-
-_git_log ()
-{
-  __git_has_doubledash && return
-
-  local g="$(git rev-parse --git-dir 2>/dev/null)"
-  local merge=""
-  if [ -f "$g/MERGE_HEAD" ]; then
-    merge="--merge"
-  fi
-  case "$cur" in
-  --pretty=*|--format=*)
-    __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
-      " "" "${cur#*=}"
-    return
-    ;;
-  --date=*)
-    __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
-    return
-    ;;
-  --decorate=*)
-    __gitcomp "full short no" "" "${cur##--decorate=}"
-    return
-    ;;
-  --*)
-    __gitcomp "
-      $__git_log_common_options
-      $__git_log_shortlog_options
-      $__git_log_gitk_options
-      --root --topo-order --date-order --reverse
-      --follow --full-diff
-      --abbrev-commit --abbrev=
-      --relative-date --date=
-      --pretty= --format= --oneline
-      --show-signature
-      --cherry-mark
-      --cherry-pick
-      --graph
-      --decorate --decorate=
-      --walk-reflogs
-      --parents --children
-      $merge
-      $__git_diff_common_options
-      --pickaxe-all --pickaxe-regex
-      "
-    return
-    ;;
-  esac
-  __git_complete_revlist
-}
-
-# Common merge options shared by git-merge(1) and git-pull(1).
-__git_merge_options="
-  --no-commit --no-stat --log --no-log --squash --strategy
-  --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
-  --verify-signatures --no-verify-signatures --gpg-sign
-  --quiet --verbose --progress --no-progress
-"
-
-_git_merge ()
-{
-  __git_complete_strategy && return
-
-  case "$cur" in
-  --*)
-    __gitcomp "$__git_merge_options
-      --rerere-autoupdate --no-rerere-autoupdate --abort"
-    return
-  esac
-  __gitcomp_nl "$(__git_refs)"
-}
-
-_git_mergetool ()
-{
-  case "$cur" in
-  --tool=*)
-    __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
-    return
-    ;;
-  --*)
-    __gitcomp "--tool="
-    return
-    ;;
-  esac
-}
-
-_git_merge_base ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "--octopus --independent --is-ancestor --fork-point"
-    return
-    ;;
-  esac
-  __gitcomp_nl "$(__git_refs)"
-}
-
-_git_mv ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "--dry-run"
-    return
-    ;;
-  esac
-
-  if [ $(__git_count_arguments "mv") -gt 0 ]; then
-    # We need to show both cached and untracked files (including
-    # empty directories) since this may not be the last argument.
-    __git_complete_index_file "--cached --others --directory"
-  else
-    __git_complete_index_file "--cached"
-  fi
-}
-
-_git_name_rev ()
-{
-  __gitcomp "--tags --all --stdin"
-}
-
-_git_notes ()
-{
-  local subcommands='add append copy edit list prune remove show'
-  local subcommand="$(__git_find_on_cmdline "$subcommands")"
-
-  case "$subcommand,$cur" in
-  ,--*)
-    __gitcomp '--ref'
-    ;;
-  ,*)
-    case "$prev" in
-    --ref)
-      __gitcomp_nl "$(__git_refs)"
-      ;;
-    *)
-      __gitcomp "$subcommands --ref"
-      ;;
-    esac
-    ;;
-  add,--reuse-message=*|append,--reuse-message=*|\
-  add,--reedit-message=*|append,--reedit-message=*)
-    __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
-    ;;
-  add,--*|append,--*)
-    __gitcomp '--file= --message= --reedit-message=
-        --reuse-message='
-    ;;
-  copy,--*)
-    __gitcomp '--stdin'
-    ;;
-  prune,--*)
-    __gitcomp '--dry-run --verbose'
-    ;;
-  prune,*)
-    ;;
-  *)
-    case "$prev" in
-    -m|-F)
-      ;;
-    *)
-      __gitcomp_nl "$(__git_refs)"
-      ;;
-    esac
-    ;;
-  esac
-}
-
-_git_pull ()
-{
-  __git_complete_strategy && return
-
-  case "$cur" in
-  --recurse-submodules=*)
-    __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
-    return
-    ;;
-  --*)
-    __gitcomp "
-      --rebase --no-rebase
-      $__git_merge_options
-      $__git_fetch_options
-    "
-    return
-    ;;
-  esac
-  __git_complete_remote_or_refspec
-}
-
-__git_push_recurse_submodules="check on-demand"
-
-__git_complete_force_with_lease ()
-{
-  local cur_=$1
-
-  case "$cur_" in
-  --*=)
-    ;;
-  *:*)
-    __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
-    ;;
-  *)
-    __gitcomp_nl "$(__git_refs)" "" "$cur_"
-    ;;
-  esac
-}
-
-_git_push ()
-{
-  case "$prev" in
-  --repo)
-    __gitcomp_nl "$(__git_remotes)"
-    return
-    ;;
-  --recurse-submodules)
-    __gitcomp "$__git_push_recurse_submodules"
-    return
-    ;;
-  esac
-  case "$cur" in
-  --repo=*)
-    __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
-    return
-    ;;
-  --recurse-submodules=*)
-    __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
-    return
-    ;;
-  --force-with-lease=*)
-    __git_complete_force_with_lease "${cur##--force-with-lease=}"
-    return
-    ;;
-  --*)
-    __gitcomp "
-      --all --mirror --tags --dry-run --force --verbose
-      --quiet --prune --delete --follow-tags
-      --receive-pack= --repo= --set-upstream
-      --force-with-lease --force-with-lease= --recurse-submodules=
-    "
-    return
-    ;;
-  esac
-  __git_complete_remote_or_refspec
-}
-
-_git_rebase ()
-{
-  local dir="$(__gitdir)"
-  if [ -f "$dir"/rebase-merge/interactive ]; then
-    __gitcomp "--continue --skip --abort --edit-todo"
-    return
-  elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
-    __gitcomp "--continue --skip --abort"
-    return
-  fi
-  __git_complete_strategy && return
-  case "$cur" in
-  --whitespace=*)
-    __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
-    return
-    ;;
-  --*)
-    __gitcomp "
-      --onto --merge --strategy --interactive
-      --preserve-merges --stat --no-stat
-      --committer-date-is-author-date --ignore-date
-      --ignore-whitespace --whitespace=
-      --autosquash --no-autosquash
-      --fork-point --no-fork-point
-      --autostash --no-autostash
-      --verify --no-verify
-      --keep-empty --root --force-rebase --no-ff
-      --exec
-      "
-
-    return
-  esac
-  __gitcomp_nl "$(__git_refs)"
-}
-
-_git_reflog ()
-{
-  local subcommands="show delete expire"
-  local subcommand="$(__git_find_on_cmdline "$subcommands")"
-
-  if [ -z "$subcommand" ]; then
-    __gitcomp "$subcommands"
-  else
-    __gitcomp_nl "$(__git_refs)"
-  fi
-}
-
-__git_send_email_confirm_options="always never auto cc compose"
-__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
-
-_git_send_email ()
-{
-  case "$prev" in
-  --to|--cc|--bcc|--from)
-    __gitcomp "
-    $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
-    "
-    return
-    ;;
-  esac
-
-  case "$cur" in
-  --confirm=*)
-    __gitcomp "
-      $__git_send_email_confirm_options
-      " "" "${cur##--confirm=}"
-    return
-    ;;
-  --suppress-cc=*)
-    __gitcomp "
-      $__git_send_email_suppresscc_options
-      " "" "${cur##--suppress-cc=}"
-
-    return
-    ;;
-  --smtp-encryption=*)
-    __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
-    return
-    ;;
-  --thread=*)
-    __gitcomp "
-      deep shallow
-      " "" "${cur##--thread=}"
-    return
-    ;;
-  --to=*|--cc=*|--bcc=*|--from=*)
-    __gitcomp "
-    $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
-    " "" "${cur#--*=}"
-    return
-    ;;
-  --*)
-    __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
-      --compose --confirm= --dry-run --envelope-sender
-      --from --identity
-      --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
-      --no-suppress-from --no-thread --quiet
-      --signed-off-by-cc --smtp-pass --smtp-server
-      --smtp-server-port --smtp-encryption= --smtp-user
-      --subject --suppress-cc= --suppress-from --thread --to
-      --validate --no-validate
-      $__git_format_patch_options"
-    return
-    ;;
-  esac
-  __git_complete_revlist
-}
-
-_git_stage ()
-{
-  _git_add
-}
-
-__git_config_get_set_variables ()
-{
-  local prevword word config_file= c=$cword
-  while [ $c -gt 1 ]; do
-    word="${words[c]}"
-    case "$word" in
-    --system|--global|--local|--file=*)
-      config_file="$word"
-      break
-      ;;
-    -f|--file)
-      config_file="$word $prevword"
-      break
-      ;;
-    esac
-    prevword=$word
-    c=$((--c))
-  done
-
-  git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
-}
-
-_git_config ()
-{
-  case "$prev" in
-  branch.*.remote|branch.*.pushremote)
-    __gitcomp_nl "$(__git_remotes)"
-    return
-    ;;
-  branch.*.merge)
-    __gitcomp_nl "$(__git_refs)"
-    return
-    ;;
-  branch.*.rebase)
-    __gitcomp "false true preserve interactive"
-    return
-    ;;
-  remote.pushdefault)
-    __gitcomp_nl "$(__git_remotes)"
-    return
-    ;;
-  remote.*.fetch)
-    local remote="${prev#remote.}"
-    remote="${remote%.fetch}"
-    if [ -z "$cur" ]; then
-      __gitcomp_nl "refs/heads/" "" "" ""
-      return
-    fi
-    __gitcomp_nl "$(__git_refs_remotes "$remote")"
-    return
-    ;;
-  remote.*.push)
-    local remote="${prev#remote.}"
-    remote="${remote%.push}"
-    __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
-      for-each-ref --format='%(refname):%(refname)' \
-      refs/heads)"
-    return
-    ;;
-  pull.twohead|pull.octopus)
-    __git_compute_merge_strategies
-    __gitcomp "$__git_merge_strategies"
-    return
-    ;;
-  color.branch|color.diff|color.interactive|\
-  color.showbranch|color.status|color.ui)
-    __gitcomp "always never auto"
-    return
-    ;;
-  color.pager)
-    __gitcomp "false true"
-    return
-    ;;
-  color.*.*)
-    __gitcomp "
-      normal black red green yellow blue magenta cyan white
-      bold dim ul blink reverse
-      "
-    return
-    ;;
-  diff.submodule)
-    __gitcomp "log short"
-    return
-    ;;
-  help.format)
-    __gitcomp "man info web html"
-    return
-    ;;
-  log.date)
-    __gitcomp "$__git_log_date_formats"
-    return
-    ;;
-  sendemail.aliasesfiletype)
-    __gitcomp "mutt mailrc pine elm gnus"
-    return
-    ;;
-  sendemail.confirm)
-    __gitcomp "$__git_send_email_confirm_options"
-    return
-    ;;
-  sendemail.suppresscc)
-    __gitcomp "$__git_send_email_suppresscc_options"
-    return
-    ;;
-  sendemail.transferencoding)
-    __gitcomp "7bit 8bit quoted-printable base64"
-    return
-    ;;
-  --get|--get-all|--unset|--unset-all)
-    __gitcomp_nl "$(__git_config_get_set_variables)"
-    return
-    ;;
-  *.*)
-    return
-    ;;
-  esac
-  case "$cur" in
-  --*)
-    __gitcomp "
-      --system --global --local --file=
-      --list --replace-all
-      --get --get-all --get-regexp
-      --add --unset --unset-all
-      --remove-section --rename-section
-      --name-only
-      "
-    return
-    ;;
-  branch.*.*)
-    local pfx="${cur%.*}." cur_="${cur##*.}"
-    __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
-    return
-    ;;
-  branch.*)
-    local pfx="${cur%.*}." cur_="${cur#*.}"
-    __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
-    __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
-    return
-    ;;
-  guitool.*.*)
-    local pfx="${cur%.*}." cur_="${cur##*.}"
-    __gitcomp "
-      argprompt cmd confirm needsfile noconsole norescan
-      prompt revprompt revunmerged title
-      " "$pfx" "$cur_"
-    return
-    ;;
-  difftool.*.*)
-    local pfx="${cur%.*}." cur_="${cur##*.}"
-    __gitcomp "cmd path" "$pfx" "$cur_"
-    return
-    ;;
-  man.*.*)
-    local pfx="${cur%.*}." cur_="${cur##*.}"
-    __gitcomp "cmd path" "$pfx" "$cur_"
-    return
-    ;;
-  mergetool.*.*)
-    local pfx="${cur%.*}." cur_="${cur##*.}"
-    __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
-    return
-    ;;
-  pager.*)
-    local pfx="${cur%.*}." cur_="${cur#*.}"
-    __git_compute_all_commands
-    __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
-    return
-    ;;
-  remote.*.*)
-    local pfx="${cur%.*}." cur_="${cur##*.}"
-    __gitcomp "
-      url proxy fetch push mirror skipDefaultUpdate
-      receivepack uploadpack tagopt pushurl
-      " "$pfx" "$cur_"
-    return
-    ;;
-  remote.*)
-    local pfx="${cur%.*}." cur_="${cur#*.}"
-    __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
-    __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
-    return
-    ;;
-  url.*.*)
-    local pfx="${cur%.*}." cur_="${cur##*.}"
-    __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
-    return
-    ;;
-  esac
-  __gitcomp "
-    add.ignoreErrors
-    advice.commitBeforeMerge
-    advice.detachedHead
-    advice.implicitIdentity
-    advice.pushNonFastForward
-    advice.resolveConflict
-    advice.statusHints
-    alias.
-    am.keepcr
-    apply.ignorewhitespace
-    apply.whitespace
-    branch.autosetupmerge
-    branch.autosetuprebase
-    browser.
-    clean.requireForce
-    color.branch
-    color.branch.current
-    color.branch.local
-    color.branch.plain
-    color.branch.remote
-    color.decorate.HEAD
-    color.decorate.branch
-    color.decorate.remoteBranch
-    color.decorate.stash
-    color.decorate.tag
-    color.diff
-    color.diff.commit
-    color.diff.frag
-    color.diff.func
-    color.diff.meta
-    color.diff.new
-    color.diff.old
-    color.diff.plain
-    color.diff.whitespace
-    color.grep
-    color.grep.context
-    color.grep.filename
-    color.grep.function
-    color.grep.linenumber
-    color.grep.match
-    color.grep.selected
-    color.grep.separator
-    color.interactive
-    color.interactive.error
-    color.interactive.header
-    color.interactive.help
-    color.interactive.prompt
-    color.pager
-    color.showbranch
-    color.status
-    color.status.added
-    color.status.changed
-    color.status.header
-    color.status.nobranch
-    color.status.unmerged
-    color.status.untracked
-    color.status.updated
-    color.ui
-    commit.status
-    commit.template
-    core.abbrev
-    core.askpass
-    core.attributesfile
-    core.autocrlf
-    core.bare
-    core.bigFileThreshold
-    core.compression
-    core.createObject
-    core.deltaBaseCacheLimit
-    core.editor
-    core.eol
-    core.excludesfile
-    core.fileMode
-    core.fsyncobjectfiles
-    core.gitProxy
-    core.ignoreStat
-    core.ignorecase
-    core.logAllRefUpdates
-    core.loosecompression
-    core.notesRef
-    core.packedGitLimit
-    core.packedGitWindowSize
-    core.pager
-    core.preferSymlinkRefs
-    core.preloadindex
-    core.quotepath
-    core.repositoryFormatVersion
-    core.safecrlf
-    core.sharedRepository
-    core.sparseCheckout
-    core.symlinks
-    core.trustctime
-    core.untrackedCache
-    core.warnAmbiguousRefs
-    core.whitespace
-    core.worktree
-    diff.autorefreshindex
-    diff.external
-    diff.ignoreSubmodules
-    diff.mnemonicprefix
-    diff.noprefix
-    diff.renameLimit
-    diff.renames
-    diff.statGraphWidth
-    diff.submodule
-    diff.suppressBlankEmpty
-    diff.tool
-    diff.wordRegex
-    diff.algorithm
-    difftool.
-    difftool.prompt
-    fetch.recurseSubmodules
-    fetch.unpackLimit
-    format.attach
-    format.cc
-    format.coverLetter
-    format.headers
-    format.numbered
-    format.pretty
-    format.signature
-    format.signoff
-    format.subjectprefix
-    format.suffix
-    format.thread
-    format.to
-    gc.
-    gc.aggressiveWindow
-    gc.auto
-    gc.autopacklimit
-    gc.packrefs
-    gc.pruneexpire
-    gc.reflogexpire
-    gc.reflogexpireunreachable
-    gc.rerereresolved
-    gc.rerereunresolved
-    gitcvs.allbinary
-    gitcvs.commitmsgannotation
-    gitcvs.dbTableNamePrefix
-    gitcvs.dbdriver
-    gitcvs.dbname
-    gitcvs.dbpass
-    gitcvs.dbuser
-    gitcvs.enabled
-    gitcvs.logfile
-    gitcvs.usecrlfattr
-    guitool.
-    gui.blamehistoryctx
-    gui.commitmsgwidth
-    gui.copyblamethreshold
-    gui.diffcontext
-    gui.encoding
-    gui.fastcopyblame
-    gui.matchtrackingbranch
-    gui.newbranchtemplate
-    gui.pruneduringfetch
-    gui.spellingdictionary
-    gui.trustmtime
-    help.autocorrect
-    help.browser
-    help.format
-    http.lowSpeedLimit
-    http.lowSpeedTime
-    http.maxRequests
-    http.minSessions
-    http.noEPSV
-    http.postBuffer
-    http.proxy
-    http.sslCipherList
-    http.sslVersion
-    http.sslCAInfo
-    http.sslCAPath
-    http.sslCert
-    http.sslCertPasswordProtected
-    http.sslKey
-    http.sslVerify
-    http.useragent
-    i18n.commitEncoding
-    i18n.logOutputEncoding
-    imap.authMethod
-    imap.folder
-    imap.host
-    imap.pass
-    imap.port
-    imap.preformattedHTML
-    imap.sslverify
-    imap.tunnel
-    imap.user
-    init.templatedir
-    instaweb.browser
-    instaweb.httpd
-    instaweb.local
-    instaweb.modulepath
-    instaweb.port
-    interactive.singlekey
-    log.date
-    log.decorate
-    log.showroot
-    mailmap.file
-    man.
-    man.viewer
-    merge.
-    merge.conflictstyle
-    merge.log
-    merge.renameLimit
-    merge.renormalize
-    merge.stat
-    merge.tool
-    merge.verbosity
-    mergetool.
-    mergetool.keepBackup
-    mergetool.keepTemporaries
-    mergetool.prompt
-    notes.displayRef
-    notes.rewrite.
-    notes.rewrite.amend
-    notes.rewrite.rebase
-    notes.rewriteMode
-    notes.rewriteRef
-    pack.compression
-    pack.deltaCacheLimit
-    pack.deltaCacheSize
-    pack.depth
-    pack.indexVersion
-    pack.packSizeLimit
-    pack.threads
-    pack.window
-    pack.windowMemory
-    pager.
-    pretty.
-    pull.octopus
-    pull.twohead
-    push.default
-    push.followTags
-    rebase.autosquash
-    rebase.stat
-    receive.autogc
-    receive.denyCurrentBranch
-    receive.denyDeleteCurrent
-    receive.denyDeletes
-    receive.denyNonFastForwards
-    receive.fsckObjects
-    receive.unpackLimit
-    receive.updateserverinfo
-    remote.pushdefault
-    remotes.
-    repack.usedeltabaseoffset
-    rerere.autoupdate
-    rerere.enabled
-    sendemail.
-    sendemail.aliasesfile
-    sendemail.aliasfiletype
-    sendemail.bcc
-    sendemail.cc
-    sendemail.cccmd
-    sendemail.chainreplyto
-    sendemail.confirm
-    sendemail.envelopesender
-    sendemail.from
-    sendemail.identity
-    sendemail.multiedit
-    sendemail.signedoffbycc
-    sendemail.smtpdomain
-    sendemail.smtpencryption
-    sendemail.smtppass
-    sendemail.smtpserver
-    sendemail.smtpserveroption
-    sendemail.smtpserverport
-    sendemail.smtpuser
-    sendemail.suppresscc
-    sendemail.suppressfrom
-    sendemail.thread
-    sendemail.to
-    sendemail.validate
-    showbranch.default
-    status.relativePaths
-    status.showUntrackedFiles
-    status.submodulesummary
-    submodule.
-    tar.umask
-    transfer.unpackLimit
-    url.
-    user.email
-    user.name
-    user.signingkey
-    web.browser
-    branch. remote.
-  "
-}
-
-_git_remote ()
-{
-  local subcommands="add rename remove set-head set-branches set-url show prune update"
-  local subcommand="$(__git_find_on_cmdline "$subcommands")"
-  if [ -z "$subcommand" ]; then
-    __gitcomp "$subcommands"
-    return
-  fi
-
-  case "$subcommand" in
-  rename|remove|set-url|show|prune)
-    __gitcomp_nl "$(__git_remotes)"
-    ;;
-  set-head|set-branches)
-    __git_complete_remote_or_refspec
-    ;;
-  update)
-    __gitcomp "$(__git_get_config_variables "remotes")"
-    ;;
-  *)
-    ;;
-  esac
-}
-
-_git_replace ()
-{
-  __gitcomp_nl "$(__git_refs)"
-}
-
-_git_reset ()
-{
-  __git_has_doubledash && return
-
-  case "$cur" in
-  --*)
-    __gitcomp "--merge --mixed --hard --soft --patch"
-    return
-    ;;
-  esac
-  __gitcomp_nl "$(__git_refs)"
-}
-
-_git_revert ()
-{
-  local dir="$(__gitdir)"
-  if [ -f "$dir"/REVERT_HEAD ]; then
-    __gitcomp "--continue --quit --abort"
-    return
-  fi
-  case "$cur" in
-  --*)
-    __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
-    return
-    ;;
-  esac
-  __gitcomp_nl "$(__git_refs)"
-}
-
-_git_rm ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
-    return
-    ;;
-  esac
-
-  __git_complete_index_file "--cached"
-}
-
-_git_shortlog ()
-{
-  __git_has_doubledash && return
-
-  case "$cur" in
-  --*)
-    __gitcomp "
-      $__git_log_common_options
-      $__git_log_shortlog_options
-      --numbered --summary
-      "
-    return
-    ;;
-  esac
-  __git_complete_revlist
-}
-
-_git_show ()
-{
-  __git_has_doubledash && return
-
-  case "$cur" in
-  --pretty=*|--format=*)
-    __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
-      " "" "${cur#*=}"
-    return
-    ;;
-  --diff-algorithm=*)
-    __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
-    return
-    ;;
-  --*)
-    __gitcomp "--pretty= --format= --abbrev-commit --oneline
-      --show-signature
-      $__git_diff_common_options
-      "
-    return
-    ;;
-  esac
-  __git_complete_revlist_file
-}
-
-_git_show_branch ()
-{
-  case "$cur" in
-  --*)
-    __gitcomp "
-      --all --remotes --topo-order --date-order --current --more=
-      --list --independent --merge-base --no-name
-      --color --no-color
-      --sha1-name --sparse --topics --reflog
-      "
-    return
-    ;;
-  esac
-  __git_complete_revlist
-}
-
-_git_stash ()
-{
-  local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
-  local subcommands='save list show apply clear drop pop create branch'
-  local subcommand="$(__git_find_on_cmdline "$subcommands")"
-  if [ -z "$subcommand" ]; then
-    case "$cur" in
-    --*)
-      __gitcomp "$save_opts"
-      ;;
-    *)
-      if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
-        __gitcomp "$subcommands"
-      fi
-      ;;
-    esac
-  else
-    case "$subcommand,$cur" in
-    save,--*)
-      __gitcomp "$save_opts"
-      ;;
-    apply,--*|pop,--*)
-      __gitcomp "--index --quiet"
-      ;;
-    drop,--*)
-      __gitcomp "--quiet"
-      ;;
-    show,--*|branch,--*)
-      ;;
-    branch,*)
-      if [ $cword -eq 3 ]; then
-        __gitcomp_nl "$(__git_refs)";
-      else
-        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
-            | sed -n -e 's/:.*//p')"
-      fi
-      ;;
-    show,*|apply,*|drop,*|pop,*)
-      __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
-          | sed -n -e 's/:.*//p')"
-      ;;
-    *)
-      ;;
-    esac
-  fi
-}
-
-_git_submodule ()
-{
-  __git_has_doubledash && return
-
-  local subcommands="add status init deinit update summary foreach sync"
-  if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
-    case "$cur" in
-    --*)
-      __gitcomp "--quiet --cached"
-      ;;
-    *)
-      __gitcomp "$subcommands"
-      ;;
-    esac
-    return
-  fi
-}
-
-_git_svn ()
-{
-  local subcommands="
-    init fetch clone rebase dcommit log find-rev
-    set-tree commit-diff info create-ignore propget
-    proplist show-ignore show-externals branch tag blame
-    migrate mkdirs reset gc
-    "
-  local subcommand="$(__git_find_on_cmdline "$subcommands")"
-  if [ -z "$subcommand" ]; then
-    __gitcomp "$subcommands"
-  else
-    local remote_opts="--username= --config-dir= --no-auth-cache"
-    local fc_opts="
-      --follow-parent --authors-file= --repack=
-      --no-metadata --use-svm-props --use-svnsync-props
-      --log-window-size= --no-checkout --quiet
-      --repack-flags --use-log-author --localtime
-      --ignore-paths= --include-paths= $remote_opts
-      "
-    local init_opts="
-      --template= --shared= --trunk= --tags=
-      --branches= --stdlayout --minimize-url
-      --no-metadata --use-svm-props --use-svnsync-props
-      --rewrite-root= --prefix= --use-log-author
-      --add-author-from $remote_opts
-      "
-    local cmt_opts="
-      --edit --rmdir --find-copies-harder --copy-similarity=
-      "
-
-    case "$subcommand,$cur" in
-    fetch,--*)
-      __gitcomp "--revision= --fetch-all $fc_opts"
-      ;;
-    clone,--*)
-      __gitcomp "--revision= $fc_opts $init_opts"
-      ;;
-    init,--*)
-      __gitcomp "$init_opts"
-      ;;
-    dcommit,--*)
-      __gitcomp "
-        --merge --strategy= --verbose --dry-run
-        --fetch-all --no-rebase --commit-url
-        --revision --interactive $cmt_opts $fc_opts
-        "
-      ;;
-    set-tree,--*)
-      __gitcomp "--stdin $cmt_opts $fc_opts"
-      ;;
-    create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
-    show-externals,--*|mkdirs,--*)
-      __gitcomp "--revision="
-      ;;
-    log,--*)
-      __gitcomp "
-        --limit= --revision= --verbose --incremental
-        --oneline --show-commit --non-recursive
-        --authors-file= --color
-        "
-      ;;
-    rebase,--*)
-      __gitcomp "
-        --merge --verbose --strategy= --local
-        --fetch-all --dry-run $fc_opts
-        "
-      ;;
-    commit-diff,--*)
-      __gitcomp "--message= --file= --revision= $cmt_opts"
-      ;;
-    info,--*)
-      __gitcomp "--url"
-      ;;
-    branch,--*)
-      __gitcomp "--dry-run --message --tag"
-      ;;
-    tag,--*)
-      __gitcomp "--dry-run --message"
-      ;;
-    blame,--*)
-      __gitcomp "--git-format"
-      ;;
-    migrate,--*)
-      __gitcomp "
-        --config-dir= --ignore-paths= --minimize
-        --no-auth-cache --username=
-        "
-      ;;
-    reset,--*)
-      __gitcomp "--revision= --parent"
-      ;;
-    *)
-      ;;
-    esac
-  fi
-}
-
-_git_tag ()
-{
-  local i c=1 f=0
-  while [ $c -lt $cword ]; do
-    i="${words[c]}"
-    case "$i" in
-    -d|-v)
-      __gitcomp_nl "$(__git_tags)"
-      return
-      ;;
-    -f)
-      f=1
-      ;;
-    esac
-    ((c++))
-  done
-
-  case "$prev" in
-  -m|-F)
-    ;;
-  -*|tag)
-    if [ $f = 1 ]; then
-      __gitcomp_nl "$(__git_tags)"
-    fi
-    ;;
-  *)
-    __gitcomp_nl "$(__git_refs)"
-    ;;
-  esac
-
-  case "$cur" in
-  --*)
-    __gitcomp "
-      --list --delete --verify --annotate --message --file
-      --sign --cleanup --local-user --force --column --sort
-      --contains --points-at
-      "
-    ;;
-  esac
-}
-
-_git_whatchanged ()
-{
-  _git_log
-}
-
-__git_main ()
-{
-  local i c=1 command __git_dir
-
-  while [ $c -lt $cword ]; do
-    i="${words[c]}"
-    case "$i" in
-    --git-dir=*) __git_dir="${i#--git-dir=}" ;;
-    --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
-    --bare)      __git_dir="." ;;
-    --help) command="help"; break ;;
-    -c|--work-tree|--namespace) ((c++)) ;;
-    -*) ;;
-    *) command="$i"; break ;;
-    esac
-    ((c++))
-  done
-
-  if [ -z "$command" ]; then
-    case "$cur" in
-    --*)   __gitcomp "
-      --paginate
-      --no-pager
-      --git-dir=
-      --bare
-      --version
-      --exec-path
-      --exec-path=
-      --html-path
-      --man-path
-      --info-path
-      --work-tree=
-      --namespace=
-      --no-replace-objects
-      --help
-      "
-      ;;
-    *)     __git_compute_porcelain_commands
-           __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
-    esac
-    return
-  fi
-
-  local completion_func="_git_${command//-/_}"
-  declare -f $completion_func >/dev/null && $completion_func && return
-
-  local expansion=$(__git_aliased_command "$command")
-  if [ -n "$expansion" ]; then
-    words[1]=$expansion
-    completion_func="_git_${expansion//-/_}"
-    declare -f $completion_func >/dev/null && $completion_func
-  fi
-}
-
-__gitk_main ()
-{
-  __git_has_doubledash && return
-
-  local g="$(__gitdir)"
-  local merge=""
-  if [ -f "$g/MERGE_HEAD" ]; then
-    merge="--merge"
-  fi
-  case "$cur" in
-  --*)
-    __gitcomp "
-      $__git_log_common_options
-      $__git_log_gitk_options
-      $merge
-      "
-    return
-    ;;
-  esac
-  __git_complete_revlist
-}
-
-if [[ -n ${ZSH_VERSION-} ]]; then
-  echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
-
-  autoload -U +X compinit && compinit
-
-  __gitcomp ()
-  {
-    emulate -L zsh
-
-    local cur_="${3-$cur}"
-
-    case "$cur_" in
-    --*=)
-      ;;
-    *)
-      local c IFS=$' \t\n'
-      local -a array
-      for c in ${=1}; do
-        c="$c${4-}"
-        case $c in
-        --*=*|*.) ;;
-        *) c="$c " ;;
-        esac
-        array[${#array[@]}+1]="$c"
-      done
-      compset -P '*[=:]'
-      compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
-      ;;
-    esac
-  }
-
-  __gitcomp_nl ()
-  {
-    emulate -L zsh
-
-    local IFS=$'\n'
-    compset -P '*[=:]'
-    compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
-  }
-
-  __gitcomp_file ()
-  {
-    emulate -L zsh
-
-    local IFS=$'\n'
-    compset -P '*[=:]'
-    compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
-  }
-
-  _git ()
-  {
-    local _ret=1 cur cword prev
-    cur=${words[CURRENT]}
-    prev=${words[CURRENT-1]}
-    let cword=CURRENT-1
-    emulate ksh -c __${service}_main
-    let _ret && _default && _ret=0
-    return _ret
-  }
-
-  compdef _git git gitk
-  return
-fi
-
-__git_func_wrap ()
-{
-  local cur words cword prev
-  _get_comp_words_by_ref -n =: cur words cword prev
-  $1
-}
-
-# Setup completion for certain functions defined above by setting common
-# variables and workarounds.
-# This is NOT a public function; use at your own risk.
-__git_complete ()
-{
-  local wrapper="__git_wrap${2}"
-  eval "$wrapper () { __git_func_wrap $2 ; }"
-  complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
-    || complete -o default -o nospace -F $wrapper $1
-}
-
-# wrapper for backwards compatibility
-_git ()
-{
-  __git_wrap__git_main
-}
-
-# wrapper for backwards compatibility
-_gitk ()
-{
-  __git_wrap__gitk_main
-}
-
-__git_complete git __git_main
-__git_complete gitk __gitk_main
-
-# The following are necessary only for Cygwin, and only are needed
-# when the user has tab-completed the executable name and consequently
-# included the '.exe' suffix.
-#
-if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
-__git_complete git.exe __git_main
-fi
diff --git a/.config/bash/profile.d/git-prompt.sh b/.config/bash/profile.d/git-prompt.sh
deleted file mode 100644 (file)
index 29ec012..0000000
+++ /dev/null
@@ -1,531 +0,0 @@
-# bash/zsh git prompt support
-#
-# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
-# Distributed under the GNU General Public License, version 2.0.
-#
-# This script allows you to see repository status in your prompt.
-#
-# To enable:
-#
-#    1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).
-#    2) Add the following line to your .bashrc/.zshrc:
-#        source ~/.git-prompt.sh
-#    3a) Change your PS1 to call __git_ps1 as
-#        command-substitution:
-#        Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
-#        ZSH:  setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
-#        the optional argument will be used as format string.
-#    3b) Alternatively, for a slightly faster prompt, __git_ps1 can
-#        be used for PROMPT_COMMAND in Bash or for precmd() in Zsh
-#        with two parameters, <pre> and <post>, which are strings
-#        you would put in $PS1 before and after the status string
-#        generated by the git-prompt machinery.  e.g.
-#        Bash: PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
-#          will show username, at-sign, host, colon, cwd, then
-#          various status string, followed by dollar and SP, as
-#          your prompt.
-#        ZSH:  precmd () { __git_ps1 "%n" ":%~$ " "|%s" }
-#          will show username, pipe, then various status string,
-#          followed by colon, cwd, dollar and SP, as your prompt.
-#        Optionally, you can supply a third argument with a printf
-#        format string to finetune the output of the branch status
-#
-# The repository status will be displayed only if you are currently in a
-# git repository. The %s token is the placeholder for the shown status.
-#
-# The prompt status always includes the current branch name.
-#
-# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value,
-# unstaged (*) and staged (+) changes will be shown next to the branch
-# name.  You can configure this per-repository with the
-# bash.showDirtyState variable, which defaults to true once
-# GIT_PS1_SHOWDIRTYSTATE is enabled.
-#
-# You can also see if currently something is stashed, by setting
-# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
-# then a '$' will be shown next to the branch name.
-#
-# If you would like to see if there're untracked files, then you can set
-# GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked
-# files, then a '%' will be shown next to the branch name.  You can
-# configure this per-repository with the bash.showUntrackedFiles
-# variable, which defaults to true once GIT_PS1_SHOWUNTRACKEDFILES is
-# enabled.
-#
-# If you would like to see the difference between HEAD and its upstream,
-# set GIT_PS1_SHOWUPSTREAM="auto".  A "<" indicates you are behind, ">"
-# indicates you are ahead, "<>" indicates you have diverged and "="
-# indicates that there is no difference. You can further control
-# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list
-# of values:
-#
-#     verbose       show number of commits ahead/behind (+/-) upstream
-#     name          if verbose, then also show the upstream abbrev name
-#     legacy        don't use the '--count' option available in recent
-#                   versions of git-rev-list
-#     git           always compare HEAD to @{upstream}
-#     svn           always compare HEAD to your SVN upstream
-#
-# You can change the separator between the branch name and the above
-# state symbols by setting GIT_PS1_STATESEPARATOR. The default separator
-# is SP.
-#
-# By default, __git_ps1 will compare HEAD to your SVN upstream if it can
-# find one, or @{upstream} otherwise.  Once you have set
-# GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by
-# setting the bash.showUpstream config variable.
-#
-# If you would like to see more information about the identity of
-# commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE
-# to one of these values:
-#
-#     contains      relative to newer annotated tag (v1.6.3.2~35)
-#     branch        relative to newer tag or branch (master~4)
-#     describe      relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
-#     default       exactly matching tag
-#
-# If you would like a colored hint about the current dirty state, set
-# GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on
-# the colored output of "git status -sb" and are available only when
-# using __git_ps1 for PROMPT_COMMAND or precmd.
-#
-# If you would like __git_ps1 to do nothing in the case when the current
-# directory is set up to be ignored by git, then set
-# GIT_PS1_HIDE_IF_PWD_IGNORED to a nonempty value. Override this on the
-# repository level by setting bash.hideIfPwdIgnored to "false".
-
-# check whether printf supports -v
-__git_printf_supports_v=
-printf -v __git_printf_supports_v -- '%s' yes >/dev/null 2>&1
-
-# stores the divergence from upstream in $p
-# used by GIT_PS1_SHOWUPSTREAM
-__git_ps1_show_upstream ()
-{
-  local key value
-  local svn_remote svn_url_pattern count n
-  local upstream=git legacy="" verbose="" name=""
-
-  svn_remote=()
-  # get some config options from git-config
-  local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
-  while read -r key value; do
-    case "$key" in
-    bash.showupstream)
-      GIT_PS1_SHOWUPSTREAM="$value"
-      if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
-        p=""
-        return
-      fi
-      ;;
-    svn-remote.*.url)
-      svn_remote[$((${#svn_remote[@]} + 1))]="$value"
-      svn_url_pattern="$svn_url_pattern\\|$value"
-      upstream=svn+git # default upstream is SVN if available, else git
-      ;;
-    esac
-  done <<< "$output"
-
-  # parse configuration values
-  for option in ${GIT_PS1_SHOWUPSTREAM}; do
-    case "$option" in
-    git|svn) upstream="$option" ;;
-    verbose) verbose=1 ;;
-    legacy)  legacy=1  ;;
-    name)    name=1 ;;
-    esac
-  done
-
-  # Find our upstream
-  case "$upstream" in
-  git)    upstream="@{upstream}" ;;
-  svn*)
-    # get the upstream from the "git-svn-id: ..." in a commit message
-    # (git-svn uses essentially the same procedure internally)
-    local -a svn_upstream
-    svn_upstream=($(git log --first-parent -1 \
-          --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
-    if [[ 0 -ne ${#svn_upstream[@]} ]]; then
-      svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]}
-      svn_upstream=${svn_upstream%@*}
-      local n_stop="${#svn_remote[@]}"
-      for ((n=1; n <= n_stop; n++)); do
-        svn_upstream=${svn_upstream#${svn_remote[$n]}}
-      done
-
-      if [[ -z "$svn_upstream" ]]; then
-        # default branch name for checkouts with no layout:
-        upstream=${GIT_SVN_ID:-git-svn}
-      else
-        upstream=${svn_upstream#/}
-      fi
-    elif [[ "svn+git" = "$upstream" ]]; then
-      upstream="@{upstream}"
-    fi
-    ;;
-  esac
-
-  # Find how many commits we are ahead/behind our upstream
-  if [[ -z "$legacy" ]]; then
-    count="$(git rev-list --count --left-right \
-        "$upstream"...HEAD 2>/dev/null)"
-  else
-    # produce equivalent output to --count for older versions of git
-    local commits
-    if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
-    then
-      local commit behind=0 ahead=0
-      for commit in $commits
-      do
-        case "$commit" in
-        "<"*) ((behind++)) ;;
-        *)    ((ahead++))  ;;
-        esac
-      done
-      count="$behind  $ahead"
-    else
-      count=""
-    fi
-  fi
-
-  # calculate the result
-  if [[ -z "$verbose" ]]; then
-    case "$count" in
-    "") # no upstream
-      p="" ;;
-    "0  0") # equal to upstream
-      p="=" ;;
-    "0  "*) # ahead of upstream
-      p=">" ;;
-    *"  0") # behind upstream
-      p="<" ;;
-    *)      # diverged from upstream
-      p="<>" ;;
-    esac
-  else
-    case "$count" in
-    "") # no upstream
-      p="" ;;
-    "0  0") # equal to upstream
-      p=" u=" ;;
-    "0  "*) # ahead of upstream
-      p=" u+${count#0 }" ;;
-    *"  0") # behind upstream
-      p=" u-${count%  0}" ;;
-    *)      # diverged from upstream
-      p=" u+${count#* }-${count%  *}" ;;
-    esac
-    if [[ -n "$count" && -n "$name" ]]; then
-      __git_ps1_upstream_name=$(git rev-parse \
-        --abbrev-ref "$upstream" 2>/dev/null)
-      if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
-        p="$p \${__git_ps1_upstream_name}"
-      else
-        p="$p ${__git_ps1_upstream_name}"
-        # not needed anymore; keep user's
-        # environment clean
-        unset __git_ps1_upstream_name
-      fi
-    fi
-  fi
-
-}
-
-# Helper function that is meant to be called from __git_ps1.  It
-# injects color codes into the appropriate gitstring variables used
-# to build a gitstring.
-__git_ps1_colorize_gitstring ()
-{
-  if [[ -n ${ZSH_VERSION-} ]]; then
-    local c_red='%F{red}'
-    local c_green='%F{green}'
-    local c_lblue='%F{blue}'
-    local c_clear='%f'
-  else
-    # Using \[ and \] around colors is necessary to prevent
-    # issues with command line editing/browsing/completion!
-    local c_red='\[\e[31m\]'
-    local c_green='\[\e[32m\]'
-    local c_lblue='\[\e[1;34m\]'
-    local c_clear='\[\e[0m\]'
-  fi
-  local bad_color=$c_red
-  local ok_color=$c_green
-  local flags_color="$c_lblue"
-
-  local branch_color=""
-  if [ $detached = no ]; then
-    branch_color="$ok_color"
-  else
-    branch_color="$bad_color"
-  fi
-  c="$branch_color$c"
-
-  z="$c_clear$z"
-  if [ "$w" = "*" ]; then
-    w="$bad_color$w"
-  fi
-  if [ -n "$i" ]; then
-    i="$ok_color$i"
-  fi
-  if [ -n "$s" ]; then
-    s="$flags_color$s"
-  fi
-  if [ -n "$u" ]; then
-    u="$bad_color$u"
-  fi
-  r="$c_clear$r"
-}
-
-__git_eread ()
-{
-  local f="$1"
-  shift
-  test -r "$f" && read "$@" <"$f"
-}
-
-# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
-# when called from PS1 using command substitution
-# in this mode it prints text to add to bash PS1 prompt (includes branch name)
-#
-# __git_ps1 requires 2 or 3 arguments when called from PROMPT_COMMAND (pc)
-# in that case it _sets_ PS1. The arguments are parts of a PS1 string.
-# when two arguments are given, the first is prepended and the second appended
-# to the state string when assigned to PS1.
-# The optional third parameter will be used as printf format string to further
-# customize the output of the git-status string.
-# In this mode you can request colored hints using GIT_PS1_SHOWCOLORHINTS=true
-__git_ps1 ()
-{
-  # preserve exit status
-  local exit=$?
-  local pcmode=no
-  local detached=no
-  local ps1pc_start='\u@\h:\w '
-  local ps1pc_end='\$ '
-  local printf_format=' (%s)'
-
-  case "$#" in
-    2|3)  pcmode=yes
-      ps1pc_start="$1"
-      ps1pc_end="$2"
-      printf_format="${3:-$printf_format}"
-      # set PS1 to a plain prompt so that we can
-      # simply return early if the prompt should not
-      # be decorated
-      PS1="$ps1pc_start$ps1pc_end"
-    ;;
-    0|1)  printf_format="${1:-$printf_format}"
-    ;;
-    *)  return $exit
-    ;;
-  esac
-
-  # ps1_expanded:  This variable is set to 'yes' if the shell
-  # subjects the value of PS1 to parameter expansion:
-  #
-  #   * bash does unless the promptvars option is disabled
-  #   * zsh does not unless the PROMPT_SUBST option is set
-  #   * POSIX shells always do
-  #
-  # If the shell would expand the contents of PS1 when drawing
-  # the prompt, a raw ref name must not be included in PS1.
-  # This protects the user from arbitrary code execution via
-  # specially crafted ref names.  For example, a ref named
-  # 'refs/heads/$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)' might cause the
-  # shell to execute 'sudo rm -rf /' when the prompt is drawn.
-  #
-  # Instead, the ref name should be placed in a separate global
-  # variable (in the __git_ps1_* namespace to avoid colliding
-  # with the user's environment) and that variable should be
-  # referenced from PS1.  For example:
-  #
-  #     __git_ps1_foo=$(do_something_to_get_ref_name)
-  #     PS1="...stuff...\${__git_ps1_foo}...stuff..."
-  #
-  # If the shell does not expand the contents of PS1, the raw
-  # ref name must be included in PS1.
-  #
-  # The value of this variable is only relevant when in pcmode.
-  #
-  # Assume that the shell follows the POSIX specification and
-  # expands PS1 unless determined otherwise.  (This is more
-  # likely to be correct if the user has a non-bash, non-zsh
-  # shell and safer than the alternative if the assumption is
-  # incorrect.)
-  #
-  local ps1_expanded=yes
-  [ -z "$ZSH_VERSION" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
-  [ -z "$BASH_VERSION" ] || shopt -q promptvars || ps1_expanded=no
-
-  local repo_info rev_parse_exit_code
-  repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
-    --is-bare-repository --is-inside-work-tree \
-    --short HEAD 2>/dev/null)"
-  rev_parse_exit_code="$?"
-
-  if [ -z "$repo_info" ]; then
-    return $exit
-  fi
-
-  local short_sha
-  if [ "$rev_parse_exit_code" = "0" ]; then
-    short_sha="${repo_info##*$'\n'}"
-    repo_info="${repo_info%$'\n'*}"
-  fi
-  local inside_worktree="${repo_info##*$'\n'}"
-  repo_info="${repo_info%$'\n'*}"
-  local bare_repo="${repo_info##*$'\n'}"
-  repo_info="${repo_info%$'\n'*}"
-  local inside_gitdir="${repo_info##*$'\n'}"
-  local g="${repo_info%$'\n'*}"
-
-  if [ "true" = "$inside_worktree" ] &&
-     [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &&
-     [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &&
-     git check-ignore -q .
-  then
-    return $exit
-  fi
-
-  local r=""
-  local b=""
-  local step=""
-  local total=""
-  if [ -d "$g/rebase-merge" ]; then
-    __git_eread "$g/rebase-merge/head-name" b
-    __git_eread "$g/rebase-merge/msgnum" step
-    __git_eread "$g/rebase-merge/end" total
-    if [ -f "$g/rebase-merge/interactive" ]; then
-      r="|REBASE-i"
-    else
-      r="|REBASE-m"
-    fi
-  else
-    if [ -d "$g/rebase-apply" ]; then
-      __git_eread "$g/rebase-apply/next" step
-      __git_eread "$g/rebase-apply/last" total
-      if [ -f "$g/rebase-apply/rebasing" ]; then
-        __git_eread "$g/rebase-apply/head-name" b
-        r="|REBASE"
-      elif [ -f "$g/rebase-apply/applying" ]; then
-        r="|AM"
-      else
-        r="|AM/REBASE"
-      fi
-    elif [ -f "$g/MERGE_HEAD" ]; then
-      r="|MERGING"
-    elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
-      r="|CHERRY-PICKING"
-    elif [ -f "$g/REVERT_HEAD" ]; then
-      r="|REVERTING"
-    elif [ -f "$g/BISECT_LOG" ]; then
-      r="|BISECTING"
-    fi
-
-    if [ -n "$b" ]; then
-      :
-    elif [ -h "$g/HEAD" ]; then
-      # symlink symbolic ref
-      b="$(git symbolic-ref HEAD 2>/dev/null)"
-    else
-      local head=""
-      if ! __git_eread "$g/HEAD" head; then
-        return $exit
-      fi
-      # is it a symbolic ref?
-      b="${head#ref: }"
-      if [ "$head" = "$b" ]; then
-        detached=yes
-        b="$(
-        case "${GIT_PS1_DESCRIBE_STYLE-}" in
-        (contains)
-          git describe --contains HEAD ;;
-        (branch)
-          git describe --contains --all HEAD ;;
-        (describe)
-          git describe HEAD ;;
-        (* | default)
-          git describe --tags --exact-match HEAD ;;
-        esac 2>/dev/null)" ||
-
-        b="$short_sha..."
-        b="($b)"
-      fi
-    fi
-  fi
-
-  if [ -n "$step" ] && [ -n "$total" ]; then
-    r="$r $step/$total"
-  fi
-
-  local w=""
-  local i=""
-  local s=""
-  local u=""
-  local c=""
-  local p=""
-
-  if [ "true" = "$inside_gitdir" ]; then
-    if [ "true" = "$bare_repo" ]; then
-      c="BARE:"
-    else
-      b="GIT_DIR!"
-    fi
-  elif [ "true" = "$inside_worktree" ]; then
-    if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &&
-       [ "$(git config --bool bash.showDirtyState)" != "false" ]
-    then
-      git diff --no-ext-diff --quiet || w="*"
-      git diff --no-ext-diff --cached --quiet || i="+"
-      if [ -z "$short_sha" ] && [ -z "$i" ]; then
-        i="#"
-      fi
-    fi
-    if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &&
-       git rev-parse --verify --quiet refs/stash >/dev/null
-    then
-      s="$"
-    fi
-
-    if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &&
-       [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &&
-       git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null
-    then
-      u="%${ZSH_VERSION+%}"
-    fi
-
-    if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
-      __git_ps1_show_upstream
-    fi
-  fi
-
-  local z="${GIT_PS1_STATESEPARATOR-" "}"
-
-  # NO color option unless in PROMPT_COMMAND mode
-  if [ $pcmode = yes ] && [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
-    __git_ps1_colorize_gitstring
-  fi
-
-  b=${b##refs/heads/}
-  if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
-    __git_ps1_branch_name=$b
-    b="\${__git_ps1_branch_name}"
-  fi
-
-  local f="$w$i$s$u"
-  local gitstring="$c$b${f:+$z$f}$r$p"
-
-  if [ $pcmode = yes ]; then
-    if [ "${__git_printf_supports_v-}" != yes ]; then
-      gitstring=$(printf -- "$printf_format" "$gitstring")
-    else
-      printf -v gitstring -- "$printf_format" "$gitstring"
-    fi
-    PS1="$ps1pc_start$gitstring$ps1pc_end"
-  else
-    printf -- "$printf_format" "$gitstring"
-  fi
-
-  return $exit
-}
diff --git a/.config/bash/profile.d/options b/.config/bash/profile.d/options
deleted file mode 100644 (file)
index 22beba3..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-# Case-insensitive globbing (used in pathname expansion)
-shopt -s nocaseglob;
-
-# Append to the Bash history file, rather than overwriting it
-shopt -s histappend;
-
-# Autocorrect typos in path names when using `cd`
-shopt -s cdspell;
-
-# Enable some Bash 4 features when possible:
-# * `autocd`, e.g. `**/qux` will enter `./foo/bar/baz/qux`
-# * Recursive globbing, e.g. `echo **/*.txt`
-for option in autocd globstar; do
-       shopt -s "$option" 2> /dev/null;
-done;
-
-# File creation
-umask 022
-
-# Don't use ^D to exit
-set -o ignoreeof
-set -o vi
-
diff --git a/.config/bash/profile.d/paths b/.config/bash/profile.d/paths
deleted file mode 100644 (file)
index eec134f..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-
-# Set PATH so it includes user's private bin if it exists
-# if [ -d "${HOME}/bin" ] ; then
-#  PATH="${HOME}/bin:${PATH}"
-# fi
-
-# Set MANPATH so it includes users' private man if it exists
-# if [ -d "${HOME}/man" ]; then
-#   MANPATH="${HOME}/man:${MANPATH}"
-# fi
-
-# Set INFOPATH so it includes users' private info if it exists
-# if [ -d "${HOME}/info" ]; then
-#   INFOPATH="${HOME}/info:${INFOPATH}"
-# fi
-
-# Set PATH to temporary folders
-export TEMPDIR="${HOME}/tmp"
-export TMPDIR="${HOME}/tmp"
-
-# Set PATH to dotfiles git folder
-export DOTFILES="${HOME}/.dotfiles"
-
-# Set PATH to PREFIX folders
-export PREFIX="${HOME}"
-
-PATH="${PREFIX}/bin:${PATH}"
-MANPATH="${PREFIX}/share/man:${MANPATH}"
-INFOPATH="${PREFIX}/share/info:${INFOPATH}"
-
-# Add local libraries to libpath
-# LD_LIBRARY_PATH="${PREFIX}/lib:${LD_LIBRARY_PATH}"
diff --git a/.config/bash/profile.d/prompt b/.config/bash/profile.d/prompt
deleted file mode 100644 (file)
index bca13df..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-# Bash git prompt solarized
-
-if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then
-        export TERM='gnome-256color';
-elif infocmp xterm-256color >/dev/null 2>&1; then
-        export TERM='xterm-256color';
-fi;
-
-if tput setaf 1 &> /dev/null; then
-       tput sgr0; # reset colors
-       bold=$(tput bold);
-       reset=$(tput sgr0);
-       black=$(tput setaf 0);
-       blue=$(tput setaf 33);
-       cyan=$(tput setaf 37);
-       green=$(tput setaf 64);
-       orange=$(tput setaf 166);
-       purple=$(tput setaf 125);
-       red=$(tput setaf 124);
-       violet=$(tput setaf 61);
-       white=$(tput setaf 15);
-       yellow=$(tput setaf 136);
-else
-       bold='';
-       reset="\e[0m";
-       black="\e[1;30m";
-       blue="\e[1;34m";
-       cyan="\e[1;36m";
-       green="\e[1;32m";
-       orange="\e[1;33m";
-       purple="\e[1;35m";
-       red="\e[1;31m";
-       violet="\e[1;35m";
-       white="\e[1;37m";
-       yellow="\e[1;33m";
-fi;
-
-# Highlight the user name when logged in as root.
-if [[ "${USER}" == "root" ]]; then
-       userStyle="${red}";
-else
-       userStyle="${orange}";
-fi;
-
-# Highlight the hostname when connected via SSH.
-if [[ "${SSH_TTY}" ]]; then
-       hostStyle="${bold}${red}";
-else
-       hostStyle="${yellow}";
-fi;
-
-# Enabling any of these options will slow down the prompt
-export GIT_PS1_SHOWDIRTYSTATE=1
-export GIT_PS1_SHOWSTASHSTATE=1
-export GIT_PS1_SHOWUNTRACKEDFILES=1
-export GIT_PS1_SHOWUPSTREAM=1
-
-# Set git prompt
-# Set the terminal title to the current working directory.
-PS1='\[\033]0;\w\007\]';
-PS1+='\[${bold}\]';
-PS1+='\r'; # newline
-PS1+='\[${userStyle}\]\u '; # username
-PS1+='\[${white}\]at ';
-PS1+='\[${hostStyle}\]\h '; # at host
-PS1+='\[${white}\]in ';
-PS1+='\[${green}\]\w '; # in working directory
-PS1+="$(__git_ps1 '\[${white}\]on \[${violet}\]%s\[${blue}\]')";  # on branch
-PS1+='\n'; # newline
-PS1+='\[${white}\]\$ '; # `$`
-PS1+='\[${reset}\]'; # reset color
-export PS1;
-
-PS2='\[${yellow}\]→ '; # `→`
-PS2+='\[${reset}\]'; # reset color
-export PS2;
diff --git a/.config/bash/profile.d/solarized b/.config/bash/profile.d/solarized
deleted file mode 100644 (file)
index e9ca994..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-[ "$PLATFORM" == "Darwin" ] && return;\r
-\r
-echo -ne   '\eP\e]10;#839496\a'  # Foreground   -> base0\r
-echo -ne   '\eP\e]11;#002B36\a'  # Background   -> base03\r
-\r
-echo -ne   '\eP\e]12;#DC322F\a'  # Cursor       -> red\r
-\r
-echo -ne  '\eP\e]4;0;#073642\a'  # black        -> Base02\r
-echo -ne  '\eP\e]4;8;#002B36\a'  # bold black   -> Base03\r
-echo -ne  '\eP\e]4;1;#DC322F\a'  # red          -> red\r
-echo -ne  '\eP\e]4;9;#CB4B16\a'  # bold red     -> orange\r
-echo -ne  '\eP\e]4;2;#859900\a'  # green        -> green\r
-echo -ne '\eP\e]4;10;#586E75\a'  # bold green   -> base01 *\r
-echo -ne  '\eP\e]4;3;#B58900\a'  # yellow       -> yellow\r
-echo -ne '\eP\e]4;11;#657B83\a'  # bold yellow  -> base00 *\r
-echo -ne  '\eP\e]4;4;#268BD2\a'  # blue         -> blue\r
-echo -ne '\eP\e]4;12;#839496\a'  # bold blue    -> base0 *\r
-echo -ne  '\eP\e]4;5;#D33682\a'  # magenta      -> magenta\r
-echo -ne '\eP\e]4;13;#6C71C4\a'  # bold magenta -> violet\r
-echo -ne  '\eP\e]4;6;#2AA198\a'  # cyan         -> cyan\r
-echo -ne '\eP\e]4;14;#93A1A1\a'  # bold cyan    -> base1 *\r
-echo -ne  '\eP\e]4;7;#EEE8D5\a'  # white        -> Base2\r
-echo -ne '\eP\e]4;15;#FDF6E3\a'  # bold white   -> Base3\r
diff --git a/.config/bash/rc/aliases b/.config/bash/rc/aliases
new file mode 100644 (file)
index 0000000..75eaa0c
--- /dev/null
@@ -0,0 +1,100 @@
+# Easier navigation: .., ..., ...., ....., ~ and -
+alias ..="cd .."
+alias ...="cd ../.."
+alias ....="cd ../../.."
+alias .....="cd ../../../.."
+alias ~="cd ~" # `cd` is probably faster to type though
+alias -- -="cd -"
+alias cd=cd_func
+alias -- --="cd --"
+alias -- -0="cd -0"
+alias -- -1="cd -1"
+alias -- -2="cd -2"
+alias -- -3="cd -3"
+alias -- -4="cd -4"
+alias -- -5="cd -5"
+alias -- -6="cd -6"
+alias -- -7="cd -7"
+alias -- -8="cd -8"
+alias -- -9="cd -9"
+
+# Secure settings
+alias rm='rm -i'
+alias cp='cp -i'
+alias mv='mv -i'
+
+alias info='info --vi-keys'
+#alias less='less -rX'                         # raw control characters, don't clear the screen after quitting
+alias whence='type -a'                        # where, of a sort
+alias grep='grep --color'                     # show differences in color
+alias egrep='egrep --color=auto'              # show differences in color
+alias fgrep='fgrep --color=auto'              # show differences in color
+
+# Shortcuts
+alias g="git"
+alias h="history"
+alias j="jobs"
+
+LS_COMMON="-hF"
+#LS_COMMON="$LS_COMMON -I NTUSER.\* -I ntuser.\*"
+
+# Detect which `ls` flavor is in use
+if whence dircolors > /dev/null 2>&1; then # GNU `ls`
+       eval $(dircolors -b $HOME/.dir_colors)
+       colorflag="--color"
+else # OS X `ls`
+       #eval $(gdircolors $HOME/.dircolors)
+       export CLICOLOR=1
+       colorflag="-G"
+fi
+
+# Always list colorized
+LS_COMMON="$LS_COMMON $colorflag"
+alias ls="command ls $LS_COMMON"
+
+# List all files excl. dotfiles
+alias l="ls"
+
+# List all files in long format excl. dotfiles
+alias ll="ls -l"
+
+# List all files in long format, incl. dotfiles
+alias la="ls -la"
+
+# List only directories
+alias lsd="ls -l | grep --color=never '^d'"
+
+# List only dotfiles
+alias l.="ls -d .*"
+
+# Enable aliases to be sudo'ed
+alias sudo='sudo '
+
+# Get week number
+alias week='date +%V'
+
+# Stopwatch
+alias timer='echo "Timer started. Stop with Ctrl-D." && date && time cat && date'
+
+# Intuitive map function
+# For example, to list all directories that contain a certain file:
+# find . -name .gitattributes | map dirname
+alias map="xargs -n1"
+
+for method in GET HEAD POST PUT DELETE TRACE OPTIONS; do
+       alias "$method"="lwp-request -m '$method'"
+done
+
+# Reload the shell (i.e. invoke as a login shell)
+alias reload="exec $SHELL -l"
+
+# alias bashhere='chere -il -t mintty -s bash'
+alias newterm='mintty /bin/env CHERE_INVOKING=1 /bin/bash -l &'
+alias gtypist='gtypist -wi'
+alias startxwin='run /usr/bin/bash.exe -l -c "/usr/bin/startxwin -- -nolock -unixkill"'
+alias sumatra='startSumatra.sh'
+alias lynx='lynx -use_mouse'
+alias startvnc='vncserver -geometry 1870x980 -depth 24'
+alias startvnc4='vnc4server -geometry 1870x980 -depth 24'
+alias python='/usr/local/bin/python3'
+alias git_local='git --git-dir=.git_local'
diff --git a/.config/bash/rc/completion b/.config/bash/rc/completion
new file mode 100644 (file)
index 0000000..11c6d16
--- /dev/null
@@ -0,0 +1,13 @@
+# Add tab completion for many Bash commands
+
+[ ! -f /etc/bash_completion ] || . /etc/bash_completion
+
+# Enable tab completion for `g` by marking it as an alias for `git`
+if type _git &> /dev/null; then
+       complete -o default -o nospace -F _git g;
+fi;
+
+# Add tab completion for SSH hostnames based on ~/.ssh/config, ignoring wildcards
+if [ -e "$HOME/.ssh/config" ]; then
+  complete -o "default" -o "nospace" -W "$(grep "^Host" ~/.ssh/config | grep -v "[?*]" | cut -d " " -f2 | tr ' ' '\n')" scp sftp ssh;
+fi;
diff --git a/.config/bash/rc/exports b/.config/bash/rc/exports
new file mode 100644 (file)
index 0000000..c9b413c
--- /dev/null
@@ -0,0 +1,39 @@
+
+# Make vim the default editor
+export EDITOR="vim";
+export VISUAL="vim";
+export MYVIMRC="$HOME/.config/vim/vimrc"
+
+# Larger bash history (allow 32³ entries; default is 500)
+export HISTSIZE=32768;
+export HISTFILESIZE=$HISTSIZE;
+export HISTCONTROL=ignoreboth;
+# Make some commands not show up in history
+export HISTIGNORE="ls:cd:cd -:pwd:exit:date:* --help";
+export HISTFILE="$HOME/.cache/bash/history";
+# Whenever displaying the prompt, write the previous line to disk
+export PROMPT_COMMAND="history -a";
+
+# Prefer US English and use UTF-8
+# export LANG=$(locale -uU)
+export LANG="en_US.UTF-8";
+export LC_ALL="en_US.UTF-8";
+
+# Highlight section titles in manual pages
+export LESS_TERMCAP_md="${yellow}";
+
+# Don’t clear the screen after quitting a manual page
+export MANPAGER="less -X";
+
+# Always enable colored `grep` output
+#export GREP_OPTIONS="--color=auto";
+
+# Set up syntax highlighting for 'less' (requires source-highlight package)
+# See http://www.gnu.org/software/src-highlite/source-highlight.html
+# export LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s"
+export LESS=-eFRX
+
+# Tell lynx where the color settings are that were adjusted for the
+# Solarized color scheme
+export LYNX_LSS=$HOME/.config/lynx.lss
+
diff --git a/.config/bash/rc/extra b/.config/bash/rc/extra
new file mode 100644 (file)
index 0000000..944ac72
--- /dev/null
@@ -0,0 +1,14 @@
+# Platform specific
+if [ "$PLATFORM" == "Msys" ]; then
+  # Mount the portable Documents folder, if it isn't already
+  if [ ! -d Documents ]; then
+    mount "${USBDRV}\Documents" "${HOME}/Documents";
+  fi
+fi
+
+if [ "$PLATFORM" == "Cygwin" ]; then
+  # Mount the portable Documents folder, if it isn't already
+  if [ ! -d Documents ]; then
+    mount -f -o noacl,posix=0 ${USBDRV}/Documents ${HOME}/Documents;
+  fi
+fi
diff --git a/.config/bash/rc/functions b/.config/bash/rc/functions
new file mode 100644 (file)
index 0000000..eac18eb
--- /dev/null
@@ -0,0 +1,296 @@
+# Create a new directory and enter it
+function mkd() {
+       mkdir -p "$@" && cd "$@";
+}
+
+# Change working directory to the top-most Finder window location
+function cdf() { # short for `cdfinder`
+       cd "$(osascript -e 'tell app "Finder" to POSIX path of (insertion location as alias)')";
+}
+
+# Create a .tar.gz archive, using `zopfli`, `pigz` or `gzip` for compression
+function targz() {
+       local tmpFile="${@%/}.tar";
+       tar -cvf "${tmpFile}" --exclude=".DS_Store" "${@}" || return 1;
+
+       size=$(
+               stat -f"%z" "${tmpFile}" 2> /dev/null; # OS X `stat`
+               stat -c"%s" "${tmpFile}" 2> /dev/null # GNU `stat`
+       );
+
+       local cmd="";
+       if (( size < 52428800 )) && hash zopfli 2> /dev/null; then
+               # the .tar file is smaller than 50 MB and Zopfli is available; use it
+               cmd="zopfli";
+       else
+               if hash pigz 2> /dev/null; then
+                       cmd="pigz";
+               else
+                       cmd="gzip";
+               fi;
+       fi;
+
+       echo "Compressing .tar using \`${cmd}\`\85";
+       "${cmd}" -v "${tmpFile}" || return 1;
+       [ -f "${tmpFile}" ] && rm "${tmpFile}";
+       echo "${tmpFile}.gz created successfully.";
+}
+
+# Determine size of a file or total size of a directory
+function fs() {
+       if du -b /dev/null > /dev/null 2>&1; then
+               local arg=-sbh;
+       else
+               local arg=-sh;
+       fi
+       if [[ -n "$@" ]]; then
+               du $arg -- "$@";
+       else
+               du $arg .[^.]* *;
+       fi;
+}
+
+# Use Git\92s colored diff when available
+hash git &>/dev/null;
+if [ $? -eq 0 ]; then
+       function diff() {
+               git diff --no-index --color-words "$@";
+       }
+fi;
+
+# Create a data URL from a file
+function dataurl() {
+       local mimeType=$(file -b --mime-type "$1");
+       if [[ $mimeType == text/* ]]; then
+               mimeType="${mimeType};charset=utf-8";
+       fi
+       echo "data:${mimeType};base64,$(openssl base64 -in "$1" | tr -d '\n')";
+}
+
+# Create a git.io short URL
+function gitio() {
+       if [ -z "${1}" -o -z "${2}" ]; then
+               echo "Usage: \`gitio slug url\`";
+               return 1;
+       fi;
+       curl -i http://git.io/ -F "url=${2}" -F "code=${1}";
+}
+
+# Start an HTTP server from a directory, optionally specifying the port
+function server() {
+       local port="${1:-8000}";
+       sleep 1 && open "http://localhost:${port}/" &
+       # Set the default Content-Type to `text/plain` instead of `application/octet-stream`
+       # And serve everything as UTF-8 (although not technically correct, this doesn\92t break anything for binary files)
+       python -c $'import SimpleHTTPServer;\nmap = SimpleHTTPServer.SimpleHTTPRequestHandler.extensions_map;\nmap[""] = "text/plain";\nfor key, value in map.items():\n\tmap[key] = value + ";charset=UTF-8";\nSimpleHTTPServer.test();' "$port";
+}
+
+# Start a PHP server from a directory, optionally specifying the port
+# (Requires PHP 5.4.0+.)
+function phpserver() {
+       local port="${1:-4000}";
+       local ip=$(ipconfig getifaddr en1);
+       sleep 1 && open "http://${ip}:${port}/" &
+       php -S "${ip}:${port}";
+}
+
+# Compare original and gzipped file size
+function gz() {
+       local origsize=$(wc -c < "$1");
+       local gzipsize=$(gzip -c "$1" | wc -c);
+       local ratio=$(echo "$gzipsize * 100 / $origsize" | bc -l);
+       printf "orig: %d bytes\n" "$origsize";
+       printf "gzip: %d bytes (%2.2f%%)\n" "$gzipsize" "$ratio";
+}
+
+# Syntax-highlight JSON strings or files
+# Usage: `json '{"foo":42}'` or `echo '{"foo":42}' | json`
+function json() {
+       if [ -t 0 ]; then # argument
+               python -mjson.tool <<< "$*" | pygmentize -l javascript;
+       else # pipe
+               python -mjson.tool | pygmentize -l javascript;
+       fi;
+}
+
+# Run `dig` and display the most useful info
+function digga() {
+       dig +nocmd "$1" any +multiline +noall +answer;
+}
+
+# UTF-8-encode a string of Unicode symbols
+function escape() {
+       printf "\\\x%s" $(printf "$@" | xxd -p -c1 -u);
+       # print a newline unless we\92re piping the output to another program
+       if [ -t 1 ]; then
+               echo ""; # newline
+       fi;
+}
+
+# Decode \x{ABCD}-style Unicode escape sequences
+function unidecode() {
+       perl -e "binmode(STDOUT, ':utf8'); print \"$@\"";
+       # print a newline unless we\92re piping the output to another program
+       if [ -t 1 ]; then
+               echo ""; # newline
+       fi;
+}
+
+# Get a character\92s Unicode code point
+function codepoint() {
+       perl -e "use utf8; print sprintf('U+%04X', ord(\"$@\"))";
+       # print a newline unless we\92re piping the output to another program
+       if [ -t 1 ]; then
+               echo ""; # newline
+       fi;
+}
+
+# Show all the names (CNs and SANs) listed in the SSL certificate
+# for a given domain
+function getcertnames() {
+       if [ -z "${1}" ]; then
+               echo "ERROR: No domain specified.";
+               return 1;
+       fi;
+
+       local domain="${1}";
+       echo "Testing ${domain}\85";
+       echo ""; # newline
+
+       local tmp=$(echo -e "GET / HTTP/1.0\nEOT" \
+               | openssl s_client -connect "${domain}:443" 2>&1);
+
+       if [[ "${tmp}" = *"-----BEGIN CERTIFICATE-----"* ]]; then
+               local certText=$(echo "${tmp}" \
+                       | openssl x509 -text -certopt "no_header, no_serial, no_version, \
+                       no_signame, no_validity, no_issuer, no_pubkey, no_sigdump, no_aux");
+                       echo "Common Name:";
+                       echo ""; # newline
+                       echo "${certText}" | grep "Subject:" | sed -e "s/^.*CN=//";
+                       echo ""; # newline
+                       echo "Subject Alternative Name(s):";
+                       echo ""; # newline
+                       echo "${certText}" | grep -A 1 "Subject Alternative Name:" \
+                               | sed -e "2s/DNS://g" -e "s/ //g" | tr "," "\n" | tail -n +2;
+                       return 0;
+       else
+               echo "ERROR: Certificate not found.";
+               return 1;
+       fi;
+}
+
+# `s` with no arguments opens the current directory in Sublime Text, otherwise
+# opens the given location
+function s() {
+       if [ $# -eq 0 ]; then
+               subl .;
+       else
+               subl "$@";
+       fi;
+}
+
+# `a` with no arguments opens the current directory in Atom Editor, otherwise
+# opens the given location
+function a() {
+       if [ $# -eq 0 ]; then
+               atom .;
+       else
+               atom "$@";
+       fi;
+}
+
+# `v` with no arguments opens the current directory in Vim, otherwise opens the
+# given location
+function v() {
+       if [ $# -eq 0 ]; then
+               vim .;
+       else
+               vim "$@";
+       fi;
+}
+
+# `o` with no arguments opens the current directory, otherwise opens the given
+# location
+function o() {
+       if [ $# -eq 0 ]; then
+               open .;
+       else
+               open "$@";
+       fi;
+}
+
+# `tre` is a shorthand for `tree` with hidden files and color enabled, ignoring
+# the `.git` directory, listing directories first. The output gets piped into
+# `less` with options to preserve color and line numbers, unless the output is
+# small enough for one screen.
+function tre() {
+       tree -aC -I '.git|node_modules|bower_components' --dirsfirst "$@" | less -FRNX;
+}
+
+repo_co ()
+{
+  repo forall -c 'pwd; git checkout '$1
+}
+
+git_getproj ()
+{
+  git remote -v | head -n1 | awk '{print $2}' | sed 's/.*29418\///'
+}
+
+# This function defines a 'cd' replacement function capable of keeping,
+# displaying and accessing history of visited directories, up to 10 entries.
+# To use it, uncomment it, source this file and try 'cd --'.
+# acd_func 1.0.5, 10-nov-2004
+# Petar Marinov, http:/geocities.com/h2428, this is public domain
+
+cd_func()
+{
+  local x2 the_new_dir adir index
+  local -i cnt
+
+  if [[ $1 ==  "--" ]]; then
+    dirs -v
+    return 0
+  fi
+
+  the_new_dir=$1
+  [[ -z $1 ]] && the_new_dir=$HOME
+
+  if [[ ${the_new_dir:0:1} == '-' ]]; then
+    #
+    # Extract dir N from dirs
+    index=${the_new_dir:1}
+    [[ -z $index ]] && index=1
+    adir=$(dirs +$index)
+    [[ -z $adir ]] && return 1
+    the_new_dir=$adir
+  fi
+
+  #
+  # '~' has to be substituted by ${HOME}
+  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"
+
+  #
+  # Now change to the new dir and add to the top of the stack
+  pushd "${the_new_dir}" > /dev/null
+  [[ $? -ne 0 ]] && return 1
+  the_new_dir=$(pwd)
+
+  #
+  # Trim down everything beyond 11th entry
+  popd -n +11 2>/dev/null 1>/dev/null
+
+  #
+  # Remove any other occurence of this dir, skipping the top of the stack
+  for ((cnt=1; cnt <= 10; cnt++)); do
+    x2=$(dirs +${cnt} 2>/dev/null)
+    [[ $? -ne 0 ]] && return 0
+    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
+    if [[ "${x2}" == "${the_new_dir}" ]]; then
+      popd -n +$cnt 2>/dev/null 1>/dev/null
+      cnt=cnt-1
+    fi
+  done
+
+  return 0
+}
diff --git a/.config/bash/rc/fzf.bash b/.config/bash/rc/fzf.bash
new file mode 100644 (file)
index 0000000..77d2e66
--- /dev/null
@@ -0,0 +1,26 @@
+# Setup fzf
+# ---------
+
+
+if [ -d "/usr/local/opt/fzf" ]; then
+
+if [[ ! "$PATH" == */usr/local/opt/fzf/bin* ]]; then
+  export PATH="$PATH:/usr/local/opt/fzf/bin"
+fi
+
+# Man path
+# --------
+if [[ ! "$MANPATH" == */usr/local/opt/fzf/man* && -d "/usr/local/opt/fzf/man" ]]; then
+  export MANPATH="$MANPATH:/usr/local/opt/fzf/man"
+fi
+
+# Auto-completion
+# ---------------
+[[ $- == *i* ]] && source "/usr/local/opt/fzf/shell/completion.bash" 2> /dev/null
+
+# Key bindings
+# ------------
+source "/usr/local/opt/fzf/shell/key-bindings.bash"
+
+
+fi
diff --git a/.config/bash/rc/fzf.functions b/.config/bash/rc/fzf.functions
new file mode 100644 (file)
index 0000000..03db9cc
--- /dev/null
@@ -0,0 +1,29 @@
+export FZF_DEFAULT_OPTS='-m'
+
+fe() {
+    # fe - Open the selected files with the default editor
+    local files=$(fzf --query="$1" --select-1 --exit-0 | sed -e "s/\(.*\)/\'\1\'/")
+    local command="${EDITOR:-vim} -p $files"
+    [ -n "$files" ] && eval $command
+}
+
+fd() {
+    # fd - cd to selected directory
+    local dir
+    dir=$(find ${1:-*} -path '*/\.*' -prune -o -type d -print 2> /dev/null | fzf +m) &&
+    cd "$dir"
+}
+
+fh() {
+    # fh - repeat history
+    eval $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//')
+}
+
+fkill() {
+    # fkill - kill process
+    pid=$(ps -ef | sed 1d | fzf -m | awk '{print $2}')
+    if [ "x$pid" != "x" ]
+    then
+        kill -${1:-9} $pid
+    fi
+}
diff --git a/.config/bash/rc/git-completion.bash b/.config/bash/rc/git-completion.bash
new file mode 100644 (file)
index 0000000..1ce3c51
--- /dev/null
@@ -0,0 +1,2777 @@
+# bash/zsh completion support for core Git.
+#
+# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
+# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
+# Distributed under the GNU General Public License, version 2.0.
+#
+# The contained completion routines provide support for completing:
+#
+#    *) local and remote branch names
+#    *) local and remote tag names
+#    *) .git/remotes file names
+#    *) git 'subcommands'
+#    *) git email aliases for git-send-email
+#    *) tree paths within 'ref:path/to/file' expressions
+#    *) file paths within current working directory and index
+#    *) common --long-options
+#
+# To use these routines:
+#
+#    1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
+#    2) Add the following line to your .bashrc/.zshrc:
+#        source ~/.git-completion.bash
+#    3) Consider changing your PS1 to also show the current branch,
+#       see git-prompt.sh for details.
+#
+# If you use complex aliases of form '!f() { ... }; f', you can use the null
+# command ':' as the first command in the function body to declare the desired
+# completion style.  For example '!f() { : git commit ; ... }; f' will
+# tell the completion to use commit completion.  This also works with aliases
+# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
+
+case "$COMP_WORDBREAKS" in
+*:*) : great ;;
+*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
+esac
+
+# __gitdir accepts 0 or 1 arguments (i.e., location)
+# returns location of .git repo
+__gitdir ()
+{
+  if [ -z "${1-}" ]; then
+    if [ -n "${__git_dir-}" ]; then
+      echo "$__git_dir"
+    elif [ -n "${GIT_DIR-}" ]; then
+      test -d "${GIT_DIR-}" || return 1
+      echo "$GIT_DIR"
+    elif [ -d .git ]; then
+      echo .git
+    else
+      git rev-parse --git-dir 2>/dev/null
+    fi
+  elif [ -d "$1/.git" ]; then
+    echo "$1/.git"
+  else
+    echo "$1"
+  fi
+}
+
+# The following function is based on code from:
+#
+#   bash_completion - programmable completion functions for bash 3.2+
+#
+#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
+#             © 2009-2010, Bash Completion Maintainers
+#                     <bash-completion-devel@lists.alioth.debian.org>
+#
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2, or (at your option)
+#   any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#   The latest version of this software can be obtained here:
+#
+#   http://bash-completion.alioth.debian.org/
+#
+#   RELEASE: 2.x
+
+# This function can be used to access a tokenized list of words
+# on the command line:
+#
+# __git_reassemble_comp_words_by_ref '=:'
+# if test "${words_[cword_-1]}" = -w
+# then
+#   ...
+# fi
+#
+# The argument should be a collection of characters from the list of
+# word completion separators (COMP_WORDBREAKS) to treat as ordinary
+# characters.
+#
+# This is roughly equivalent to going back in time and setting
+# COMP_WORDBREAKS to exclude those characters.  The intent is to
+# make option types like --date=<type> and <rev>:<path> easy to
+# recognize by treating each shell word as a single token.
+#
+# It is best not to set COMP_WORDBREAKS directly because the value is
+# shared with other completion scripts.  By the time the completion
+# function gets called, COMP_WORDS has already been populated so local
+# changes to COMP_WORDBREAKS have no effect.
+#
+# Output: words_, cword_, cur_.
+
+__git_reassemble_comp_words_by_ref()
+{
+  local exclude i j first
+  # Which word separators to exclude?
+  exclude="${1//[^$COMP_WORDBREAKS]}"
+  cword_=$COMP_CWORD
+  if [ -z "$exclude" ]; then
+    words_=("${COMP_WORDS[@]}")
+    return
+  fi
+  # List of word completion separators has shrunk;
+  # re-assemble words to complete.
+  for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
+    # Append each nonempty word consisting of just
+    # word separator characters to the current word.
+    first=t
+    while
+      [ $i -gt 0 ] &&
+      [ -n "${COMP_WORDS[$i]}" ] &&
+      # word consists of excluded word separators
+      [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
+    do
+      # Attach to the previous token,
+      # unless the previous token is the command name.
+      if [ $j -ge 2 ] && [ -n "$first" ]; then
+        ((j--))
+      fi
+      first=
+      words_[$j]=${words_[j]}${COMP_WORDS[i]}
+      if [ $i = $COMP_CWORD ]; then
+        cword_=$j
+      fi
+      if (($i < ${#COMP_WORDS[@]} - 1)); then
+        ((i++))
+      else
+        # Done.
+        return
+      fi
+    done
+    words_[$j]=${words_[j]}${COMP_WORDS[i]}
+    if [ $i = $COMP_CWORD ]; then
+      cword_=$j
+    fi
+  done
+}
+
+if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
+_get_comp_words_by_ref ()
+{
+  local exclude cur_ words_ cword_
+  if [ "$1" = "-n" ]; then
+    exclude=$2
+    shift 2
+  fi
+  __git_reassemble_comp_words_by_ref "$exclude"
+  cur_=${words_[cword_]}
+  while [ $# -gt 0 ]; do
+    case "$1" in
+    cur)
+      cur=$cur_
+      ;;
+    prev)
+      prev=${words_[$cword_-1]}
+      ;;
+    words)
+      words=("${words_[@]}")
+      ;;
+    cword)
+      cword=$cword_
+      ;;
+    esac
+    shift
+  done
+}
+fi
+
+__gitcompappend ()
+{
+  local x i=${#COMPREPLY[@]}
+  for x in $1; do
+    if [[ "$x" == "$3"* ]]; then
+      COMPREPLY[i++]="$2$x$4"
+    fi
+  done
+}
+
+__gitcompadd ()
+{
+  COMPREPLY=()
+  __gitcompappend "$@"
+}
+
+# Generates completion reply, appending a space to possible completion words,
+# if necessary.
+# It accepts 1 to 4 arguments:
+# 1: List of possible completion words.
+# 2: A prefix to be added to each possible completion word (optional).
+# 3: Generate possible completion matches for this word (optional).
+# 4: A suffix to be appended to each possible completion word (optional).
+__gitcomp ()
+{
+  local cur_="${3-$cur}"
+
+  case "$cur_" in
+  --*=)
+    ;;
+  *)
+    local c i=0 IFS=$' \t\n'
+    for c in $1; do
+      c="$c${4-}"
+      if [[ $c == "$cur_"* ]]; then
+        case $c in
+        --*=*|*.) ;;
+        *) c="$c " ;;
+        esac
+        COMPREPLY[i++]="${2-}$c"
+      fi
+    done
+    ;;
+  esac
+}
+
+# Variation of __gitcomp_nl () that appends to the existing list of
+# completion candidates, COMPREPLY.
+__gitcomp_nl_append ()
+{
+  local IFS=$'\n'
+  __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
+}
+
+# Generates completion reply from newline-separated possible completion words
+# by appending a space to all of them.
+# It accepts 1 to 4 arguments:
+# 1: List of possible completion words, separated by a single newline.
+# 2: A prefix to be added to each possible completion word (optional).
+# 3: Generate possible completion matches for this word (optional).
+# 4: A suffix to be appended to each possible completion word instead of
+#    the default space (optional).  If specified but empty, nothing is
+#    appended.
+__gitcomp_nl ()
+{
+  COMPREPLY=()
+  __gitcomp_nl_append "$@"
+}
+
+# Generates completion reply with compgen from newline-separated possible
+# completion filenames.
+# It accepts 1 to 3 arguments:
+# 1: List of possible completion filenames, separated by a single newline.
+# 2: A directory prefix to be added to each possible completion filename
+#    (optional).
+# 3: Generate possible completion matches for this word (optional).
+__gitcomp_file ()
+{
+  local IFS=$'\n'
+
+  # XXX does not work when the directory prefix contains a tilde,
+  # since tilde expansion is not applied.
+  # This means that COMPREPLY will be empty and Bash default
+  # completion will be used.
+  __gitcompadd "$1" "${2-}" "${3-$cur}" ""
+
+  # use a hack to enable file mode in bash < 4
+  compopt -o filenames +o nospace 2>/dev/null ||
+  compgen -f /non-existing-dir/ > /dev/null
+}
+
+# Execute 'git ls-files', unless the --committable option is specified, in
+# which case it runs 'git diff-index' to find out the files that can be
+# committed.  It return paths relative to the directory specified in the first
+# argument, and using the options specified in the second argument.
+__git_ls_files_helper ()
+{
+  if [ "$2" == "--committable" ]; then
+    git -C "$1" diff-index --name-only --relative HEAD
+  else
+    # NOTE: $2 is not quoted in order to support multiple options
+    git -C "$1" ls-files --exclude-standard $2
+  fi 2>/dev/null
+}
+
+
+# __git_index_files accepts 1 or 2 arguments:
+# 1: Options to pass to ls-files (required).
+# 2: A directory path (optional).
+#    If provided, only files within the specified directory are listed.
+#    Sub directories are never recursed.  Path must have a trailing
+#    slash.
+__git_index_files ()
+{
+  local dir="$(__gitdir)" root="${2-.}" file
+
+  if [ -d "$dir" ]; then
+    __git_ls_files_helper "$root" "$1" |
+    while read -r file; do
+      case "$file" in
+      ?*/*) echo "${file%%/*}" ;;
+      *) echo "$file" ;;
+      esac
+    done | sort | uniq
+  fi
+}
+
+__git_heads ()
+{
+  local dir="$(__gitdir)"
+  if [ -d "$dir" ]; then
+    git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
+      refs/heads
+    return
+  fi
+}
+
+__git_tags ()
+{
+  local dir="$(__gitdir)"
+  if [ -d "$dir" ]; then
+    git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
+      refs/tags
+    return
+  fi
+}
+
+# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
+# presence of 2nd argument means use the guess heuristic employed
+# by checkout for tracking branches
+__git_refs ()
+{
+  local i hash dir="$(__gitdir "${1-}")" track="${2-}"
+  local format refs
+  if [ -d "$dir" ]; then
+    case "$cur" in
+    refs|refs/*)
+      format="refname"
+      refs="${cur%/*}"
+      track=""
+      ;;
+    *)
+      for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
+        if [ -e "$dir/$i" ]; then echo $i; fi
+      done
+      format="refname:short"
+      refs="refs/tags refs/heads refs/remotes"
+      ;;
+    esac
+    git --git-dir="$dir" for-each-ref --format="%($format)" \
+      $refs
+    if [ -n "$track" ]; then
+      # employ the heuristic used by git checkout
+      # Try to find a remote branch that matches the completion word
+      # but only output if the branch name is unique
+      local ref entry
+      git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
+        "refs/remotes/" | \
+      while read -r entry; do
+        eval "$entry"
+        ref="${ref#*/}"
+        if [[ "$ref" == "$cur"* ]]; then
+          echo "$ref"
+        fi
+      done | sort | uniq -u
+    fi
+    return
+  fi
+  case "$cur" in
+  refs|refs/*)
+    git ls-remote "$dir" "$cur*" 2>/dev/null | \
+    while read -r hash i; do
+      case "$i" in
+      *^{}) ;;
+      *) echo "$i" ;;
+      esac
+    done
+    ;;
+  *)
+    echo "HEAD"
+    git for-each-ref --format="%(refname:short)" -- \
+      "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
+    ;;
+  esac
+}
+
+# __git_refs2 requires 1 argument (to pass to __git_refs)
+__git_refs2 ()
+{
+  local i
+  for i in $(__git_refs "$1"); do
+    echo "$i:$i"
+  done
+}
+
+# __git_refs_remotes requires 1 argument (to pass to ls-remote)
+__git_refs_remotes ()
+{
+  local i hash
+  git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
+  while read -r hash i; do
+    echo "$i:refs/remotes/$1/${i#refs/heads/}"
+  done
+}
+
+__git_remotes ()
+{
+  local d="$(__gitdir)"
+  test -d "$d/remotes" && ls -1 "$d/remotes"
+  git --git-dir="$d" remote
+}
+
+__git_list_merge_strategies ()
+{
+  git merge -s help 2>&1 |
+  sed -n -e '/[Aa]vailable strategies are: /,/^$/{
+    s/\.$//
+    s/.*://
+    s/^[  ]*//
+    s/[   ]*$//
+    p
+  }'
+}
+
+__git_merge_strategies=
+# 'git merge -s help' (and thus detection of the merge strategy
+# list) fails, unfortunately, if run outside of any git working
+# tree.  __git_merge_strategies is set to the empty string in
+# that case, and the detection will be repeated the next time it
+# is needed.
+__git_compute_merge_strategies ()
+{
+  test -n "$__git_merge_strategies" ||
+  __git_merge_strategies=$(__git_list_merge_strategies)
+}
+
+__git_complete_revlist_file ()
+{
+  local pfx ls ref cur_="$cur"
+  case "$cur_" in
+  *..?*:*)
+    return
+    ;;
+  ?*:*)
+    ref="${cur_%%:*}"
+    cur_="${cur_#*:}"
+    case "$cur_" in
+    ?*/*)
+      pfx="${cur_%/*}"
+      cur_="${cur_##*/}"
+      ls="$ref:$pfx"
+      pfx="$pfx/"
+      ;;
+    *)
+      ls="$ref"
+      ;;
+    esac
+
+    case "$COMP_WORDBREAKS" in
+    *:*) : great ;;
+    *)   pfx="$ref:$pfx" ;;
+    esac
+
+    __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
+        | sed '/^100... blob /{
+                   s,^.*  ,,
+                   s,$, ,
+               }
+               /^120000 blob /{
+                   s,^.*  ,,
+                   s,$, ,
+               }
+               /^040000 tree /{
+                   s,^.*  ,,
+                   s,$,/,
+               }
+               s/^.*  //')" \
+      "$pfx" "$cur_" ""
+    ;;
+  *...*)
+    pfx="${cur_%...*}..."
+    cur_="${cur_#*...}"
+    __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+    ;;
+  *..*)
+    pfx="${cur_%..*}.."
+    cur_="${cur_#*..}"
+    __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+    ;;
+  *)
+    __gitcomp_nl "$(__git_refs)"
+    ;;
+  esac
+}
+
+
+# __git_complete_index_file requires 1 argument:
+# 1: the options to pass to ls-file
+#
+# The exception is --committable, which finds the files appropriate commit.
+__git_complete_index_file ()
+{
+  local pfx="" cur_="$cur"
+
+  case "$cur_" in
+  ?*/*)
+    pfx="${cur_%/*}"
+    cur_="${cur_##*/}"
+    pfx="${pfx}/"
+    ;;
+  esac
+
+  __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
+}
+
+__git_complete_file ()
+{
+  __git_complete_revlist_file
+}
+
+__git_complete_revlist ()
+{
+  __git_complete_revlist_file
+}
+
+__git_complete_remote_or_refspec ()
+{
+  local cur_="$cur" cmd="${words[1]}"
+  local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
+  if [ "$cmd" = "remote" ]; then
+    ((c++))
+  fi
+  while [ $c -lt $cword ]; do
+    i="${words[c]}"
+    case "$i" in
+    --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
+    --all)
+      case "$cmd" in
+      push) no_complete_refspec=1 ;;
+      fetch)
+        return
+        ;;
+      *) ;;
+      esac
+      ;;
+    -*) ;;
+    *) remote="$i"; break ;;
+    esac
+    ((c++))
+  done
+  if [ -z "$remote" ]; then
+    __gitcomp_nl "$(__git_remotes)"
+    return
+  fi
+  if [ $no_complete_refspec = 1 ]; then
+    return
+  fi
+  [ "$remote" = "." ] && remote=
+  case "$cur_" in
+  *:*)
+    case "$COMP_WORDBREAKS" in
+    *:*) : great ;;
+    *)   pfx="${cur_%%:*}:" ;;
+    esac
+    cur_="${cur_#*:}"
+    lhs=0
+    ;;
+  +*)
+    pfx="+"
+    cur_="${cur_#+}"
+    ;;
+  esac
+  case "$cmd" in
+  fetch)
+    if [ $lhs = 1 ]; then
+      __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
+    else
+      __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+    fi
+    ;;
+  pull|remote)
+    if [ $lhs = 1 ]; then
+      __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
+    else
+      __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+    fi
+    ;;
+  push)
+    if [ $lhs = 1 ]; then
+      __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
+    else
+      __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
+    fi
+    ;;
+  esac
+}
+
+__git_complete_strategy ()
+{
+  __git_compute_merge_strategies
+  case "$prev" in
+  -s|--strategy)
+    __gitcomp "$__git_merge_strategies"
+    return 0
+  esac
+  case "$cur" in
+  --strategy=*)
+    __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
+    return 0
+    ;;
+  esac
+  return 1
+}
+
+__git_commands () {
+  if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
+  then
+    printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
+  else
+    git help -a|egrep '^  [a-zA-Z0-9]'
+  fi
+}
+
+__git_list_all_commands ()
+{
+  local i IFS=" "$'\n'
+  for i in $(__git_commands)
+  do
+    case $i in
+    *--*)             : helper pattern;;
+    *) echo $i;;
+    esac
+  done
+}
+
+__git_all_commands=
+__git_compute_all_commands ()
+{
+  test -n "$__git_all_commands" ||
+  __git_all_commands=$(__git_list_all_commands)
+}
+
+__git_list_porcelain_commands ()
+{
+  local i IFS=" "$'\n'
+  __git_compute_all_commands
+  for i in $__git_all_commands
+  do
+    case $i in
+    *--*)             : helper pattern;;
+    applymbox)        : ask gittus;;
+    applypatch)       : ask gittus;;
+    archimport)       : import;;
+    cat-file)         : plumbing;;
+    check-attr)       : plumbing;;
+    check-ignore)     : plumbing;;
+    check-mailmap)    : plumbing;;
+    check-ref-format) : plumbing;;
+    checkout-index)   : plumbing;;
+    column)           : internal helper;;
+    commit-tree)      : plumbing;;
+    count-objects)    : infrequent;;
+    credential)       : credentials;;
+    credential-*)     : credentials helper;;
+    cvsexportcommit)  : export;;
+    cvsimport)        : import;;
+    cvsserver)        : daemon;;
+    daemon)           : daemon;;
+    diff-files)       : plumbing;;
+    diff-index)       : plumbing;;
+    diff-tree)        : plumbing;;
+    fast-import)      : import;;
+    fast-export)      : export;;
+    fsck-objects)     : plumbing;;
+    fetch-pack)       : plumbing;;
+    fmt-merge-msg)    : plumbing;;
+    for-each-ref)     : plumbing;;
+    hash-object)      : plumbing;;
+    http-*)           : transport;;
+    index-pack)       : plumbing;;
+    init-db)          : deprecated;;
+    local-fetch)      : plumbing;;
+    ls-files)         : plumbing;;
+    ls-remote)        : plumbing;;
+    ls-tree)          : plumbing;;
+    mailinfo)         : plumbing;;
+    mailsplit)        : plumbing;;
+    merge-*)          : plumbing;;
+    mktree)           : plumbing;;
+    mktag)            : plumbing;;
+    pack-objects)     : plumbing;;
+    pack-redundant)   : plumbing;;
+    pack-refs)        : plumbing;;
+    parse-remote)     : plumbing;;
+    patch-id)         : plumbing;;
+    prune)            : plumbing;;
+    prune-packed)     : plumbing;;
+    quiltimport)      : import;;
+    read-tree)        : plumbing;;
+    receive-pack)     : plumbing;;
+    remote-*)         : transport;;
+    rerere)           : plumbing;;
+    rev-list)         : plumbing;;
+    rev-parse)        : plumbing;;
+    runstatus)        : plumbing;;
+    sh-setup)         : internal;;
+    shell)            : daemon;;
+    show-ref)         : plumbing;;
+    send-pack)        : plumbing;;
+    show-index)       : plumbing;;
+    ssh-*)            : transport;;
+    stripspace)       : plumbing;;
+    symbolic-ref)     : plumbing;;
+    unpack-file)      : plumbing;;
+    unpack-objects)   : plumbing;;
+    update-index)     : plumbing;;
+    update-ref)       : plumbing;;
+    update-server-info) : daemon;;
+    upload-archive)   : plumbing;;
+    upload-pack)      : plumbing;;
+    write-tree)       : plumbing;;
+    var)              : infrequent;;
+    verify-pack)      : infrequent;;
+    verify-tag)       : plumbing;;
+    *) echo $i;;
+    esac
+  done
+}
+
+__git_porcelain_commands=
+__git_compute_porcelain_commands ()
+{
+  test -n "$__git_porcelain_commands" ||
+  __git_porcelain_commands=$(__git_list_porcelain_commands)
+}
+
+# Lists all set config variables starting with the given section prefix,
+# with the prefix removed.
+__git_get_config_variables ()
+{
+  local section="$1" i IFS=$'\n'
+  for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
+    echo "${i#$section.}"
+  done
+}
+
+__git_pretty_aliases ()
+{
+  __git_get_config_variables "pretty"
+}
+
+__git_aliases ()
+{
+  __git_get_config_variables "alias"
+}
+
+# __git_aliased_command requires 1 argument
+__git_aliased_command ()
+{
+  local word cmdline=$(git --git-dir="$(__gitdir)" \
+    config --get "alias.$1")
+  for word in $cmdline; do
+    case "$word" in
+    \!gitk|gitk)
+      echo "gitk"
+      return
+      ;;
+    \!*)  : shell command alias ;;
+    -*) : option ;;
+    *=*)  : setting env ;;
+    git)  : git itself ;;
+    \(\))   : skip parens of shell function definition ;;
+    {)  : skip start of shell helper function ;;
+    :)  : skip null command ;;
+    \'*)  : skip opening quote after sh -c ;;
+    *)
+      echo "$word"
+      return
+    esac
+  done
+}
+
+# __git_find_on_cmdline requires 1 argument
+__git_find_on_cmdline ()
+{
+  local word subcommand c=1
+  while [ $c -lt $cword ]; do
+    word="${words[c]}"
+    for subcommand in $1; do
+      if [ "$subcommand" = "$word" ]; then
+        echo "$subcommand"
+        return
+      fi
+    done
+    ((c++))
+  done
+}
+
+__git_has_doubledash ()
+{
+  local c=1
+  while [ $c -lt $cword ]; do
+    if [ "--" = "${words[c]}" ]; then
+      return 0
+    fi
+    ((c++))
+  done
+  return 1
+}
+
+# Try to count non option arguments passed on the command line for the
+# specified git command.
+# When options are used, it is necessary to use the special -- option to
+# tell the implementation were non option arguments begin.
+# XXX this can not be improved, since options can appear everywhere, as
+# an example:
+# git mv x -n y
+#
+# __git_count_arguments requires 1 argument: the git command executed.
+__git_count_arguments ()
+{
+  local word i c=0
+
+  # Skip "git" (first argument)
+  for ((i=1; i < ${#words[@]}; i++)); do
+    word="${words[i]}"
+
+    case "$word" in
+      --)
+        # Good; we can assume that the following are only non
+        # option arguments.
+        ((c = 0))
+        ;;
+      "$1")
+        # Skip the specified git command and discard git
+        # main options
+        ((c = 0))
+        ;;
+      ?*)
+        ((c++))
+        ;;
+    esac
+  done
+
+  printf "%d" $c
+}
+
+__git_whitespacelist="nowarn warn error error-all fix"
+
+_git_am ()
+{
+  local dir="$(__gitdir)"
+  if [ -d "$dir"/rebase-apply ]; then
+    __gitcomp "--skip --continue --resolved --abort"
+    return
+  fi
+  case "$cur" in
+  --whitespace=*)
+    __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
+    return
+    ;;
+  --*)
+    __gitcomp "
+      --3way --committer-date-is-author-date --ignore-date
+      --ignore-whitespace --ignore-space-change
+      --interactive --keep --no-utf8 --signoff --utf8
+      --whitespace= --scissors
+      "
+    return
+  esac
+}
+
+_git_apply ()
+{
+  case "$cur" in
+  --whitespace=*)
+    __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
+    return
+    ;;
+  --*)
+    __gitcomp "
+      --stat --numstat --summary --check --index
+      --cached --index-info --reverse --reject --unidiff-zero
+      --apply --no-add --exclude=
+      --ignore-whitespace --ignore-space-change
+      --whitespace= --inaccurate-eof --verbose
+      "
+    return
+  esac
+}
+
+_git_add ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "
+      --interactive --refresh --patch --update --dry-run
+      --ignore-errors --intent-to-add
+      "
+    return
+  esac
+
+  # XXX should we check for --update and --all options ?
+  __git_complete_index_file "--others --modified --directory --no-empty-directory"
+}
+
+_git_archive ()
+{
+  case "$cur" in
+  --format=*)
+    __gitcomp "$(git archive --list)" "" "${cur##--format=}"
+    return
+    ;;
+  --remote=*)
+    __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
+    return
+    ;;
+  --*)
+    __gitcomp "
+      --format= --list --verbose
+      --prefix= --remote= --exec=
+      "
+    return
+    ;;
+  esac
+  __git_complete_file
+}
+
+_git_bisect ()
+{
+  __git_has_doubledash && return
+
+  local subcommands="start bad good skip reset visualize replay log run"
+  local subcommand="$(__git_find_on_cmdline "$subcommands")"
+  if [ -z "$subcommand" ]; then
+    if [ -f "$(__gitdir)"/BISECT_START ]; then
+      __gitcomp "$subcommands"
+    else
+      __gitcomp "replay start"
+    fi
+    return
+  fi
+
+  case "$subcommand" in
+  bad|good|reset|skip|start)
+    __gitcomp_nl "$(__git_refs)"
+    ;;
+  *)
+    ;;
+  esac
+}
+
+_git_branch ()
+{
+  local i c=1 only_local_ref="n" has_r="n"
+
+  while [ $c -lt $cword ]; do
+    i="${words[c]}"
+    case "$i" in
+    -d|-m)  only_local_ref="y" ;;
+    -r) has_r="y" ;;
+    esac
+    ((c++))
+  done
+
+  case "$cur" in
+  --set-upstream-to=*)
+    __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
+    ;;
+  --*)
+    __gitcomp "
+      --color --no-color --verbose --abbrev= --no-abbrev
+      --track --no-track --contains --merged --no-merged
+      --set-upstream-to= --edit-description --list
+      --unset-upstream
+      "
+    ;;
+  *)
+    if [ $only_local_ref = "y" -a $has_r = "n" ]; then
+      __gitcomp_nl "$(__git_heads)"
+    else
+      __gitcomp_nl "$(__git_refs)"
+    fi
+    ;;
+  esac
+}
+
+_git_bundle ()
+{
+  local cmd="${words[2]}"
+  case "$cword" in
+  2)
+    __gitcomp "create list-heads verify unbundle"
+    ;;
+  3)
+    # looking for a file
+    ;;
+  *)
+    case "$cmd" in
+      create)
+        __git_complete_revlist
+      ;;
+    esac
+    ;;
+  esac
+}
+
+_git_checkout ()
+{
+  __git_has_doubledash && return
+
+  case "$cur" in
+  --conflict=*)
+    __gitcomp "diff3 merge" "" "${cur##--conflict=}"
+    ;;
+  --*)
+    __gitcomp "
+      --quiet --ours --theirs --track --no-track --merge
+      --conflict= --orphan --patch
+      "
+    ;;
+  *)
+    # check if --track, --no-track, or --no-guess was specified
+    # if so, disable DWIM mode
+    local flags="--track --no-track --no-guess" track=1
+    if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
+      track=''
+    fi
+    __gitcomp_nl "$(__git_refs '' $track)"
+    ;;
+  esac
+}
+
+_git_cherry ()
+{
+  __gitcomp_nl "$(__git_refs)"
+}
+
+_git_cherry_pick ()
+{
+  local dir="$(__gitdir)"
+  if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
+    __gitcomp "--continue --quit --abort"
+    return
+  fi
+  case "$cur" in
+  --*)
+    __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
+    ;;
+  *)
+    __gitcomp_nl "$(__git_refs)"
+    ;;
+  esac
+}
+
+_git_clean ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "--dry-run --quiet"
+    return
+    ;;
+  esac
+
+  # XXX should we check for -x option ?
+  __git_complete_index_file "--others --directory"
+}
+
+_git_clone ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "
+      --local
+      --no-hardlinks
+      --shared
+      --reference
+      --quiet
+      --no-checkout
+      --bare
+      --mirror
+      --origin
+      --upload-pack
+      --template=
+      --depth
+      --single-branch
+      --branch
+      "
+    return
+    ;;
+  esac
+}
+
+_git_commit ()
+{
+  case "$prev" in
+  -c|-C)
+    __gitcomp_nl "$(__git_refs)" "" "${cur}"
+    return
+    ;;
+  esac
+
+  case "$cur" in
+  --cleanup=*)
+    __gitcomp "default scissors strip verbatim whitespace
+      " "" "${cur##--cleanup=}"
+    return
+    ;;
+  --reuse-message=*|--reedit-message=*|\
+  --fixup=*|--squash=*)
+    __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
+    return
+    ;;
+  --untracked-files=*)
+    __gitcomp "all no normal" "" "${cur##--untracked-files=}"
+    return
+    ;;
+  --*)
+    __gitcomp "
+      --all --author= --signoff --verify --no-verify
+      --edit --no-edit
+      --amend --include --only --interactive
+      --dry-run --reuse-message= --reedit-message=
+      --reset-author --file= --message= --template=
+      --cleanup= --untracked-files --untracked-files=
+      --verbose --quiet --fixup= --squash=
+      "
+    return
+  esac
+
+  if git rev-parse --verify --quiet HEAD >/dev/null; then
+    __git_complete_index_file "--committable"
+  else
+    # This is the first commit
+    __git_complete_index_file "--cached"
+  fi
+}
+
+_git_describe ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "
+      --all --tags --contains --abbrev= --candidates=
+      --exact-match --debug --long --match --always
+      "
+    return
+  esac
+  __gitcomp_nl "$(__git_refs)"
+}
+
+__git_diff_algorithms="myers minimal patience histogram"
+
+__git_diff_common_options="--stat --numstat --shortstat --summary
+      --patch-with-stat --name-only --name-status --color
+      --no-color --color-words --no-renames --check
+      --full-index --binary --abbrev --diff-filter=
+      --find-copies-harder
+      --text --ignore-space-at-eol --ignore-space-change
+      --ignore-all-space --ignore-blank-lines --exit-code
+      --quiet --ext-diff --no-ext-diff
+      --no-prefix --src-prefix= --dst-prefix=
+      --inter-hunk-context=
+      --patience --histogram --minimal
+      --raw --word-diff --word-diff-regex=
+      --dirstat --dirstat= --dirstat-by-file
+      --dirstat-by-file= --cumulative
+      --diff-algorithm=
+"
+
+_git_diff ()
+{
+  __git_has_doubledash && return
+
+  case "$cur" in
+  --diff-algorithm=*)
+    __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
+    return
+    ;;
+  --*)
+    __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
+      --base --ours --theirs --no-index
+      $__git_diff_common_options
+      "
+    return
+    ;;
+  esac
+  __git_complete_revlist_file
+}
+
+__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
+      tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
+"
+
+_git_difftool ()
+{
+  __git_has_doubledash && return
+
+  case "$cur" in
+  --tool=*)
+    __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
+    return
+    ;;
+  --*)
+    __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
+      --base --ours --theirs
+      --no-renames --diff-filter= --find-copies-harder
+      --relative --ignore-submodules
+      --tool="
+    return
+    ;;
+  esac
+  __git_complete_revlist_file
+}
+
+__git_fetch_recurse_submodules="yes on-demand no"
+
+__git_fetch_options="
+  --quiet --verbose --append --upload-pack --force --keep --depth=
+  --tags --no-tags --all --prune --dry-run --recurse-submodules=
+"
+
+_git_fetch ()
+{
+  case "$cur" in
+  --recurse-submodules=*)
+    __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
+    return
+    ;;
+  --*)
+    __gitcomp "$__git_fetch_options"
+    return
+    ;;
+  esac
+  __git_complete_remote_or_refspec
+}
+
+__git_format_patch_options="
+  --stdout --attach --no-attach --thread --thread= --no-thread
+  --numbered --start-number --numbered-files --keep-subject --signoff
+  --signature --no-signature --in-reply-to= --cc= --full-index --binary
+  --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
+  --inline --suffix= --ignore-if-in-upstream --subject-prefix=
+  --output-directory --reroll-count --to= --quiet --notes
+"
+
+_git_format_patch ()
+{
+  case "$cur" in
+  --thread=*)
+    __gitcomp "
+      deep shallow
+      " "" "${cur##--thread=}"
+    return
+    ;;
+  --*)
+    __gitcomp "$__git_format_patch_options"
+    return
+    ;;
+  esac
+  __git_complete_revlist
+}
+
+_git_fsck ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "
+      --tags --root --unreachable --cache --no-reflogs --full
+      --strict --verbose --lost-found
+      "
+    return
+    ;;
+  esac
+}
+
+_git_gc ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "--prune --aggressive"
+    return
+    ;;
+  esac
+}
+
+_git_gitk ()
+{
+  _gitk
+}
+
+__git_match_ctag() {
+  awk "/^${1//\//\\/}/ { print \$1 }" "$2"
+}
+
+_git_grep ()
+{
+  __git_has_doubledash && return
+
+  case "$cur" in
+  --*)
+    __gitcomp "
+      --cached
+      --text --ignore-case --word-regexp --invert-match
+      --full-name --line-number
+      --extended-regexp --basic-regexp --fixed-strings
+      --perl-regexp
+      --threads
+      --files-with-matches --name-only
+      --files-without-match
+      --max-depth
+      --count
+      --and --or --not --all-match
+      "
+    return
+    ;;
+  esac
+
+  case "$cword,$prev" in
+  2,*|*,-*)
+    if test -r tags; then
+      __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
+      return
+    fi
+    ;;
+  esac
+
+  __gitcomp_nl "$(__git_refs)"
+}
+
+_git_help ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "--all --guides --info --man --web"
+    return
+    ;;
+  esac
+  __git_compute_all_commands
+  __gitcomp "$__git_all_commands $(__git_aliases)
+    attributes cli core-tutorial cvs-migration
+    diffcore everyday gitk glossary hooks ignore modules
+    namespaces repository-layout revisions tutorial tutorial-2
+    workflows
+    "
+}
+
+_git_init ()
+{
+  case "$cur" in
+  --shared=*)
+    __gitcomp "
+      false true umask group all world everybody
+      " "" "${cur##--shared=}"
+    return
+    ;;
+  --*)
+    __gitcomp "--quiet --bare --template= --shared --shared="
+    return
+    ;;
+  esac
+}
+
+_git_ls_files ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "--cached --deleted --modified --others --ignored
+      --stage --directory --no-empty-directory --unmerged
+      --killed --exclude= --exclude-from=
+      --exclude-per-directory= --exclude-standard
+      --error-unmatch --with-tree= --full-name
+      --abbrev --ignored --exclude-per-directory
+      "
+    return
+    ;;
+  esac
+
+  # XXX ignore options like --modified and always suggest all cached
+  # files.
+  __git_complete_index_file "--cached"
+}
+
+_git_ls_remote ()
+{
+  __gitcomp_nl "$(__git_remotes)"
+}
+
+_git_ls_tree ()
+{
+  __git_complete_file
+}
+
+# Options that go well for log, shortlog and gitk
+__git_log_common_options="
+  --not --all
+  --branches --tags --remotes
+  --first-parent --merges --no-merges
+  --max-count=
+  --max-age= --since= --after=
+  --min-age= --until= --before=
+  --min-parents= --max-parents=
+  --no-min-parents --no-max-parents
+"
+# Options that go well for log and gitk (not shortlog)
+__git_log_gitk_options="
+  --dense --sparse --full-history
+  --simplify-merges --simplify-by-decoration
+  --left-right --notes --no-notes
+"
+# Options that go well for log and shortlog (not gitk)
+__git_log_shortlog_options="
+  --author= --committer= --grep=
+  --all-match --invert-grep
+"
+
+__git_log_pretty_formats="oneline short medium full fuller email raw format:"
+__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
+
+_git_log ()
+{
+  __git_has_doubledash && return
+
+  local g="$(git rev-parse --git-dir 2>/dev/null)"
+  local merge=""
+  if [ -f "$g/MERGE_HEAD" ]; then
+    merge="--merge"
+  fi
+  case "$cur" in
+  --pretty=*|--format=*)
+    __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
+      " "" "${cur#*=}"
+    return
+    ;;
+  --date=*)
+    __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
+    return
+    ;;
+  --decorate=*)
+    __gitcomp "full short no" "" "${cur##--decorate=}"
+    return
+    ;;
+  --*)
+    __gitcomp "
+      $__git_log_common_options
+      $__git_log_shortlog_options
+      $__git_log_gitk_options
+      --root --topo-order --date-order --reverse
+      --follow --full-diff
+      --abbrev-commit --abbrev=
+      --relative-date --date=
+      --pretty= --format= --oneline
+      --show-signature
+      --cherry-mark
+      --cherry-pick
+      --graph
+      --decorate --decorate=
+      --walk-reflogs
+      --parents --children
+      $merge
+      $__git_diff_common_options
+      --pickaxe-all --pickaxe-regex
+      "
+    return
+    ;;
+  esac
+  __git_complete_revlist
+}
+
+# Common merge options shared by git-merge(1) and git-pull(1).
+__git_merge_options="
+  --no-commit --no-stat --log --no-log --squash --strategy
+  --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
+  --verify-signatures --no-verify-signatures --gpg-sign
+  --quiet --verbose --progress --no-progress
+"
+
+_git_merge ()
+{
+  __git_complete_strategy && return
+
+  case "$cur" in
+  --*)
+    __gitcomp "$__git_merge_options
+      --rerere-autoupdate --no-rerere-autoupdate --abort"
+    return
+  esac
+  __gitcomp_nl "$(__git_refs)"
+}
+
+_git_mergetool ()
+{
+  case "$cur" in
+  --tool=*)
+    __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
+    return
+    ;;
+  --*)
+    __gitcomp "--tool="
+    return
+    ;;
+  esac
+}
+
+_git_merge_base ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "--octopus --independent --is-ancestor --fork-point"
+    return
+    ;;
+  esac
+  __gitcomp_nl "$(__git_refs)"
+}
+
+_git_mv ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "--dry-run"
+    return
+    ;;
+  esac
+
+  if [ $(__git_count_arguments "mv") -gt 0 ]; then
+    # We need to show both cached and untracked files (including
+    # empty directories) since this may not be the last argument.
+    __git_complete_index_file "--cached --others --directory"
+  else
+    __git_complete_index_file "--cached"
+  fi
+}
+
+_git_name_rev ()
+{
+  __gitcomp "--tags --all --stdin"
+}
+
+_git_notes ()
+{
+  local subcommands='add append copy edit list prune remove show'
+  local subcommand="$(__git_find_on_cmdline "$subcommands")"
+
+  case "$subcommand,$cur" in
+  ,--*)
+    __gitcomp '--ref'
+    ;;
+  ,*)
+    case "$prev" in
+    --ref)
+      __gitcomp_nl "$(__git_refs)"
+      ;;
+    *)
+      __gitcomp "$subcommands --ref"
+      ;;
+    esac
+    ;;
+  add,--reuse-message=*|append,--reuse-message=*|\
+  add,--reedit-message=*|append,--reedit-message=*)
+    __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
+    ;;
+  add,--*|append,--*)
+    __gitcomp '--file= --message= --reedit-message=
+        --reuse-message='
+    ;;
+  copy,--*)
+    __gitcomp '--stdin'
+    ;;
+  prune,--*)
+    __gitcomp '--dry-run --verbose'
+    ;;
+  prune,*)
+    ;;
+  *)
+    case "$prev" in
+    -m|-F)
+      ;;
+    *)
+      __gitcomp_nl "$(__git_refs)"
+      ;;
+    esac
+    ;;
+  esac
+}
+
+_git_pull ()
+{
+  __git_complete_strategy && return
+
+  case "$cur" in
+  --recurse-submodules=*)
+    __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
+    return
+    ;;
+  --*)
+    __gitcomp "
+      --rebase --no-rebase
+      $__git_merge_options
+      $__git_fetch_options
+    "
+    return
+    ;;
+  esac
+  __git_complete_remote_or_refspec
+}
+
+__git_push_recurse_submodules="check on-demand"
+
+__git_complete_force_with_lease ()
+{
+  local cur_=$1
+
+  case "$cur_" in
+  --*=)
+    ;;
+  *:*)
+    __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
+    ;;
+  *)
+    __gitcomp_nl "$(__git_refs)" "" "$cur_"
+    ;;
+  esac
+}
+
+_git_push ()
+{
+  case "$prev" in
+  --repo)
+    __gitcomp_nl "$(__git_remotes)"
+    return
+    ;;
+  --recurse-submodules)
+    __gitcomp "$__git_push_recurse_submodules"
+    return
+    ;;
+  esac
+  case "$cur" in
+  --repo=*)
+    __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
+    return
+    ;;
+  --recurse-submodules=*)
+    __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
+    return
+    ;;
+  --force-with-lease=*)
+    __git_complete_force_with_lease "${cur##--force-with-lease=}"
+    return
+    ;;
+  --*)
+    __gitcomp "
+      --all --mirror --tags --dry-run --force --verbose
+      --quiet --prune --delete --follow-tags
+      --receive-pack= --repo= --set-upstream
+      --force-with-lease --force-with-lease= --recurse-submodules=
+    "
+    return
+    ;;
+  esac
+  __git_complete_remote_or_refspec
+}
+
+_git_rebase ()
+{
+  local dir="$(__gitdir)"
+  if [ -f "$dir"/rebase-merge/interactive ]; then
+    __gitcomp "--continue --skip --abort --edit-todo"
+    return
+  elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
+    __gitcomp "--continue --skip --abort"
+    return
+  fi
+  __git_complete_strategy && return
+  case "$cur" in
+  --whitespace=*)
+    __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
+    return
+    ;;
+  --*)
+    __gitcomp "
+      --onto --merge --strategy --interactive
+      --preserve-merges --stat --no-stat
+      --committer-date-is-author-date --ignore-date
+      --ignore-whitespace --whitespace=
+      --autosquash --no-autosquash
+      --fork-point --no-fork-point
+      --autostash --no-autostash
+      --verify --no-verify
+      --keep-empty --root --force-rebase --no-ff
+      --exec
+      "
+
+    return
+  esac
+  __gitcomp_nl "$(__git_refs)"
+}
+
+_git_reflog ()
+{
+  local subcommands="show delete expire"
+  local subcommand="$(__git_find_on_cmdline "$subcommands")"
+
+  if [ -z "$subcommand" ]; then
+    __gitcomp "$subcommands"
+  else
+    __gitcomp_nl "$(__git_refs)"
+  fi
+}
+
+__git_send_email_confirm_options="always never auto cc compose"
+__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
+
+_git_send_email ()
+{
+  case "$prev" in
+  --to|--cc|--bcc|--from)
+    __gitcomp "
+    $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
+    "
+    return
+    ;;
+  esac
+
+  case "$cur" in
+  --confirm=*)
+    __gitcomp "
+      $__git_send_email_confirm_options
+      " "" "${cur##--confirm=}"
+    return
+    ;;
+  --suppress-cc=*)
+    __gitcomp "
+      $__git_send_email_suppresscc_options
+      " "" "${cur##--suppress-cc=}"
+
+    return
+    ;;
+  --smtp-encryption=*)
+    __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
+    return
+    ;;
+  --thread=*)
+    __gitcomp "
+      deep shallow
+      " "" "${cur##--thread=}"
+    return
+    ;;
+  --to=*|--cc=*|--bcc=*|--from=*)
+    __gitcomp "
+    $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
+    " "" "${cur#--*=}"
+    return
+    ;;
+  --*)
+    __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
+      --compose --confirm= --dry-run --envelope-sender
+      --from --identity
+      --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
+      --no-suppress-from --no-thread --quiet
+      --signed-off-by-cc --smtp-pass --smtp-server
+      --smtp-server-port --smtp-encryption= --smtp-user
+      --subject --suppress-cc= --suppress-from --thread --to
+      --validate --no-validate
+      $__git_format_patch_options"
+    return
+    ;;
+  esac
+  __git_complete_revlist
+}
+
+_git_stage ()
+{
+  _git_add
+}
+
+__git_config_get_set_variables ()
+{
+  local prevword word config_file= c=$cword
+  while [ $c -gt 1 ]; do
+    word="${words[c]}"
+    case "$word" in
+    --system|--global|--local|--file=*)
+      config_file="$word"
+      break
+      ;;
+    -f|--file)
+      config_file="$word $prevword"
+      break
+      ;;
+    esac
+    prevword=$word
+    c=$((--c))
+  done
+
+  git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
+}
+
+_git_config ()
+{
+  case "$prev" in
+  branch.*.remote|branch.*.pushremote)
+    __gitcomp_nl "$(__git_remotes)"
+    return
+    ;;
+  branch.*.merge)
+    __gitcomp_nl "$(__git_refs)"
+    return
+    ;;
+  branch.*.rebase)
+    __gitcomp "false true preserve interactive"
+    return
+    ;;
+  remote.pushdefault)
+    __gitcomp_nl "$(__git_remotes)"
+    return
+    ;;
+  remote.*.fetch)
+    local remote="${prev#remote.}"
+    remote="${remote%.fetch}"
+    if [ -z "$cur" ]; then
+      __gitcomp_nl "refs/heads/" "" "" ""
+      return
+    fi
+    __gitcomp_nl "$(__git_refs_remotes "$remote")"
+    return
+    ;;
+  remote.*.push)
+    local remote="${prev#remote.}"
+    remote="${remote%.push}"
+    __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
+      for-each-ref --format='%(refname):%(refname)' \
+      refs/heads)"
+    return
+    ;;
+  pull.twohead|pull.octopus)
+    __git_compute_merge_strategies
+    __gitcomp "$__git_merge_strategies"
+    return
+    ;;
+  color.branch|color.diff|color.interactive|\
+  color.showbranch|color.status|color.ui)
+    __gitcomp "always never auto"
+    return
+    ;;
+  color.pager)
+    __gitcomp "false true"
+    return
+    ;;
+  color.*.*)
+    __gitcomp "
+      normal black red green yellow blue magenta cyan white
+      bold dim ul blink reverse
+      "
+    return
+    ;;
+  diff.submodule)
+    __gitcomp "log short"
+    return
+    ;;
+  help.format)
+    __gitcomp "man info web html"
+    return
+    ;;
+  log.date)
+    __gitcomp "$__git_log_date_formats"
+    return
+    ;;
+  sendemail.aliasesfiletype)
+    __gitcomp "mutt mailrc pine elm gnus"
+    return
+    ;;
+  sendemail.confirm)
+    __gitcomp "$__git_send_email_confirm_options"
+    return
+    ;;
+  sendemail.suppresscc)
+    __gitcomp "$__git_send_email_suppresscc_options"
+    return
+    ;;
+  sendemail.transferencoding)
+    __gitcomp "7bit 8bit quoted-printable base64"
+    return
+    ;;
+  --get|--get-all|--unset|--unset-all)
+    __gitcomp_nl "$(__git_config_get_set_variables)"
+    return
+    ;;
+  *.*)
+    return
+    ;;
+  esac
+  case "$cur" in
+  --*)
+    __gitcomp "
+      --system --global --local --file=
+      --list --replace-all
+      --get --get-all --get-regexp
+      --add --unset --unset-all
+      --remove-section --rename-section
+      --name-only
+      "
+    return
+    ;;
+  branch.*.*)
+    local pfx="${cur%.*}." cur_="${cur##*.}"
+    __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
+    return
+    ;;
+  branch.*)
+    local pfx="${cur%.*}." cur_="${cur#*.}"
+    __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
+    __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
+    return
+    ;;
+  guitool.*.*)
+    local pfx="${cur%.*}." cur_="${cur##*.}"
+    __gitcomp "
+      argprompt cmd confirm needsfile noconsole norescan
+      prompt revprompt revunmerged title
+      " "$pfx" "$cur_"
+    return
+    ;;
+  difftool.*.*)
+    local pfx="${cur%.*}." cur_="${cur##*.}"
+    __gitcomp "cmd path" "$pfx" "$cur_"
+    return
+    ;;
+  man.*.*)
+    local pfx="${cur%.*}." cur_="${cur##*.}"
+    __gitcomp "cmd path" "$pfx" "$cur_"
+    return
+    ;;
+  mergetool.*.*)
+    local pfx="${cur%.*}." cur_="${cur##*.}"
+    __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
+    return
+    ;;
+  pager.*)
+    local pfx="${cur%.*}." cur_="${cur#*.}"
+    __git_compute_all_commands
+    __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
+    return
+    ;;
+  remote.*.*)
+    local pfx="${cur%.*}." cur_="${cur##*.}"
+    __gitcomp "
+      url proxy fetch push mirror skipDefaultUpdate
+      receivepack uploadpack tagopt pushurl
+      " "$pfx" "$cur_"
+    return
+    ;;
+  remote.*)
+    local pfx="${cur%.*}." cur_="${cur#*.}"
+    __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
+    __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
+    return
+    ;;
+  url.*.*)
+    local pfx="${cur%.*}." cur_="${cur##*.}"
+    __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
+    return
+    ;;
+  esac
+  __gitcomp "
+    add.ignoreErrors
+    advice.commitBeforeMerge
+    advice.detachedHead
+    advice.implicitIdentity
+    advice.pushNonFastForward
+    advice.resolveConflict
+    advice.statusHints
+    alias.
+    am.keepcr
+    apply.ignorewhitespace
+    apply.whitespace
+    branch.autosetupmerge
+    branch.autosetuprebase
+    browser.
+    clean.requireForce
+    color.branch
+    color.branch.current
+    color.branch.local
+    color.branch.plain
+    color.branch.remote
+    color.decorate.HEAD
+    color.decorate.branch
+    color.decorate.remoteBranch
+    color.decorate.stash
+    color.decorate.tag
+    color.diff
+    color.diff.commit
+    color.diff.frag
+    color.diff.func
+    color.diff.meta
+    color.diff.new
+    color.diff.old
+    color.diff.plain
+    color.diff.whitespace
+    color.grep
+    color.grep.context
+    color.grep.filename
+    color.grep.function
+    color.grep.linenumber
+    color.grep.match
+    color.grep.selected
+    color.grep.separator
+    color.interactive
+    color.interactive.error
+    color.interactive.header
+    color.interactive.help
+    color.interactive.prompt
+    color.pager
+    color.showbranch
+    color.status
+    color.status.added
+    color.status.changed
+    color.status.header
+    color.status.nobranch
+    color.status.unmerged
+    color.status.untracked
+    color.status.updated
+    color.ui
+    commit.status
+    commit.template
+    core.abbrev
+    core.askpass
+    core.attributesfile
+    core.autocrlf
+    core.bare
+    core.bigFileThreshold
+    core.compression
+    core.createObject
+    core.deltaBaseCacheLimit
+    core.editor
+    core.eol
+    core.excludesfile
+    core.fileMode
+    core.fsyncobjectfiles
+    core.gitProxy
+    core.ignoreStat
+    core.ignorecase
+    core.logAllRefUpdates
+    core.loosecompression
+    core.notesRef
+    core.packedGitLimit
+    core.packedGitWindowSize
+    core.pager
+    core.preferSymlinkRefs
+    core.preloadindex
+    core.quotepath
+    core.repositoryFormatVersion
+    core.safecrlf
+    core.sharedRepository
+    core.sparseCheckout
+    core.symlinks
+    core.trustctime
+    core.untrackedCache
+    core.warnAmbiguousRefs
+    core.whitespace
+    core.worktree
+    diff.autorefreshindex
+    diff.external
+    diff.ignoreSubmodules
+    diff.mnemonicprefix
+    diff.noprefix
+    diff.renameLimit
+    diff.renames
+    diff.statGraphWidth
+    diff.submodule
+    diff.suppressBlankEmpty
+    diff.tool
+    diff.wordRegex
+    diff.algorithm
+    difftool.
+    difftool.prompt
+    fetch.recurseSubmodules
+    fetch.unpackLimit
+    format.attach
+    format.cc
+    format.coverLetter
+    format.headers
+    format.numbered
+    format.pretty
+    format.signature
+    format.signoff
+    format.subjectprefix
+    format.suffix
+    format.thread
+    format.to
+    gc.
+    gc.aggressiveWindow
+    gc.auto
+    gc.autopacklimit
+    gc.packrefs
+    gc.pruneexpire
+    gc.reflogexpire
+    gc.reflogexpireunreachable
+    gc.rerereresolved
+    gc.rerereunresolved
+    gitcvs.allbinary
+    gitcvs.commitmsgannotation
+    gitcvs.dbTableNamePrefix
+    gitcvs.dbdriver
+    gitcvs.dbname
+    gitcvs.dbpass
+    gitcvs.dbuser
+    gitcvs.enabled
+    gitcvs.logfile
+    gitcvs.usecrlfattr
+    guitool.
+    gui.blamehistoryctx
+    gui.commitmsgwidth
+    gui.copyblamethreshold
+    gui.diffcontext
+    gui.encoding
+    gui.fastcopyblame
+    gui.matchtrackingbranch
+    gui.newbranchtemplate
+    gui.pruneduringfetch
+    gui.spellingdictionary
+    gui.trustmtime
+    help.autocorrect
+    help.browser
+    help.format
+    http.lowSpeedLimit
+    http.lowSpeedTime
+    http.maxRequests
+    http.minSessions
+    http.noEPSV
+    http.postBuffer
+    http.proxy
+    http.sslCipherList
+    http.sslVersion
+    http.sslCAInfo
+    http.sslCAPath
+    http.sslCert
+    http.sslCertPasswordProtected
+    http.sslKey
+    http.sslVerify
+    http.useragent
+    i18n.commitEncoding
+    i18n.logOutputEncoding
+    imap.authMethod
+    imap.folder
+    imap.host
+    imap.pass
+    imap.port
+    imap.preformattedHTML
+    imap.sslverify
+    imap.tunnel
+    imap.user
+    init.templatedir
+    instaweb.browser
+    instaweb.httpd
+    instaweb.local
+    instaweb.modulepath
+    instaweb.port
+    interactive.singlekey
+    log.date
+    log.decorate
+    log.showroot
+    mailmap.file
+    man.
+    man.viewer
+    merge.
+    merge.conflictstyle
+    merge.log
+    merge.renameLimit
+    merge.renormalize
+    merge.stat
+    merge.tool
+    merge.verbosity
+    mergetool.
+    mergetool.keepBackup
+    mergetool.keepTemporaries
+    mergetool.prompt
+    notes.displayRef
+    notes.rewrite.
+    notes.rewrite.amend
+    notes.rewrite.rebase
+    notes.rewriteMode
+    notes.rewriteRef
+    pack.compression
+    pack.deltaCacheLimit
+    pack.deltaCacheSize
+    pack.depth
+    pack.indexVersion
+    pack.packSizeLimit
+    pack.threads
+    pack.window
+    pack.windowMemory
+    pager.
+    pretty.
+    pull.octopus
+    pull.twohead
+    push.default
+    push.followTags
+    rebase.autosquash
+    rebase.stat
+    receive.autogc
+    receive.denyCurrentBranch
+    receive.denyDeleteCurrent
+    receive.denyDeletes
+    receive.denyNonFastForwards
+    receive.fsckObjects
+    receive.unpackLimit
+    receive.updateserverinfo
+    remote.pushdefault
+    remotes.
+    repack.usedeltabaseoffset
+    rerere.autoupdate
+    rerere.enabled
+    sendemail.
+    sendemail.aliasesfile
+    sendemail.aliasfiletype
+    sendemail.bcc
+    sendemail.cc
+    sendemail.cccmd
+    sendemail.chainreplyto
+    sendemail.confirm
+    sendemail.envelopesender
+    sendemail.from
+    sendemail.identity
+    sendemail.multiedit
+    sendemail.signedoffbycc
+    sendemail.smtpdomain
+    sendemail.smtpencryption
+    sendemail.smtppass
+    sendemail.smtpserver
+    sendemail.smtpserveroption
+    sendemail.smtpserverport
+    sendemail.smtpuser
+    sendemail.suppresscc
+    sendemail.suppressfrom
+    sendemail.thread
+    sendemail.to
+    sendemail.validate
+    showbranch.default
+    status.relativePaths
+    status.showUntrackedFiles
+    status.submodulesummary
+    submodule.
+    tar.umask
+    transfer.unpackLimit
+    url.
+    user.email
+    user.name
+    user.signingkey
+    web.browser
+    branch. remote.
+  "
+}
+
+_git_remote ()
+{
+  local subcommands="add rename remove set-head set-branches set-url show prune update"
+  local subcommand="$(__git_find_on_cmdline "$subcommands")"
+  if [ -z "$subcommand" ]; then
+    __gitcomp "$subcommands"
+    return
+  fi
+
+  case "$subcommand" in
+  rename|remove|set-url|show|prune)
+    __gitcomp_nl "$(__git_remotes)"
+    ;;
+  set-head|set-branches)
+    __git_complete_remote_or_refspec
+    ;;
+  update)
+    __gitcomp "$(__git_get_config_variables "remotes")"
+    ;;
+  *)
+    ;;
+  esac
+}
+
+_git_replace ()
+{
+  __gitcomp_nl "$(__git_refs)"
+}
+
+_git_reset ()
+{
+  __git_has_doubledash && return
+
+  case "$cur" in
+  --*)
+    __gitcomp "--merge --mixed --hard --soft --patch"
+    return
+    ;;
+  esac
+  __gitcomp_nl "$(__git_refs)"
+}
+
+_git_revert ()
+{
+  local dir="$(__gitdir)"
+  if [ -f "$dir"/REVERT_HEAD ]; then
+    __gitcomp "--continue --quit --abort"
+    return
+  fi
+  case "$cur" in
+  --*)
+    __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
+    return
+    ;;
+  esac
+  __gitcomp_nl "$(__git_refs)"
+}
+
+_git_rm ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
+    return
+    ;;
+  esac
+
+  __git_complete_index_file "--cached"
+}
+
+_git_shortlog ()
+{
+  __git_has_doubledash && return
+
+  case "$cur" in
+  --*)
+    __gitcomp "
+      $__git_log_common_options
+      $__git_log_shortlog_options
+      --numbered --summary
+      "
+    return
+    ;;
+  esac
+  __git_complete_revlist
+}
+
+_git_show ()
+{
+  __git_has_doubledash && return
+
+  case "$cur" in
+  --pretty=*|--format=*)
+    __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
+      " "" "${cur#*=}"
+    return
+    ;;
+  --diff-algorithm=*)
+    __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
+    return
+    ;;
+  --*)
+    __gitcomp "--pretty= --format= --abbrev-commit --oneline
+      --show-signature
+      $__git_diff_common_options
+      "
+    return
+    ;;
+  esac
+  __git_complete_revlist_file
+}
+
+_git_show_branch ()
+{
+  case "$cur" in
+  --*)
+    __gitcomp "
+      --all --remotes --topo-order --date-order --current --more=
+      --list --independent --merge-base --no-name
+      --color --no-color
+      --sha1-name --sparse --topics --reflog
+      "
+    return
+    ;;
+  esac
+  __git_complete_revlist
+}
+
+_git_stash ()
+{
+  local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
+  local subcommands='save list show apply clear drop pop create branch'
+  local subcommand="$(__git_find_on_cmdline "$subcommands")"
+  if [ -z "$subcommand" ]; then
+    case "$cur" in
+    --*)
+      __gitcomp "$save_opts"
+      ;;
+    *)
+      if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
+        __gitcomp "$subcommands"
+      fi
+      ;;
+    esac
+  else
+    case "$subcommand,$cur" in
+    save,--*)
+      __gitcomp "$save_opts"
+      ;;
+    apply,--*|pop,--*)
+      __gitcomp "--index --quiet"
+      ;;
+    drop,--*)
+      __gitcomp "--quiet"
+      ;;
+    show,--*|branch,--*)
+      ;;
+    branch,*)
+      if [ $cword -eq 3 ]; then
+        __gitcomp_nl "$(__git_refs)";
+      else
+        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
+            | sed -n -e 's/:.*//p')"
+      fi
+      ;;
+    show,*|apply,*|drop,*|pop,*)
+      __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
+          | sed -n -e 's/:.*//p')"
+      ;;
+    *)
+      ;;
+    esac
+  fi
+}
+
+_git_submodule ()
+{
+  __git_has_doubledash && return
+
+  local subcommands="add status init deinit update summary foreach sync"
+  if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
+    case "$cur" in
+    --*)
+      __gitcomp "--quiet --cached"
+      ;;
+    *)
+      __gitcomp "$subcommands"
+      ;;
+    esac
+    return
+  fi
+}
+
+_git_svn ()
+{
+  local subcommands="
+    init fetch clone rebase dcommit log find-rev
+    set-tree commit-diff info create-ignore propget
+    proplist show-ignore show-externals branch tag blame
+    migrate mkdirs reset gc
+    "
+  local subcommand="$(__git_find_on_cmdline "$subcommands")"
+  if [ -z "$subcommand" ]; then
+    __gitcomp "$subcommands"
+  else
+    local remote_opts="--username= --config-dir= --no-auth-cache"
+    local fc_opts="
+      --follow-parent --authors-file= --repack=
+      --no-metadata --use-svm-props --use-svnsync-props
+      --log-window-size= --no-checkout --quiet
+      --repack-flags --use-log-author --localtime
+      --ignore-paths= --include-paths= $remote_opts
+      "
+    local init_opts="
+      --template= --shared= --trunk= --tags=
+      --branches= --stdlayout --minimize-url
+      --no-metadata --use-svm-props --use-svnsync-props
+      --rewrite-root= --prefix= --use-log-author
+      --add-author-from $remote_opts
+      "
+    local cmt_opts="
+      --edit --rmdir --find-copies-harder --copy-similarity=
+      "
+
+    case "$subcommand,$cur" in
+    fetch,--*)
+      __gitcomp "--revision= --fetch-all $fc_opts"
+      ;;
+    clone,--*)
+      __gitcomp "--revision= $fc_opts $init_opts"
+      ;;
+    init,--*)
+      __gitcomp "$init_opts"
+      ;;
+    dcommit,--*)
+      __gitcomp "
+        --merge --strategy= --verbose --dry-run
+        --fetch-all --no-rebase --commit-url
+        --revision --interactive $cmt_opts $fc_opts
+        "
+      ;;
+    set-tree,--*)
+      __gitcomp "--stdin $cmt_opts $fc_opts"
+      ;;
+    create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
+    show-externals,--*|mkdirs,--*)
+      __gitcomp "--revision="
+      ;;
+    log,--*)
+      __gitcomp "
+        --limit= --revision= --verbose --incremental
+        --oneline --show-commit --non-recursive
+        --authors-file= --color
+        "
+      ;;
+    rebase,--*)
+      __gitcomp "
+        --merge --verbose --strategy= --local
+        --fetch-all --dry-run $fc_opts
+        "
+      ;;
+    commit-diff,--*)
+      __gitcomp "--message= --file= --revision= $cmt_opts"
+      ;;
+    info,--*)
+      __gitcomp "--url"
+      ;;
+    branch,--*)
+      __gitcomp "--dry-run --message --tag"
+      ;;
+    tag,--*)
+      __gitcomp "--dry-run --message"
+      ;;
+    blame,--*)
+      __gitcomp "--git-format"
+      ;;
+    migrate,--*)
+      __gitcomp "
+        --config-dir= --ignore-paths= --minimize
+        --no-auth-cache --username=
+        "
+      ;;
+    reset,--*)
+      __gitcomp "--revision= --parent"
+      ;;
+    *)
+      ;;
+    esac
+  fi
+}
+
+_git_tag ()
+{
+  local i c=1 f=0
+  while [ $c -lt $cword ]; do
+    i="${words[c]}"
+    case "$i" in
+    -d|-v)
+      __gitcomp_nl "$(__git_tags)"
+      return
+      ;;
+    -f)
+      f=1
+      ;;
+    esac
+    ((c++))
+  done
+
+  case "$prev" in
+  -m|-F)
+    ;;
+  -*|tag)
+    if [ $f = 1 ]; then
+      __gitcomp_nl "$(__git_tags)"
+    fi
+    ;;
+  *)
+    __gitcomp_nl "$(__git_refs)"
+    ;;
+  esac
+
+  case "$cur" in
+  --*)
+    __gitcomp "
+      --list --delete --verify --annotate --message --file
+      --sign --cleanup --local-user --force --column --sort
+      --contains --points-at
+      "
+    ;;
+  esac
+}
+
+_git_whatchanged ()
+{
+  _git_log
+}
+
+__git_main ()
+{
+  local i c=1 command __git_dir
+
+  while [ $c -lt $cword ]; do
+    i="${words[c]}"
+    case "$i" in
+    --git-dir=*) __git_dir="${i#--git-dir=}" ;;
+    --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
+    --bare)      __git_dir="." ;;
+    --help) command="help"; break ;;
+    -c|--work-tree|--namespace) ((c++)) ;;
+    -*) ;;
+    *) command="$i"; break ;;
+    esac
+    ((c++))
+  done
+
+  if [ -z "$command" ]; then
+    case "$cur" in
+    --*)   __gitcomp "
+      --paginate
+      --no-pager
+      --git-dir=
+      --bare
+      --version
+      --exec-path
+      --exec-path=
+      --html-path
+      --man-path
+      --info-path
+      --work-tree=
+      --namespace=
+      --no-replace-objects
+      --help
+      "
+      ;;
+    *)     __git_compute_porcelain_commands
+           __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
+    esac
+    return
+  fi
+
+  local completion_func="_git_${command//-/_}"
+  declare -f $completion_func >/dev/null && $completion_func && return
+
+  local expansion=$(__git_aliased_command "$command")
+  if [ -n "$expansion" ]; then
+    words[1]=$expansion
+    completion_func="_git_${expansion//-/_}"
+    declare -f $completion_func >/dev/null && $completion_func
+  fi
+}
+
+__gitk_main ()
+{
+  __git_has_doubledash && return
+
+  local g="$(__gitdir)"
+  local merge=""
+  if [ -f "$g/MERGE_HEAD" ]; then
+    merge="--merge"
+  fi
+  case "$cur" in
+  --*)
+    __gitcomp "
+      $__git_log_common_options
+      $__git_log_gitk_options
+      $merge
+      "
+    return
+    ;;
+  esac
+  __git_complete_revlist
+}
+
+if [[ -n ${ZSH_VERSION-} ]]; then
+  echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
+
+  autoload -U +X compinit && compinit
+
+  __gitcomp ()
+  {
+    emulate -L zsh
+
+    local cur_="${3-$cur}"
+
+    case "$cur_" in
+    --*=)
+      ;;
+    *)
+      local c IFS=$' \t\n'
+      local -a array
+      for c in ${=1}; do
+        c="$c${4-}"
+        case $c in
+        --*=*|*.) ;;
+        *) c="$c " ;;
+        esac
+        array[${#array[@]}+1]="$c"
+      done
+      compset -P '*[=:]'
+      compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
+      ;;
+    esac
+  }
+
+  __gitcomp_nl ()
+  {
+    emulate -L zsh
+
+    local IFS=$'\n'
+    compset -P '*[=:]'
+    compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
+  }
+
+  __gitcomp_file ()
+  {
+    emulate -L zsh
+
+    local IFS=$'\n'
+    compset -P '*[=:]'
+    compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
+  }
+
+  _git ()
+  {
+    local _ret=1 cur cword prev
+    cur=${words[CURRENT]}
+    prev=${words[CURRENT-1]}
+    let cword=CURRENT-1
+    emulate ksh -c __${service}_main
+    let _ret && _default && _ret=0
+    return _ret
+  }
+
+  compdef _git git gitk
+  return
+fi
+
+__git_func_wrap ()
+{
+  local cur words cword prev
+  _get_comp_words_by_ref -n =: cur words cword prev
+  $1
+}
+
+# Setup completion for certain functions defined above by setting common
+# variables and workarounds.
+# This is NOT a public function; use at your own risk.
+__git_complete ()
+{
+  local wrapper="__git_wrap${2}"
+  eval "$wrapper () { __git_func_wrap $2 ; }"
+  complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
+    || complete -o default -o nospace -F $wrapper $1
+}
+
+# wrapper for backwards compatibility
+_git ()
+{
+  __git_wrap__git_main
+}
+
+# wrapper for backwards compatibility
+_gitk ()
+{
+  __git_wrap__gitk_main
+}
+
+__git_complete git __git_main
+__git_complete gitk __gitk_main
+
+# The following are necessary only for Cygwin, and only are needed
+# when the user has tab-completed the executable name and consequently
+# included the '.exe' suffix.
+#
+if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
+__git_complete git.exe __git_main
+fi
diff --git a/.config/bash/rc/git-prompt.sh b/.config/bash/rc/git-prompt.sh
new file mode 100644 (file)
index 0000000..29ec012
--- /dev/null
@@ -0,0 +1,531 @@
+# bash/zsh git prompt support
+#
+# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
+# Distributed under the GNU General Public License, version 2.0.
+#
+# This script allows you to see repository status in your prompt.
+#
+# To enable:
+#
+#    1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).
+#    2) Add the following line to your .bashrc/.zshrc:
+#        source ~/.git-prompt.sh
+#    3a) Change your PS1 to call __git_ps1 as
+#        command-substitution:
+#        Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
+#        ZSH:  setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
+#        the optional argument will be used as format string.
+#    3b) Alternatively, for a slightly faster prompt, __git_ps1 can
+#        be used for PROMPT_COMMAND in Bash or for precmd() in Zsh
+#        with two parameters, <pre> and <post>, which are strings
+#        you would put in $PS1 before and after the status string
+#        generated by the git-prompt machinery.  e.g.
+#        Bash: PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
+#          will show username, at-sign, host, colon, cwd, then
+#          various status string, followed by dollar and SP, as
+#          your prompt.
+#        ZSH:  precmd () { __git_ps1 "%n" ":%~$ " "|%s" }
+#          will show username, pipe, then various status string,
+#          followed by colon, cwd, dollar and SP, as your prompt.
+#        Optionally, you can supply a third argument with a printf
+#        format string to finetune the output of the branch status
+#
+# The repository status will be displayed only if you are currently in a
+# git repository. The %s token is the placeholder for the shown status.
+#
+# The prompt status always includes the current branch name.
+#
+# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value,
+# unstaged (*) and staged (+) changes will be shown next to the branch
+# name.  You can configure this per-repository with the
+# bash.showDirtyState variable, which defaults to true once
+# GIT_PS1_SHOWDIRTYSTATE is enabled.
+#
+# You can also see if currently something is stashed, by setting
+# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
+# then a '$' will be shown next to the branch name.
+#
+# If you would like to see if there're untracked files, then you can set
+# GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked
+# files, then a '%' will be shown next to the branch name.  You can
+# configure this per-repository with the bash.showUntrackedFiles
+# variable, which defaults to true once GIT_PS1_SHOWUNTRACKEDFILES is
+# enabled.
+#
+# If you would like to see the difference between HEAD and its upstream,
+# set GIT_PS1_SHOWUPSTREAM="auto".  A "<" indicates you are behind, ">"
+# indicates you are ahead, "<>" indicates you have diverged and "="
+# indicates that there is no difference. You can further control
+# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list
+# of values:
+#
+#     verbose       show number of commits ahead/behind (+/-) upstream
+#     name          if verbose, then also show the upstream abbrev name
+#     legacy        don't use the '--count' option available in recent
+#                   versions of git-rev-list
+#     git           always compare HEAD to @{upstream}
+#     svn           always compare HEAD to your SVN upstream
+#
+# You can change the separator between the branch name and the above
+# state symbols by setting GIT_PS1_STATESEPARATOR. The default separator
+# is SP.
+#
+# By default, __git_ps1 will compare HEAD to your SVN upstream if it can
+# find one, or @{upstream} otherwise.  Once you have set
+# GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by
+# setting the bash.showUpstream config variable.
+#
+# If you would like to see more information about the identity of
+# commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE
+# to one of these values:
+#
+#     contains      relative to newer annotated tag (v1.6.3.2~35)
+#     branch        relative to newer tag or branch (master~4)
+#     describe      relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
+#     default       exactly matching tag
+#
+# If you would like a colored hint about the current dirty state, set
+# GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on
+# the colored output of "git status -sb" and are available only when
+# using __git_ps1 for PROMPT_COMMAND or precmd.
+#
+# If you would like __git_ps1 to do nothing in the case when the current
+# directory is set up to be ignored by git, then set
+# GIT_PS1_HIDE_IF_PWD_IGNORED to a nonempty value. Override this on the
+# repository level by setting bash.hideIfPwdIgnored to "false".
+
+# check whether printf supports -v
+__git_printf_supports_v=
+printf -v __git_printf_supports_v -- '%s' yes >/dev/null 2>&1
+
+# stores the divergence from upstream in $p
+# used by GIT_PS1_SHOWUPSTREAM
+__git_ps1_show_upstream ()
+{
+  local key value
+  local svn_remote svn_url_pattern count n
+  local upstream=git legacy="" verbose="" name=""
+
+  svn_remote=()
+  # get some config options from git-config
+  local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
+  while read -r key value; do
+    case "$key" in
+    bash.showupstream)
+      GIT_PS1_SHOWUPSTREAM="$value"
+      if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
+        p=""
+        return
+      fi
+      ;;
+    svn-remote.*.url)
+      svn_remote[$((${#svn_remote[@]} + 1))]="$value"
+      svn_url_pattern="$svn_url_pattern\\|$value"
+      upstream=svn+git # default upstream is SVN if available, else git
+      ;;
+    esac
+  done <<< "$output"
+
+  # parse configuration values
+  for option in ${GIT_PS1_SHOWUPSTREAM}; do
+    case "$option" in
+    git|svn) upstream="$option" ;;
+    verbose) verbose=1 ;;
+    legacy)  legacy=1  ;;
+    name)    name=1 ;;
+    esac
+  done
+
+  # Find our upstream
+  case "$upstream" in
+  git)    upstream="@{upstream}" ;;
+  svn*)
+    # get the upstream from the "git-svn-id: ..." in a commit message
+    # (git-svn uses essentially the same procedure internally)
+    local -a svn_upstream
+    svn_upstream=($(git log --first-parent -1 \
+          --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
+    if [[ 0 -ne ${#svn_upstream[@]} ]]; then
+      svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]}
+      svn_upstream=${svn_upstream%@*}
+      local n_stop="${#svn_remote[@]}"
+      for ((n=1; n <= n_stop; n++)); do
+        svn_upstream=${svn_upstream#${svn_remote[$n]}}
+      done
+
+      if [[ -z "$svn_upstream" ]]; then
+        # default branch name for checkouts with no layout:
+        upstream=${GIT_SVN_ID:-git-svn}
+      else
+        upstream=${svn_upstream#/}
+      fi
+    elif [[ "svn+git" = "$upstream" ]]; then
+      upstream="@{upstream}"
+    fi
+    ;;
+  esac
+
+  # Find how many commits we are ahead/behind our upstream
+  if [[ -z "$legacy" ]]; then
+    count="$(git rev-list --count --left-right \
+        "$upstream"...HEAD 2>/dev/null)"
+  else
+    # produce equivalent output to --count for older versions of git
+    local commits
+    if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
+    then
+      local commit behind=0 ahead=0
+      for commit in $commits
+      do
+        case "$commit" in
+        "<"*) ((behind++)) ;;
+        *)    ((ahead++))  ;;
+        esac
+      done
+      count="$behind  $ahead"
+    else
+      count=""
+    fi
+  fi
+
+  # calculate the result
+  if [[ -z "$verbose" ]]; then
+    case "$count" in
+    "") # no upstream
+      p="" ;;
+    "0  0") # equal to upstream
+      p="=" ;;
+    "0  "*) # ahead of upstream
+      p=">" ;;
+    *"  0") # behind upstream
+      p="<" ;;
+    *)      # diverged from upstream
+      p="<>" ;;
+    esac
+  else
+    case "$count" in
+    "") # no upstream
+      p="" ;;
+    "0  0") # equal to upstream
+      p=" u=" ;;
+    "0  "*) # ahead of upstream
+      p=" u+${count#0 }" ;;
+    *"  0") # behind upstream
+      p=" u-${count%  0}" ;;
+    *)      # diverged from upstream
+      p=" u+${count#* }-${count%  *}" ;;
+    esac
+    if [[ -n "$count" && -n "$name" ]]; then
+      __git_ps1_upstream_name=$(git rev-parse \
+        --abbrev-ref "$upstream" 2>/dev/null)
+      if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
+        p="$p \${__git_ps1_upstream_name}"
+      else
+        p="$p ${__git_ps1_upstream_name}"
+        # not needed anymore; keep user's
+        # environment clean
+        unset __git_ps1_upstream_name
+      fi
+    fi
+  fi
+
+}
+
+# Helper function that is meant to be called from __git_ps1.  It
+# injects color codes into the appropriate gitstring variables used
+# to build a gitstring.
+__git_ps1_colorize_gitstring ()
+{
+  if [[ -n ${ZSH_VERSION-} ]]; then
+    local c_red='%F{red}'
+    local c_green='%F{green}'
+    local c_lblue='%F{blue}'
+    local c_clear='%f'
+  else
+    # Using \[ and \] around colors is necessary to prevent
+    # issues with command line editing/browsing/completion!
+    local c_red='\[\e[31m\]'
+    local c_green='\[\e[32m\]'
+    local c_lblue='\[\e[1;34m\]'
+    local c_clear='\[\e[0m\]'
+  fi
+  local bad_color=$c_red
+  local ok_color=$c_green
+  local flags_color="$c_lblue"
+
+  local branch_color=""
+  if [ $detached = no ]; then
+    branch_color="$ok_color"
+  else
+    branch_color="$bad_color"
+  fi
+  c="$branch_color$c"
+
+  z="$c_clear$z"
+  if [ "$w" = "*" ]; then
+    w="$bad_color$w"
+  fi
+  if [ -n "$i" ]; then
+    i="$ok_color$i"
+  fi
+  if [ -n "$s" ]; then
+    s="$flags_color$s"
+  fi
+  if [ -n "$u" ]; then
+    u="$bad_color$u"
+  fi
+  r="$c_clear$r"
+}
+
+__git_eread ()
+{
+  local f="$1"
+  shift
+  test -r "$f" && read "$@" <"$f"
+}
+
+# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
+# when called from PS1 using command substitution
+# in this mode it prints text to add to bash PS1 prompt (includes branch name)
+#
+# __git_ps1 requires 2 or 3 arguments when called from PROMPT_COMMAND (pc)
+# in that case it _sets_ PS1. The arguments are parts of a PS1 string.
+# when two arguments are given, the first is prepended and the second appended
+# to the state string when assigned to PS1.
+# The optional third parameter will be used as printf format string to further
+# customize the output of the git-status string.
+# In this mode you can request colored hints using GIT_PS1_SHOWCOLORHINTS=true
+__git_ps1 ()
+{
+  # preserve exit status
+  local exit=$?
+  local pcmode=no
+  local detached=no
+  local ps1pc_start='\u@\h:\w '
+  local ps1pc_end='\$ '
+  local printf_format=' (%s)'
+
+  case "$#" in
+    2|3)  pcmode=yes
+      ps1pc_start="$1"
+      ps1pc_end="$2"
+      printf_format="${3:-$printf_format}"
+      # set PS1 to a plain prompt so that we can
+      # simply return early if the prompt should not
+      # be decorated
+      PS1="$ps1pc_start$ps1pc_end"
+    ;;
+    0|1)  printf_format="${1:-$printf_format}"
+    ;;
+    *)  return $exit
+    ;;
+  esac
+
+  # ps1_expanded:  This variable is set to 'yes' if the shell
+  # subjects the value of PS1 to parameter expansion:
+  #
+  #   * bash does unless the promptvars option is disabled
+  #   * zsh does not unless the PROMPT_SUBST option is set
+  #   * POSIX shells always do
+  #
+  # If the shell would expand the contents of PS1 when drawing
+  # the prompt, a raw ref name must not be included in PS1.
+  # This protects the user from arbitrary code execution via
+  # specially crafted ref names.  For example, a ref named
+  # 'refs/heads/$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)' might cause the
+  # shell to execute 'sudo rm -rf /' when the prompt is drawn.
+  #
+  # Instead, the ref name should be placed in a separate global
+  # variable (in the __git_ps1_* namespace to avoid colliding
+  # with the user's environment) and that variable should be
+  # referenced from PS1.  For example:
+  #
+  #     __git_ps1_foo=$(do_something_to_get_ref_name)
+  #     PS1="...stuff...\${__git_ps1_foo}...stuff..."
+  #
+  # If the shell does not expand the contents of PS1, the raw
+  # ref name must be included in PS1.
+  #
+  # The value of this variable is only relevant when in pcmode.
+  #
+  # Assume that the shell follows the POSIX specification and
+  # expands PS1 unless determined otherwise.  (This is more
+  # likely to be correct if the user has a non-bash, non-zsh
+  # shell and safer than the alternative if the assumption is
+  # incorrect.)
+  #
+  local ps1_expanded=yes
+  [ -z "$ZSH_VERSION" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
+  [ -z "$BASH_VERSION" ] || shopt -q promptvars || ps1_expanded=no
+
+  local repo_info rev_parse_exit_code
+  repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
+    --is-bare-repository --is-inside-work-tree \
+    --short HEAD 2>/dev/null)"
+  rev_parse_exit_code="$?"
+
+  if [ -z "$repo_info" ]; then
+    return $exit
+  fi
+
+  local short_sha
+  if [ "$rev_parse_exit_code" = "0" ]; then
+    short_sha="${repo_info##*$'\n'}"
+    repo_info="${repo_info%$'\n'*}"
+  fi
+  local inside_worktree="${repo_info##*$'\n'}"
+  repo_info="${repo_info%$'\n'*}"
+  local bare_repo="${repo_info##*$'\n'}"
+  repo_info="${repo_info%$'\n'*}"
+  local inside_gitdir="${repo_info##*$'\n'}"
+  local g="${repo_info%$'\n'*}"
+
+  if [ "true" = "$inside_worktree" ] &&
+     [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &&
+     [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &&
+     git check-ignore -q .
+  then
+    return $exit
+  fi
+
+  local r=""
+  local b=""
+  local step=""
+  local total=""
+  if [ -d "$g/rebase-merge" ]; then
+    __git_eread "$g/rebase-merge/head-name" b
+    __git_eread "$g/rebase-merge/msgnum" step
+    __git_eread "$g/rebase-merge/end" total
+    if [ -f "$g/rebase-merge/interactive" ]; then
+      r="|REBASE-i"
+    else
+      r="|REBASE-m"
+    fi
+  else
+    if [ -d "$g/rebase-apply" ]; then
+      __git_eread "$g/rebase-apply/next" step
+      __git_eread "$g/rebase-apply/last" total
+      if [ -f "$g/rebase-apply/rebasing" ]; then
+        __git_eread "$g/rebase-apply/head-name" b
+        r="|REBASE"
+      elif [ -f "$g/rebase-apply/applying" ]; then
+        r="|AM"
+      else
+        r="|AM/REBASE"
+      fi
+    elif [ -f "$g/MERGE_HEAD" ]; then
+      r="|MERGING"
+    elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
+      r="|CHERRY-PICKING"
+    elif [ -f "$g/REVERT_HEAD" ]; then
+      r="|REVERTING"
+    elif [ -f "$g/BISECT_LOG" ]; then
+      r="|BISECTING"
+    fi
+
+    if [ -n "$b" ]; then
+      :
+    elif [ -h "$g/HEAD" ]; then
+      # symlink symbolic ref
+      b="$(git symbolic-ref HEAD 2>/dev/null)"
+    else
+      local head=""
+      if ! __git_eread "$g/HEAD" head; then
+        return $exit
+      fi
+      # is it a symbolic ref?
+      b="${head#ref: }"
+      if [ "$head" = "$b" ]; then
+        detached=yes
+        b="$(
+        case "${GIT_PS1_DESCRIBE_STYLE-}" in
+        (contains)
+          git describe --contains HEAD ;;
+        (branch)
+          git describe --contains --all HEAD ;;
+        (describe)
+          git describe HEAD ;;
+        (* | default)
+          git describe --tags --exact-match HEAD ;;
+        esac 2>/dev/null)" ||
+
+        b="$short_sha..."
+        b="($b)"
+      fi
+    fi
+  fi
+
+  if [ -n "$step" ] && [ -n "$total" ]; then
+    r="$r $step/$total"
+  fi
+
+  local w=""
+  local i=""
+  local s=""
+  local u=""
+  local c=""
+  local p=""
+
+  if [ "true" = "$inside_gitdir" ]; then
+    if [ "true" = "$bare_repo" ]; then
+      c="BARE:"
+    else
+      b="GIT_DIR!"
+    fi
+  elif [ "true" = "$inside_worktree" ]; then
+    if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &&
+       [ "$(git config --bool bash.showDirtyState)" != "false" ]
+    then
+      git diff --no-ext-diff --quiet || w="*"
+      git diff --no-ext-diff --cached --quiet || i="+"
+      if [ -z "$short_sha" ] && [ -z "$i" ]; then
+        i="#"
+      fi
+    fi
+    if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &&
+       git rev-parse --verify --quiet refs/stash >/dev/null
+    then
+      s="$"
+    fi
+
+    if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &&
+       [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &&
+       git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null
+    then
+      u="%${ZSH_VERSION+%}"
+    fi
+
+    if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
+      __git_ps1_show_upstream
+    fi
+  fi
+
+  local z="${GIT_PS1_STATESEPARATOR-" "}"
+
+  # NO color option unless in PROMPT_COMMAND mode
+  if [ $pcmode = yes ] && [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
+    __git_ps1_colorize_gitstring
+  fi
+
+  b=${b##refs/heads/}
+  if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
+    __git_ps1_branch_name=$b
+    b="\${__git_ps1_branch_name}"
+  fi
+
+  local f="$w$i$s$u"
+  local gitstring="$c$b${f:+$z$f}$r$p"
+
+  if [ $pcmode = yes ]; then
+    if [ "${__git_printf_supports_v-}" != yes ]; then
+      gitstring=$(printf -- "$printf_format" "$gitstring")
+    else
+      printf -v gitstring -- "$printf_format" "$gitstring"
+    fi
+    PS1="$ps1pc_start$gitstring$ps1pc_end"
+  else
+    printf -- "$printf_format" "$gitstring"
+  fi
+
+  return $exit
+}
diff --git a/.config/bash/rc/options b/.config/bash/rc/options
new file mode 100644 (file)
index 0000000..22beba3
--- /dev/null
@@ -0,0 +1,23 @@
+# Case-insensitive globbing (used in pathname expansion)
+shopt -s nocaseglob;
+
+# Append to the Bash history file, rather than overwriting it
+shopt -s histappend;
+
+# Autocorrect typos in path names when using `cd`
+shopt -s cdspell;
+
+# Enable some Bash 4 features when possible:
+# * `autocd`, e.g. `**/qux` will enter `./foo/bar/baz/qux`
+# * Recursive globbing, e.g. `echo **/*.txt`
+for option in autocd globstar; do
+       shopt -s "$option" 2> /dev/null;
+done;
+
+# File creation
+umask 022
+
+# Don't use ^D to exit
+set -o ignoreeof
+set -o vi
+
diff --git a/.config/bash/rc/paths b/.config/bash/rc/paths
new file mode 100644 (file)
index 0000000..eec134f
--- /dev/null
@@ -0,0 +1,32 @@
+
+# Set PATH so it includes user's private bin if it exists
+# if [ -d "${HOME}/bin" ] ; then
+#  PATH="${HOME}/bin:${PATH}"
+# fi
+
+# Set MANPATH so it includes users' private man if it exists
+# if [ -d "${HOME}/man" ]; then
+#   MANPATH="${HOME}/man:${MANPATH}"
+# fi
+
+# Set INFOPATH so it includes users' private info if it exists
+# if [ -d "${HOME}/info" ]; then
+#   INFOPATH="${HOME}/info:${INFOPATH}"
+# fi
+
+# Set PATH to temporary folders
+export TEMPDIR="${HOME}/tmp"
+export TMPDIR="${HOME}/tmp"
+
+# Set PATH to dotfiles git folder
+export DOTFILES="${HOME}/.dotfiles"
+
+# Set PATH to PREFIX folders
+export PREFIX="${HOME}"
+
+PATH="${PREFIX}/bin:${PATH}"
+MANPATH="${PREFIX}/share/man:${MANPATH}"
+INFOPATH="${PREFIX}/share/info:${INFOPATH}"
+
+# Add local libraries to libpath
+# LD_LIBRARY_PATH="${PREFIX}/lib:${LD_LIBRARY_PATH}"
diff --git a/.config/bash/rc/prompt b/.config/bash/rc/prompt
new file mode 100644 (file)
index 0000000..bca13df
--- /dev/null
@@ -0,0 +1,76 @@
+# Bash git prompt solarized
+
+if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then
+        export TERM='gnome-256color';
+elif infocmp xterm-256color >/dev/null 2>&1; then
+        export TERM='xterm-256color';
+fi;
+
+if tput setaf 1 &> /dev/null; then
+       tput sgr0; # reset colors
+       bold=$(tput bold);
+       reset=$(tput sgr0);
+       black=$(tput setaf 0);
+       blue=$(tput setaf 33);
+       cyan=$(tput setaf 37);
+       green=$(tput setaf 64);
+       orange=$(tput setaf 166);
+       purple=$(tput setaf 125);
+       red=$(tput setaf 124);
+       violet=$(tput setaf 61);
+       white=$(tput setaf 15);
+       yellow=$(tput setaf 136);
+else
+       bold='';
+       reset="\e[0m";
+       black="\e[1;30m";
+       blue="\e[1;34m";
+       cyan="\e[1;36m";
+       green="\e[1;32m";
+       orange="\e[1;33m";
+       purple="\e[1;35m";
+       red="\e[1;31m";
+       violet="\e[1;35m";
+       white="\e[1;37m";
+       yellow="\e[1;33m";
+fi;
+
+# Highlight the user name when logged in as root.
+if [[ "${USER}" == "root" ]]; then
+       userStyle="${red}";
+else
+       userStyle="${orange}";
+fi;
+
+# Highlight the hostname when connected via SSH.
+if [[ "${SSH_TTY}" ]]; then
+       hostStyle="${bold}${red}";
+else
+       hostStyle="${yellow}";
+fi;
+
+# Enabling any of these options will slow down the prompt
+export GIT_PS1_SHOWDIRTYSTATE=1
+export GIT_PS1_SHOWSTASHSTATE=1
+export GIT_PS1_SHOWUNTRACKEDFILES=1
+export GIT_PS1_SHOWUPSTREAM=1
+
+# Set git prompt
+# Set the terminal title to the current working directory.
+PS1='\[\033]0;\w\007\]';
+PS1+='\[${bold}\]';
+PS1+='\r'; # newline
+PS1+='\[${userStyle}\]\u '; # username
+PS1+='\[${white}\]at ';
+PS1+='\[${hostStyle}\]\h '; # at host
+PS1+='\[${white}\]in ';
+PS1+='\[${green}\]\w '; # in working directory
+PS1+="$(__git_ps1 '\[${white}\]on \[${violet}\]%s\[${blue}\]')";  # on branch
+PS1+='\n'; # newline
+PS1+='\[${white}\]\$ '; # `$`
+PS1+='\[${reset}\]'; # reset color
+export PS1;
+
+PS2='\[${yellow}\]→ '; # `→`
+PS2+='\[${reset}\]'; # reset color
+export PS2;
diff --git a/.config/bash/rc/solarized b/.config/bash/rc/solarized
new file mode 100644 (file)
index 0000000..3a9d3bb
--- /dev/null
@@ -0,0 +1,23 @@
+[ "$PLATFORM" == "Darwin" ] && return;
+
+echo -ne   '\eP\e]10;#839496\a'  # Foreground   -> base0
+echo -ne   '\eP\e]11;#002B36\a'  # Background   -> base03
+
+echo -ne   '\eP\e]12;#DC322F\a'  # Cursor       -> red
+
+echo -ne  '\eP\e]4;0;#073642\a'  # black        -> Base02
+echo -ne  '\eP\e]4;8;#002B36\a'  # bold black   -> Base03
+echo -ne  '\eP\e]4;1;#DC322F\a'  # red          -> red
+echo -ne  '\eP\e]4;9;#CB4B16\a'  # bold red     -> orange
+echo -ne  '\eP\e]4;2;#859900\a'  # green        -> green
+echo -ne '\eP\e]4;10;#586E75\a'  # bold green   -> base01 *
+echo -ne  '\eP\e]4;3;#B58900\a'  # yellow       -> yellow
+echo -ne '\eP\e]4;11;#657B83\a'  # bold yellow  -> base00 *
+echo -ne  '\eP\e]4;4;#268BD2\a'  # blue         -> blue
+echo -ne '\eP\e]4;12;#839496\a'  # bold blue    -> base0 *
+echo -ne  '\eP\e]4;5;#D33682\a'  # magenta      -> magenta
+echo -ne '\eP\e]4;13;#6C71C4\a'  # bold magenta -> violet
+echo -ne  '\eP\e]4;6;#2AA198\a'  # cyan         -> cyan
+echo -ne '\eP\e]4;14;#93A1A1\a'  # bold cyan    -> base1 *
+echo -ne  '\eP\e]4;7;#EEE8D5\a'  # white        -> Base2
+echo -ne '\eP\e]4;15;#FDF6E3\a'  # bold white   -> Base3