diff --git a/README.md b/README.md index f30545d1ebfd8b10c3bec43325bdb3bba0e0136e..c0585d237617259e167c1ca5670d5d4c831a9bc8 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ community around the general idea of version controlling your (digital) life. * IRC: #vcs-home on irc.oftc.net -* Mailing list: vcs-home@lists.madduck.net +* Mailing list: http://lists.madduck.net/listinfo/vcs-home * Pull requests or issues on https://github.com/RichiH/vcsh @@ -98,7 +98,7 @@ To illustrate, this is what a possible directory structure looks like. ### available.d ### -The files you see in $XDG_CONFIG_HOME/mr/available.d are mr configuration files +The files you see in $XDG\_CONFIG\_HOME/mr/available.d are mr configuration files that contain the commands to manage (checkout, update etc.) a single repository. vcsh repo configs end in .vcsh, git configs end in .git, etc. This is optional and your preference. For example, this is what a zsh.vcsh @@ -116,7 +116,7 @@ this repository and fork your own. ### config.d ### -$XDG_CONFIG_HOME/mr/available.d contains *all available* repositories. Only +$XDG\_CONFIG\_HOME/mr/available.d contains *all available* repositories. Only files/links present in mr/config.d, however, will be used by mr. That means that in this example, only the zsh, gitconfigs, tmux and vim repositories will be checked out. A simple `mr update` run in $HOME will clone or update those @@ -130,11 +130,13 @@ this: [DEFAULT] jobs = 5 - include = cat $XDG_CONFIG_HOME/mr/config.d/* + # Use if your mr does not have vcsh support in mainline, yet + include = cat /usr/share/mr/vcsh + include = cat ${XDG_CONFIG_HOME:-$HOME/.config}/mr/config.d/* ### repo.d ### -$XDG_CONFIG_HOME/vcsh/repo.d is the directory where all git repositories which +$XDG\_CONFIG\_HOME/vcsh/repo.d is the directory where all git repositories which are under vcsh's control are located. Since their working trees are configured to be in $HOME, the files contained in those repositories will be put in $HOME directly. @@ -185,10 +187,10 @@ Make sure none of the following files and directories exist for your test * ~/.gitignore.d * ~/.mrconfig -* $XDG_CONFIG_HOME/mr/available.d/mr.vcsh -* $XDG_CONFIG_HOME/mr/available.d/zsh.vcsh -* $XDG_CONFIG_HOME/mr/config.d/mr.vcsh -* $XDG_CONFIG_HOME/vcsh/repo.d/mr.git/ +* $XDG\_CONFIG\_HOME/mr/available.d/mr.vcsh +* $XDG\_CONFIG\_HOME/mr/available.d/zsh.vcsh +* $XDG\_CONFIG\_HOME/mr/config.d/mr.vcsh +* $XDG\_CONFIG\_HOME/vcsh/repo.d/mr.git/ All of the files are part of the template repository, the directory is where the template will be stored. diff --git a/doc/hooks b/doc/hooks index 199123fe868cf4be7b5b3f6b638c526d5acea220..036e2dc6a28ca6e76e4a4a504b8a224abee7a21f 100644 --- a/doc/hooks +++ b/doc/hooks @@ -1,4 +1,6 @@ Available hooks are: +pre-command +post-command pre-enter post-enter pre-run diff --git a/doc/vcsh.1.ronn b/doc/vcsh.1.ronn index f9a849fa5817478ce40769ad4bd979d66afd4b52..cc66e075b9ff4b49d220ce9579c95fbce2809589 100644 --- a/doc/vcsh.1.ronn +++ b/doc/vcsh.1.ronn @@ -25,6 +25,8 @@ vcsh(1) - manage config files in $HOME via fake bare git repositories `vcsh` setup <repo> +`vcsh` which <substring> + `vcsh` write-gitignore <repo> `vcsh` <repo> <gitcommand> @@ -98,11 +100,14 @@ an interactive user. * setup: Set up repository with recommended settings. +* which <substring>: + Find <substring> in name of any tracked file. + * write-gitignore: Write .gitignore.d/<repo> via git ls-files. * <repo> <gitcommand>: - Shortcut to run `vcsh` on a repo. Will prepend `git` to <command> by itself. + Shortcut to run `vcsh` on a repo. Will prepend `git` to <command>. * <repo>: Shortcut to run `vcsh enter <repo>`. diff --git a/vcsh b/vcsh index 41d5ed03e5669238a726ea51d0e7af6595d51154..ba0049e542120cf4931ce3652b9b412808bef2b4 100755 --- a/vcsh +++ b/vcsh @@ -35,6 +35,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 @@ -100,7 +101,7 @@ To continue, type 'Yes, do as I say'" for file in $files; do rm -f $file || info "could not delete '$file', continuing with deletion" done - rmdir "$GIT_DIR" || error "could not delete '$GIT_DIR'" + rm -r "$GIT_DIR" || error "could not delete '$GIT_DIR'" } enter() { @@ -183,6 +184,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 +228,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 +298,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"