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

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:

Initial commit
authorRichard Hartmann <richih.mailinglist@gmail.com>
Thu, 28 Apr 2011 11:51:00 +0000 (13:51 +0200)
committerRichard Hartmann <richih.mailinglist@gmail.com>
Thu, 28 Apr 2011 11:51:00 +0000 (13:51 +0200)
TODO [new file with mode: 0644]
vcsh [new file with mode: 0755]

diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..d273f5d
--- /dev/null
+++ b/TODO
@@ -0,0 +1,8 @@
+* run-time checks for all zsh-specific stuff and make this run with /bin/sh; mostly done
+** vcsh_exit() needs to be wrapped into something that checks if it's being executed by zsh
+** setopt etc: same
+* use PROMPT_SUBST in my own prompt instead of calling buildPS1 again to make this work for everyone, not just me
+* if we are within a vcsh already, only help, run and exit should be allowed
+* ^d re-binding does fail weirdly once i vcsh exit
+* allow vcsh clone <repo>; without <target>
+* set git config core.worktree $HOME or ../../../.. ?
diff --git a/vcsh b/vcsh
new file mode 100755 (executable)
index 0000000..c26b50a
--- /dev/null
+++ b/vcsh
@@ -0,0 +1,132 @@
+#!/bin/sh
+
+#set -x
+
+SELF=$(basename $0)
+[ -z $XDG_CONFIG_HOME ] && XDG_CONFIG_HOME="$HOME/.config"
+VCSH_BASE="$XDG_CONFIG_HOME/vcsh/repo.d"
+
+help() {
+       echo "usage: $SELF <args>
+
+   help           Display this help
+
+   list           List all repos
+
+   use <repo>     Use this repository
+   run <repo>
+       <command>  Use this repository
+
+   init           Initialize a new repository
+   clone <remote>
+         <repo>   Clone from an existing repository
+
+   exit           Exit vcsh mode" >&2
+}
+
+use() {
+       REPO_NAME="$1"
+       GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
+
+       if [ ! -d "$GIT_DIR" ]; then
+               echo E: no repository found for "$REPO_NAME" >&2
+               return 2
+       fi
+
+       export GIT_DIR
+       export GIT_WORK_TREE="$(git config --get core.worktree)"
+       export VCSH_DIRECTORY="$REPO_NAME"
+}
+
+init() {
+       [[ -e $GIT_DIR ]] &&
+               echo "$(basename $0): fatal: $GIT_DIR exists" &&
+               return 21
+       export GIT_WORK_TREE="$HOME"
+       mkdir -p $GIT_WORK_TREE
+       cd $GIT_WORK_TREE ||
+               (echo "$(basename $0): fatal: could not enter $GIT_WORK_TREE" &&
+                exit 20) || exit 20
+       cd $GIT_WORK_TREE
+       git init
+       git config core.worktree $GIT_WORK_TREE
+}
+
+leave() {
+       unset GIT_DIR
+       unset GIT_WORK_TREE
+       unset VCSH_DIRECTORY
+}
+
+if [ "$1" = 'help' ] || [ $# -eq 0 ]; then
+       help
+       [ "$1" = 'help' ]
+       return $?
+
+elif [ "$1" = 'list' ]; then
+       for i in $VCSH_BASE/*.git; do
+               echo $(basename $i .git)
+       done
+       return 0
+
+elif [ "$1" = 'run' ]; then
+       use $2
+       shift 2
+       "$@"
+       leave
+       return 0
+
+elif [ "$1" = 'use' ]; then
+       if [[ -o NO_IGNORE_EOF ]]; then
+               export VCSH_NO_IGNORE_EOF=1
+               setopt IGNORE_EOF
+               vcsh_exit() {vcsh exit; zle reset-prompt}
+               zle -N vcsh_exit
+               bindkey '^d' 'vcsh_exit'
+       fi
+       use $2
+       buildPS1
+       return 0
+
+elif [ "$1" = 'clone' ]; then
+       export GIT_REMOTE="$2"
+       export REPO_NAME="$3"
+       export GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
+       init
+
+       git remote add origin $GIT_REMOTE
+       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 "$(basename $0): error: $i exists." &&
+               CONFLICT=1;
+       done
+       [[ -n $CONFLICT ]] &&
+               echo "$(basename $0): fatal: will stop after fetching and not try to merge!\n" &&
+               exit 3
+       git merge origin/master
+       vcsh use $REPO_NAME
+
+elif [ "$1" = 'init' ]; then
+       export REPO_NAME="$2"
+       export GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
+       init
+       vcsh use $REPO_NAME
+
+elif [ "$1" = 'exit' ]; then
+       if [[ $VCSH_NO_IGNORE_EOF -gt 0 ]]; then
+               unset VCSH_NO_IGNORE_EOF
+               setopt NO_IGNORE_EOF
+       fi
+       leave
+       buildPS1
+       return 0
+
+else
+       help
+       return 3
+
+fi
+