Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

bunch of updates... w/ todo script

  • Loading branch information...
commit 2e1cd2f1aab9e3c098bf99724ae8ce86a2fd9f50 1 parent c995979
DeShawn Williams authored
Showing with 7,047 additions and 196 deletions.
  1. +41 −45 conf/bash/bash_aliases
  2. +2 −133 conf/bash/bash_profile
  3. +144 −3 conf/bash/bashrc
  4. +76 −12 conf/tmux/tmux.conf
  5. +55 −0 conf/tmux/work.conf
  6. +4 −2 conf/vim/vimrc
  7. +1 −1  scripts/has_it_been_a_while.sh
  8. +3 −0  scripts/todo/.gitignore
  9. +38 −0 scripts/todo/GEN-VERSION-FILE
  10. +674 −0 scripts/todo/LICENSE
  11. +52 −0 scripts/todo/Makefile
  12. +27 −0 scripts/todo/README.textile
  13. 0  scripts/todo/done.txt
  14. 0  scripts/todo/report.txt
  15. +2 −0  scripts/todo/tests/Makefile
  16. +258 −0 scripts/todo/tests/README
  17. +87 −0 scripts/todo/tests/aggregate-results.sh
  18. +70 −0 scripts/todo/tests/t0000-config.sh
  19. +103 −0 scripts/todo/tests/t0001-null.sh
  20. +40 −0 scripts/todo/tests/t0002-actions.sh
  21. +16 −0 scripts/todo/tests/t0100-code-nobacktick.sh
  22. +113 −0 scripts/todo/tests/t1000-addlist.sh
  23. +89 −0 scripts/todo/tests/t1010-add-date.sh
  24. +101 −0 scripts/todo/tests/t1020-addtolistfile.sh
  25. +75 −0 scripts/todo/tests/t1030-addto-date.sh
  26. +167 −0 scripts/todo/tests/t1100-replace.sh
  27. +103 −0 scripts/todo/tests/t1200-pri.sh
  28. +131 −0 scripts/todo/tests/t1250-listpri.sh
  29. +42 −0 scripts/todo/tests/t1260-listprj.sh
  30. +733 −0 scripts/todo/tests/t1300-ls.sh
  31. +58 −0 scripts/todo/tests/t1310-listcon.sh
  32. +58 −0 scripts/todo/tests/t1320-listproj.sh
  33. +185 −0 scripts/todo/tests/t1330-ls-highlighting.sh
  34. +65 −0 scripts/todo/tests/t1340-listescapes.sh
  35. +150 −0 scripts/todo/tests/t1350-listall.sh
  36. +122 −0 scripts/todo/tests/t1400-prepend.sh
  37. +86 −0 scripts/todo/tests/t1500-do.sh
  38. +103 −0 scripts/todo/tests/t1600-append.sh
  39. +97 −0 scripts/todo/tests/t1700-depri.sh
  40. +153 −0 scripts/todo/tests/t1800-del.sh
  41. +35 −0 scripts/todo/tests/t1900-archive.sh
  42. +103 −0 scripts/todo/tests/t1910-deduplicate.sh
  43. +96 −0 scripts/todo/tests/t1950-report.sh
  44. +136 −0 scripts/todo/tests/t2000-multiline.sh
  45. +57 −0 scripts/todo/tests/t8000-actions.sh
  46. +167 −0 scripts/todo/tests/t9999-testsuite_example.sh
  47. +664 −0 scripts/todo/tests/test-lib.sh
  48. +6 −0 scripts/todo/tests/testshell.sh
  49. 0  scripts/todo/todo
  50. +79 −0 scripts/todo/todo.cfg
  51. +1,300 −0 scripts/todo/todo.sh
  52. +1 −0  scripts/todo/todo.txt
  53. +79 −0 scripts/todo/todo_completion
