From 1588d3349f76052c29b9767e14ef74b8f672e8be Mon Sep 17 00:00:00 2001
From: Richard Hartmann <richih.mailinglist@gmail.com>
Date: Sun, 18 Sep 2011 01:20:02 +0200
Subject: [PATCH] Made fully(?) POSIX shell compliant, some minor cleanups

* This version should be fully POSIX shell compliant
* Quoted all variables withing [ ]
* Added debugging and verbose output via shell variables
* Cleaned up INSTALL
---
 INSTALL | 10 ++++----
 vcsh    | 71 ++++++++++++++++++++++++++++++++++++++-------------------
 2 files changed, 53 insertions(+), 28 deletions(-)

diff --git a/INSTALL b/INSTALL
index 5813f80..897c5eb 100644
--- a/INSTALL
+++ b/INSTALL
@@ -5,19 +5,19 @@ mkdir -p ~/work/git
 cd !$
 
 # Clone vcsh and make it available
-git clone git://github.com/RichiH/vcsh.git vcsh-readonly
-PATH+=":/home/richih/work/git/vcsh-readonly"
+git clone git://github.com/RichiH/vcsh.git vcsh
+PATH+=":$HOME/work/git/vcsh"
 export PATH
 
 # Grab my mr config. see below for details on how I set this up
