X-Git-Url: https://git.madduck.net/code/vcsh.git/blobdiff_plain/189cb6bd1558c7cb4aabd9fa05624e44ce0afa3d..bcf33dd42f50079d4c2c19c64d2403435188cc3d:/vcsh?ds=sidebyside diff --git a/vcsh b/vcsh index ba0049e..496a43f 100755 --- a/vcsh +++ b/vcsh @@ -5,26 +5,81 @@ # For details, see LICENSE. To submit patches, you have to agree to # license your code under the GNU GPL version 2 or later. +# While the following is not legally binding, the author would like to +# explain the choice of GPLv2+ over GPLv3+. +# The author prefers GPLv3+ over GPLv2+ but feels it's better to maintain +# full compability with git. In case git ever changes its licensing terms, +# this software will most likely follow suit. +SELF=$(basename $0) + +fatal() { + echo "$SELF: fatal: $1" >&2 + exit $2 +} + +# We need to run getops as soon as possible so we catch -d and other +# options that will modify our behaviour. +# Commands are handled at the end of this script. +while getopts "c:dv" flag; do + if [ "$1" = '-d' ] || [ "$1" = '--debug' ]; then + set -vx + VCSH_DEBUG=1 + shift 1 + elif [ "$1" = '-v' ];then + VCSH_VERBOSE=1 + elif [ "$1" = '-c' ];then + 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' -SELF=$(basename $0) help() { - echo "usage: $SELF + echo "usage: $SELF + options: + -c Source file + -d Enable debug mode + -v Enable verbose mode + + commands: clone \\ [] Clone from an existing repository + delete Delete an existing repository + enter Enter repository; spawn new instance of \$SHELL help Display this help text - delete Delete an existing repository - enter Enter repository; spawn new instance of \$SHELL init Initialize a new repository list List all repositories list-tracked List all files tracked by vcsh @@ -34,7 +89,7 @@ help() { Rename repository run \\ Use this repository - setup Set up repository with recommended settings + setup Set up repository with recommended settings which Find substring in name of any tracked file write-gitignore \\ Write .gitignore.d/ via git ls-files @@ -51,11 +106,6 @@ verbose() { if [ -n "$VCSH_DEBUG" ] || [ -n "$VCSH_VERBOSE" ]; then echo "$SELF: verbose: $@"; fi } -fatal() { - echo "$SELF: fatal: $1" >&2 - exit $2 -} - error() { echo "$SELF: error: $1" >&2 } @@ -133,8 +183,8 @@ init() { } list() { - for i in "$VCSH_REPO_D"/*.git; do - echo $(basename "$i" .git) + for repo in "$VCSH_REPO_D"/*.git; do + [ -d "$repo" ] && [ -r "$repo" ] && echo $(basename "$repo" .git) done }