#!/bin/sh
-[ -n "$VCSH_DEBUG" ] && set -x
+[ -n "$VCSH_DEBUG" ] && set -vx
[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config"
[ -z "$VCSH_BASE" ] && VCSH_BASE="$XDG_CONFIG_HOME/vcsh/repo.d"
enter Enter repository; spawn new $SHELL
init <repo> Initialize a new repository
list List all repositories
+ list-tracked List all files tracked by vcsh
+ list-tracked-by \\
+ <repo> List files tracked by a repository
rename <repo> \\
<newname> Rename repository
run <repo> \\
done
}
-#get_files() {
-# return $(git ls-files)
-#}
-#
-#list_tracked_all() {
-# use
-# for repo in $(list); do
-# files="$files $(get_files $repo)"
-# done
-# echo $files | sort -u
-#}
+get_files() {
+ export GIT_DIR="$VCSH_BASE/$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
+}
rename() {
git_dir_exists
git config core.worktree "$GIT_WORK_TREE"
git config core.excludesfile ".gitignore.d/$VCSH_REPO_NAME"
git config vcsh.vcsh 'true'
- touch "$HOME/.gitignore.d/$VCSH_REPO_NAME" || error "could not touch '$HOME/.gitignore.d/$VCSH_REPO_NAME'"
- git add "$HOME/.gitignore.d/$VCSH_REPO_NAME"
+ [ -e "$HOME/.gitignore.d/$VCSH_REPO_NAME" ] && git add -f "$HOME/.gitignore.d/$VCSH_REPO_NAME"
}
use() {
elif [ "$1" = 'delete' ] ||
[ "$1" = 'enter' ] ||
[ "$1" = 'init' ] ||
- [ "$1" = 'list-tracked-all' ] ||
+ [ "$1" = 'list-tracked-by' ] ||
[ "$1" = 'rename' ] ||
[ "$1" = 'run' ] ||
[ "$1" = 'seed-gitignore' ] ||
export VCSH_REPO_NAME="$2"
export GIT_DIR="$VCSH_BASE/$VCSH_REPO_NAME.git"
[ "$VCSH_COMMAND" = 'rename' ] && export GIT_DIR_NEW="$VCSH_BASE/$3.git"
- if [ "$VCSH_COMMAND" = 'run' ]; then
- shift 2
- export VCSH_EXTERNAL_COMMAND="$*"
- echo $VCSH_REPO_NAME | grep -q '/' && export GIT_DIR=$VCSH_REPO_NAME
- fi
+ [ "$VCSH_COMMAND" = 'run' ] && shift 2 && export VCSH_EXTERNAL_COMMAND="$*"
[ "$VCSH_COMMAND" = 'seed-gitignore' ]
-# [ "$VCSH_COMMAND" = 'seed-gitignore' ] && export VCSH_COMMAND='seed_gitignore'
-elif [ "$1" = 'list' ]; then
+elif [ "$1" = 'list' ] ||
+ [ "$1" = 'list-tracked' ]; then
export VCSH_COMMAND="$1"
-elif [ -n "$1" ]; then
- export VCSH_COMMAND=run
+elif [ -n "$1" -a -n "$2" ]; then
+ export VCSH_COMMAND='run'
export VCSH_REPO_NAME="$1"
export GIT_DIR="$VCSH_BASE/$VCSH_REPO_NAME.git"
[ -d $GIT_DIR ] || { help; exit 1; }
shift 1
export VCSH_EXTERNAL_COMMAND="git $*"
+elif [ -n "$1" ]; then
+ export VCSH_COMMAND='enter'
+ export VCSH_REPO_NAME="$1"
+ export GIT_DIR="$VCSH_BASE/$VCSH_REPO_NAME.git"
+ [ -d $GIT_DIR ] || { help; exit 1; }
else
# $1 is empty, or 'help'
help && exit
fi
+# Did we receive a directory instead of a name?
+# Mangle the input to fit normal operation.
+if echo $VCSH_REPO_NAME | grep -q '/'; then
+ export GIT_DIR=$VCSH_REPO_NAME
+ export VCSH_REPO_NAME=$(basename $VCSH_REPO_NAME .git)
+fi
+
+
for check_directory in "$VCSH_BASE" "$HOME/.gitignore.d"
do
if [ ! -d "$check_directory" ]; then