]> git.madduck.net Git - code/vcsh.git/blobdiff - vcsh

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Apply patch by Ian Campbell
[code/vcsh.git] / vcsh
diff --git a/vcsh b/vcsh
index ce8d385d4fe0a0b550797adfecc43a40e6af64bb..194bb2151c2a94a55098d74edc16176ad07ed2fb 100755 (executable)
--- a/vcsh
+++ b/vcsh
 # full compability with git. In case git ever changes its licensing terms,
 # this software will most likely follow suit.
 
 # full compability with git. In case git ever changes its licensing terms,
 # this software will most likely follow suit.
 
+SELF=$(basename $0)
+
+fatal() {
+       echo "$SELF: fatal: $1" >&2
+       exit $2
+}
+
+# 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
+       if [ "$1" = '-d' ] || [ "$1" = '--debug' ]; then
+               set -vx
+               VCSH_DEBUG=1
+       elif [ "$1" = '-v' ];then
+               VCSH_VERBOSE=1
+       elif [ "$1" = '-c' ];then
+               VCSH_OPTION_CONFIG=$OPTARG
+       fi
+       shift 1
+done
+
+source_all() {
+       # Source file even if it's in $PWD and does not have any slashes in it
+       case "$1" in
+               */*) . "$1";;
+               *)   . "$PWD/$1";;
+       esac;
+}
+
+
+# Read configuration and set defaults if anything's not set
 [ -n "$VCSH_DEBUG" ]                  && set -vx
 [ -z "$XDG_CONFIG_HOME" ]             && XDG_CONFIG_HOME="$HOME/.config"
 [ -n "$VCSH_DEBUG" ]                  && set -vx
 [ -z "$XDG_CONFIG_HOME" ]             && XDG_CONFIG_HOME="$HOME/.config"
+
+# Read configuration files if there are any
+[ -r "/etc/vcsh/config" ]             && . "/etc/vcsh/config"
 [ -r "$XDG_CONFIG_HOME/vcsh/config" ] && . "$XDG_CONFIG_HOME/vcsh/config"
 [ -r "$XDG_CONFIG_HOME/vcsh/config" ] && . "$XDG_CONFIG_HOME/vcsh/config"
+if [ -n "$VCSH_OPTION_CONFIG" ]; then
+       # Source $VCSH_OPTION_CONFIG if it can be read and is in $PWD of $PATH
+       if [ -r "$VCSH_OPTION_CONFIG" ]; then
+               source_all "$VCSH_OPTION_CONFIG"
+       else
+               fatal "Can not read configuration file '$VCSH_OPTION_CONFIG'" 1
+       fi
+fi
 [ -n "$VCSH_DEBUG" ]                  && set -vx
 [ -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_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'
 
-SELF=$(basename $0)
 
 help() {
 
 help() {
-       echo "usage: $SELF <args>
+       echo "usage: $SELF <options> <command>
 
 
+   options:
+   -c <file>            Source file
+   -d                   Enable debug mode
+   -v                   Enable verbose mode
+
+   commands:
    clone <remote> \\
          [<repo>]       Clone from an existing repository
    clone <remote> \\
          [<repo>]       Clone from an existing repository
-   delete               Delete an existing repository
-   enter                Enter repository; spawn new instance of \$SHELL
+   delete <repo>        Delete an existing repository
+   enter <repo>         Enter repository; spawn new instance of \$SHELL
    help                 Display this help text
    init <repo>          Initialize a new repository
    list                 List all repositories
    help                 Display this help text
    init <repo>          Initialize a new repository
    list                 List all repositories
@@ -39,7 +89,7 @@ help() {
           <newname>     Rename repository
    run <repo> \\
        <command>        Use this repository
           <newname>     Rename repository
    run <repo> \\
        <command>        Use this repository
-   setup                Set up repository with recommended settings
+   setup <repo>         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
    which <substring>    Find substring in name of any tracked file
    write-gitignore \\
    <repo>               Write .gitignore.d/<repo> via git ls-files
@@ -56,11 +106,6 @@ verbose() {
        if [ -n "$VCSH_DEBUG" ] || [ -n "$VCSH_VERBOSE" ]; then echo "$SELF: verbose: $@"; fi
 }
 
        if [ -n "$VCSH_DEBUG" ] || [ -n "$VCSH_VERBOSE" ]; then echo "$SELF: verbose: $@"; fi
 }
 
-fatal() {
-       echo "$SELF: fatal: $1" >&2
-       exit $2
-}
-
 error() {
        echo "$SELF: error: $1" >&2
 }
 error() {
        echo "$SELF: error: $1" >&2
 }
@@ -139,7 +184,7 @@ init() {
 
 list() {
        for repo in "$VCSH_REPO_D"/*.git; do
 
 list() {
        for repo in "$VCSH_REPO_D"/*.git; do
-               [ -r "$repo" ] && echo $(basename "$repo" .git)
+               [ -d "$repo" ] && [ -r "$repo" ] && echo $(basename "$repo" .git)
        done
 }
 
        done
 }
 
@@ -169,7 +214,7 @@ rename() {
 run() {
        hook pre-run
        use
 run() {
        hook pre-run
        use
-       $VCSH_EXTERNAL_COMMAND
+       "$@"
        hook post-run
 }
 
        hook post-run
 }
 
@@ -259,7 +304,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"
        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
        [ "$VCSH_COMMAND" = 'write-gitignore' ]
 elif [ "$1" = 'list' ] ||
      [ "$1" = 'list-tracked' ]; then
@@ -270,7 +315,7 @@ elif [ -n "$2" ]; then
        export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
        [ -d $GIT_DIR ] || { help; exit 1; }
        shift 1
        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"
 elif [ -n "$1" ]; then
        export VCSH_COMMAND='enter'
        export VCSH_REPO_NAME="$1"
@@ -304,6 +349,6 @@ done
 verbose "$VCSH_COMMAND begin"
 export VCSH_COMMAND=$(echo $VCSH_COMMAND | sed 's/-/_/g')
 hook pre-command
 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"
 hook post-command
 verbose "$VCSH_COMMAND end, exiting"