X-Git-Url: https://git.madduck.net/code/vcsh.git/blobdiff_plain/ecb36d5d99bdcebd781c5cb17780f51020f896b7..7e33e38a869989d04d12f2ef160d514041eb01e3:/vcsh

diff --git a/vcsh b/vcsh
index d6ee234..98b1e6b 100755
--- a/vcsh
+++ b/vcsh
@@ -18,13 +18,14 @@
 basename() {
 	# Implemented in shell to avoid spawning another process
 	local file
-	file="${1##*/}"
+	file="${1%/}"
+	file="${file##*/}"
 	[ -z "$2" ] || file="${file%$2}"
 	echo "$file"
 }
 
 SELF=$(basename $0)
-VERSION='1.20130909'
+VERSION='1.20130909.git-HEAD'
 
 fatal() {
 	echo "$SELF: fatal: $1" >&2
@@ -159,11 +160,11 @@ clone() {
 	for object in $(git ls-tree -r origin/master | awk '{print $4}'); do
 		[ -e "$object" ] &&
 			error "'$object' exists." &&
-			VCSH_CONFLICT=1;
+			VCSH_CONFLICT=1
 	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
@@ -390,46 +391,69 @@ write_gitignore() {
 		fatal "could not move '$tempfile' to '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME'" 53
 }
 
-if [ "$1" = 'clone' ]; then
-	[ -z "$2" ] && fatal "$1: please specify a remote" 1
-	export VCSH_COMMAND="$1"
+debug `git version`
+
+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
+
+export VCSH_COMMAND="$1"
+
+[ "$VCSH_COMMAND" = 'clon' ]   || [ "$VCSH_COMMAND" = 'clo' ]   || [ "$VCSH_COMMAND" = 'cl' ]                                                                && VCSH_COMMAND='clone'
+[ "$VCSH_COMMAND" = 'commi' ]  || [ "$VCSH_COMMAND" = 'comm' ]  || [ "$VCSH_COMMAND" = 'com' ]  || [ "$VCSH_COMMAND" = 'co' ]                                && VCSH_COMMAND='commit'
+[ "$VCSH_COMMAND" = 'delet' ]  || [ "$VCSH_COMMAND" = 'dele' ]  || [ "$VCSH_COMMAND" = 'del' ]  || [ "$VCSH_COMMAND" = 'de' ]                                && VCSH_COMMAND='delete'
+[ "$VCSH_COMMAND" = 'ente' ]   || [ "$VCSH_COMMAND" = 'ent' ]   || [ "$VCSH_COMMAND" = 'en' ]                                                                && VCSH_COMMAND='enter'
+[ "$VCSH_COMMAND" = 'hel' ]    || [ "$VCSH_COMMAND" = 'he' ]                                                                                                 && VCSH_COMMAND='help'
+[ "$VCSH_COMMAND" = 'ini' ]    || [ "$VCSH_COMMAND" = 'in' ]                                                                                                 && VCSH_COMMAND='init'
+[ "$VCSH_COMMAND" = 'pul' ]                                                                                                                                  && VCSH_COMMAND='pull'
+[ "$VCSH_COMMAND" = 'pus' ]                                                                                                                                  && VCSH_COMMAND='push'
+[ "$VCSH_COMMAND" = 'renam' ]  || [ "$VCSH_COMMAND" = 'rena' ]  || [ "$VCSH_COMMAND" = 'ren' ]  || [ "$VCSH_COMMAND" = 're' ]                                && VCSH_COMMAND='rename'
+[ "$VCSH_COMMAND" = 'ru' ]                                                                                                                                   && VCSH_COMMAND='run'
+[ "$VCSH_COMMAND" = 'statu' ]  || [ "$VCSH_COMMAND" = 'stat' ]  || [ "$VCSH_COMMAND" = 'sta' ]  || [ "$VCSH_COMMAND" = 'st' ]                                && VCSH_COMMAND='status'
+[ "$VCSH_COMMAND" = 'upgrad' ] || [ "$VCSH_COMMAND" = 'upgra' ] || [ "$VCSH_COMMAND" = 'upgr' ] || [ "$VCSH_COMMAND" = 'upg' ]                               && VCSH_COMMAND='upgrade'
+[ "$VCSH_COMMAND" = 'versio' ] || [ "$VCSH_COMMAND" = 'versi' ] || [ "$VCSH_COMMAND" = 'vers' ] || [ "$VCSH_COMMAND" = 'ver' ] || [ "$VCSH_COMMAND" = 've' ] && VCSH_COMMAND='version'
+[ "$VCSH_COMMAND" = 'whic' ]   || [ "$VCSH_COMMAND" = 'whi' ]   || [ "$VCSH_COMMAND" = 'wh' ]                                                                && VCSH_COMMAND='which'
+[ "$VCSH_COMMAND" = 'write' ]  || [ "$VCSH_COMMAND" = 'writ' ]  || [ "$VCSH_COMMAND" = 'wri' ]  || [ "$VCSH_COMMAND" = 'wr' ]                                && VCSH_COMMAND='write-gitignore'
+
+
+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 [ "$1" = 'version' ]; then
+elif [ "$VCSH_COMMAND" = 'version' ]; then
 	echo "$SELF $VERSION"
+	git version
 	exit
-elif [ "$1" = 'which' ]; then
-	[ -z "$2" ] && fatal "$1: please specify a filename" 1
-	[ -n "$3" ] && fatal "$1: too many parameters" 1
-	export VCSH_COMMAND="$1"
+elif [ "$VCSH_COMMAND" = 'which' ]; then
+	[ -z "$2" ] && fatal "$VCSH_COMMAND: please specify a filename" 1
+	[ -n "$3" ] && fatal "$VCSH_COMMAND: too many parameters" 1
 	export VCSH_COMMAND_PARAMETER="$2"
-elif [ "$1" = 'delete' ]           ||
-     [ "$1" = 'enter' ]            ||
-     [ "$1" = 'init' ]             ||
-     [ "$1" = 'list-tracked-by' ]  ||
-     [ "$1" = 'rename' ]           ||
-     [ "$1" = 'run' ]              ||
-     [ "$1" = 'upgrade' ]          ||
-     [ "$1" = 'write-gitignore' ]; then
-	[ -z $2 ]                      && fatal "$1: please specify repository to work on" 1
-	[ "$1" = 'rename' -a -z "$3" ] && fatal "$1: please specify a target name" 1
-	[ "$1" = 'run'    -a -z "$3" ] && fatal "$1: please specify a command" 1
-	export VCSH_COMMAND="$1"
+elif [ "$VCSH_COMMAND" = 'delete' ]           ||
+     [ "$VCSH_COMMAND" = 'enter' ]            ||
+     [ "$VCSH_COMMAND" = 'init' ]             ||
+     [ "$VCSH_COMMAND" = 'list-tracked-by' ]  ||
+     [ "$VCSH_COMMAND" = 'rename' ]           ||
+     [ "$VCSH_COMMAND" = 'run' ]              ||
+     [ "$VCSH_COMMAND" = 'upgrade' ]          ||
+     [ "$VCSH_COMMAND" = 'write-gitignore' ]; then
+	[ -z $2 ]                                 && fatal "$VCSH_COMMAND: please specify repository to work on" 1
+	[ "$VCSH_COMMAND" = 'rename' -a -z "$3" ] && fatal "$VCSH_COMMAND: please specify a target name" 1
+	[ "$VCSH_COMMAND" = 'run'    -a -z "$3" ] && fatal "$VCSH_COMMAND: please specify a command" 1
 	export VCSH_REPO_NAME="$2"
 	export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
 	[ "$VCSH_COMMAND" = 'rename' ] && { export VCSH_REPO_NAME_NEW="$3";
 	                                    export GIT_DIR_NEW="$VCSH_REPO_D/$VCSH_REPO_NAME_NEW.git"; }
 	[ "$VCSH_COMMAND" = 'run' ]    && shift 2
-elif [ "$1" = 'commit' ] ||
-     [ "$1" = 'list' ] ||
-     [ "$1" = 'list-tracked' ] ||
-     [ "$1" = 'pull' ] ||
-     [ "$1" = 'push' ]; then
-	export VCSH_COMMAND="$1"
-elif [ "$1" = 'status' ]; then
-	export VCSH_COMMAND="$1"
+elif [ "$VCSH_COMMAND" = 'commit' ] ||
+     [ "$VCSH_COMMAND" = 'list' ] ||
+     [ "$VCSH_COMMAND" = 'list-tracked' ] ||
+     [ "$VCSH_COMMAND" = 'pull' ] ||
+     [ "$VCSH_COMMAND" = 'push' ]; then
+	:
+elif [ "$VCSH_COMMAND" = 'status' ]; then
 	export VCSH_REPO_NAME="$2"
 elif [ -n "$2" ]; then
 	export VCSH_COMMAND='run'
@@ -438,7 +462,7 @@ elif [ -n "$2" ]; then
 	[ -d $GIT_DIR ] || { help; exit 1; }
 	shift 1
 	set -- "git" "$@"
-elif [ -n "$1" ]; then
+elif [ -n "$VCSH_COMMAND" ]; then
 	export VCSH_COMMAND='enter'
 	export VCSH_REPO_NAME="$1"
 	export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"