+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'
+[ -z "$VCSH_WORKTREE" ] && VCSH_WORKTREE='absolute'
+
+if [ ! "x$VCSH_GITIGNORE" = 'xexact' ] && [ ! "x$VCSH_GITIGNORE" = 'xnone' ] && [ ! "x$VCSH_GITIGNORE" = 'xrecursive' ]; then
+ fatal "'\$VCSH_GITIGNORE' must equal 'exact', 'none', or 'recursive'" 1
+fi
+
+if [ ! "x$VCSH_WORKTREE" = 'xabsolute' ] && [ ! "x$VCSH_WORKTREE" = 'xrelative' ]; then
+ fatal "'\$VCSH_WORKTREE' must equal 'absolute', or 'relative'" 1
+fi
+
+
+help() {
+ echo "usage: $SELF <options> <command>
+
+ options:
+ -c <file> Source file
+ -d Enable debug mode
+ -v Enable verbose mode
+
+ commands:
+ clone <remote> \\
+ [<repo>] Clone from an existing repository
+ commit Commit in all repositories
+ 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
+ list-tracked List all files tracked by vcsh
+ list-tracked-by \\
+ <repo> List files tracked by a repository
+ pull Pull from all vcsh remotes
+ push Push to vcsh remotes
+ rename <repo> \\
+ <newname> Rename repository
+ run <repo> \\
+ <command> Use this repository
+ status [<repo>] Show statuses of all/one vcsh repositories
+ upgrade <repo> Upgrade repository to currently recommended settings
+ version Print version information
+ which <substring> Find substring in name of any tracked file
+ write-gitignore \\
+ <repo> Write .gitignore.d/<repo> via git ls-files
+
+ <repo> <git command> Shortcut to run git commands directly
+ <repo> Shortcut to enter repository" >&2
+}