X-Git-Url: https://git.madduck.net/code/vcsh.git/blobdiff_plain/0083a3e21e81a132a150c1626b4b58d53f73a3c8..4503574f82e5f3ed2581511d0a2d8324b7e091f9:/vcsh?ds=inline diff --git a/vcsh b/vcsh index f987fbf..0c43fd3 100755 --- a/vcsh +++ b/vcsh @@ -15,16 +15,8 @@ # This should always be the first line of code to facilitate debugging [ -n "$VCSH_DEBUG" ] && set -vx -basename() { - # Implemented in shell to avoid spawning another process - local file - file="${1##*/}" - [ -z "$2" ] || file="${file%$2}" - echo "$file" -} - SELF=$(basename $0) -VERSION='1.20130909.git-HEAD' +VERSION='1.20131214.git-HEAD' fatal() { echo "$SELF: fatal: $1" >&2 @@ -40,11 +32,11 @@ while getopts "c:dv" flag; do VCSH_DEBUG=1 echo "debug mode on" echo "$SELF $VERSION" - elif [ "$1" = '-v' ];then + elif [ "$1" = '-v' ]; then VCSH_VERBOSE=1 echo "verbose mode on" echo "$SELF $VERSION" - elif [ "$1" = '-c' ];then + elif [ "$1" = '-c' ]; then VCSH_OPTION_CONFIG=$OPTARG fi shift 1 @@ -61,7 +53,7 @@ source_all() { # Read configuration and set defaults if anything's not set [ -n "$VCSH_DEBUG" ] && set -vx -[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config" +: ${XDG_CONFIG_HOME:=$HOME/.config} # Read configuration files if there are any [ -r "/etc/vcsh/config" ] && . "/etc/vcsh/config" @@ -77,11 +69,11 @@ 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' +: ${VCSH_REPO_D:=$XDG_CONFIG_HOME/vcsh/repo.d} +: ${VCSH_HOOK_D:=$XDH_CONFIG_HOME/vcsh/hooks-enabled} +: ${VCSH_BASE:=$HOME} +: ${VCSH_GITIGNORE:=exact} +: ${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 @@ -163,7 +155,7 @@ clone() { done [ "$VCSH_CONFLICT" = '1' ] && fatal "will stop after fetching and not try to merge! - Once this situation has been resolved, run 'vcsh run $VCSH_REPO_NAME git pull' to finish cloning.\n" 17 + Once this situation has been resolved, run 'vcsh run $VCSH_REPO_NAME git pull' to finish cloning." 17 git merge origin/master hook post-clone retire @@ -255,7 +247,7 @@ list_tracked_by() { pull() { hook pre-pull for VCSH_REPO_NAME in $(list); do - echo -n "$VCSH_REPO_NAME: " + printf "$VCSH_REPO_NAME: " export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" use git pull @@ -267,7 +259,7 @@ pull() { push() { hook pre-push for VCSH_REPO_NAME in $(list); do - echo -n "$VCSH_REPO_NAME: " + printf "$VCSH_REPO_NAME: " export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" use git push @@ -288,7 +280,7 @@ rename() { # Now that the repository has been renamed, we need to fix up its configuration # Overwrite old name.. GIT_DIR="$GIT_DIR_NEW" - $VCSH_REPO_NAME="$VCSH_REPO_NAME_NEW" + VCSH_REPO_NAME="$VCSH_REPO_NAME_NEW" # ..and clobber all old configuration upgrade } @@ -368,7 +360,8 @@ write_gitignore() { # Contrary to GNU mktemp, mktemp on BSD/OSX requires a template for temp files # Use the template GNU mktemo defaults to - tempfile=$(mktemp tmp.XXXXXXXXXX) || fatal "could not create tempfile" 51 + # The downside to this is that we need to account for unset TMPDIR + tempfile=$(mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX") || fatal "could not create tempfile: '${tempfile}'" 51 echo '*' > "$tempfile" || fatal "could not write to '$tempfile'" 57 for gitignore in $gitignores; do @@ -419,6 +412,7 @@ if [ "$VCSH_COMMAND" = 'clone' ]; then [ -z "$2" ] && fatal "$VCSH_COMMAND: please specify a remote" 1 GIT_REMOTE="$2" [ -n "$3" ] && VCSH_REPO_NAME="$3" || VCSH_REPO_NAME=$(basename "$GIT_REMOTE" .git) + [ -z "$VCSH_REPO_NAME" ] && fatal "$VCSH_COMMAND: could not determine repository name" 1 export VCSH_REPO_NAME export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" elif [ "$VCSH_COMMAND" = 'version' ]; then