View
86 conf/bash/bash_aliases
@@ -1,16 +1,5 @@
-# RANDOM CONSTANTS
-WORKUNAME='dalopez'
-CUSTOM_BUILD_DIR='~/programs'
-CUSTOM_BUILD_BIN_DIR='bin'
-
-# Detect platform for platform conditionals
-platform='unknown'
-unamestr=`uname`
-if [[ "$unamestr" == 'Linux' ]]; then
- platform='linux'
-elif [[ "$unamestr" == 'Darwin' ]]; then
- platform='darwin'
-fi
+# colored directory listings etc
+ #dircolors=~/env/conf/bash/dircolors-$(tput colors)
if [[ $platform == 'linux' ]]; then
# SPECIFIC TO LINUX MACHINES
@@ -31,13 +20,28 @@ elif [[ $platform == 'darwin' ]]; then
alias ff6="/Applications/Firefox6.app/Contents/MacOS/firefox-bin -no-remote -P 'firefox6' &"
# OSX - (clears DNS on mac machine)
alias flushdns="dscacheutil -flushcache"
+fi
+if [ -f $dircolors ]; then
+ eval $(dircolors -b $dircolors)
+ if [[ $platform == 'darwin' ]]; then
+ alias ls='gls --color=auto'
+ else
+ alias ls='ls --color=auto'
+ fi;
+ alias grep='grep --color=auto'
+ alias fgrep='fgrep --color=auto'
+ alias egrep='egrep --color=auto'
+else
+ eval $(dircolors)
fi
+# and now on to the sane stuff.... kinda.......................................
+
# Programs
alias rhino="java -jar ~/programs/rhino/js.jar"
-# Handy unix stuff
+# Handy utilities
# count files in directory (recursive)
alias count_files='find . -type f | wc -l'
@@ -45,17 +49,18 @@ fi
alias rmsvn='find . -name .svn -print0 | xargs -0 rm -rf'
# outputs /bin directories bash is reading from
alias paths='echo -e ${PATH//:/\\n}'
- # copies Samuel L Jackson Ipsum to clipboard
- alias sam='less ~/SamuelIpsum.txt | pbcopy'
+ alias ipsum='cat ~/ipsum.txt | pbcopy'
# General Shorcuts
alias s="sudo"
alias ss="s !!"
+
#Lazy ass aliases
alias c="clear"
alias b="cd .."
+ # use gnu ls instead of mac... with colors
if [[ $platform == 'darwin' ]]; then
alias l="gls -l --color=auto"
alias la='gls -la --color=auto'
@@ -75,8 +80,15 @@ fi
alias gco='git co'
# Editor aliases
-alias gvim='~/env/scripts/vim/mvim'
-alias sgvim='sudo ~/env/scripts/vim/mvim'
+if [[ $platform == 'darwin' ]]; then
+ alias vim='reattach-to-user-namespace vim' # reattach is for clipboard funnyness
+fi
+
+if [[ $platform == 'darwin' ]]; then
+ alias gvim='~/env/scripts/vim/mvim'
+ alias sgvim='sudo ~/env/scripts/vim/mvim'
+fi
+
alias ed=vim
# Misc Scripts
@@ -98,11 +110,11 @@ alias drush='~/env/scripts/drush/drush'
alias apx="ap stop"
alias aps="ap start"
# edit main apache configuration file
- alias apc="sgvim /etc/apache2/httpd.conf"
+ alias apc="ed /etc/apache2/httpd.conf"
alias apl="tail -f /Applications/MAMP/logs/apache_error.log"
- alias vac="sgvim /usr/local/etc/varnish/default.vcl"
+ alias vac="ed /usr/local/etc/varnish/default.vcl"
alias vas="varnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:1702"
- alias ngc="sgvim vim /usr/local/etc/nginx/nginx.conf"
+ alias ngc="ed vim /usr/local/etc/nginx/nginx.conf"
alias ngs="sudo nginx"
alias ngx="sudo nginx -s stop"
@@ -113,17 +125,17 @@ alias drush='~/env/scripts/drush/drush'
alias mysqlx='sudo mysql.server stop'
# edit host configuration (just 777'd host file.)
- alias ehosts="sgvim /etc/hosts"
- alias ehost="sgvim /etc/hosts"
- alias eh="gvim /etc/hosts"
+ alias ehosts="ed /etc/hosts"
+ alias ehost="ed /etc/hosts"
+ alias eh="ed /etc/hosts"
# edit gvim rc
alias gvimrc="gvim ~/.gvimrc.local"
# edit vimrc
- alias vrc="gvim ~/.vimrc"
+ alias vrc="ed ~/.vimrc"
# edit bash profile
- alias brc="gvim ~/.bash_profile && bash --rcfile ~/.bash_profile"
+ alias brc="ed ~/.bash_profile && bash --rcfile ~/.bash_profile"
# edit bash aliases
- alias bal="gvim ~/.bash_aliases && bash --rcfile ~/.bash_profile"
+ alias bal="ed ~/.bash_aliases && bash --rcfile ~/.bash_profile"
# reload bash configurations
alias brl='bash --rcfile ~/.bash_profile'
@@ -159,23 +171,7 @@ alias drush='~/env/scripts/drush/drush'
alias bafi='cd ~/sites/drupal/sites/all/modules/baffin_component/includes/'
alias zom='cd ~/sites/drupal/sites/all/modules/utils/zommons/'
-# colored directory listings etc
- dircolors=~/env/conf/bash/dircolors-$(tput colors)
-
- if [ -f $dircolors ]; then
- eval $(dircolors -b $dircolors)
- if [[ $platform == 'darwin' ]]; then
- alias ls='gls --color=auto'
- else
- alias ls='ls --color=auto'
- fi;
- alias grep='grep --color=auto'
- alias fgrep='fgrep --color=auto'
- alias egrep='egrep --color=auto'
- else
- eval $(dircolors)
- fi
-
+# Server login aliases
alias devjump='ssh dalopez@devjump.zappos.net'
-
alias prelive='ssh dalopez@new-prelive.zappos.net'
+
View
135 conf/bash/bash_profile
@@ -1,136 +1,5 @@
# Source global definitions
-if [ -f /etc/bashrc ]; then
- . /etc/bashrc
+if [[ -f /etc/bashrc ]]; then
+ source ~/.bashrc
fi
-export ENV_NAME=`cat ~/env/var/env_name`
-
-export TERM='xterm-256color'
-
-# Load custom environment variables
-if [ -e ~/env/conf/bash/bash_env ]; then . ~/env/conf/bash/bash_env; fi
-
-# Load .bash_aliases
-if [ -e ~/.bash_aliases ]; then . ~/.bash_aliases; fi
-
-# PS1... W0rd
-PS1='\[\e[38;5;120m\]$PWD\[\e[m\] \[\e[1;34m\]- ($ENV_NAME) $(__git_ps1 "(%s)")\[\e[m\]
-=>\[\e[m\]'
-
-# Git auto completion
-source ~/env/scripts/git/git-completion.bash
-
-#------------------------------------------------------------------------------
-# Functions / Complex aliases
-#------------------------------------------------------------------------------
-
-# Change the title of the current tab
-t(){
- echo -ne "\e]2;$*\a"
-}
-
-# Search through process list
-psf() {
- if [ ! -z $1 ] ; then
- echo "Grepping for processes matching $1..."
- ps aux | grep $1 | grep -v grep
- else
- echo "!! Need name to grep for"
- fi
-}
-
-# Run a custom script
-rs() {
- php ~/env/scripts/script.php "$@";
-}
-
-# Run a site command
-site() {
- php ~/env/scripts/site/site.php "$@";
-}
-
-# Find a file with a pattern in name:
-function ff() {
- find . -type f -iname '*'$*'*' -ls ;
-}
-
-# Find a file with a pattern in name:
-function f() {
- ff "$*" | awk '{FS = " " ; print $11}'
-}
-
-# Find a pattern in a set of files and highlight them:
-function fstr() {
- OPTIND=1
- local case=""
- local usage="fstr: find string in files. Usage: fstr [-i] \"pattern\" [\"filename pattern\"] "
- while getopts :it opt
- do
- case "$opt" in
- i) case="-i " ;;
- *) echo "$usage"; return;;
- esac
- done
- shift $(( $OPTIND - 1 ))
- if [ "$#" -lt 1 ]; then
- echo "$usage"
- return;
- fi
- find . -type f -name "${2:-*}" -print0 | xargs -0 egrep -sn ${case} "$1" 2>&- | more
-
-}
-
-alias fs=fstr
-
-# Extract a compressed archive
-function extract() {
- if [ -f $1 ] ; then
- case $1 in
- *.tar.bz2) tar xvjf $1 ;;
- *.tar.gz) tar xvzf $1 ;;
- *.bz2) bunzip2 $1 ;;
- *.rar) unrar x $1 ;;
- *.gz) gunzip $1 ;;
- *.tar) tar xvf $1 ;;
- *.tbz2) tar xvjf $1 ;;
- *.tgz) tar xvzf $1 ;;
- *.zip) unzip $1 ;;
- *.Z) uncompress $1 ;;
- *.7z) 7z x $1 ;;
- *) echo "'$1' cannot be extracted via >extract<" ;;
- esac
- else
- echo "'$1' is not a valid file"
- fi
-}
-
-# Find ip address
-function ipaddr() {
- echo $(/sbin/ifconfig | awk '/inet addr:/ { print $2 }' | sed -e 's/addr://' | sed -e 's/127.0.0.1//')
-}
-
-# Make a directory and go into it
-function mk() {
- mkdir $1
- cd $1
-}
-
-# Function to load a screen profile
-sp() {
- if [[ -f "$HOME/env/conf/screen/$1" ]]; then
- screen -c "$HOME/env/conf/screen/$1"
- else
- screen -c "$HOME/env/conf/screen/screenrc"
- fi
-}
-
-
-#MACHINE SPECIFIC
-#PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/git/bin:/opt/local/bin
-#PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:/Users/dal/scripts:/Users/dal/scripts/drush:/usr/local/sbin
-
-[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function
-
-source $HOME/env/scripts/startup.sh
-
-source ~/fez-scripts/fez-scripts.bashrc
View
147 conf/bash/bashrc
@@ -1,6 +1,147 @@
-if [ -e ~/.bash_profile ];
- then . ~/.bash_profile;
+# RANDOM CONSTANTS
+WORKUNAME='dalopez'
+CUSTOM_BUILD_DIR='~/programs'
+CUSTOM_BUILD_BIN_DIR='bin'
+
+# Detect platform for platform conditionals
+platform='unknown'
+unamestr=`uname`
+if [[ "$unamestr" == 'Linux' ]]; then
+ platform='linux'
+elif [[ "$unamestr" == 'Darwin' ]]; then
+ platform='darwin'
fi
-source ~/fez-scripts/fez-scripts.bashrc
export "MAVEN_OPTS=-Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m"
+
+export ENV_NAME=`cat ~/env/var/env_name`
+
+export TERM='xterm-256color'
+
+# PS1... W0rd
+PS1='\[\e[38;5;120m\]$PWD\[\e[m\] \[\e[1;34m\]- ($ENV_NAME) $(__git_ps1 "(%s)")\[\e[m\]
+=>\[\e[m\]'
+
+# Git auto completion
+source ~/env/scripts/git/git-completion.bash
+# Load .bash_aliases
+if [ -e ~/.bash_aliases ]; then source ~/.bash_aliases; fi
+# Load fez-scripts
+source ~/fez-scripts/fez-scripts.bashrc
+
+#------------------------------------------------------------------------------
+# Functions / Complex aliases
+#------------------------------------------------------------------------------
+
+# Change the title of the current tab
+t(){
+ echo -ne "\e]2;$*\a"
+}
+
+# Search through process list
+psf() {
+ if [ ! -z $1 ] ; then
+ echo "Grepping for processes matching $1..."
+ ps aux | grep $1 | grep -v grep
+ else
+ echo "!! Need name to grep for"
+ fi
+}
+
+# Run a custom script
+rs() {
+ php ~/env/scripts/script.php "$@";
+}
+
+# Run a site command
+site() {
+ php ~/env/scripts/site/site.php "$@";
+}
+
+# Find a file with a pattern in name:
+function ff() {
+ find . -type f -iname '*'$*'*' -ls ;
+}
+
+# Find a file with a pattern in name:
+function f() {
+ ff "$*" | awk '{FS = " " ; print $11}'
+}
+
+# Find a pattern in a set of files and highlight them:
+function fstr() {
+ OPTIND=1
+ local case=""
+ local usage="fstr: find string in files. Usage: fstr [-i] \"pattern\" [\"filename pattern\"] "
+ while getopts :it opt
+ do
+ case "$opt" in
+ i) case="-i " ;;
+ *) echo "$usage"; return;;
+ esac
+ done
+ shift $(( $OPTIND - 1 ))
+ if [ "$#" -lt 1 ]; then
+ echo "$usage"
+ return;
+ fi
+ find . -type f -name "${2:-*}" -print0 | xargs -0 egrep -sn ${case} "$1" 2>&- | more
+
+}
+
+alias fs=fstr
+
+# Extract a compressed archive
+function extract() {
+ if [ -f $1 ] ; then
+ case $1 in
+ *.tar.bz2) tar xvjf $1 ;;
+ *.tar.gz) tar xvzf $1 ;;
+ *.bz2) bunzip2 $1 ;;
+ *.rar) unrar x $1 ;;
+ *.gz) gunzip $1 ;;
+ *.tar) tar xvf $1 ;;
+ *.tbz2) tar xvjf $1 ;;
+ *.tgz) tar xvzf $1 ;;
+ *.zip) unzip $1 ;;
+ *.Z) uncompress $1 ;;
+ *.7z) 7z x $1 ;;
+ *) echo "'$1' cannot be extracted via >extract<" ;;
+ esac
+ else
+ echo "'$1' is not a valid file"
+ fi
+}
+
+# Find ip address
+function ipaddr() {
+ echo $(/sbin/ifconfig | awk '/inet addr:/ { print $2 }' | sed -e 's/addr://' | sed -e 's/127.0.0.1//')
+}
+
+# Make a directory and go into it
+function mk() {
+ mkdir $1
+ cd $1
+}
+
+# Function to load a screen profile
+sp() {
+ if [[ -f "$HOME/env/conf/screen/$1" ]]; then
+ screen -c "$HOME/env/conf/screen/$1"
+ else
+ screen -c "$HOME/env/conf/screen/screenrc"
+ fi
+}
+
+#MACHINE SPECIFIC
+#PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/git/bin:/opt/local/bin
+#PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:/Users/dal/scripts:/Users/dal/scripts/drush:/usr/local/sbin
+
+JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home"
+
+[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function
+
+source $HOME/env/scripts/startup.sh
+
+source ~/fez-scripts/fez-scripts.bashrc
+
View
88 conf/tmux/tmux.conf
@@ -1,13 +1,11 @@
+# sources:
+# https://gist.github.co/721200
+
# Use traditional screen Ctrl+a binding
set-option -g prefix C-a
unbind-key C-b
bind-key C-a send-prefix
-
-# Make background color blue
-set-option -g status-bg blue
-
-
# Reload tmux config
bind r source-file ~/.tmux.conf
@@ -16,21 +14,87 @@ set -g status-bg black
set -g status-fg white
set -g status-interval 60
set -g status-left-length 30
-set -g status-left '#[fg=green](#S) #(whoami)@#H#[default]'
-set -g status-right '#[fg=yellow]#(cut -d " " -f 1-3 /proc/loadavg)#[default] #[fg=blue]%H:%M#[default]'
+set -g status-left ''
+set -g status-right ''
+
+#set -g status-right '#[fg=yellow]#(cut -d " " -f 1-3 /proc/loadavg)#[default] #[fg=blue]%H:%M#[default]'
-unbind %
-bind | split-window -h
-bind % split-window -v
+# use better mnemonics for horizontal/vertical splits
+bind-key - split-window -v
+bind-key _ split-window -v
+bind-key | split-window -h
+# Mouse interactions
set -g mode-mouse on
set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on
+# Use VI mode for stuff...
+set -g mode-keys vi
+set -g status-keys vi
+
# Slowness in keys are because tmux is waiting for an escape sequence. Fix that by setting
# escape time to zero
set -s escape-time 0
-# home dp zeta monitor conf devjump prelive qa man workspace vim
-#
+# Tmux buffer to osx clipboard
+bind C-y run-shell "reattach-to-user-namespace -l bash -c 'tmux show-buffer | pbcopy'"
+
+# control automatic window renaming
+setw -g automatic-rename off
+
+# displays
+bind-key * list-clients
+
+# Cycle to next pane
+bind-key -r Tab select-pane -t :.+
+
+# choose window/session
+bind-key "'" choose-window
+bind-key '"' choose-session
+
+# display visible indicator of each pane
+bind-key w display-panes
+
+# navigate panes using jk, and ctrl+jk (no prefix)
+bind-key -r j select-pane -t :.-
+bind-key -r k select-pane -t :.+
+bind-key -r C-j select-pane -t :.-
+bind-key -r C-k select-pane -t :.+
+
+# navigate windows using hl, and ctrl-hl (no prefix)
+bind-key -r h select-window -t :-
+bind-key -r l select-window -t :+
+bind-key -r C-h select-window -t :-
+bind-key -r C-l select-window -t :+
+
+# swap panes
+bind-key -r J swap-pane -D
+bind-key -r K swap-pane -U
+
+
+# copying and pasting, this should be default.
+bind-key [ copy-mode
+bind-key ] paste-buffer -s \015
+
+# kill current pane/window
+bind-key k confirm-before kill-pane
+bind-key K confirm-before kill-server
+
+# title (default key in tmux is ',') (this is default screen binding)
+bind-key A command-prompt "rename-window %%"
+
+bind-key R respawn-window # ? dunno what this is
+
+# set global r-o-e so that initial window of initial session gets it
+set -g set-remain-on-exit on
+
+source-file ~/env/conf/tmux/work.conf
+
+# restore global r-o-e
+set -g set-remain-on-exit off
+
+# let session r-o-e inherit from global value for future windows
+set -u set-remain-on-exit
+
View
55 conf/tmux/work.conf
@@ -0,0 +1,55 @@
+new-session -d -n home
+ # must have matrix.
+ #send-keys -t home "cd ~/" C-m "clear" C-m
+ #splitw -h -p 50 -t home
+ #send-keys -t home "cd ~/" C-m "clear" C-m
+ #send-keys -t home "vim" C-m
+ #select-pane -t .0
+ send-keys -t home "cmatrix -s && cd ~/ && tmux splitw -h -p 50 -t home && tmux select-pane -t .0 && clear && tmux send-keys -t home.1 'vim ~/notes.txt' C-m" C-m
+
+new-window -d -n drupal
+ send-keys -t drupal "cd ~/sites/drupal/sites/all/modules" C-m "clear" C-m
+ splitw -h -p 50 -t drupal
+ send-keys -t drupal "cd ~/sites/drupal/sites/all/modules" C-m "clear" C-m
+ send-keys -t drupal "vim" C-m
+ select-pane -t .0
+
+new-window -d -n zeta
+ send-keys -t zeta "cd ~/workspace/zeta-platform/zeta-web/src/main/frontend" C-m "clear" C-m
+ splitw -h -p 50 -t zeta
+ send-keys -t zeta "cd ~/workspace/zeta-platform/zeta-web/src/main/frontend" C-m "clear" C-m
+ send-keys -t zeta "vim" C-m
+ select-pane -t .0
+
+new-window -d -n workspace
+ send-keys -t workspace "cd ~/workspace" C-m "clear" C-m
+ splitw -h -p 50 -t workspace
+ send-keys -t workspace "cd ~/workspace" C-m "clear" C-m
+ send-keys -t workspace "vim" C-m
+ select-pane -t .0
+
+new-window -d -n monitor
+ splitw -h -p 50 -t monitor
+ splitw -v -p 50 -t monitor
+ select-pane -t .0
+ send-keys -t .top-right "tcl" C-m
+ send-keys -t .bottom-right "apl" C-m
+
+new-window -d -n servers
+
+new-window -d -n man
+
+new-window -d -n conf
+ send-keys -t conf "cd ~/env/conf" C-m "clear" C-m
+ splitw -h -p 50 -t conf
+ send-keys -t conf "cd ~/fez-scripts/" C-m "clear" C-m
+ select-pane -t .0
+
+new-window -d -n misc
+ send-keys -t misc "cd ~/" C-m "clear" C-m
+ splitw -h -p 50 -t misc
+ send-keys -t misc "cd ~/" C-m "clear" C-m
+ send-keys -t misc "vim" C-m
+
+select-window -t home
+
View
6 conf/vim/vimrc
@@ -3,6 +3,8 @@ set ofu=syntaxcomplete#Complete
set nocompatible
+set clipboard=unnamed
+
" keep working directory to the directory of the currently opened file
set autochdir
@@ -163,8 +165,6 @@ if exists("+showtabline")
set tabline=%!MyTabLine()
endif
-
-
if has("autocmd")
" Drupal *.module and *.install files.
augroup module
@@ -185,3 +185,5 @@ endif
nmap <CR> :w<CR>
+vmap <C-x> :!pbcopy<CR>
+vmap <C-c> :w !pbcopy<CR><CR>
View
2  scripts/has_it_been_a_while.sh
@@ -7,7 +7,7 @@ NOW=`date +%s` #get the current timestamp
LAST_REFRESH_SECONDS_AGO=$(($NOW - $LAST_REFRESH)) #get the number of seconds since last refresh
# if its past the specified amount of day(s)
-if [ $LAST_REFRESH_SECONDS_AGO -gt $(($DAYS * 86400)) ]; then
+if [[ $LAST_REFRESH_SECONDS_AGO -gt $(($DAYS * 86400)) ]]; then
echo "yes"
echo $NOW > $LAST_REFRESH_FILE
else
View
3  scripts/todo/.gitignore
@@ -0,0 +1,3 @@
+VERSION-FILE
+tests/test-results
+tests/trash\ directory.*
View
38 scripts/todo/GEN-VERSION-FILE
@@ -0,0 +1,38 @@
+#!/bin/sh
+# Based on git's GIT-VERSION-GEN.
+
+VF=VERSION-FILE
+DEF_VER=v2.2
+
+LF='
+'
+
+if test -d .git -o -f .git &&
+ VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&
+ case "$VN" in
+ *$LF*) (exit 1) ;;
+ v[0-9]*)
+ git update-index -q --refresh
+ test -z "$(git diff-index --name-only HEAD --)" ||
+ VN="$VN-dirty" ;;
+ esac
+then
+ VN=$(echo "$VN" | sed -e 's/-/./g');
+else
+ VN="$DEF_VER"
+fi
+
+VN=$(expr "$VN" : v*'\(.*\)')
+
+if test -r $VF
+then
+ VC=$(sed -e 's/^VERSION=//' <$VF)
+else
+ VC=unset
+fi
+test "$VN" = "$VC" || {
+ echo >&2 "VERSION=$VN"
+ echo "VERSION=$VN" >$VF
+}
+
+
View
674 scripts/todo/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
View
52 scripts/todo/Makefile
@@ -0,0 +1,52 @@
+#
+# Makefile for todo.txt
+#
+
+# Dynamically detect/generate version file as necessary
+# This file will define a variable called VERSION.
+.PHONY: .FORCE-VERSION-FILE
+VERSION-FILE: .FORCE-VERSION-FILE
+ @./GEN-VERSION-FILE
+-include VERSION-FILE
+
+# Maybe this will include the version in it.
+todo.sh: VERSION-FILE
+
+# For packaging
+DISTFILES := todo.cfg todo_completion
+
+DISTNAME=todo.txt_cli-$(VERSION)
+dist: $(DISTFILES) todo.sh
+ mkdir -p $(DISTNAME)
+ cp -f $(DISTFILES) $(DISTNAME)/
+ sed -e 's/@DEV_VERSION@/'$(VERSION)'/' todo.sh > $(DISTNAME)/todo.sh
+ tar cf $(DISTNAME).tar $(DISTNAME)/
+ gzip -f -9 $(DISTNAME).tar
+ zip -9r $(DISTNAME).zip $(DISTNAME)/
+ rm -r $(DISTNAME)
+
+.PHONY: clean
+clean:
+ rm -f $(DISTNAME).tar.gz $(DISTNAME).zip
+
+
+#
+# Testing
+#
+TESTS = $(wildcard tests/t[0-9][0-9][0-9][0-9]-*.sh)
+#TEST_OPTIONS=--verbose
+
+test-pre-clean:
+ rm -rf tests/test-results "tests/trash directory"*
+
+aggregate-results: $(TESTS)
+
+$(TESTS): test-pre-clean
+ -cd tests && ./$(notdir $@) $(TEST_OPTIONS)
+
+test: aggregate-results
+ tests/aggregate-results.sh tests/test-results/t*-*
+ rm -rf tests/test-results
+
+# Force tests to get run every time
+.PHONY: test test-pre-clean aggregate-results $(TESTS)
View
27 scripts/todo/README.textile
@@ -0,0 +1,27 @@
+h1. TODO.TXT Command Line Interface
+
+A simple and extensible shell script for managing your todo.txt file.
+
+h2. "Downloads":http://github.com/ginatrapani/todo.txt-cli/downloads
+
+"Download the latest stable release":http://github.com/ginatrapani/todo.txt-cli/downloads for use on your desktop or server.
+
+h2. "Documentation":http://wiki.github.com/ginatrapani/todo.txt-cli
+
+* "User Documentation":http://wiki.github.com/ginatrapani/todo.txt-cli/user-documentation - Find out "how to install and use Todo.txt CLI":http://wiki.github.com/ginatrapani/todo.txt-cli/user-documentation, and get tips and tricks.
+
+* "Developer Documentation":http://wiki.github.com/ginatrapani/todo.txt-cli/developer-documentation - "Contribute to Todo.txt CLI":http://wiki.github.com/ginatrapani/todo.txt-cli/developer-documentation and build your own custom add-ons.
+
+h2. "Mailing List":http://groups.yahoo.com/group/todotxt/
+
+Get support from users and developers on the "mailing list":http://groups.yahoo.com/group/todotxt/.
+
+h2. Quick Links
+
+* Original anemic release by "Gina Trapani":http://ginatrapani.org on 5/11/2006.
+* Raised to great heights by "brainy and dedicated volunteers":http://github.com/ginatrapani/todo.txt-cli/network.
+* Licensed under the "GPL":http://www.gnu.org/copyleft/gpl.html
+* "Add-on Directory":https://github.com/ginatrapani/todo.txt-cli/wiki/Todo.sh-Add-on-Directory
+https://github.com/ginatrapani/todo.txt-cli/wiki/Creating-and-Installing-Add-ons
+* "Changelog":http://wiki.github.com/ginatrapani/todo.txt-cli/todosh-changelog
+* "Known Bugs":http://github.com/ginatrapani/todo.txt-cli/issues
View
0  scripts/todo/done.txt
No changes.
View
0  scripts/todo/report.txt
No changes.
View
2  scripts/todo/tests/Makefile
@@ -0,0 +1,2 @@
+test:
+ $(MAKE) -C .. test
View
258 scripts/todo/tests/README
@@ -0,0 +1,258 @@
+todo.sh tests
+=============
+
+This directory holds test scripts for todo.sh. The
+first part of this short document describes how to run the tests
+and read their output.
+
+When fixing the tools or adding enhancements, you are strongly
+encouraged to add tests in this directory to cover what you are
+trying to fix or enhance. The later part of this short document
+describes how your test scripts should be organized.
+
+
+Running Tests
+-------------
+
+The easiest way to run tests is to say "make test" from the top-level.
+This runs all the tests.
+
+ rm -rf tests/test-results "tests/trash directory"*
+ cd tests && sh t0000-config.sh
+ * ok 1: no config file
+ * ok 2: config file (default location 1)
+ * ok 3: config file (default location 2)
+ * ok 4: config file (command line)
+ * ok 5: config file (env variable)
+ * passed all 5 test(s)
+ cd tests && sh t0001-null.sh
+ * ok 1: null ls
+ * passed all 1 test(s)
+ rm -rf tests/test-results
+
+Or you can run each test individually from command line, like
+this:
+
+ $ ./t0001-null.sh
+ * ok 1: null ls
+ * passed all 1 test(s)
+
+You can pass --verbose (or -v), --debug (or -d), and --immediate
+(or -i) command line argument to the test, or by setting GIT_TEST_OPTS
+appropriately before running "make".
+
+--verbose::
+ This makes the test more verbose. Specifically, the
+ command being run and their output if any are also
+ output.
+
+--debug::
+ This may help the person who is developing a new test.
+ It causes the command defined with test_debug to run.
+
+--immediate::
+ This causes the test to immediately exit upon the first
+ failed test.
+
+--long-tests::
+ This causes additional long-running tests to be run (where
+ available), for more exhaustive testing.
+
+--tee::
+ In addition to printing the test output to the terminal,
+ write it to files named 't/test-results/$TEST_NAME.out'.
+ As the names depend on the tests' file names, it is safe to
+ run the tests with this option in parallel.
+
+Skipping Tests
+--------------
+
+In some environments, certain tests have no way of succeeding
+due to platform limitation, such as lack of 'unzip' program, or
+filesystem that do not allow arbitrary sequence of non-NUL bytes
+as pathnames.
+
+You should be able to say something like
+
+ $ SKIP_TESTS=t0000.2 sh ./t0000-config.sh
+
+and even:
+
+ $ SKIP_TESTS='t[0-4]??? t91?? t9200.8' make
+
+to omit such tests. The value of the environment variable is a
+SP separated list of patterns that tells which tests to skip,
+and either can match the "t[0-9]{4}" part to skip the whole
+test, or t[0-9]{4} followed by ".$number" to say which
+particular test to skip.
+
+Note that some tests in the existing test suite rely on previous
+test item, so you cannot arbitrarily disable one and expect the
+remainder of test to check what the test originally was intended
+to check.
+
+
+Naming Tests
+------------
+
+The test files are named as:
+
+ tNNNN-commandname-details.sh
+
+where N is a decimal digit.
+
+First digit tells the family:
+
+ 0 - the absolute basics and global stuff
+ 1 - basic every-day usage
+ 2 - add ins
+
+Second digit tells the particular command we are testing.
+
+Third digit (optionally) tells the particular switch or group of switches
+we are testing.
+
+If you create files under tests/ directory (i.e. here) that is not
+the top-level test script, never name the file to match the above
+pattern. The Makefile here considers all such files as the
+top-level test script and tries to run all of them. A care is
+especially needed if you are creating a common test library
+file, similar to test-lib.sh, because such a library file may
+not be suitable for standalone execution.
+
+
+Writing Tests
+-------------
+
+The test script is written as a shell script. It should start
+with the standard "#!/bin/sh" with copyright notices, and an
+assignment to variable 'test_description', like this:
+
+ #!/bin/sh
+ #
+ # Copyright (c) 2005 Junio C Hamano
+ #
+
+ test_description='xxx test (option --frotz)
+
+ This test registers the following structure in the cache
+ and tries to run git-ls-files with option --frotz.'
+
+
+Source 'test-lib.sh'
+--------------------
+
+After assigning test_description, the test script should source
+test-lib.sh like this:
+
+ . ./test-lib.sh
+
+This test harness library does the following things:
+
+ - If the script is invoked with command line argument --help
+ (or -h), it shows the test_description and exits.
+
+ - Creates an empty test directory with an empty todo file
+ database and chdir(2) into it. This directory is 't/trash directory'
+ if you must know, but I do not think you care.
+
+ - Defines standard test helper functions for your scripts to
+ use. These functions are designed to make all scripts behave
+ consistently when command line arguments --verbose (or -v),
+ --debug (or -d), and --immediate (or -i) is given.
+
+
+End with test_done
+------------------
+
+Your script will be a sequence of tests, using helper functions
+from the test harness library. At the end of the script, call
+'test_done'.
+
+
+Test harness library
+--------------------
+
+There are a handful helper functions defined in the test harness
+library for your script to use.
+
+ - test_todo_session <message> < transcript
+
+ This takes a single string as a parameter, which is treated
+ as a base description of what is being tested, and then
+ reads from standard input a transcript of todo.sh commands
+ and expected output. Each command is run in the current
+ test environment and the output is compared with the
+ expected output. (See below for how to generate transcripts
+ easily.)
+
+ - test_tick [interval]
+
+ The test harness has an internal view of time which is
+ implemented by wrapping the date command. This takes a single
+ optional positive integer parameter which indicates how much
+ to advance the internal time. The default value is one day.
+
+ - test_expect_success <message> <script>
+
+ This takes two strings as parameter, and evaluates the
+ <script>. If it yields success, test is considered
+ successful. <message> should state what it is testing.
+
+ Example:
+
+ test_expect_success \
+ 'git-write-tree should be able to write an empty tree.' \
+ 'tree=$(git-write-tree)'
+
+ - test_expect_failure <message> <script>
+
+ This is NOT the opposite of test_expect_success, but is used
+ to mark a test that demonstrates a known breakage. Unlike
+ the usual test_expect_success tests, which say "ok" on
+ success and "FAIL" on failure, this will say "FIXED" on
+ success and "still broken" on failure. Failures from these
+ tests won't cause -i (immediate) to stop.
+
+ - test_debug <script>
+
+ This takes a single argument, <script>, and evaluates it only
+ when the test script is started with --debug command line
+ argument. This is primarily meant for use during the
+ development of a new test script.
+
+ - test_done
+
+ Your test script must have test_done at the end. Its purpose
+ is to summarize successes and failures in the test script and
+ exit with an appropriate error code.
+
+
+Generating test transcripts
+---------------------------
+
+You can generate test scripts from screenshots as following:
+
+ $ ./testshell.sh
+
+You'll be in a special test environment with an empty todo.txt
+and the dates and timestamps will be artificially fixed.
+
+Then the session can be used to make a unit test thanks to
+test_todo_session, see the existing tests as examples.
+
+Be careful to replace all occurences of the full path to the test
+directory by $HOME as testshell.sh will explain you when you execute it
+otherwise the tests will work properly only on your own computer.
+
+Don't use "script" as this would log every keystroke, not only what's
+visible!!
+
+
+Credits
+-------
+
+This test framework was derived from the framework used by
+git itself, written originally by Junio Hamano and licensed
+for use under the GPL. It was specialized for todo.txt-cli
+by Emil Sit and Philippe Teuwen.
View
87 scripts/todo/tests/aggregate-results.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+
+[ "x$TERM" != "xdumb" ] && (
+ export TERM &&
+ [ -t 1 ] &&
+ tput bold >/dev/null 2>&1 &&
+ tput setaf 1 >/dev/null 2>&1 &&
+ tput sgr0 >/dev/null 2>&1
+ ) &&
+ color=t
+
+case "$1" in
+--no-color)
+ color=; shift ;;
+esac
+
+if test -n "$color"; then
+ say_color () {
+ (
+ export TERM
+ case "$1" in
+ error) tput bold; tput setaf 1;; # bold red
+ skip) tput bold; tput setaf 2;; # bold green
+ pass) tput setaf 2;; # green
+ info) tput setaf 3;; # brown
+ *) test -n "$quiet" && return;;
+ esac
+ shift
+ printf "* %s" "$*"
+ tput sgr0
+ echo
+ )
+ }
+else
+ say_color() {
+ test -z "$1" && test -n "$quiet" && return
+ shift
+ echo "* $*"
+ }
+fi
+
+get_color()
+{
+ # Only use the supplied color if there are actually instances of that
+ # type, so that a clean test run does not distract the user by the
+ # appearance of the error highlighting.
+ if [ ${1:?} -eq 0 ]
+ then
+ echo 'info'
+ else
+ echo "${2:-info}"
+ fi
+}
+
+
+fixed=0
+success=0
+failed=0
+broken=0
+total=0
+
+for file
+do
+ while read type value
+ do
+ case $type in
+ '')
+ continue ;;
+ fixed)
+ fixed=$(($fixed + $value)) ;;
+ success)
+ success=$(($success + $value)) ;;
+ failed)
+ failed=$(($failed + $value)) ;;
+ broken)
+ broken=$(($broken + $value)) ;;
+ total)
+ total=$(($total + $value)) ;;
+ esac
+ done <"$file"
+done
+
+say_color 'info' "$(printf "%-8s%d\n" fixed $fixed)"
+say_color "$(get_color "$success" 'pass')" "$(printf "%-8s%d\n" success $success)"
+say_color "$(get_color "$failed" 'error')" "$(printf "%-8s%d\n" failed $failed)"
+say_color "$(get_color "$broken" 'error')" "$(printf "%-8s%d\n" broken $broken)"
+say_color 'info' "$(printf "%-8s%d\n" total $total)"
View
70 scripts/todo/tests/t0000-config.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+test_description='todo.sh configuration file location
+
+This test just makes sure that todo.sh can find its
+config files in the default locations and take arguments
+to find it somewhere else.
+'
+. ./test-lib.sh
+
+# Remove the pre-created todo.cfg to test behavior in its absence
+rm -f todo.cfg
+echo "Fatal Error: Cannot read configuration file $HOME/.todo/config" > expect
+test_expect_success 'no config file' '
+ todo.sh > output 2>&1 || test_cmp expect output
+'
+
+# All the below tests will output the usage message.
+cat > expect << EOF
+Usage: todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
+Try 'todo.sh -h' for more information.
+EOF
+
+cat > test.cfg << EOF
+export TODO_DIR=.
+export TODO_FILE="\$TODO_DIR/todo.txt"
+export DONE_FILE="\$TODO_DIR/done.txt"
+export REPORT_FILE="\$TODO_DIR/report.txt"
+export TMP_FILE="\$TODO_DIR/todo.tmp"
+touch used_config
+EOF
+
+rm -f used_config
+test_expect_success 'config file (default location 1)' '
+ mkdir .todo
+ cp test.cfg .todo/config
+ todo.sh > output;
+ test_cmp expect output && test -f used_config &&
+ rm -rf .todo
+'
+
+rm -f used_config
+test_expect_success 'config file (default location 2)' '
+ cp test.cfg todo.cfg
+ todo.sh > output;
+ test_cmp expect output && test -f used_config &&
+ rm -f todo.cfg
+'
+
+rm -f used_config
+test_expect_success 'config file (default location 3)' '
+ cp test.cfg .todo.cfg
+ todo.sh > output;
+ test_cmp expect output && test -f used_config &&
+ rm -f .todo.cfg
+'
+
+rm -f used_config
+test_expect_success 'config file (command line)' '
+ todo.sh -d test.cfg > output;
+ test_cmp expect output && test -f used_config
+'
+
+rm -f used_config
+test_expect_success 'config file (env variable)' '
+ TODOTXT_CFG_FILE=test.cfg todo.sh > output;
+ test_cmp expect output && test -f used_config
+'
+
+test_done
View
103 scripts/todo/tests/t0001-null.sh
@@ -0,0 +1,103 @@
+#!/bin/sh
+
+test_description='todo.sh basic null functionality test.
+
+This test just makes sure the basic commands work,
+when there are no todos.
+'
+. ./test-lib.sh
+
+#
+# ls|list
+#
+cat > expect <<EOF
+--
+TODO: 0 of 0 tasks shown
+EOF
+
+test_expect_success 'null ls' '
+ todo.sh ls > output && test_cmp expect output
+'
+test_expect_success 'null list' '
+ todo.sh list > output && test_cmp expect output
+'
+test_expect_success 'null list filter' '
+ todo.sh list filter > output && test_cmp expect output
+'
+
+#
+# lsp|listpri
+#
+# Re-use expect from ls.
+test_expect_success 'null lsp' '
+ todo.sh lsp > output && test_cmp expect output
+'
+test_expect_success 'null listpri' '
+ todo.sh listpri > output && test_cmp expect output
+'
+test_expect_success 'null listpri a' '
+ todo.sh listpri a > output && test_cmp expect output
+'
+
+#
+# lsa|listall
+#
+cat > expect <<EOF
+--
+TODO: 0 of 0 tasks shown
+DONE: 0 of 0 tasks shown
+total 0 of 0 tasks shown
+EOF
+
+test_expect_success 'null lsa' '
+ todo.sh lsa > output && test_cmp expect output
+'
+test_expect_success 'null list' '
+ todo.sh listall > output && test_cmp expect output
+'
+test_expect_success 'null list filter' '
+ todo.sh listall filter > output && test_cmp expect output
+'
+
+
+#
+# lsc|listcon
+#
+test_expect_success 'null lsc' '
+ todo.sh lsc > output && ! test -s output
+'
+test_expect_success 'null listcon' '
+ todo.sh listcon > output && ! test -s output
+'
+
+#
+# lsprj|listproj
+#
+test_expect_success 'null lsprj' '
+ todo.sh lsprj > output && ! test -s output
+'
+test_expect_success 'null listproj' '
+ todo.sh listproj > output && ! test -s output
+'
+
+#
+# lf|listfile
+#
+cat > expect <<EOF
+TODO: File does not exist.
+EOF
+# XXX really should give a better usage error message here.
+test_expect_success 'null lf' '
+ todo.sh lf > output || test_cmp expect output
+'
+test_expect_success 'null listfile' '
+ todo.sh listfile > output || test_cmp expect output
+'
+cat > expect <<EOF
+TODO: File foo.txt does not exist.
+EOF
+test_expect_success 'null listfile foo.txt' '
+ todo.sh listfile foo.txt > output || test_cmp expect output
+'
+
+test_done
View
40 scripts/todo/tests/t0002-actions.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+test_description='todo.sh actions.d
+
+This test just makes sure that todo.sh can locate custom actions.
+'
+. ./test-lib.sh
+
+# All the below tests will output the custom action message
+cat > expect << EOF
+TODO: foo
+EOF
+
+cat > foo << EOF
+echo "TODO: foo"
+EOF
+chmod +x foo
+
+test_expect_success 'custom action (default location 1)' '
+ mkdir .todo.actions.d
+ cp foo .todo.actions.d/
+ todo.sh foo > output;
+ test_cmp expect output && rm -rf .todo.actions.d
+'
+
+test_expect_success 'custom action (default location 2)' '
+ mkdir -p .todo/actions
+ cp foo .todo/actions/
+ todo.sh foo > output;
+ test_cmp expect output && rm -rf .todo/actions
+'
+
+test_expect_success 'custom action (env variable)' '
+ mkdir myactions
+ cp foo myactions/
+ TODO_ACTIONS_DIR=myactions todo.sh foo > output;
+ test_cmp expect output && rm -rf myactions
+'
+
+test_done
View
16 scripts/todo/tests/t0100-code-nobacktick.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+test_description='no old-style backtick command substitution
+
+This test checks the todo.sh script itself for occurrences
+of old-style backtick command substitution, which should be
+replaced with $(...).
+On failure, it will print each offending line number and line.
+'
+. ./test-lib.sh
+
+test_todo_session 'no old-style backtick command substitution' <<EOF
+>>> sed -n -e 's/\(^\|[ \t]\)#.*//' -e '/\`/{' -e '=;p' -e '}' "$(which todo.sh)"
+EOF
+
+test_done
View
113 scripts/todo/tests/t1000-addlist.sh
@@ -0,0 +1,113 @@
+#!/bin/sh
+
+test_description='basic add and list functionality
+
+This test just makes sure the basic add and list
+command work, including support for filtering.
+'
+. ./test-lib.sh
+
+#
+# Add and list
+#
+test_todo_session 'basic add/list' <<EOF
+>>> todo.sh add notice the daisies
+1 notice the daisies
+TODO: 1 added.
+
+>>> todo.sh list
+1 notice the daisies
+--
+TODO: 1 of 1 tasks shown
+
+>>> todo.sh add smell the roses
+2 smell the roses
+TODO: 2 added.
+
+>>> todo.sh list
+1 notice the daisies
+2 smell the roses
+--
+TODO: 2 of 2 tasks shown
+EOF
+
+#
+# Filter
+#
+test_todo_session 'basic list filtering' <<EOF
+>>> todo.sh list daisies
+1 notice the daisies
+--
+TODO: 1 of 2 tasks shown
+
+>>> todo.sh list smell
+2 smell the roses
+--
+TODO: 1 of 2 tasks shown
+EOF
+
+test_todo_session 'case-insensitive filtering' <<EOF
+>>> todo.sh add smell the uppercase Roses
+3 smell the uppercase Roses
+TODO: 3 added.
+
+>>> todo.sh list roses
+2 smell the roses
+3 smell the uppercase Roses
+--
+TODO: 2 of 3 tasks shown
+EOF
+
+test_todo_session 'add with symbols' <<EOF
+>>> todo.sh add "~@#$%^&*()-_=+[{]}|;:',<.>/?"
+4 ~@#$%^&*()-_=+[{]}|;:',<.>/?
+TODO: 4 added.
+
+>>> todo.sh add '\`!\\"'
+5 \`!\\"
+TODO: 5 added.
+
+>>> todo.sh list
+1 notice the daisies
+2 smell the roses
+3 smell the uppercase Roses
+5 \`!\\"
+4 ~@#$%^&*()-_=+[{]}|;:',<.>/?
+--
+TODO: 5 of 5 tasks shown
+EOF
+
+#
+# Advanced add
+#
+
+cat /dev/null > todo.txt
+test_todo_session 'add with spaces' <<EOF
+>>> todo.sh add "notice the three spaces"
+1 notice the three spaces
+TODO: 1 added.
+
+>>> todo.sh add notice how the spaces get lost
+2 notice how the spaces get lost
+TODO: 2 added.
+
+>>> todo.sh list
+2 notice how the spaces get lost
+1 notice the three spaces
+--
+TODO: 2 of 2 tasks shown
+EOF
+
+cat /dev/null > todo.txt
+test_todo_session 'add with CR' <<EOF
+>>> todo.sh add "smell the
+Carriage Return"
+1 smell the Carriage Return
+TODO: 1 added.
+
+>>> todo.sh list
+1 smell the Carriage Return
+--
+TODO: 1 of 1 tasks shown
+EOF
+
View
89 scripts/todo/tests/t1010-add-date.sh
@@ -0,0 +1,89 @@
+#!/bin/sh
+
+test_description='test the date on add feature
+
+Tests paths by which we might automatically add
+a date to each item.
+'
+. ./test-lib.sh
+
+#
+# Add and list
+#
+test_todo_session 'cmd line first day' <<EOF
+>>> todo.sh -t add notice the daisies
+1 2009-02-13 notice the daisies
+TODO: 1 added.
+
+>>> todo.sh list
+1 2009-02-13 notice the daisies
+--
+TODO: 1 of 1 tasks shown
+EOF
+
+test_todo_session 'cmd line first day with priority' <<EOF
+>>> todo.sh -pt add '(A) notice the daisies'
+2 (A) 2009-02-13 notice the daisies
+TODO: 2 added.
+
+>>> todo.sh -p list
+2 (A) 2009-02-13 notice the daisies
+1 2009-02-13 notice the daisies
+--
+TODO: 2 of 2 tasks shown
+
+>>> todo.sh -npf del 2
+2 (A) 2009-02-13 notice the daisies
+TODO: 2 deleted.
+EOF
+
+test_tick
+
+test_todo_session 'cmd line second day' <<EOF
+>>> todo.sh -t add smell the roses
+2 2009-02-14 smell the roses
+TODO: 2 added.
+
+>>> todo.sh list
+1 2009-02-13 notice the daisies
+2 2009-02-14 smell the roses
+--
+TODO: 2 of 2 tasks shown
+EOF
+
+test_tick
+
+test_todo_session 'cmd line third day' <<EOF
+>>> todo.sh -t add mow the lawn
+3 2009-02-15 mow the lawn
+TODO: 3 added.
+
+>>> todo.sh list
+1 2009-02-13 notice the daisies
+2 2009-02-14 smell the roses
+3 2009-02-15 mow the lawn
+--
+TODO: 3 of 3 tasks shown
+EOF
+
+# Switch to config file
+echo "export TODOTXT_DATE_ON_ADD=1" >> todo.cfg
+
+# Bump the clock, for good measure.
+test_tick 3600
+
+test_todo_session 'config file third day' <<EOF
+>>> todo.sh add take out the trash
+4 2009-02-15 take out the trash
+TODO: 4 added.
+
+>>> todo.sh list
+1 2009-02-13 notice the daisies
+2 2009-02-14 smell the roses
+3 2009-02-15 mow the lawn
+4 2009-02-15 take out the trash
+--
+TODO: 4 of 4 tasks shown
+EOF
+
+test_done
View
101 scripts/todo/tests/t1020-addtolistfile.sh
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+test_description='basic addto and list functionality
+
+This test just makes sure the basic addto and listfile
+commands work, including support for filtering.
+'
+. ./test-lib.sh
+
+#
+# Addto and listfile
+#
+test_todo_session 'nonexistant file' <<EOF
+>>> todo.sh addto garden.txt notice the daisies
+TODO: Destination file $HOME/garden.txt does not exist.
+=== 1
+EOF
+
+touch "$HOME/garden.txt"
+
+test_todo_session 'basic addto/listfile' <<EOF
+>>> todo.sh addto garden.txt notice the daisies
+1 notice the daisies
+GARDEN: 1 added.
+
+>>> todo.sh listfile garden.txt
+1 notice the daisies
+--
+GARDEN: 1 of 1 tasks shown
+
+>>> todo.sh addto garden.txt smell the roses
+2 smell the roses
+GARDEN: 2 added.
+
+>>> todo.sh listfile garden.txt
+1 notice the daisies
+2 smell the roses
+--
+GARDEN: 2 of 2 tasks shown
+EOF
+
+#
+# List available files
+#
+test_todo_session 'list available files' <<EOF
+>>> todo.sh listfile
+Files in the todo.txt directory:
+done.txt
+garden.txt
+report.txt
+todo.txt
+
+>>> TODOTXT_VERBOSE=0 todo.sh listfile
+done.txt
+garden.txt
+report.txt
+todo.txt
+EOF
+
+#
+# Filter
+#
+test_todo_session 'basic listfile filtering' <<EOF
+>>> todo.sh listfile garden.txt daisies
+1 notice the daisies
+--
+GARDEN: 1 of 2 tasks shown
+
+>>> todo.sh listfile garden.txt smell
+2 smell the roses
+--
+GARDEN: 1 of 2 tasks shown
+EOF
+
+test_todo_session 'case-insensitive filtering' <<EOF
+>>> todo.sh addto garden.txt smell the uppercase Roses
+3 smell the uppercase Roses
+GARDEN: 3 added.
+
+>>> todo.sh listfile garden.txt roses
+2 smell the roses
+3 smell the uppercase Roses
+--
+GARDEN: 2 of 3 tasks shown
+EOF
+
+test_todo_session 'addto with &' <<EOF
+>>> todo.sh addto garden.txt "dig the garden & water the flowers"
+4 dig the garden & water the flowers
+GARDEN: 4 added.
+
+>>> todo.sh listfile garden.txt
+4 dig the garden & water the flowers
+1 notice the daisies
+2 smell the roses
+3 smell the uppercase Roses
+--
+GARDEN: 4 of 4 tasks shown
+EOF
+
+test_done
View
75 scripts/todo/tests/t1030-addto-date.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+
+test_description='test the date on addto feature
+
+Tests paths by which we might automatically add
+a date to each item.
+'
+. ./test-lib.sh
+
+touch "$HOME/garden.txt"
+
+#
+# Add and list
+#
+test_todo_session 'cmd line first day' <<EOF
+>>> todo.sh -t addto garden.txt notice the daisies
+1 2009-02-13 notice the daisies
+GARDEN: 1 added.
+
+>>> todo.sh listfile garden.txt
+1 2009-02-13 notice the daisies
+--
+GARDEN: 1 of 1 tasks shown
+EOF
+
+test_tick
+
+test_todo_session 'cmd line second day' <<EOF
+>>> todo.sh -t addto garden.txt smell the roses
+2 2009-02-14 smell the roses
+GARDEN: 2 added.
+
+>>> todo.sh listfile garden.txt
+1 2009-02-13 notice the daisies
+2 2009-02-14 smell the roses
+--
+GARDEN: 2 of 2 tasks shown
+EOF
+
+test_tick
+
+test_todo_session 'cmd line third day' <<EOF
+>>> todo.sh -t addto garden.txt mow the lawn
+3 2009-02-15 mow the lawn
+GARDEN: 3 added.
+
+>>> todo.sh listfile garden.txt
+1 2009-02-13 notice the daisies
+2 2009-02-14 smell the roses
+3 2009-02-15 mow the lawn
+--
+GARDEN: 3 of 3 tasks shown
+EOF
+
+# Switch to config file
+echo "export TODOTXT_DATE_ON_ADD=1" >> todo.cfg
+
+# Bump the clock, for good measure.
+test_tick 3600
+
+test_todo_session 'config file third day' <<EOF
+>>> todo.sh addto garden.txt take out the trash
+4 2009-02-15 take out the trash
+GARDEN: 4 added.
+
+>>> todo.sh listfile garden.txt
+1 2009-02-13 notice the daisies
+2 2009-02-14 smell the roses
+3 2009-02-15 mow the lawn
+4 2009-02-15 take out the trash
+--
+GARDEN: 4 of 4 tasks shown
+EOF