X-Git-Url: https://git.madduck.net/code/vcsh.git/blobdiff_plain/80ebb8dcdf12f32873670c8adcdd8d49ca2c7b01..326493cc7976584bcbe13ab8e01a697a4368f7f9:/vcsh?ds=sidebyside

diff --git a/vcsh b/vcsh
index a578487..358135a 100755
--- a/vcsh
+++ b/vcsh
@@ -5,6 +5,11 @@
 # 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.
 
 [ -n "$VCSH_DEBUG" ]                  && set -vx
 [ -z "$XDG_CONFIG_HOME" ]             && XDG_CONFIG_HOME="$HOME/.config"
@@ -22,9 +27,9 @@ help() {
 
    clone <remote> \\
          [<repo>]       Clone from an existing repository
-   help                 Display this help text
    delete               Delete an existing repository
    enter                Enter repository; spawn new instance of \$SHELL
+   help                 Display this help text
    init <repo>          Initialize a new repository
    list                 List all repositories
    list-tracked         List all files tracked by vcsh
@@ -35,6 +40,7 @@ help() {
    run <repo> \\
        <command>        Use this repository
    setup                Set up repository with recommended settings
+   which <substring>    Find substring in name of any tracked file
    write-gitignore \\
    <repo>               Write .gitignore.d/<repo> via git ls-files
 
@@ -132,8 +138,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
 }
 
@@ -183,6 +189,14 @@ use() {
 	export VCSH_DIRECTORY="$VCSH_REPO_NAME"
 }
 
+which() {
+	for VCSH_REPO_NAME in $(list); do
+		for VCSH_FILE in $(get_files); do
+			echo $VCSH_FILE | grep -q "$VCSH_COMMAND_PARAMETER" && echo "$VCSH_REPO_NAME: $VCSH_FILE"
+		done
+	done | sort -u
+}
+
 write_gitignore() {
 	use
 	cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11
@@ -219,19 +233,24 @@ if [ ! "x$VCSH_GITIGNORE" = 'xexact' ] && [ ! "x$VCSH_GITIGNORE" = 'xrecursive'
 fi
 
 if [ "$1" = 'clone' ]; then
-	[ -z $2 ] && fatal "$1: please specify a remote" 1
+	[ -z "$2" ] && fatal "$1: please specify a remote" 1
 	export VCSH_COMMAND="$1"
 	GIT_REMOTE="$2"
 	[ -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" = 'delete' ]          ||
-     [ "$1" = 'enter' ]           ||
-     [ "$1" = 'init' ]            ||
-     [ "$1" = 'list-tracked-by' ] ||
-     [ "$1" = 'rename' ]          ||
-     [ "$1" = 'run' ]             ||
-     [ "$1" = 'setup' ]           ||
+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"
+	export VCSH_COMMAND_PARAMETER="$2"
+elif [ "$1" = 'delete' ]           ||
+     [ "$1" = 'enter' ]            ||
+     [ "$1" = 'init' ]             ||
+     [ "$1" = 'list-tracked-by' ]  ||
+     [ "$1" = 'rename' ]           ||
+     [ "$1" = 'run' ]              ||
+     [ "$1" = 'setup' ]            ||
      [ "$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
@@ -284,5 +303,7 @@ done
 
 verbose "$VCSH_COMMAND begin"
 export VCSH_COMMAND=$(echo $VCSH_COMMAND | sed 's/-/_/g')
+hook pre-command
 $VCSH_COMMAND
+hook post-command
 verbose "$VCSH_COMMAND end, exiting"