if [ "$1" = '-d' ] || [ "$1" = '--debug' ]; then
set -vx
VCSH_DEBUG=1
- shift 1
elif [ "$1" = '-v' ];then
VCSH_VERBOSE=1
elif [ "$1" = '-c' ];then
- # Source $OPTARG if it can be read and has an absolute or relative
- # path or is in $PATH
- if [ -r "$OPTARG" ]; then
- . "$OPTARG"
- else
- fatal "Can not read configuration file '$OPTARG'" 1
- fi
+ VCSH_OPTION_CONFIG=$OPTARG
fi
+ shift 1
done
+source_all() {
+ # Source file even if it's in $PWD and does not have any slashes in it
+ case "$1" in
+ */*) . "$1";;
+ *) . "$PWD/$1";;
+ esac;
+}
+
+# Read configuration and set defaults if anything's not set
[ -n "$VCSH_DEBUG" ] && set -vx
[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config"
+
+# Read configuration files if there are any
+[ -r "/etc/vcsh/config" ] && . "/etc/vcsh/config"
[ -r "$XDG_CONFIG_HOME/vcsh/config" ] && . "$XDG_CONFIG_HOME/vcsh/config"
+if [ -n "$VCSH_OPTION_CONFIG" ]; then
+ # Source $VCSH_OPTION_CONFIG if it can be read and is in $PWD of $PATH
+ if [ -r "$VCSH_OPTION_CONFIG" ]; then
+ source_all "$VCSH_OPTION_CONFIG"
+ else
+ fatal "Can not read configuration file '$VCSH_OPTION_CONFIG'" 1
+ fi
+fi
[ -n "$VCSH_DEBUG" ] && set -vx
+
+# Read defaults
[ -z "$VCSH_REPO_D" ] && VCSH_REPO_D="$XDG_CONFIG_HOME/vcsh/repo.d"
[ -z "$VCSH_HOOK_D" ] && VCSH_HOOK_D="$XDG_CONFIG_HOME/vcsh/hooks-enabled"
[ -z "$VCSH_BASE" ] && VCSH_BASE="$HOME"
[ -z "$VCSH_GITIGNORE" ] && VCSH_GITIGNORE='exact'
+
help() {
echo "usage: $SELF <options> <command>
options:
- -c <file> Source file prior to other configuration files
+ -c <file> Source file
-d Enable debug mode
- -d Enable verbose mode
+ -v Enable verbose mode
commands:
clone <remote> \\
[<repo>] Clone from an existing repository
- delete Delete an existing repository
- enter Enter repository; spawn new instance of \$SHELL
+ delete <repo> Delete an existing repository
+ enter <repo> Enter repository; spawn new instance of \$SHELL
help Display this help text
init <repo> Initialize a new repository
list List all repositories
<newname> Rename repository
run <repo> \\
<command> Use this repository
- setup Set up repository with recommended settings
+ setup <repo> Set up repository with recommended settings
which <substring> Find substring in name of any tracked file
write-gitignore \\
<repo> Write .gitignore.d/<repo> via git ls-files
delete() {
cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11
use
- info "This operation WILL DETROY DATA!"
+ info "This operation WILL DESTROY DATA!"
files=$(git ls-files)
echo "These files will be deleted:
for file in $files; do
rm -f $file || info "could not delete '$file', continuing with deletion"
done
- rm -r "$GIT_DIR" || error "could not delete '$GIT_DIR'"
+ rm -rf "$GIT_DIR" || error "could not delete '$GIT_DIR'"
}
enter() {
run() {
hook pre-run
use
- $VCSH_EXTERNAL_COMMAND
+ "$@"
hook post-run
}
export VCSH_REPO_NAME="$2"
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
[ "$VCSH_COMMAND" = 'rename' ] && export GIT_DIR_NEW="$VCSH_REPO_D/$3.git"
- [ "$VCSH_COMMAND" = 'run' ] && shift 2 && export VCSH_EXTERNAL_COMMAND="$*"
+ [ "$VCSH_COMMAND" = 'run' ] && shift 2
[ "$VCSH_COMMAND" = 'write-gitignore' ]
elif [ "$1" = 'list' ] ||
[ "$1" = 'list-tracked' ]; then
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
[ -d $GIT_DIR ] || { help; exit 1; }
shift 1
- export VCSH_EXTERNAL_COMMAND="git $*"
+ set -- "git" "$@"
elif [ -n "$1" ]; then
export VCSH_COMMAND='enter'
export VCSH_REPO_NAME="$1"
verbose "$VCSH_COMMAND begin"
export VCSH_COMMAND=$(echo $VCSH_COMMAND | sed 's/-/_/g')
hook pre-command
-$VCSH_COMMAND
+$VCSH_COMMAND "$@"
hook post-command
verbose "$VCSH_COMMAND end, exiting"