Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial commit.

  • Loading branch information...
commit 791e7adaf57f353a6e633acba889389290dca4a3 0 parents
isaacs authored
1  .bash_profile
@@ -0,0 +1 @@
+. ~/.profile
0  .bashrc
No changes.
4 .cvsrc
@@ -0,0 +1,4 @@
+cvs -q
+checkout -P
+update -dP
+diff -Nup
943 .extra.bashrc
@@ -0,0 +1,943 @@
+######
+# .extra.bashrc - Isaac's Bash Extras
+# This file is designed to be a drop-in for any machine that I log into.
+# Currently, that means it has to work under Darwin, Ubuntu, and yRHEL
+#
+# Per-platform includes at the bottom, but most functionality is included
+# in this file, and forked based on resource availability.
+#
+# Functions are preferred over shell scripts, because then there's just
+# a few files to scp over to a new host for me to use it comfortably.
+#
+# .extra_Darwin.bashrc has significantly more stuff, since my mac is also
+# a GUI environment, and my primary platform.
+######
+
+
+# Note for Leopard Users #
+# If you use this, it will probably make your $PATH variable pretty long,
+# which will cause terrible performance in a stock Leopard install.
+# To fix this, comment out the following lines in your /etc/profile file:
+
+# if [ -x /usr/libexec/path_helper ]; then
+# eval `/usr/libexec/path_helper -s`
+# fi
+
+# Thanks to "allan" in irc://irc.freenode.net/#textmate for knowing this!
+
+
+echo "loading bash extras..."
+
+# i like my aliases. please always have them!
+shopt expand_aliases &>/dev/null
+
+if [ "$BASH_COMPLETION_DIR" == "" ]; then
+ [ -f /opt/local/etc/bash_completion ] && . /opt/local/etc/bash_completion
+ [ -f /etc/bash_completion ] && . /etc/bash_completion
+fi
+
+# set some globals
+if ! [ -f "$HOME" ]; then
+ export HOME="`echo ~`"
+fi
+
+path=$HOME/bin:$HOME/scripts:/home/y/bin:/opt/local/sbin:/opt/local/bin:/opt/local/libexec:/opt/local/apache2/bin:/opt/local/lib/mysql/bin:/opt/local/lib/erlang/bin:/usr/local/sbin:/usr/local/bin:/usr/local/libexec:/usr/sbin:/usr/bin:/usr/libexec:/sbin:/bin:/libexec:/usr/X11R6/bin:/home/y/include:/opt/local/share/mysql5/mysql:/usr/local/mysql/bin:/opt/local/include:/opt/local/apache2/include:/usr/local/include:/usr/include:/usr/X11R6/include
+! [ -d ~/bin ] && mkdir ~/bin
+path_elements="${path//:/ }"
+path=""
+for i in $path_elements; do
+ [ -d $i ] && path="$path$i "
+done
+export PATH=$(path=`echo $path`; echo ${path// /:})
+
+
+# Use UTF-8, and throw errors in PHP and Perl if it's not available.
+# Note: this is VERY obnoxious if UTF8 is not available!
+# That's the point!
+export LC_CTYPE=en_US.UTF-8
+export LC_ALL=""
+export LANG=$LC_CTYPE
+export LANGUAGE=$LANG
+export TZ=America/Los_Angeles
+
+# chooses the first argument that matches a file in the path.
+choose_first () {
+ for i in "$@"; do
+ if ! [ -f "$i" ] && inpath "$i"; then
+ i="`which $i`"
+ fi
+ if [ -f "$i" ]; then
+ echo $i
+ break
+ fi
+ done
+}
+inpath () {
+ ! [ $# -eq 1 ] && echo "usage: inpath <file>" && return 1
+ f="`which $1 2>/dev/null`"
+ [ -f "$f" ] && return 0
+ return 1
+}
+
+# headless <command> [<key>]
+# to reconnect, do: headless "" <key>
+headless () {
+ if [ "$2" == "" ]; then
+ hash=`md5 -qs "$1"`
+ else
+ hash="$2"
+ fi
+ if [ "$1" != "" ]; then
+ dtach -n /tmp/headless-$hash bash -l -c "$1"
+ else
+ dtach -A /tmp/headless-$hash bash -l
+ fi
+}
+
+# function to do something in the background
+back () {
+ ( $@ ) &
+}
+# do something very quietly.
+quiet () {
+ ( $@ ) >/dev/null 2>/dev/null
+}
+
+if inpath yuicompressor; then
+ testjs () {
+ for i in `find . -name "*.js"`; do
+ err="`yuicompressor -o /dev/null $i 2>/dev/stdout`"
+ if [ "$err" != "" ]; then
+ echo "$i has errors:"
+ echo "$err"
+ fi
+ done
+ }
+fi
+
+# give a little colou?r to grep commands, if supported
+grep=grep
+if [ "`grep --help | grep color`" != "" ]; then
+ grep="grep --color"
+elif [ "`grep --help | grep colour`" != "" ]; then
+ grep="grep --colour"
+fi
+alias grep="$grep"
+
+
+# substitute "this" for "that" if "this" exists and is in the path.
+substitute () {
+ ! [ $# -eq 2 ] && echo "usage: substitute <desired> <orig>" && return 1
+ inpath "$1" && new="`which $1`" && alias $2="$new"
+}
+
+substitute yssh ssh
+substitute yscp scp
+
+export CVSROOT=vault.yahoo.com:/CVSROOT
+export CVS_RSH=`choose_first yssh ssh`
+export RSYNC_RSH=`choose_first yssh ssh`
+
+[ -d ~/dev/main/yahoo ] && export SRCTOP=~/dev/main/yahoo
+
+has_yinst=0
+inpath yinst && has_yinst=1
+
+# useful commands:
+_set_editor () {
+ edit_cmd="`choose_first $@`"
+ if [ -f "$edit_cmd" ]; then
+ if [ -f "${edit_cmd}_wait" ]; then
+ export EDITOR="${edit_cmd}_wait"
+ else
+ export EDITOR="$edit_cmd"
+ fi
+ fi
+ alias edit="$edit_cmd"
+ alias sued="sudo $edit_cmd"
+}
+# my list of editors, by preference.
+_set_editor mate vim vi pico ed
+
+# shebang <file> <program> [<args>]
+shebang () {
+ sb="shebang"
+ if [ $# -lt 2 ]; then
+ echo "usage: $sb <file> <program> [<arg string>]"
+ return 1
+ elif ! [ -f "$1" ]; then
+ echo "$sb: $1 is not a file."
+ return 1
+ fi
+ if ! [ -w "$1" ]; then
+ echo "$sb: $1 is not writable."
+ return 1
+ fi
+ prog="$2"
+ ! [ -f "$prog" ] && prog="`which $prog 2>/dev/null`"
+ if ! [ -x "$prog" ]; then
+ echo "$sb: $2 is not executable, or not in path."
+ return 1
+ fi
+ chmod ogu+x "$1"
+ prog="#!$prog"
+ [ "$3" != "" ] && prog="$prog $3"
+ if ! [ "`head -n 1 \"$1\"`" == "$prog" ]; then
+ contents="`cat \"$1\"`"
+ newcontents=`cat <<ENDSHEBANG
+$prog
+$contents
+ENDSHEBANG`
+ echo -n "$newcontents" > $1
+ fi
+ return 0
+}
+
+rand () {
+ # r=``
+ # echo $r
+ echo `php -r 'echo rand();'`
+}
+
+pickrand () {
+ cnt=0
+ if [ $# == 1 ]; then
+ tst=$1
+ else
+ tst="-d"
+ fi
+ for i in *; do
+ [ $tst "$i" ] && let 'cnt += 1'
+ done
+ r=`rand`
+ p=0
+ [ $cnt -eq 0 ] && return 1
+ let 'p = r % cnt'
+ # echo "[$cnt $r --- $p]"
+ cnt=0
+ for i in *; do
+ # echo "[$cnt]"
+ [ $tst "$i" ] && let 'cnt += 1' && [ $cnt -eq $p ] && echo "$i" && return
+ done
+}
+
+
+# md5 from the command line
+# I like the BSD/Darwin "md5" util a bit better than md5sum flavor.
+# Ported here to always have it.
+# Yeah, that's right. My bash profile has a PHP program embedded
+# inside. You wanna fight about it?
+if ! inpath md5 && inpath php; then
+ # careful on this next trick. The php code can *not* use single-quotes.
+ echo '<?php
+ // The BSD md5 checksum program, ported to PHP by Isaac Z. Schlueter
+
+ function main ($argv, $argc) /* int */ {
+ global $bin;
+ $return = true;
+ $bin = basename( array_shift($argv) );
+ $return = 0;
+ foreach (parseargs($argv, $argc) as $target => $action) {
+ // echo "$action($target)\n";
+ if ( !$action( $target ) ) {
+ $return ++;
+ }
+ }
+ // convert to bash success/failure flag
+ exit( $return );
+ }
+
+ function parseargs ($argv, $argc) {
+ $actions = array();
+ $getstring = false;
+ $needstdin = true;
+ foreach ($argv as $arg) {
+ // echo "arg: $arg\n";
+ if ($getstring) {
+ $getstring = false;
+ $actions[ "\"$arg\"" ] = "cksumString";
+ continue;
+ }
+ if ($arg[0] !== "-") {
+ // echo "setting $arg to cksumFile\n";
+ $needstdin = false;
+ $actions[$arg] = "cksumFile";
+ } else {
+ // is a flag
+ $arg = substr($arg, 1);
+ if (strlen($arg) === 0) {
+ $actions["-"] = "cksumFile";
+ } else {
+ while (strlen($arg)) {
+ $flag = $arg{0};
+ $arg = substr($arg, 1);
+ switch ($flag) {
+ case "s":
+ if ($arg) {
+ $actions["\"$arg\""] = "cksumString";
+ $arg = "";
+ } else {
+ $getstring = true;
+ }
+ $needstdin = false;
+ break;
+ case "p": $actions[] = "cksumStdinPrint"; $needstdin = false; break;
+ case "q": flag("quiet", true); break;
+ case "r": flag("reverse",true); break;
+ case "t": $actions["timeTrial"] = "timeTrial"; $needstdin = false; break;
+ case "x": $actions["runTests"] = "runTests"; $needstdin = false; break;
+ default : $actions["$flag"] = "usage"; $needstdin = false; break;
+ } // switch
+ } // while
+ } // strlen($arg)
+ }
+ } // end foreach
+ if ($getstring) {
+ global $bin;
+ // exited without getting a string!
+ error_log("$bin: option requires an argument -- s");
+ usage();
+ }
+ if ($needstdin) {
+ $actions[] = "cksumStdin";
+ }
+ return $actions;
+ }
+
+ /*
+ -s string
+ Print a checksum of the given string.
+ -p
+ Echo stdin to stdout and appends the MD5 sum to stdout.
+ -q
+ Quiet mode - only the MD5 sum is printed out. Overrides the -r option.
+ -r
+ Reverses the format of the output. This helps with visual diffs.
+ Does nothing when combined with the -ptx options.
+ -t
+ Run a built-in time trial.
+ -x
+ Run a built-in test script.
+ */
+
+ function cksumFile ($file) {
+ // echo "in > cksumFile($file)\n";
+ // echo "\noriginal: \n";
+ // echo `md5_original $file`;
+
+ $missing = !file_exists($file);
+ $isdir = $missing ? 0 : is_dir($file); // only call if necessary
+ if ( $missing || $isdir ) {
+ global $bin;
+ error_log("$bin: $file: " . ($missing ? "No such file or directory" : "is a directory."));
+ // echo "bout to return\n";
+ return false;
+ }
+ output("MD5 (%s) = %s", $file, md5(file_get_contents($file)));
+ }
+ function cksumStdin () {
+ $stdin = file_get_contents("php://stdin");
+ writeln(md5($stdin));
+ return true;
+ }
+ function cksumStdinPrint () {
+ $stdin = file_get_contents("php://stdin");
+ output("%s%s", $stdin, md5($stdin), array("reverse"=>false));
+ return true;
+ }
+
+ function cksumString ($str) {
+ return output("MD5 (%s) = %s", $str, md5(substr($str,1,-1)));
+ }
+ function runTests () {
+ writeln("MD5 test suite:");
+ $return = true;
+ foreach (array(
+ "", "a", "abc", "message digest", "abcdefghijklmnopqrstuvwxyz",
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+ "12345678901234567890123456789012345678901234567890123456789012345678901234567890") as $str ) {
+ $return = $return && cksumString("\"$str\"");
+ }
+ return $return;
+ }
+ function timeTrial () {
+ error_log("Time trial not supported in this version.");
+ return false;
+ }
+ function flag ($flag, $set = null) {
+ static $flags = array();
+ $f = in_array($flag, $flags) ? $flags[$flag] : ($flags[$flag] = false);
+ return ($set === null) ? $f : (($flags[$flag] = (bool)$set) || true) && $f;
+ }
+
+
+ function usage ($option = "") {
+ global $bin;
+ if (!empty($option)) {
+ error_log("$bin: illegal option -- $option");
+ }
+ writeln("usage: $bin [-pqrtx] [-s string] [files ...]");
+ return false;
+ }
+ function output ($format, $input, $digest, $flags = array()) {
+ $orig_flags = array();
+ foreach ($flags as $flag => $value) {
+ $orig_flags[$flag] = flag($flag);
+ flag($flag, $value);
+ }
+ if ( flag("quiet") ) {
+ writeln($digest);
+ } elseif ( flag("reverse") ) {
+ writeln( "$digest $input" );
+ } else {
+ writeln( sprintf($format, $input, $digest) );
+ }
+ foreach ($orig_flags as $flag=>$value) {
+ flag($flag, $value);
+ }
+ return true;
+ }
+ function writeln ($str) {
+ echo "$str\n";
+ }
+ main($argv, $argc);
+ ?>'>~/bin/md5
+ shebang ~/bin/md5 php "-d open_basedir="
+fi
+
+# a friendlier delete on the command line
+! [ -d ~/.Trash ] && mkdir ~/.Trash
+chmod 700 ~/.Trash
+alias emptytrash="find ~/.Trash -not -path ~/.Trash -exec rm -rf {} \; 2>/dev/null"
+if ! inpath del; then
+ if [ -d ~/.Trash ]; then
+ del () {
+ for i in "$@"; do
+ mv "$i" ~/.Trash/
+ done
+ }
+ else
+ alias del=rm
+ fi
+fi
+alias mvsafe="mv -i"
+
+lscolor=""
+if [ "$TERM" != "dumb" ] && [ -f "`which dircolors 2>/dev/null`" ]; then
+ eval "`dircolors -b`"
+ lscolor=" --color=auto"
+ #alias dir='ls --color=auto --format=vertical'
+ #alias vdir='ls --color=auto --format=long'
+fi
+ls_cmd="ls$lscolor"
+alias ls="$ls_cmd"
+alias la="$ls_cmd -laF"
+alias lal="$ls_cmd -laFL"
+alias ll="$ls_cmd -lF"
+alias ag="alias | $grep"
+fn () {
+ func=`set | egrep '^[a-zA-Z0-9_-]+ ()' | egrep -v '^_' | awk '{print $1}' | grep "$1"`
+ [ -z "$func" ] && echo "$1 is not a function" > /dev/stderr && return 1
+ echo $func && return 0
+}
+alias lg="$ls_cmd -laF | $grep"
+alias chdir="cd"
+alias more="less -e"
+alias lsdevs="sudo lsof | $grep /dev"
+
+
+# domain sniffing
+w () {
+ whois $1 | egrep -i '(registrar:|no match|record expires on)'
+}
+
+
+# find files in current dir by name (not in package dirs)
+f () {
+ find . -name "$1" -not -path "*/rhel.*.*.package/*" -not -path "*/CVS/*" -not -path "*/CVS" -not -path "*/rhel.*.*.package"
+}
+
+#make tree a little cooler looking.
+alias tree="tree -CAFa -I 'CVS|rhel.*.*.package|.svn|.git' --dirsfirst"
+
+if [ "$has_yinst" == 1 ]; then
+ # echo "has yinst = $has_yinst"
+ yapr="yinst restart yapache"
+elif inpath apache2ctl; then
+ yapr="sudo apache2ctl graceful"
+elif inpath apachectl; then
+ yapr="sudo apachectl graceful"
+else
+ # well, just try to HUP it. Note: this is odd.
+ yapr="sudo killall -HUP httpd"
+fi
+alias yapr="$yapr"
+
+
+__yapl () {
+ if [ ${#@} -gt 0 ]; then
+ site="$1"
+ else
+ site="foohack.com"
+ fi
+ tail -f ~/apache/log/$site/error_log
+}
+__yaprl () {
+ yapr
+ __yapl "$1"
+}
+if [ -d "$HOME/apache/log/" ]; then
+ alias yapl="__yapl"
+ alias yaprl="__yaprl"
+else
+ apache_log="`choose_first /home/y/logs/yapache/php-error /home/y/logs/yapache/error /home/y/logs/yapache/error_log /home/y/logs/yapache/us/error_log /home/y/logs/yapache/us/error /opt/local/apache2/logs/error_log /var/log/httpd/error_log /var/log/httpd/error`"
+ yapl="tail -f $apache_log"
+ alias yaprl="$yapr;$yapl"
+ alias yapl="$yapl"
+fi
+
+alias prof=". ~/.extra.bashrc"
+editprof () {
+ s=""
+ if [ "$1" != "" ]; then
+ s="_$1"
+ fi
+ $EDITOR ~/.extra$s.bashrc
+ . ~/.extra.bashrc
+}
+pushprof () {
+ [ "$1" == "" ] && echo "no hostname provided" && return 1
+ failures=0
+ for each in $@; do
+ if [ "$each" != "" ]; then
+ if rsync -v -a -z ~/.{profile,extra,cvsrc,git}* $each:~ && \
+ rsync -v -a -z ~/.ssh/*{.pub,authorized_keys,config} $each:~/.ssh/; then
+ echo "Pushed bash extras and public keys to $each"
+ else
+ echo "Failed to push to $each"
+ let 'failures += 1'
+ fi
+ fi
+ done
+ return $failures
+}
+
+if [ $has_yinst == 1 ]; then
+ alias inst="yinst install"
+ alias yl="yinst ls"
+ alias yg="yinst ls | $grep"
+elif [ -f "`which port 2>/dev/null`" ]; then
+ alias inst="sudo port install"
+ alias yl="port list installed"
+ alias yg="port list installed | $grep"
+ alias upup="sudo port sync && sudo port upgrade installed"
+elif [ -f "`which apt-get 2>/dev/null`" ]; then
+ alias inst="sudo apt-get install"
+ alias yl="dpkg --list | egrep '^ii'"
+ alias yg="dpkg --list | egrep '^ii' | $grep"
+ alias upup="sudo apt-get update && sudo apt-get upgrade"
+fi
+
+
+
+
+#cvs stuff
+#more in .bash_extra_Darwin
+clearconflicts () {
+ edit=""
+ clear=""
+ for i in `cvs up | egrep '^C' | egrep -o '[^C\ ].*$'`; do
+ if [ -f "$i" ]; then
+ echo ""
+ echo -n "$i - what to do? (C)lean copy, (E)dit, (S)kip (skip) "
+ read -n 1 action
+ if [ "$action" == "C" ] || [ "$action" == "c" ]; then
+ echo ""
+ echo "clearit!"
+ clear="$clear $i"
+ elif [ "$action" == "E" ] || [ "$action" == "e" ]; then
+ edit="$edit $i"
+ fi
+ fi
+ done
+ if ! [ "$clear" == "" ]; then
+ for i in $clear; do
+ rm -rf $clear
+ done
+ cvs up -dPC $clear
+ fi
+ #echo "editing: [[[$edit]]]"
+ if ! [ "$edit" == "" ]; then
+ edit $edit
+ fi
+}
+
+cvsunknown () {
+ for i in `uq`; do
+ if [ -f "$i" ]; then
+ echo ""
+ echo -n "$i - what to do? (R)emove, (S)kip (skip) "
+ read -n 1 action
+ if [ "$action" == "R" ] || [ "$action" == "r" ]; then
+ rm -rf $i
+ fi
+ fi
+ done
+}
+
+diffless () {
+ cvs diff $@ | less
+}
+alias cu="cvs up"
+alias ug="cvs up | egrep '^[^\?]'"
+# alias uc="cvs up -C" # This is convenient but WAAAAYYY too powerful!!
+alias um="cvs up | egrep '^(M|A)' | egrep -o '[^MA\ ].*$'"
+alias uq="cvs up | egrep '^\?' | egrep -o '[^\?\ ].*$'"
+alias cci="cvs ci"
+
+# alias sc="svn up -C" # This is convenient but WAAAAYYY too powerful!!
+alias sci="svn ci"
+alias sg="svn up"
+alias sq="svn status | egrep '^\?' | egrep -o '[^\?\ ].*$'"
+alias sm="svn status | egrep '^(M|A)' | egrep -o '[^MA\ ].*$'"
+alias svncleanup="sudo find . -name '.svn' -exec rm -rf {} \; ;"
+
+alias gci="git commit"
+alias gpu="git pull"
+alias gps="git push"
+
+addcommit () {
+ cvs add $@
+ cvs commit $@
+}
+cvsrm () {
+ rm $@
+ cvs rm $@
+}
+alias cvsrev="cvs update -f -r "
+
+# finds and deletes .DS_Store, *.bak, and .# files.
+# Doesn't handle files with spaces in the name, but in that case, probably won't cause problems, just won't work.
+cvscleanup () {
+ curdir="."
+ files=""
+ COUNTER=0
+
+ for f in [`ls -RA | egrep "(^\.|\.bak$)"`];
+ do
+ if [ ${f:0:1} = "[" ]; then
+ f=${f:1}
+ fi
+ if [ ${f:(${#f}-1)} = "]" ]; then
+ f=${f:0:(${#f}-1)}
+ fi
+ if [ ${f:0:1} = "." ]; then
+ if [ "$f" != ".cvsignore" ] && [ "$f" != ".crontab" ]; then
+ if [ -d ${f:0:(${#f}-1)} ]; then
+ curdir=${f:0:(${#f}-1)}
+ elif [ -f "$curdir/$f" ]; then
+ files="$files $curdir/$f "
+ let COUNTER=COUNTER+1
+ echo "$curdir/$f "
+ elif [ -f "$curdir/${f:1}" ]; then
+ files="$files $curdir/${f:1} "
+ let COUNTER=COUNTER+1
+ echo "$curdir/${f:1}"
+ fi
+ fi
+ elif [ ${f:(${#f}-4)} = ".bak" ]; then
+ if [ -d ${f:0:(${#f}-1)} ]; then
+ curdir=${f:0:(${#f}-1)}
+ elif [ -f "$curdir/$f" ]; then
+ files="$files $curdir/$f "
+ let COUNTER=COUNTER+1
+ echo "$curdir/$f "
+ elif [ -f "$curdir/${f:1}" ]; then
+ files="$files $curdir/${f:1} "
+ let COUNTER=COUNTER+1
+ echo "$curdir/${f:1}"
+ fi
+ fi
+ done
+
+ if [ "$COUNTER" != "0" ]; then
+ echo ""
+ echo "OK to delete $COUNTER file(s)? (enter Y to delete)"
+ read doit
+ if [ "$doit" = "Y" ]; then
+ `rm $files`
+ echo "done"
+ else
+ echo "cancelled"
+ fi
+ else
+ echo ""
+ echo "No backup files found."
+ fi
+}
+
+
+#get the ip address of a host easily.
+getip () {
+ for each in $@; do
+ echo $each
+ echo "nslookup:"
+ nslookup $each | grep Address: | grep -v '#' | egrep -o '([0-9]+\.){3}[0-9]+'
+ echo "ping:"
+ ping -c1 -t1 $each | egrep -o '([0-9]+\.){3}[0-9]+' | head -n1
+ done
+}
+
+ips () {
+ interface=""
+ for i in $( ifconfig | egrep -o '(^(vmnet|en)[0-9]:|inet ([0-9]+\.){3}[0-9]+)' | egrep -o '(^(vmnet|en)[0-9]:|([0-9]+\.){3}[0-9]+)' | grep -v 127.0.0.1 ); do
+ # echo "i=[$i]"
+ if [ ${i:(${#i}-1)} == ":" ]; then
+ interface=$i
+ else
+ echo $interface $i
+ fi
+ done
+}
+
+macs () {
+ interface=""
+ for i in $( ifconfig | egrep -o '(^(vmnet|en)[0-9]:|ether ([0-9a-f]{2}:){5}[0-9a-f]{2})' | egrep -o '(^(vmnet|en)[0-9]:|([0-9a-f]{2}:){5}[0-9a-f]{2})' ); do
+ # echo "i=[$i]"
+ if [ ${i:(${#i}-1)} == ":" ]; then
+ interface=$i
+ else
+ echo $interface $i
+ fi
+ done
+}
+
+# set the bash prompt and the title function
+
+! [ "$TITLE" ] && TITLE=''
+! [ "${__title}" ] && __title=''
+__settitle () {
+ __title="$1"
+ if [ "$YROOT_NAME" != "" ]; then
+ if [ "${__title}" != "" ]; then
+ TITLE="$YROOT_NAME — ${__title}"
+ else
+ TITLE="$YROOT_NAME"
+ fi
+ else
+ TITLE=${__title}
+ fi
+ DIR=${PWD/$HOME/\~}
+ t=""
+ [ "$TITLE" != "" ] && t="$TITLE — "
+ echo -ne "\033]0;$t${HOSTNAME_FIRSTPART%%\.*}:$DIR\007"
+}
+title () {
+ if [ ${#@} == 1 ]; then
+ __settitle "$@"
+ else
+ echo "$TITLE"
+ fi
+}
+
+#show the short hostname, selected title, and yroot, and update them all on each prompt
+HOSTNAME=`uname -n`;
+HOSTNAME_FIRSTPART=${HOSTNAME%\.yahoo\.com};
+_arch=`uname`
+_bg=`[ $_arch == "Darwin" ] && echo 44 || echo 42`
+_color=`[ $_arch == "Darwin" ] && echo 1 || echo 30`
+PROMPT_COMMAND='__settitle "${__title}"
+DIR=${PWD/$HOME/\~}
+export HOSTNAME=`uname -n`
+export HOSTNAME_FIRSTPART=${HOSTNAME%\.yahoo\.com}
+t=""
+[ "$TITLE" != "" ] && t="$TITLE — "
+echo -ne "\033]0;$t${HOSTNAME_FIRSTPART%%\.*}:$DIR\007"
+echo ""
+[ "$TITLE" ] && echo -ne "\033[${_color}m\033[${_bg}m $TITLE \033[0m"
+echo -ne "\033[1;41m ${HOSTNAME_FIRSTPART} \033[0m:$DIR"'
+#this part gets repeated when you tab to see options
+PS1="\n[\t \u] \\$ "
+
+# view processes.
+alias processes="ps axMuc | egrep '^[a-zA-Z0-9]'"
+pg () {
+ ps aux | grep $@ | grep -v "$grep $@"
+}
+pid () {
+ pg $@ | awk '{print $2}'
+}
+
+alias v="ssh visitbread.corp.yahoo.com"
+alias vm="ssh visitbread-vm0.corp.yahoo.com"
+alias fh="ssh foohack.com"
+alias st="ssh sistertrain.com"
+
+
+sshagents () {
+ pg -i ssh
+ set | grep SSH | grep -v grep
+ find /tmp/ -type s | grep -i ssh
+}
+agent () {
+ eval `ssh-agent`
+ ssh-add
+}
+
+fhcp () {
+ p=`pwd`
+ for i in $@; do
+ if [ -d "$p/$i" ] || [ -f "$p/$i" ]; then
+ dir=`dirname $p/$i`
+ siteroot=~/Sites/
+ rdir=${dir##$siteroot}
+ echo "Sending $i"
+ rsync -vazuR --stats --no-implied-dirs --delete --exclude=".*\.svn.*" $i foohack.com:~/apache/$rdir
+ fi
+ done
+}
+
+fhfetch () {
+ p=`pwd`
+ for i in $@; do
+ dir=`dirname $p/$i`
+ siteroot=~/Sites
+ # siteroot=$siteroot
+ # dir=$dir
+ rdir=${dir##$siteroot}
+ # echo rdir=$rdir
+ file=`basename $i`
+ # file=$file
+ rsync -vazu --no-implied-dirs --stats --exclude=".*\.svn.*" foohack.com:~/apache$rdir/$file $dir/
+ #scp -r foohack.com:~/apache$rdir/$file $dir
+ done
+}
+
+
+repeat () {
+ if [ "$2" == "" ]; then
+ delay=1
+ else
+ delay=$2
+ fi
+ while sleep $delay; do
+ clear
+ date +%s
+ $1
+ done
+}
+
+watch () {
+ if [ "$2" == "" ]; then
+ delay=1
+ else
+ delay="$2"
+ fi
+ i="";
+ j="";
+ while sleep $delay; do
+ i=`$1`;
+ if [ "$i" != "$j" ]; then
+ date +%s
+ echo $i
+ fi
+ done
+}
+
+# floating-point calculations
+calc () {
+ expression="$@"
+ if [ ${#expression} -lt 7 ] || [ "${expression:0:6}" != "scale=" ]; then
+ expression="scale=16;$expression"
+ fi
+ echo "$expression" | bc
+}
+
+# more persistent wget for fetching files to a specific filename.
+fetch_to () {
+ [ $# -ne 2 ] && echo "usage: fetch_to <url> <filename>" && return 1
+ urltofetch=$1
+ fname="$2"
+ wget -O "$fname" $urltofetch
+}
+
+# command-line perl prog
+alias pie="perl -p -i -e "
+
+# c++ compile
+cm () {
+ f="$1"
+ o="$f"
+ o=${o%.c}
+ o=${o%.cpp}
+ o=${o%.cc}
+ g++ -o $o $f
+}
+
+# weekly status texts for team updates.
+weekly () {
+ $EDITOR ~/weeklystatus.txt
+ # change the first line to reflect last updated status.
+ fl=$( echo \# $( finger `whoami` | egrep -o 'Name: .*' | egrep -o '[^:\ ]+' | grep -v 'Name' ) `date +%Y-%m-%d` )
+ rest="$( l=`cat ~/weeklystatus.txt | wc -l`; let 'l -= 1'; tail -n $l ~/weeklystatus.txt )"
+ cat <<STATUS >~/weeklystatus.txt
+$fl
+$rest
+STATUS
+ rsync -z --timeout=5 ~/weeklystatus.txt visitbread:~
+ cat ~/weeklystatus.txt
+}
+
+# tarsnap wrappers.
+# http://tarsnap.com
+ts () {
+ e=echo
+ inpath growlnotify && e="growlnotify -t tarsnap -m "
+ if [ $# -lt 1 ] || ! [ -e "$1" ]; then
+ $e "Need to supply a file/directory to back up" > /dev/stderr
+ return 1
+ fi
+ if [ $# -gt 1 ]; then
+ errors=0
+ for i in $@; do
+ ts $i || let 'errors += 1'
+ done
+ return $errors
+ fi
+ thetitle=`title`
+ thefile="$1"
+ $e "backing up $thefile"
+ title "backing up $thefile"
+ backupfile="`hostname`:${thefile/\//}:`date +%Y-%m-%d-%H-%M-%S`"
+ backupfile=${backupfile//\//-}
+ tarsnap -cvf "$backupfile" $thefile 2> ~/.tslog
+ $e "done backing up $thefile"
+ title "$thetitle"
+}
+tsbg () {
+ ( ts $@ ) &
+}
+tsh () {
+ # headless <command> [<key>]
+ headless "ts $@" ts-headless-backup
+}
+tskill () {
+ kill -s SIGQUIT `pid tarsnap`
+}
+tsabort () {
+ kill `pid tarsnap`
+}
+tslisten () {
+ tail -f ~/.tslog
+}
+
+
+#load any per-platform .extra.bashrc files.
+arch=`uname -s`;
+[ -f ~/.extra_$arch.bashrc ] && . ~/.extra_$arch.bashrc
+machinearch=`uname -m`
+[ -f ~/.extra_${arch}_${machinearch}.bashrc ] && . ~/.extra_${arch}_${machinearch}.bashrc
+[ $has_yinst == 1 ] && [ -f ~/.extra_yinst.bashrc ] && . ~/.extra_yinst.bashrc
+inpath "git" && [ -f ~/.git-completion ] && . ~/.git-completion
+
+export BASH_EXTRAS_LOADED=1
111 .extra_Darwin.bashrc
@@ -0,0 +1,111 @@
+# commands that only get loaded on the Darwin platform.
+# Mostly, these commands interact with specific Mac programs.
+
+alias compressmail='sqlite3 ~/Library/Mail/Envelope\ Index vacuum index'
+
+viewcvs () {
+ wd=`pwd`
+ for x in $@; do
+ x="$wd/$x"
+ # argument should be a file or folder.
+ if [ -f "$x" ]; then
+ folder=`dirname "$x"`
+ thefile=`basename "$x"`
+ elif [ -d "$x" ]; then
+ folder="$x"
+ thefile=""
+ else
+ #echo "invalid argument : $x"
+ return
+ fi
+
+ cvsfolder="$folder/CVS"
+ #echo "cvsfolder = $cvsfolder"
+ if ! [ -d "$cvsfolder" ]; then
+ #echo "not in a cvs folder"
+ return
+ fi
+ repo=`cat "$folder/CVS/Repository"`
+
+ open http://vault.yahoo.com/viewcvs/$repo/$thefile
+ done
+}
+
+cvsdiff () {
+ SCRIPTNAME="${0##*/}"
+ OLDFILE=/tmp/"${1##*/}"
+ NEWFILE="$1"
+
+ if [ $# -eq 1 ]
+ then
+ cvs update -p "$NEWFILE" > "$OLDFILE"
+ elif [ $# -eq 2 ]
+ then
+ cvs update -p -r "$2" "$NEWFILE" > "$OLDFILE"
+ else
+ echo "usage: $SCRIPTNAME <file> [rev]"
+ return 1
+ fi
+
+ #echo "newfile $NEWFILE"
+ #echo "oldfile $OLDFILE"
+ #echo "pwd `pwd`"
+
+ opendiff "$OLDFILE" "$NEWFILE" -merge "`pwd`/$NEWFILE"
+}
+
+
+unison_bin="`which unison`"
+unison_prof="yap"
+unison () {
+ $unison_bin -logfile /dev/null -ui text -times -ignore 'Regex .*docs/2008[0-9]{4}/.*' -ignore 'Regex .*/\.svn/.*' -ignore 'Regex .*/(FreeBSD|rhel)\.[0-9]+\.[0-9]+\.package.*' -ignore 'Regex .*/\.DS_Store' $@ $unison_prof
+}
+# unison () {
+# $unison_bin -ui text -logfile /dev/stdout -ignore 'Regex .*docs/2008[0-9]{4}/.*' -ignore 'Regex .*/(FreeBSD|rhel)\.[0-9]+\.[0-9]+\.package.*' -ignore 'Regex .*/\.DS_Store' -times $@ $unison_prof
+# }
+unisondev () {
+ unison -terse -repeat 1 -batch
+}
+unisonpush () {
+ unison -force /Users/isaacs/dev/yap/ -batch -terse
+}
+unisonstart () {
+ echo "pushing..."
+ growlnotify -a Unison -t Unison -m pushing...
+ unisonpush
+ echo "starting..."
+ growlnotify -a Unison -t Unison -m starting...
+ unisondev
+ echo "stopped."
+ growlnotify -a Unison -t Unison -m stopped.
+}
+unisonquiet () {
+ echo "" > ~/unisonlog.txt
+ headless '( unisonstart &>~/unisonlog.txt ) &'
+}
+unisonlisten () {
+ title unison
+ pid=`pid unison`
+ if [ "$pid" == "" ]; then
+ unisonquiet
+ else
+ echo "[$pid] (already running)"
+ fi
+ tail -f ~/unisonlog.txt
+}
+unisonkill () {
+ killall unison
+ for id in `pid unison`; do
+ kill $1 $id
+ done
+}
+
+[ `basename "$EDITOR"` == "mate_wait" ] && export LESSEDIT='mate_wait -l %lm %f'
+
+export UNISONLOCALHOSTNAME=sistertrain-lm.corp.yahoo.com
+
+alias sethost="sudo hostname sistertrain-lm; sudo scutil --set LocalHostName sistertrain-lm; sudo scutil --set HostName sistertrain-lm"
+
+ahyaneupdate () {
+ fh '. ~/.extra.bashrc; cd dev/ahyane; agent; git fetch; git rebase origin/master; bin/build.php'
+}
4 .extra_Linux.bashrc
@@ -0,0 +1,4 @@
+# Used on Linux platforms.
+backup_apache () {
+ tarsnap -cvf apache-`date +'%Y-%m-%d'` ~/apache
+}
48 .extra_yinst.bashrc
@@ -0,0 +1,48 @@
+# Used on platforms that support yinst commands.
+export ROOT=/home/y
+alias yg="yinst list | grep "
+
+portshift () {
+ [ $# -gt 1 ] && from="$1" && to="$2"
+ [ $# -eq 1 ] && from="80" && to="$1"
+ [ $# -eq 0 ] && from="80" && to="10080"
+ s=""
+ for i in $(
+ yinst set | egrep ': '$from'$' | awk -F: '{ print $1 }'
+ ); do s="$s $i=$to"; echo $i=$to; done
+ yinst set $s
+}
+
+
+relink () {
+ br="$1"
+ [ "$br" != "" ] && br="-br $br"
+ if ! [ -f "`which yinst_create`" ]; then
+ yinst i yinst_create
+ fi
+ rm *.tgz
+ yinst_create -t link && yinst i *.tgz $br
+}
+
+rebuild () {
+ if ! [ -f "`which yinst_create`" ]; then
+ yinst i yinst_create
+ fi
+ rm *.tgz
+ yinst_create
+ yinst i *.tgz
+}
+
+dist_nightly () {
+ if ! [ -f "`which yinst_create`" ]; then
+ yinst i yinst_create
+ fi
+ if ! [ -f "`which dist_install`" ]; then
+ yinst i dist_tools
+ fi
+ rm *.tgz
+ yinst_create -t nightly
+ dist_install -br nightly *.tgz -batch
+}
+
+alias clearydht="/home/y/bin/ydhtUtil -h nightly-vm0.mlk.corp.re1.yahoo.com:4080 -t YapDropzoneData -r 3S6DVY5YYV3QJZ6UWC6MURRYIQ -d"
1,700 .git-completion
@@ -0,0 +1,1700 @@
+#
+# bash 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'
+# *) tree paths within 'ref:path/to/file' expressions
+# *) common --long-options
+#
+# To use these routines:
+#
+# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
+# 2) Added the following line to your .bashrc:
+# source ~/.git-completion.sh
+#
+# 3) You may want to make sure the git executable is available
+# in your PATH before this script is sourced, as some caching
+# is performed while the script loads. If git isn't found
+# at source time then all lookups will be done on demand,
+# which may be slightly slower.
+#
+# 4) Consider changing your PS1 to also show the current branch:
+# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
+#
+# The argument to __git_ps1 will be displayed only if you
+# are currently in a git repository. The %s token will be
+# the name of the current branch.
+#
+# To submit patches:
+#
+# *) Read Documentation/SubmittingPatches
+# *) Send all patches to the current maintainer:
+#
+# "Shawn O. Pearce" <spearce@spearce.org>
+#
+# *) Always CC the Git mailing list:
+#
+# git@vger.kernel.org
+#
+
+case "$COMP_WORDBREAKS" in
+*:*) : great ;;
+*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
+esac
+
+__gitdir ()
+{
+ if [ -z "$1" ]; then
+ if [ -n "$__git_dir" ]; then
+ 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
+}
+
+__git_ps1 ()
+{
+ local g="$(git rev-parse --git-dir 2>/dev/null)"
+ if [ -n "$g" ]; then
+ local r
+ local b
+ if [ -d "$g/rebase-apply" ]
+ then
+ if test -f "$g/rebase-apply/rebasing"
+ then
+ r="|REBASE"
+ elif test -f "$g/rebase-apply/applying"
+ then
+ r="|AM"
+ else
+ r="|AM/REBASE"
+ fi
+ b="$(git symbolic-ref HEAD 2>/dev/null)"
+ elif [ -f "$g/rebase-merge/interactive" ]
+ then
+ r="|REBASE-i"
+ b="$(cat "$g/rebase-merge/head-name")"
+ elif [ -d "$g/rebase-merge" ]
+ then
+ r="|REBASE-m"
+ b="$(cat "$g/rebase-merge/head-name")"
+ elif [ -f "$g/MERGE_HEAD" ]
+ then
+ r="|MERGING"
+ b="$(git symbolic-ref HEAD 2>/dev/null)"
+ else
+ if [ -f "$g/BISECT_LOG" ]
+ then
+ r="|BISECTING"
+ fi
+ if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
+ then
+ if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
+ then
+ b="$(cut -c1-7 "$g/HEAD")..."
+ fi
+ fi
+ fi
+
+ if [ -n "$1" ]; then
+ printf "$1" "${b##refs/heads/}$r"
+ else
+ printf " (%s)" "${b##refs/heads/}$r"
+ fi
+ fi
+}
+
+__gitcomp_1 ()
+{
+ local c IFS=' '$'\t'$'\n'
+ for c in $1; do
+ case "$c$2" in
+ --*=*) printf %s$'\n' "$c$2" ;;
+ *.) printf %s$'\n' "$c$2" ;;
+ *) printf %s$'\n' "$c$2 " ;;
+ esac
+ done
+}
+
+__gitcomp ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ if [ $# -gt 2 ]; then
+ cur="$3"
+ fi
+ case "$cur" in
+ --*=)
+ COMPREPLY=()
+ ;;
+ *)
+ local IFS=$'\n'
+ COMPREPLY=($(compgen -P "$2" \
+ -W "$(__gitcomp_1 "$1" "$4")" \
+ -- "$cur"))
+ ;;
+ esac
+}
+
+__git_heads ()
+{
+ local cmd i is_hash=y dir="$(__gitdir "$1")"
+ if [ -d "$dir" ]; then
+ git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
+ refs/heads
+ return
+ fi
+ for i in $(git ls-remote "$1" 2>/dev/null); do
+ case "$is_hash,$i" in
+ y,*) is_hash=n ;;
+ n,*^{}) is_hash=y ;;
+ n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
+ n,*) is_hash=y; echo "$i" ;;
+ esac
+ done
+}
+
+__git_tags ()
+{
+ local cmd i is_hash=y dir="$(__gitdir "$1")"
+ if [ -d "$dir" ]; then
+ git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
+ refs/tags
+ return
+ fi
+ for i in $(git ls-remote "$1" 2>/dev/null); do
+ case "$is_hash,$i" in
+ y,*) is_hash=n ;;
+ n,*^{}) is_hash=y ;;
+ n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
+ n,*) is_hash=y; echo "$i" ;;
+ esac
+ done
+}
+
+__git_refs ()
+{
+ local i is_hash=y dir="$(__gitdir "$1")"
+ local cur="${COMP_WORDS[COMP_CWORD]}" format refs
+ if [ -d "$dir" ]; then
+ case "$cur" in
+ refs|refs/*)
+ format="refname"
+ refs="${cur%/*}"
+ ;;
+ *)
+ if [ -e "$dir/HEAD" ]; then echo HEAD; fi
+ format="refname:short"
+ refs="refs/tags refs/heads refs/remotes"
+ ;;
+ esac
+ git --git-dir="$dir" for-each-ref --format="%($format)" \
+ $refs
+ return
+ fi
+ for i in $(git ls-remote "$dir" 2>/dev/null); do
+ case "$is_hash,$i" in
+ y,*) is_hash=n ;;
+ n,*^{}) is_hash=y ;;
+ n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
+ n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
+ n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
+ n,*) is_hash=y; echo "$i" ;;
+ esac
+ done
+}
+
+__git_refs2 ()
+{
+ local i
+ for i in $(__git_refs "$1"); do
+ echo "$i:$i"
+ done
+}
+
+__git_refs_remotes ()
+{
+ local cmd i is_hash=y
+ for i in $(git ls-remote "$1" 2>/dev/null); do
+ case "$is_hash,$i" in
+ n,refs/heads/*)
+ is_hash=y
+ echo "$i:refs/remotes/$1/${i#refs/heads/}"
+ ;;
+ y,*) is_hash=n ;;
+ n,*^{}) is_hash=y ;;
+ n,refs/tags/*) is_hash=y;;
+ n,*) is_hash=y; ;;
+ esac
+ done
+}
+
+__git_remotes ()
+{
+ local i ngoff IFS=$'\n' d="$(__gitdir)"
+ shopt -q nullglob || ngoff=1
+ shopt -s nullglob
+ for i in "$d/remotes"/*; do
+ echo ${i#$d/remotes/}
+ done
+ [ "$ngoff" ] && shopt -u nullglob
+ for i in $(git --git-dir="$d" config --list); do
+ case "$i" in
+ remote.*.url=*)
+ i="${i#remote.}"
+ echo "${i/.url=*/}"
+ ;;
+ esac
+ done
+}
+
+__git_merge_strategies ()
+{
+ if [ -n "$__git_merge_strategylist" ]; then
+ echo "$__git_merge_strategylist"
+ return
+ fi
+ git merge -s help 2>&1 |
+ sed -n -e '/[Aa]vailable strategies are: /,/^$/{
+ s/\.$//
+ s/.*://
+ s/^[ ]*//
+ s/[ ]*$//
+ p
+ }'
+}
+__git_merge_strategylist=
+__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
+
+__git_complete_file ()
+{
+ local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ ?*:*)
+ 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
+
+ local IFS=$'\n'
+ COMPREPLY=($(compgen -P "$pfx" \
+ -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
+ | sed '/^100... blob /{
+ s,^.* ,,
+ s,$, ,
+ }
+ /^120000 blob /{
+ s,^.* ,,
+ s,$, ,
+ }
+ /^040000 tree /{
+ s,^.* ,,
+ s,$,/,
+ }
+ s/^.* //')" \
+ -- "$cur"))
+ ;;
+ *)
+ __gitcomp "$(__git_refs)"
+ ;;
+ esac
+}
+
+__git_complete_revlist ()
+{
+ local pfx cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ *...*)
+ pfx="${cur%...*}..."
+ cur="${cur#*...}"
+ __gitcomp "$(__git_refs)" "$pfx" "$cur"
+ ;;
+ *..*)
+ pfx="${cur%..*}.."
+ cur="${cur#*..}"
+ __gitcomp "$(__git_refs)" "$pfx" "$cur"
+ ;;
+ *)
+ __gitcomp "$(__git_refs)"
+ ;;
+ esac
+}
+
+__git_all_commands ()
+{
+ if [ -n "$__git_all_commandlist" ]; then
+ echo "$__git_all_commandlist"
+ return
+ fi
+ local i IFS=" "$'\n'
+ for i in $(git help -a|egrep '^ ')
+ do
+ case $i in
+ *--*) : helper pattern;;
+ *) echo $i;;
+ esac
+ done
+}
+__git_all_commandlist=
+__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
+
+__git_porcelain_commands ()
+{
+ if [ -n "$__git_porcelain_commandlist" ]; then
+ echo "$__git_porcelain_commandlist"
+ return
+ fi
+ local i IFS=" "$'\n'
+ for i in "help" $(__git_all_commands)
+ do
+ case $i in
+ *--*) : helper pattern;;
+ applymbox) : ask gittus;;
+ applypatch) : ask gittus;;
+ archimport) : import;;
+ cat-file) : plumbing;;
+ check-attr) : plumbing;;
+ check-ref-format) : plumbing;;
+ checkout-index) : plumbing;;
+ commit-tree) : plumbing;;
+ count-objects) : infrequent;;
+ 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;;
+ lost-found) : infrequent;;
+ 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;;
+ peek-remote) : plumbing;;
+ prune) : plumbing;;
+ prune-packed) : plumbing;;
+ quiltimport) : import;;
+ read-tree) : plumbing;;
+ receive-pack) : plumbing;;
+ reflog) : plumbing;;
+ repo-config) : deprecated;;
+ 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;;
+ tar-tree) : deprecated;;
+ 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_commandlist=
+__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
+
+__git_aliases ()
+{
+ local i IFS=$'\n'
+ for i in $(git --git-dir="$(__gitdir)" config --list); do
+ case "$i" in
+ alias.*)
+ i="${i#alias.}"
+ echo "${i/=*/}"
+ ;;
+ esac
+ done
+}
+
+__git_aliased_command ()
+{
+ local word cmdline=$(git --git-dir="$(__gitdir)" \
+ config --get "alias.$1")
+ for word in $cmdline; do
+ if [ "${word##-*}" ]; then
+ echo $word
+ return
+ fi
+ done
+}
+
+__git_find_subcommand ()
+{
+ local word subcommand c=1
+
+ while [ $c -lt $COMP_CWORD ]; do
+ word="${COMP_WORDS[c]}"
+ for subcommand in $1; do
+ if [ "$subcommand" = "$word" ]; then
+ echo "$subcommand"
+ return
+ fi
+ done
+ c=$((++c))
+ done
+}
+
+__git_has_doubledash ()
+{
+ local c=1
+ while [ $c -lt $COMP_CWORD ]; do
+ if [ "--" = "${COMP_WORDS[c]}" ]; then
+ return 0
+ fi
+ c=$((++c))
+ done
+ return 1
+}
+
+__git_whitespacelist="nowarn warn error error-all fix"
+
+_git_am ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
+ if [ -d "$dir"/rebase-apply ]; then
+ __gitcomp "--skip --resolved --abort"
+ return
+ fi
+ case "$cur" in
+ --whitespace=*)
+ __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
+ return
+ ;;
+ --*)
+ __gitcomp "
+ --signoff --utf8 --binary --3way --interactive
+ --whitespace=
+ "
+ return
+ esac
+ COMPREPLY=()
+}
+
+_git_apply ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ 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=
+ --whitespace= --inaccurate-eof --verbose
+ "
+ return
+ esac
+ COMPREPLY=()
+}
+
+_git_add ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --interactive --refresh --patch --update --dry-run
+ --ignore-errors
+ "
+ return
+ esac
+ COMPREPLY=()
+}
+
+_git_archive ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --format=*)
+ __gitcomp "$(git archive --list)" "" "${cur##--format=}"
+ return
+ ;;
+ --remote=*)
+ __gitcomp "$(__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_subcommand "$subcommands")"
+ if [ -z "$subcommand" ]; then
+ __gitcomp "$subcommands"
+ return
+ fi
+
+ case "$subcommand" in
+ bad|good|reset|skip)
+ __gitcomp "$(__git_refs)"
+ ;;
+ *)
+ COMPREPLY=()
+ ;;
+ esac
+}
+
+_git_branch ()
+{
+ local i c=1 only_local_ref="n" has_r="n"
+
+ while [ $c -lt $COMP_CWORD ]; do
+ i="${COMP_WORDS[c]}"
+ case "$i" in
+ -d|-m) only_local_ref="y" ;;
+ -r) has_r="y" ;;
+ esac
+ c=$((++c))
+ done
+
+ case "${COMP_WORDS[COMP_CWORD]}" in
+ --*=*) COMPREPLY=() ;;
+ --*)
+ __gitcomp "
+ --color --no-color --verbose --abbrev= --no-abbrev
+ --track --no-track --contains --merged --no-merged
+ "
+ ;;
+ *)
+ if [ $only_local_ref = "y" -a $has_r = "n" ]; then
+ __gitcomp "$(__git_heads)"
+ else
+ __gitcomp "$(__git_refs)"
+ fi
+ ;;
+ esac
+}
+
+_git_bundle ()
+{
+ local cmd="${COMP_WORDS[2]}"
+ case "$COMP_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
+
+ __gitcomp "$(__git_refs)"
+}
+
+_git_cherry ()
+{
+ __gitcomp "$(__git_refs)"
+}
+
+_git_cherry_pick ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--edit --no-commit"
+ ;;
+ *)
+ __gitcomp "$(__git_refs)"
+ ;;
+ esac
+}
+
+_git_clean ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--dry-run --quiet"
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_clone ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --local
+ --no-hardlinks
+ --shared
+ --reference
+ --quiet
+ --no-checkout
+ --bare
+ --mirror
+ --origin
+ --upload-pack
+ --template=
+ --depth
+ "
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_commit ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --all --author= --signoff --verify --no-verify
+ --edit --amend --include --only --interactive
+ "
+ return
+ esac
+ COMPREPLY=()
+}
+
+_git_describe ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --all --tags --contains --abbrev= --candidates=
+ --exact-match --debug --long --match --always
+ "
+ return
+ esac
+ __gitcomp "$(__git_refs)"
+}
+
+_git_diff ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--cached --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 --pickaxe-all --pickaxe-regex
+ --text --ignore-space-at-eol --ignore-space-change
+ --ignore-all-space --exit-code --quiet --ext-diff
+ --no-ext-diff
+ --no-prefix --src-prefix= --dst-prefix=
+ --base --ours --theirs
+ "
+ return
+ ;;
+ esac
+ __git_complete_file
+}
+
+_git_fetch ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+
+ if [ "$COMP_CWORD" = 2 ]; then
+ __gitcomp "$(__git_remotes)"
+ else
+ case "$cur" in
+ *:*)
+ local pfx=""
+ case "$COMP_WORDBREAKS" in
+ *:*) : great ;;
+ *) pfx="${cur%%:*}:" ;;
+ esac
+ __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
+ ;;
+ *)
+ __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
+ ;;
+ esac
+ fi
+}
+
+_git_format_patch ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --stdout --attach --thread
+ --output-directory
+ --numbered --start-number
+ --numbered-files
+ --keep-subject
+ --signoff
+ --in-reply-to=
+ --full-index --binary
+ --not --all
+ --cover-letter
+ --no-prefix --src-prefix= --dst-prefix=
+ "
+ return
+ ;;
+ esac
+ __git_complete_revlist
+}
+
+_git_gc ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--prune --aggressive"
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_grep ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --cached
+ --text --ignore-case --word-regexp --invert-match
+ --full-name
+ --extended-regexp --basic-regexp --fixed-strings
+ --files-with-matches --name-only
+ --files-without-match
+ --count
+ --and --or --not --all-match
+ "
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_help ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--all --info --man --web"
+ return
+ ;;
+ esac
+ __gitcomp "$(__git_all_commands)
+ attributes cli core-tutorial cvs-migration
+ diffcore gitk glossary hooks ignore modules
+ repository-layout tutorial tutorial-2
+ workflows
+ "
+}
+
+_git_init ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --shared=*)
+ __gitcomp "
+ false true umask group all world everybody
+ " "" "${cur##--shared=}"
+ return
+ ;;
+ --*)
+ __gitcomp "--quiet --bare --template= --shared --shared="
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_ls_files ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ 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
+ COMPREPLY=()
+}
+
+_git_ls_remote ()
+{
+ __gitcomp "$(__git_remotes)"
+}
+
+_git_ls_tree ()
+{
+ __git_complete_file
+}
+
+_git_log ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --pretty=*)
+ __gitcomp "
+ oneline short medium full fuller email raw
+ " "" "${cur##--pretty=}"
+ return
+ ;;
+ --date=*)
+ __gitcomp "
+ relative iso8601 rfc2822 short local default
+ " "" "${cur##--date=}"
+ return
+ ;;
+ --*)
+ __gitcomp "
+ --max-count= --max-age= --since= --after=
+ --min-age= --before= --until=
+ --root --topo-order --date-order --reverse
+ --no-merges --follow
+ --abbrev-commit --abbrev=
+ --relative-date --date=
+ --author= --committer= --grep=
+ --all-match
+ --pretty= --name-status --name-only --raw
+ --not --all
+ --left-right --cherry-pick
+ --graph
+ --stat --numstat --shortstat
+ --decorate --diff-filter=
+ --color-words --walk-reflogs
+ --parents --children --full-history
+ --merge
+ "
+ return
+ ;;
+ esac
+ __git_complete_revlist
+}
+
+_git_merge ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "${COMP_WORDS[COMP_CWORD-1]}" in
+ -s|--strategy)
+ __gitcomp "$(__git_merge_strategies)"
+ return
+ esac
+ case "$cur" in
+ --strategy=*)
+ __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
+ return
+ ;;
+ --*)
+ __gitcomp "
+ --no-commit --no-stat --log --no-log --squash --strategy
+ "
+ return
+ esac
+ __gitcomp "$(__git_refs)"
+}
+
+_git_mergetool ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --tool=*)
+ __gitcomp "
+ kdiff3 tkdiff meld xxdiff emerge
+ vimdiff gvimdiff ecmerge opendiff
+ " "" "${cur##--tool=}"
+ return
+ ;;
+ --*)
+ __gitcomp "--tool="
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_merge_base ()
+{
+ __gitcomp "$(__git_refs)"
+}
+
+_git_mv ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--dry-run"
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_name_rev ()
+{
+ __gitcomp "--tags --all --stdin"
+}
+
+_git_pull ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+
+ if [ "$COMP_CWORD" = 2 ]; then
+ __gitcomp "$(__git_remotes)"
+ else
+ __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
+ fi
+}
+
+_git_push ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+
+ if [ "$COMP_CWORD" = 2 ]; then
+ __gitcomp "$(__git_remotes)"
+ else
+ case "$cur" in
+ *:*)
+ local pfx=""
+ case "$COMP_WORDBREAKS" in
+ *:*) : great ;;
+ *) pfx="${cur%%:*}:" ;;
+ esac
+
+ __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
+ ;;
+ +*)
+ __gitcomp "$(__git_refs)" + "${cur#+}"
+ ;;
+ *)
+ __gitcomp "$(__git_refs)"
+ ;;
+ esac
+ fi
+}
+
+_git_rebase ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
+ if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
+ __gitcomp "--continue --skip --abort"
+ return
+ fi
+ case "${COMP_WORDS[COMP_CWORD-1]}" in
+ -s|--strategy)
+ __gitcomp "$(__git_merge_strategies)"
+ return
+ esac
+ case "$cur" in
+ --strategy=*)
+ __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
+ return
+ ;;
+ --*)
+ __gitcomp "--onto --merge --strategy --interactive"
+ return
+ esac
+ __gitcomp "$(__git_refs)"
+}
+
+_git_send_email ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
+ --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-ssl --smtp-user --subject
+ --suppress-cc --suppress-from --thread --to
+ --validate --no-validate"
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_config ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ local prv="${COMP_WORDS[COMP_CWORD-1]}"
+ case "$prv" in
+ branch.*.remote)
+ __gitcomp "$(__git_remotes)"
+ return
+ ;;
+ branch.*.merge)
+ __gitcomp "$(__git_refs)"
+ return
+ ;;
+ remote.*.fetch)
+ local remote="${prv#remote.}"
+ remote="${remote%.fetch}"
+ __gitcomp "$(__git_refs_remotes "$remote")"
+ return
+ ;;
+ remote.*.push)
+ local remote="${prv#remote.}"
+ remote="${remote%.push}"
+ __gitcomp "$(git --git-dir="$(__gitdir)" \
+ for-each-ref --format='%(refname):%(refname)' \
+ refs/heads)"
+ return
+ ;;
+ pull.twohead|pull.octopus)
+ __gitcomp "$(__git_merge_strategies)"
+ return
+ ;;
+ color.branch|color.diff|color.status)
+ __gitcomp "always never auto"
+ return
+ ;;
+ color.*.*)
+ __gitcomp "
+ black red green yellow blue magenta cyan white
+ bold dim ul blink reverse
+ "
+ return
+ ;;
+ *.*)
+ COMPREPLY=()
+ return
+ ;;
+ esac
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --global --system --file=
+ --list --replace-all
+ --get --get-all --get-regexp
+ --add --unset --unset-all
+ --remove-section --rename-section
+ "
+ return
+ ;;
+ branch.*.*)
+ local pfx="${cur%.*}."
+ cur="${cur##*.}"
+ __gitcomp "remote merge" "$pfx" "$cur"
+ return
+ ;;
+ branch.*)
+ local pfx="${cur%.*}."
+ cur="${cur#*.}"
+ __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
+ return
+ ;;
+ remote.*.*)
+ local pfx="${cur%.*}."
+ cur="${cur##*.}"
+ __gitcomp "
+ url fetch push skipDefaultUpdate
+ receivepack uploadpack tagopt
+ " "$pfx" "$cur"
+ return
+ ;;
+ remote.*)
+ local pfx="${cur%.*}."
+ cur="${cur#*.}"
+ __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
+ return
+ ;;
+ esac
+ __gitcomp "
+ apply.whitespace
+ core.fileMode
+ core.gitProxy
+ core.ignoreStat
+ core.preferSymlinkRefs
+ core.logAllRefUpdates
+ core.loosecompression
+ core.repositoryFormatVersion
+ core.sharedRepository
+ core.warnAmbiguousRefs
+ core.compression
+ core.packedGitWindowSize
+ core.packedGitLimit
+ clean.requireForce
+ color.branch
+ color.branch.current
+ color.branch.local
+ color.branch.remote
+ color.branch.plain
+ color.diff
+ color.diff.plain
+ color.diff.meta
+ color.diff.frag
+ color.diff.old
+ color.diff.new
+ color.diff.commit
+ color.diff.whitespace
+ color.pager
+ color.status
+ color.status.header
+ color.status.added
+ color.status.changed
+ color.status.untracked
+ diff.renameLimit
+ diff.renames
+ fetch.unpackLimit
+ format.headers
+ format.subjectprefix
+ gitcvs.enabled
+ gitcvs.logfile
+ gitcvs.allbinary
+ gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
+ gitcvs.dbtablenameprefix
+ gc.packrefs
+ gc.reflogexpire
+ gc.reflogexpireunreachable
+ gc.rerereresolved
+ gc.rerereunresolved
+ http.sslVerify
+ http.sslCert
+ http.sslKey
+ http.sslCAInfo
+ http.sslCAPath
+ http.maxRequests
+ http.lowSpeedLimit
+ http.lowSpeedTime
+ http.noEPSV
+ i18n.commitEncoding
+ i18n.logOutputEncoding
+ log.showroot
+ merge.tool
+ merge.summary
+ merge.verbosity
+ pack.window
+ pack.depth
+ pack.windowMemory
+ pack.compression
+ pack.deltaCacheSize
+ pack.deltaCacheLimit
+ pull.octopus
+ pull.twohead
+ repack.useDeltaBaseOffset
+ showbranch.default
+ tar.umask
+ transfer.unpackLimit
+ receive.unpackLimit
+ receive.denyNonFastForwards
+ user.name
+ user.email
+ user.signingkey
+ branch. remote.
+ "
+}
+
+_git_remote ()
+{
+ local subcommands="add rm show prune update"
+ local subcommand="$(__git_find_subcommand "$subcommands")"
+ if [ -z "$subcommand" ]; then
+ __gitcomp "$subcommands"
+ return
+ fi
+
+ case "$subcommand" in
+ rm|show|prune)
+ __gitcomp "$(__git_remotes)"
+ ;;
+ update)
+ local i c='' IFS=$'\n'
+ for i in $(git --git-dir="$(__gitdir)" config --list); do
+ case "$i" in
+ remotes.*)
+ i="${i#remotes.}"
+ c="$c ${i/=*/}"
+ ;;
+ esac
+ done
+ __gitcomp "$c"
+ ;;
+ *)
+ COMPREPLY=()
+ ;;
+ esac
+}
+
+_git_reset ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--mixed --hard --soft"
+ return
+ ;;
+ esac
+ __gitcomp "$(__git_refs)"
+}
+
+_git_revert ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
+ return
+ ;;
+ esac
+ __gitcomp "$(__git_refs)"
+}
+
+_git_rm ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_shortlog ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --max-count= --max-age= --since= --after=
+ --min-age= --before= --until=
+ --no-merges
+ --author= --committer= --grep=
+ --all-match
+ --not --all
+ --numbered --summary
+ "
+ return
+ ;;
+ esac
+ __git_complete_revlist
+}
+
+_git_show ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --pretty=*)
+ __gitcomp "
+ oneline short medium full fuller email raw
+ " "" "${cur##--pretty=}"
+ return
+ ;;
+ --*)
+ __gitcomp "--pretty="
+ return
+ ;;
+ esac
+ __git_complete_file
+}
+
+_git_show_branch ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --all --remotes --topo-order --current --more=
+ --list --independent --merge-base --no-name
+ --sha1-name --topics --reflog
+ "
+ return
+ ;;
+ esac
+ __git_complete_revlist
+}
+
+_git_stash ()
+{
+ local subcommands='save list show apply clear drop pop create branch'
+ local subcommand="$(__git_find_subcommand "$subcommands")"
+ if [ -z "$subcommand" ]; then
+ __gitcomp "$subcommands"
+ else
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$subcommand,$cur" in
+ save,--*)
+ __gitcomp "--keep-index"
+ ;;
+ apply,--*)
+ __gitcomp "--index"
+ ;;
+ show,--*|drop,--*|pop,--*|branch,--*)
+ COMPREPLY=()
+ ;;
+ show,*|apply,*|drop,*|pop,*|branch,*)
+ __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
+ | sed -n -e 's/:.*//p')"
+ ;;
+ *)
+ COMPREPLY=()
+ ;;
+ esac
+ fi
+}
+
+_git_submodule ()
+{
+ __git_has_doubledash && return
+
+ local subcommands="add status init update summary foreach sync"
+ if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ 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
+ "
+ local subcommand="$(__git_find_subcommand "$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 --user-log-author $remote_opts
+ "
+ local init_opts="
+ --template= --shared= --trunk= --tags=
+ --branches= --stdlayout --minimize-url
+ --no-metadata --use-svm-props --use-svnsync-props
+ --rewrite-root= $remote_opts
+ "
+ local cmt_opts="
+ --edit --rmdir --find-copies-harder --copy-similarity=
+ "
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ 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 $cmt_opts $fc_opts
+ "
+ ;;
+ set-tree,--*)
+ __gitcomp "--stdin $cmt_opts $fc_opts"
+ ;;
+ create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
+ show-externals,--*)
+ __gitcomp "--revision="
+ ;;
+ log,--*)
+ __gitcomp "
+ --limit= --revision= --verbose --incremental
+ --oneline --show-commit --non-recursive
+ --authors-file=
+ "
+ ;;
+ rebase,--*)
+ __gitcomp "
+ --merge --verbose --strategy= --local
+ --fetch-all $fc_opts
+ "
+ ;;
+ commit-diff,--*)
+ __gitcomp "--message= --file= --revision= $cmt_opts"
+ ;;
+ info,--*)
+ __gitcomp "--url"
+ ;;
+ *)
+ COMPREPLY=()
+ ;;
+ esac
+ fi
+}
+
+_git_tag ()
+{
+ local i c=1 f=0
+ while [ $c -lt $COMP_CWORD ]; do
+ i="${COMP_WORDS[c]}"
+ case "$i" in
+ -d|-v)
+ __gitcomp "$(__git_tags)"
+ return
+ ;;
+ -f)
+ f=1
+ ;;
+ esac
+ c=$((++c))
+ done
+
+ case "${COMP_WORDS[COMP_CWORD-1]}" in
+ -m|-F)
+ COMPREPLY=()
+ ;;
+ -*|tag)
+ if [ $f = 1 ]; then
+ __gitcomp "$(__git_tags)"
+ else
+ COMPREPLY=()
+ fi
+ ;;
+ *)
+ __gitcomp "$(__git_refs)"
+ ;;
+ esac
+}
+
+_git ()
+{
+ local i c=1 command __git_dir
+
+ while [ $c -lt $COMP_CWORD ]; do
+ i="${COMP_WORDS[c]}"
+ case "$i" in
+ --git-dir=*) __git_dir="${i#--git-dir=}" ;;
+ --bare) __git_dir="." ;;
+ --version|-p|--paginate) ;;
+ --help) command="help"; break ;;
+ *) command="$i"; break ;;
+ esac
+ c=$((++c))
+ done
+
+ if [ -z "$command" ]; then
+ case "${COMP_WORDS[COMP_CWORD]}" in
+ --*=*) COMPREPLY=() ;;
+ --*) __gitcomp "
+ --paginate
+ --no-pager
+ --git-dir=
+ --bare
+ --version
+ --exec-path
+ --work-tree=
+ --help
+ "
+ ;;
+ *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
+ esac
+ return
+ fi
+
+ local expansion=$(__git_aliased_command "$command")
+ [ "$expansion" ] && command="$expansion"
+
+ case "$command" in
+ am) _git_am ;;
+ add) _git_add ;;
+ apply) _git_apply ;;
+ archive) _git_archive ;;
+ bisect) _git_bisect ;;
+ bundle) _git_bundle ;;
+ branch) _git_branch ;;
+ checkout) _git_checkout ;;
+ cherry) _git_cherry ;;
+ cherry-pick) _git_cherry_pick ;;
+ clean) _git_clean ;;
+ clone) _git_clone ;;
+ commit) _git_commit ;;
+ config) _git_config ;;
+ describe) _git_describe ;;
+ diff) _git_diff ;;
+ fetch) _git_fetch ;;
+ format-patch) _git_format_patch ;;
+ gc) _git_gc ;;
+ grep) _git_grep ;;
+ help) _git_help ;;
+ init) _git_init ;;
+ log) _git_log ;;
+ ls-files) _git_ls_files ;;
+ ls-remote) _git_ls_remote ;;
+ ls-tree) _git_ls_tree ;;
+ merge) _git_merge;;
+ mergetool) _git_mergetool;;
+ merge-base) _git_merge_base ;;
+ mv) _git_mv ;;
+ name-rev) _git_name_rev ;;
+ pull) _git_pull ;;
+ push) _git_push ;;
+ rebase) _git_rebase ;;
+ remote) _git_remote ;;
+ reset) _git_reset ;;
+ revert) _git_revert ;;
+ rm) _git_rm ;;
+ send-email) _git_send_email ;;
+ shortlog) _git_shortlog ;;
+ show) _git_show ;;
+ show-branch) _git_show_branch ;;
+ stash) _git_stash ;;
+ submodule) _git_submodule ;;
+ svn) _git_svn ;;
+ tag) _git_tag ;;
+ whatchanged) _git_log ;;
+ *) COMPREPLY=() ;;
+ esac
+}
+
+_gitk ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ local g="$(git rev-parse --git-dir 2>/dev/null)"
+ local merge=""
+ if [ -f $g/MERGE_HEAD ]; then
+ merge="--merge"
+ fi
+ case "$cur" in
+ --*)
+ __gitcomp "--not --all $merge"
+ return
+ ;;
+ esac
+ __git_complete_revlist
+}
+
+complete -o default -o nospace -F _git git
+complete -o default -o nospace -F _gitk gitk
+
+# 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
+complete -o default -o nospace -F _git git.exe
+fi
+PS1=' \033[44m\033[31m$(__git_ps1 "%s")\033[0m'$PS1
27 .gitconfig
@@ -0,0 +1,27 @@
+[user]
+ email = i@foohack.com
+ name = isaacs
+[alias]
+ ci = commit
+ st = status
+ br = branch
+ co = checkout
+ df = diff
+ lg = log -p
+[color]
+ branch = auto
+ diff = auto
+ status = auto
+[color "branch"]
+ current = yellow reverse
+ local = yellow
+ remote = green
+[color "diff"]
+ meta = yellow bold
+ frag = magenta bold
+ old = red bold
+ new = green bold
+[color "status"]
+ added = yellow
+ changed = green
+ untracked = cyan
4 .profile
@@ -0,0 +1,4 @@
+if [ -n "$BASH_VERSION" ]; then
+ [ -f ~/.bashrc ] && . ~/.bashrc
+ [ -f ~/.extra.bashrc ] && . ~/.extra.bashrc
+fi
11 .tarsnaprc
@@ -0,0 +1,11 @@
+# Tarsnap cache directory
+cachedir /Users/isaacs/.tarsnap/tarsnap-cache
+
+# Tarsnap key file
+keyfile /Users/isaacs/.tarsnap/tarsnap.key
+
+# Don't archive files which have the nodump flag set
+nodump
+
+# Print statistics when creating or deleting archives
+print-stats
14 README
@@ -0,0 +1,14 @@
+Isaac Z. Schlueter's Dot Files
+
+Released under the DWTFPL. No rights reserved.
+
+
+NO WARRANTEE EXPRESSED OR IMPLIED. (SERIOUSLY, NOT EVEN A LITLE.)
+
+If you use my dot files without modification you'd better damn fucking well know that you're running code written by someone else in a VERY personal place.
+
+I do not recommend this. Instead, what you should do is fork this repo, and read through the files carefully and understand each piece, changing it to suit your personal needs. Remove anything you won't use or don't understand. Dotfiles are the most powerful things in the world, and can give your terminal wings, or cripple it completely.
+
+I will not support you if you use these files and it sets your computer on fire, disables your terminal, doesn't work, or eats your kitten. You're on your own, and I hope that the pain is a useful lesson in why you should understand every line in your bashrc.
+
+If you come up with something interesting or clever or make something work better, send me a pull request or drop a line to i at foo hack dot com.
20 install.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+! [ -d ~/.dotfile_backup ] && mkdir ~/.dotfile_backup
+for i in .*; do
+ if ! [ "$i" == "." ] && ! [ "$i" == ".." ] && ! [ "$i" == ".git" ]; then
+ if [ -e ~/$i ]; then
+ if ! ( cp ~/$i ~/.dotfile_backup/$i ) || ! ( rm ~/$i || unlink ~/$i ); then
+ echo "Failed on $i" > /dev/stderr
+ exit 1
+ fi
+ fi
+ if ln -s `pwd`/$i ~/$i; then
+ echo "Linked: $i" > /dev/stderr
+ else
+ echo "Failed on $i" > /dev/stderr
+ exit 1
+ fi
+ fi
+done
+
+exit 0

1 comment on commit 791e7ad

Bradley Wright

You probably want to remove any Y!-specific stuff – it’s not really cool to have non-public hostnames etc. in a public repo.

Please sign in to comment.
Something went wrong with that request. Please try again.