-zsh ~/work/git/vcsh-readonly/vcsh clone ssh://<remote>/mr.git
+~/work/git/vcsh/vcsh clone ssh://<remote>/mr.git
 cd ~/.config/mr/config.d/
 ln -s ../available.d/* .
 
 # make vcsh work by default. Adapt for Bash etc as needed
 cd
-zsh ~/work/git/vcsh-readonly/vcsh clone ssh://<remote>/zsh.git
-ln -s ~/work/git/vcsh-readonly/vcsh .zsh/functions
+zsh ~/work/git/vcsh/vcsh clone ssh://<remote>/zsh.git
+ln -s ~/work/git/vcsh/vcsh .zsh/functions
 zsh
 
 
diff --git a/vcsh b/vcsh
index c4423fd..eb852a0 100755
--- a/vcsh
+++ b/vcsh
@@ -1,14 +1,14 @@
 #!/bin/sh
 
-#set -x
+[ "$VCSH_DEBUG" -gt 0 ] && set -x
 
 SELF=$(basename $0)
 
-[ -z $XDG_CONFIG_HOME ] && XDG_CONFIG_HOME="$HOME/.config"
+[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config"
 for check_directory in $XDG_CONFIG_HOME $XDG_CONFIG_HOME/vcsh $XDG_CONFIG_HOME/vcsh/repo.d
 do
-	if [ ! -d $check_directory ]; then
-		if [ -e $check_directory ]; then
+	if [ ! -d "$check_directory" ]; then
+		if [ -e "$check_directory" ]; then
 			echo "$SELF: error: $check_directory exists but is not a directory" >&2
 			exit 2
 		else
@@ -19,6 +19,14 @@ done
 
 VCSH_BASE="$XDG_CONFIG_HOME/vcsh/repo.d"
 
+debug() {
+	[ -n "$VCSH_DEBUG" ] && echo "$SELF: debug: $1"
+}
+
+verbose() {
+	if [ -n "$VCSH_DEBUG" ] || [ -n "$VCSH_VERBOSE" ]; then echo "$SELF: verbose: $1"; fi
+}
+
 help() {
 	echo "usage: $SELF <args>
 
@@ -38,6 +46,7 @@ help() {
 }
 
 use() {
+	verbose "use() start"
 	REPO_NAME="$1"
 	GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
 
@@ -49,10 +58,12 @@ use() {
 	export GIT_DIR
 	export GIT_WORK_TREE="$(git config --get core.worktree)"
 	export VCSH_DIRECTORY="$REPO_NAME"
+	verbose "use() stop"
 }
 
 init() {
-	[[ -e $GIT_DIR ]] &&
+	verbose "init() start"
+	[ -e "$GIT_DIR" ] &&
 		echo "$SELF: fatal: $GIT_DIR exists" &&
 		return 21
 	export GIT_WORK_TREE="$HOME"
@@ -63,6 +74,7 @@ init() {
 	cd $GIT_WORK_TREE
 	git init
 	git config core.worktree $GIT_WORK_TREE
+	verbose "init() stop"
 }
 
 leave() {
@@ -71,45 +83,52 @@ leave() {
 	unset VCSH_DIRECTORY
 }
 
-if [ "$1" = 'help' ] || [ $# -eq 0 ]; then
+if [ "$1" = 'help' ] || [ "$#" -eq 0 ]; then
 	help
 	[ "$1" = 'help' ]
 	exit $?
 
 elif [ "$1" = 'list' ]; then
+	verbose "list start"
 	for i in $VCSH_BASE/*.git; do
 		echo $(basename $i .git)
 	done
+	verbose "list stop"
 	exit 0
 
 elif [ "$1" = 'run' ]; then
+	verbose "run start"
 	use $2
 	shift 2
 	"$@"
 	leave
+	verbose "run start"
 	exit 0
 
 elif [ "$1" = 'use' ]; then
-	if [[ -o NO_IGNORE_EOF ]]; then
-		export VCSH_NO_IGNORE_EOF=1
-		setopt IGNORE_EOF
-		if [[ -n $ZSH_VERSION ]]; then
-			vcsh_exit() {
-				vcsh exit;
-				zle reset-prompt;
-			}
+	verbose "use start"
+	if [ -n "$ZSH_VERSION" ]; then
+		if [ -o NO_IGNORE_EOF ]; then
+			export VCSH_NO_IGNORE_EOF=1
+			setopt IGNORE_EOF
 		fi
+		vcsh_exit() {
+			vcsh exit;
+			zle reset-prompt;
+		}
 		zle -N vcsh_exit
 		bindkey '^d' 'vcsh_exit'
 	fi
 	use $2
-	buildPS1
+	[ -n "$ZSH_VERSION" ] && [ "$USER" = richih ] && buildPS1
+	verbose "use stop"
 	exit 0
 
 elif [ "$1" = 'clone' ]; then
+	verbose "clone start"
 	GIT_REMOTE="$2"
 	REPO_NAME="$3"
-	[[ -z $REPO_NAME ]] && REPO_NAME=$(basename $GIT_REMOTE .git)
+	[ -z "$REPO_NAME" ] && REPO_NAME=$(basename $GIT_REMOTE .git)
 	export REPO_NAME
 	export GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
 	init
@@ -118,33 +137,39 @@ elif [ "$1" = 'clone' ]; then
 	git config branch.master.remote origin
 	git config branch.master.merge  refs/heads/master
 	git fetch
-	for i in $(git ls-tree -r origin/master | awk '{print $4}'); do
-	[[ -e $i ]] &&
-		echo "$SELF: error: $i exists." &&
-		CONFLICT=1;
+	for object in $(git ls-tree -r origin/master | awk '{print $4}'); do
+		[ -e "$object" ] &&
+			echo "$SELF: error: $object exists." &&
+			VCSH_CONFLICT=1;
 	done
-	[[ -n $CONFLICT ]] &&
+	[ -n "$VCSH_CONFLICT" ] &&
 		echo "$SELF: fatal: will stop after fetching and not try to merge!\n" &&
 		exit 3
 	git merge origin/master
 	vcsh use $REPO_NAME
+	verbose "clone end"
 
 elif [ "$1" = 'init' ]; then
+	verbose "init start"
 	export REPO_NAME="$2"
 	export GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
 	init
 	vcsh use $REPO_NAME
+	verbose "init stop"
 
 elif [ "$1" = 'exit' ]; then
-	if [[ $VCSH_NO_IGNORE_EOF -gt 0 ]]; then
+	verbose "exit start"
+	if [ -n "$ZSH_VERSION" ] && [ -n "$VCSH_NO_IGNORE_EOF" ]; then
 		unset VCSH_NO_IGNORE_EOF
 		setopt NO_IGNORE_EOF
 	fi
 	leave
-	buildPS1
+	[ -n "$ZSH_VERSION" ] && [ "$USER" = richih ] && buildPS1
+	verbose "exit stop"
 	exit 0
 
 else
+	verbose "defaulting to calling help()"
 	help
 	exit 3
 
-- 
GitLab