#!/bin/sh
 
-[ "$VCSH_DEBUG" -gt 0 ] && set -x
+[ -n "$VCSH_DEBUG" ] && set -x
 
 SELF=$(basename $0)
 
 [ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config"
-for check_directory in $XDG_CONFIG_HOME $XDG_CONFIG_HOME/vcsh $XDG_CONFIG_HOME/vcsh/repo.d
+[ -z "$VCSH_BASE" ]       && VCSH_BASE="$XDG_CONFIG_HOME/vcsh/repo.d"
+for check_directory in "$VCSH_BASE"
 do
        if [ ! -d "$check_directory" ]; then
                if [ -e "$check_directory" ]; then
                        echo "$SELF: error: $check_directory exists but is not a directory" >&2
                        exit 2
                else
-                       mkdir $check_directory || (echo "$SELF: error: could not create $check_directory" >&2; exit 2)
+                       mkdir -p "$check_directory" || (echo "$SELF: error: could not create $check_directory" >&2; exit 2)
                fi
        fi
 done
 
-VCSH_BASE="$XDG_CONFIG_HOME/vcsh/repo.d"
-
 debug() {
        [ -n "$VCSH_DEBUG" ] && echo "$SELF: debug: $1"
 }
        if [ -n "$VCSH_DEBUG" ] || [ -n "$VCSH_VERBOSE" ]; then echo "$SELF: verbose: $1"; fi
 }
 
