As noted earlier, `vcsh` will set <$GIT_DIR> and <$GIT_WORK_TREE> to the
appropriate values for fake bare git repositories.
+## CONFIG
+
+There are several ways to turn the various knobs on `vcsh`. In order of
+ascending precedence, they are:
+
+* `VARIABLE=foo vcsh`
+* </etc/vcsh/config>
+* <$XDG_CONFIG_HOME/vcsh/config>
+* `vcsh -c <file>`
+
+Please note that those files are sourced. Any and all commands will be
+executed in the context of your shell.
+
+Interesting knobs you can turn:
+
+* <$VCSH_GITIGNORE>:
+ Can be either <exact> or <recursive>.
+
+ <exact> will seed the repo-specific <.gitignore> with all file and directory
+ names which `git ls-files` returns.
+
+ <recursive> will descend through all directories recursively additionally to
+ the above.
+
+ Defaults to <exact>.
+
+Less interesting knobs you could turn:
+
+* <$VCSH_DEBUG>:
+ Enter debug mode.
+
+* <$XDG_CONFIG_HOME>:
+ As specified in the 'XDG Base Directory Specification', see
+ <http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>
+
+ Defaults to <$HOME/.config>.
+
+* <$VCSH_REPO_D>:
+ The directory where repositories are read from and stored.
+
+ Defaults to <$XDG_CONFIG_HOME/vcsh/repo.d>.
+
+* <$VCSH_HOOK_D>:
+ The directory where hooks are read from.
+
+ Defaults to <$XDG_CONFIG_HOME/vcsh/hooks-enabled>.
+
+* <$VCSH_BASE>:
+ The directory where repositories are checked out to.
+
+ Defaults to <$HOME>.
+
+
## HOOK SYSTEM
`vcsh` provides a hook system. Hook scripts must be executable and should be
## SECURITY CONSIDERATIONS
-`vcsh` allows you to execute arbitrary commands via `vcsh` run. For example,
+`vcsh` allows you to execute arbitrary commands via `vcsh run`. For example,
adding a `sudo`(8) rule for `vcsh` would be pretty stupid.
-Additionally, vcsh will source, i.e. execute, <$XDG_CONFIG_HOME/vcsh/config>.
-You can put any and all commands into this config file and they will be executed.
+Additionally, vcsh will source, i.e. execute, all files listed in <CONFIG>.
+You can put any and all commands into these config files and they will be
+executed.
## BUGS
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
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