- verbose "list end"
-
-elif [ "$VCSH_COMMAND" = 'run' ]; then
- verbose "run begin"
- use || return 1
- $VCSH_EXTERNAL_COMMAND
- leave
- verbose "run end"
-
-elif [ "$VCSH_COMMAND" = 'seed-gitignore' ]; then
- verbose "seed-gitignore begin"
- use || return 1
- # Switching directory as this has to be executed from $HOME to be of any use.
- # Going back into old directory at the end in case `vcsh use` is reactivated.
- old_dir="$PWD"
- cd "$HOME"
- git config core.excludesfile ".gitignore.d/$VCSH_REPO_NAME"
+}
+
+init() {
+ [ ! -e "$GIT_DIR" ] || fatal "'$GIT_DIR' exists" 10
+ mkdir -p "$VCSH_BASE" || fatal "could not create '$VCSH_BASE'" 50
+ cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11
+ git init
+ upgrade
+}
+
+list() {
+ for repo in "$VCSH_REPO_D"/*.git; do
+ [ -d "$repo" ] && [ -r "$repo" ] && echo $(basename "$repo" .git)
+ done
+}
+
+get_files() {
+ export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
+ git ls-files
+}
+
+list_tracked() {
+ for VCSH_REPO_NAME in $(list); do
+ get_files
+ done | sort -u
+}
+
+list_tracked_by() {
+ use
+ git ls-files | sort -u
+}
+
+pull() {
+ hook pre-pull
+ for VCSH_REPO_NAME in $(list); do
+ echo -n "$VCSH_REPO_NAME: "
+ export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
+ use
+ git pull
+ done
+ hook post-pull
+}
+
+push() {
+ hook pre-push
+ for VCSH_REPO_NAME in $(list); do
+ echo -n "$VCSH_REPO_NAME: "
+ export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git"
+ use
+ git push
+ done
+ hook post-push
+}
+
+retire() {
+ unset GIT_WORK_TREE
+ unset VCSH_DIRECTORY
+}
+
+rename() {
+ git_dir_exists
+ [ -d "$GIT_DIR_NEW" ] && fatal "'$GIT_DIR_NEW' exists" 54
+ mv -f "$GIT_DIR" "$GIT_DIR_NEW" || fatal "Could not mv '$GIT_DIR' '$GIT_DIR_NEW'" 52
+
+ # Now that the repository has been renamed, we need to fix up its configuration
+ # Overwrite old name..
+ GIT_DIR="$GIT_DIR_NEW"
+ $VCSH_REPO_NAME="$VCSH_REPO_NAME_NEW"
+ # ..and clobber all old configuration
+ upgrade
+}
+
+run() {
+ hook pre-run
+ use
+ "$@"
+ hook post-run
+}
+
+upgrade() {
+ hook pre-upgrade
+ # fake-bare repositories are not bare, actually. Set this to false
+ # because otherwise Git complains "fatal: core.bare and core.worktree
+ # do not make sense"
+ git config core.bare false
+ # in core.worktree, keep a relative reference to the base directory
+ git config core.worktree $(cd $GIT_DIR && GIT_WORK_TREE="$VCSH_BASE" git rev-parse --show-cdup)
+ [ ! "x$VCSH_GITIGNORE" = 'xnone' ] && git config core.excludesfile ".gitignore.d/$VCSH_REPO_NAME"
+ git config vcsh.vcsh 'true'
+ use
+ [ -e "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" ] && git add -f "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME"
+ hook post-upgrade
+}
+
+use() {
+ git_dir_exists
+ export GIT_WORK_TREE="$(git rev-parse --show-toplevel)"
+ 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() {
+ # Don't do anything if the user does not want to write gitignore
+ if [ "x$VCSH_GITIGNORE" = 'xnone' ]; then
+ info "Not writing gitignore as '\$VCSH_GITIGNORE' is set to 'none'"
+ exit
+ fi
+
+ use
+ cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11