+#   use <repo>     Use this repository
+#
+#   exit              Exit vcsh mode" >&2
 help() {
        echo "usage: $SELF <args>
 
-   help           Display this help
-
-   list           List all repos
+   help              Display this help
 
-   use <repo>     Use this repository
-   run <repo>
-       <command>  Use this repository
+   list              List all repos
 
-   init           Initialize a new repository
-   clone <remote>
-         [<repo>] Clone from an existing repository
+   run <repo> \\
+       <command>     Use this repository
 
-   exit           Exit vcsh mode" >&2
+   init <repo>       Initialize a new repository
+   clone <remote> \\
+         [<repo>]    Clone from an existing repository
+   seed-gitignore \\
+   <repo>            Seed .gitignore.d/<repo> from git ls-files" >&2
 }
 
 use() {
-       verbose "use() start"
+       verbose "use() begin"
        REPO_NAME="$1"
        GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
 
        export GIT_DIR
        export GIT_WORK_TREE="$(git config --get core.worktree)"
        export VCSH_DIRECTORY="$REPO_NAME"
-       verbose "use() stop"
+       verbose "use() end"
 }
 
 init() {
-       verbose "init() start"
+       verbose "init() begin"
        [ -e "$GIT_DIR" ] &&
                echo "$SELF: fatal: $GIT_DIR exists" &&
                return 21
        export GIT_WORK_TREE="$HOME"
-       mkdir -p $GIT_WORK_TREE
-       cd $GIT_WORK_TREE ||
+       mkdir -p "$GIT_WORK_TREE"
+       cd "$GIT_WORK_TREE" ||
                (echo "$SELF: fatal: could not enter $GIT_WORK_TREE" &&
                 exit 20) || exit 20
-       cd $GIT_WORK_TREE
+       cd "$GIT_WORK_TREE"
        git init
-       git config core.worktree $GIT_WORK_TREE
-       verbose "init() stop"
+       git config core.worktree "$GIT_WORK_TREE"
+       verbose "init() end"
 }
 
 leave() {
        exit $?
 
 elif [ "$1" = 'list' ]; then
-       verbose "list start"
-       for i in $VCSH_BASE/*.git; do
-               echo $(basename $i .git)
+       verbose "list begin"
+       for i in "$VCSH_BASE"/*.git; do
+               echo $(basename "$i" .git)
        done
-       verbose "list stop"
+       verbose "list end"
        exit 0
 
 elif [ "$1" = 'run' ]; then
-       verbose "run start"
-       use $2
+       verbose "run begin"
+       use "$2"
        shift 2
        "$@"
        leave
-       verbose "run start"
+       verbose "run end"
        exit 0
 
-elif [ "$1" = 'use' ]; then
-       verbose "use start"
-       if [ -n "$ZSH_VERSION" ]; then
-               if [ -o NO_IGNORE_EOF ]; then
-                       export VCSH_NO_IGNORE_EOF=1
-                       setopt IGNORE_EOF
-               fi
-               vcsh_exit() {
-                       vcsh exit;
-                       zle reset-prompt;
-               }
-               zle -N vcsh_exit
-               bindkey '^d' 'vcsh_exit'
-       fi
-       use $2
-       [ -n "$ZSH_VERSION" ] && [ "$USER" = richih ] && buildPS1
-       verbose "use stop"
-       exit 0
+#elif [ "$1" = 'use' ]; then
+#      verbose "use begin"
+#      if [ -n "$ZSH_VERSION" ]; then
+#              if [ -o NO_IGNORE_EOF ]; then
+#                      export VCSH_NO_IGNORE_EOF=1
+#                      setopt IGNORE_EOF
+#              fi
+#              vcsh_exit() {
+#                      vcsh exit;
+#                      zle reset-prompt;
+#              }
+#              zle -N vcsh_exit
+#              bindkey '^d' 'vcsh_exit'
+#      fi
+#      use $2
+#      [ -n "$ZSH_VERSION" ] && [ "$USER" = richih ] && buildPS1
+#      verbose "use end"
+#      exit 0
 
 elif [ "$1" = 'clone' ]; then
-       verbose "clone start"
+       verbose "clone begin"
        GIT_REMOTE="$2"
        REPO_NAME="$3"
-       [ -z "$REPO_NAME" ] && REPO_NAME=$(basename $GIT_REMOTE .git)
+       [ -z "$REPO_NAME" ] && REPO_NAME=$(basename "$GIT_REMOTE" .git)
        export REPO_NAME
        export GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
        init
 
-       git remote add origin $GIT_REMOTE
+       git remote add origin "$GIT_REMOTE"
        git config branch.master.remote origin
        git config branch.master.merge  refs/heads/master
        git fetch
                        echo "$SELF: error: $object exists." &&
                        VCSH_CONFLICT=1;
        done
-       [ -n "$VCSH_CONFLICT" ] &&
+       [ "$VCSH_CONFLICT" = '1' ] &&
                echo "$SELF: fatal: will stop after fetching and not try to merge!\n" &&
+               echo "  Once this situation has been resolved, run 'vcsh run <foo> git pull' to finish cloning.\n" &&
                exit 3
        git merge origin/master
-       vcsh use $REPO_NAME
+#      vcsh use $REPO_NAME
        verbose "clone end"
 
 elif [ "$1" = 'init' ]; then
-       verbose "init start"
+       verbose "init begin"
+       [ -z $2 ] && help && echo && echo "$SELF $1: please specify repository to work on" && return 0
        export REPO_NAME="$2"
        export GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
        init
-       vcsh use $REPO_NAME
-       verbose "init stop"
-
-elif [ "$1" = 'exit' ]; then
-       verbose "exit start"
-       if [ -n "$ZSH_VERSION" ] && [ -n "$VCSH_NO_IGNORE_EOF" ]; then
-               unset VCSH_NO_IGNORE_EOF
-               setopt NO_IGNORE_EOF
-       fi
-       leave
-       [ -n "$ZSH_VERSION" ] && [ "$USER" = richih ] && buildPS1
-       verbose "exit stop"
-       exit 0
+#      vcsh use "$REPO_NAME"
+       verbose "init end"
+
+#elif [ "$1" = 'exit' ]; then
+#      verbose "exit begin"
+#      if [ -n "$ZSH_VERSION" ] && [ "$VCSH_NO_IGNORE_EOF" = '1' ]; then
+#              unset VCSH_NO_IGNORE_EOF
+#              setopt NO_IGNORE_EOF
+#      fi
+#      leave
+#      [ -n "$ZSH_VERSION" ] && [ "$USER" = richih ] && buildPS1
+#      verbose "exit end"
+#      exit 0
+
+elif [ "$1" = 'seed-gitignore' ]; then
+       verbose "seed-gitignore begin"
+       [ -z $2 ] && help && echo && echo "$SELF $1: please specify repository to work on" && return 0
+       use "$2"
+       files=$(git ls-files)
+       gitignores=$(for file in $(git ls-files); do
+               while true; do
+                       echo $file; new="${file%/*}"
+                       [ "$file" = "$new" ] && break
+                       file="$new"
+               done;
+       done | sort -u | sed 's/^/!/')
+       [ -e .gitignore.d/$2 ] &&
+       echo "$SELF: .gitignore.d/$2 exists, moving it to .gitignore.d/$2.bak" &&
+       mv -f .gitignore.d/$2 .gitignore.d/$2.bak
+       echo '*' > .gitignore.d/$2
+       for gitignore in $gitignores; do
+               echo $gitignore >> .gitignore.d/$2
+       done
 
 else
        verbose "defaulting to calling help()"