X-Git-Url: https://git.madduck.net/code/vcsh.git/blobdiff_plain/2783a60d4aab84128ed175f030fc3cd6f30b3220..525c11f877bcf1df0f259de357c61ee8ff1ae3f5:/vcsh

diff --git a/vcsh b/vcsh
index 496a43f..cf85e7c 100755
--- a/vcsh
+++ b/vcsh
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 # This program is licensed under the GNU GPL version 2 or later.
-# (c) Richard "RichiH" Hartmann <richih.mailinglist@gmail.com>, 2011-2012
+# (c) Richard "RichiH" Hartmann <richih.mailinglist@gmail.com>, 2011-2013
 # For details, see LICENSE. To submit patches, you have to agree to
 # license your code under the GNU GPL version 2 or later.
 
@@ -9,9 +9,19 @@
 # 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,
+# which is admittedly extremely unlikely to the point of being impossible,
 # this software will most likely follow suit.
 
+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.2'
 
 fatal() {
 	echo "$SELF: fatal: $1" >&2
@@ -21,16 +31,16 @@ fatal() {
 # 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
+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
+	shift 1
 done
 
 source_all() {
@@ -89,7 +99,8 @@ help() {
           <newname>     Rename repository
    run <repo> \\
        <command>        Use this repository
-   setup <repo>         Set up repository with recommended settings
+   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
@@ -138,7 +149,7 @@ clone() {
 delete() {
 	cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11
 	use
-	info "This operation WILL DETROY DATA!"
+	info "This operation WILL DESTROY DATA!"
 	files=$(git ls-files)
 	echo "These files will be deleted:
 
@@ -151,7 +162,7 @@ To continue, type 'Yes, do as I say'"
 	for file in $files; do
 		rm -f $file || info "could not delete '$file', continuing with deletion"
 	done
-	rm -r "$GIT_DIR" || error "could not delete '$GIT_DIR'"
+	rm -rf "$GIT_DIR" || error "could not delete '$GIT_DIR'"
 }
 
 enter() {
@@ -168,7 +179,7 @@ git_dir_exists() {
 hook() {
 	for hook in $VCSH_HOOK_D/$1* $VCSH_HOOK_D/$VCSH_REPO_NAME.$1*; do
 		[ -x "$hook" ] || continue
-		info "executing '$hook'"
+		verbose "executing '$hook'"
 		"$hook"
 	done
 }
@@ -179,7 +190,7 @@ init() {
 	mkdir -p "$GIT_WORK_TREE" || fatal "could not create '$GIT_WORK_TREE'" 50
 	cd "$GIT_WORK_TREE" || fatal "could not enter '$GIT_WORK_TREE'" 11
 	git init
-	setup
+	upgrade
 }
 
 list() {
@@ -214,18 +225,18 @@ rename() {
 run() {
 	hook pre-run
 	use
-	$VCSH_EXTERNAL_COMMAND
+	"$@"
 	hook post-run
 }
 
-setup() {
-	hook pre-setup
+upgrade() {
+	hook pre-upgrade
 	use
 	git config core.worktree     "$GIT_WORK_TREE"
 	git config core.excludesfile ".gitignore.d/$VCSH_REPO_NAME"
 	git config vcsh.vcsh         'true'
 	[ -e "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" ] && git add -f "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME"
-	hook post-setup
+	hook post-upgrade
 }
 
 use() {
@@ -255,9 +266,9 @@ write_gitignore() {
 	tempfile=$(mktemp) || fatal "could not create tempfile" 51
 	echo '*' > "$tempfile" || fatal "could not write to '$tempfile'" 57
 	for gitignore in $gitignores; do
-		echo "$gitignore" | sed 's/^/!/' >> "$tempfile" || fatal "could not write to '$tempfile'" 57
+		echo "$gitignore" | sed 's@^@!/@' >> "$tempfile" || fatal "could not write to '$tempfile'" 57
 		if [ x$VCSH_GITIGNORE = x'recursive' ] && [ -d "$gitignore" ]; then
-			{ echo "$gitignore/*" | sed 's/^/!/' >> "$tempfile" || fatal "could not write to '$tempfile'" 57; }
+			{ echo "$gitignore/*" | sed 's@^@!/@' >> "$tempfile" || fatal "could not write to '$tempfile'" 57; }
 		fi
 	done
 	if diff -N "$tempfile" "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" > /dev/null; then
@@ -284,6 +295,9 @@ if [ "$1" = 'clone' ]; then
 	[ -n "$3" ] && VCSH_REPO_NAME="$3" || VCSH_REPO_NAME=$(basename "$GIT_REMOTE" .git)
 	export VCSH_REPO_NAME
 	export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
+elif [ "$1" = 'version' ]; then
+	echo "$SELF $VERSION"
+	exit
 elif [ "$1" = 'which' ]; then
 	[ -z "$2" ] && fatal "$1: please specify a filename" 1
 	[ -n "$3" ] && fatal "$1: too many parameters" 1
@@ -295,7 +309,7 @@ elif [ "$1" = 'delete' ]           ||
      [ "$1" = 'list-tracked-by' ]  ||
      [ "$1" = 'rename' ]           ||
      [ "$1" = 'run' ]              ||
-     [ "$1" = 'setup' ]            ||
+     [ "$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
@@ -304,7 +318,7 @@ elif [ "$1" = 'delete' ]           ||
 	export VCSH_REPO_NAME="$2"
 	export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
 	[ "$VCSH_COMMAND" = 'rename' ]         && export GIT_DIR_NEW="$VCSH_REPO_D/$3.git"
-	[ "$VCSH_COMMAND" = 'run' ] && shift 2 && export VCSH_EXTERNAL_COMMAND="$*"
+	[ "$VCSH_COMMAND" = 'run' ] && shift 2
 	[ "$VCSH_COMMAND" = 'write-gitignore' ]
 elif [ "$1" = 'list' ] ||
      [ "$1" = 'list-tracked' ]; then
@@ -315,7 +329,7 @@ elif [ -n "$2" ]; then
 	export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
 	[ -d $GIT_DIR ] || { help; exit 1; }
 	shift 1
-	export VCSH_EXTERNAL_COMMAND="git $*"
+	set -- "git" "$@"
 elif [ -n "$1" ]; then
 	export VCSH_COMMAND='enter'
 	export VCSH_REPO_NAME="$1"
@@ -349,6 +363,6 @@ done
 verbose "$VCSH_COMMAND begin"
 export VCSH_COMMAND=$(echo $VCSH_COMMAND | sed 's/-/_/g')
 hook pre-command
-$VCSH_COMMAND
+$VCSH_COMMAND "$@"
 hook post-command
 verbose "$VCSH_COMMAND end, exiting"