From: Gernot Schulz Date: Fri, 18 Nov 2011 18:59:45 +0000 (+0100) Subject: Merge branch 'master' into docs X-Git-Url: https://git.madduck.net/code/vcsh.git/commitdiff_plain/8364333583ce45cc41c334a34d4793276f8bf691?hp=2cba2ad7bd28fd65df380511b29527c9e203d3a0 Merge branch 'master' into docs --- diff --git a/README.md b/README.md index 7a2ba04..fce637b 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ and clone a large number of repositories. The use of mr is technically optional To illustrate, this is what a possible directory structure looks like. $HOME - |-- .config + |-- $XDG_CONFIG_HOME (defaults to $HOME/.config) | |-- mr | | |-- available.d | | | |-- zsh.vcsh @@ -84,14 +84,16 @@ To illustrate, this is what a possible directory structure looks like. ### available.d ### -The files you see in ~/.config/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.mrconfig with read-only -access to my zshrc repo looks likes. I.e. in this specific example, push can -not work. +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 +with read-only access to my zshrc repo looks likes. I.e. in this specific +example, push can not work as you will be using the author's repository. This +is for demonstration, only. Of course, you are more than welcome to clone from +this repository and fork your own. - [$HOME/.config/vcsh/repo.d/zsh.git] + [$XDG_CONFIG_HOME/vcsh/repo.d/zsh.git] checkout = vcsh clone 'git://github.com/RichiH/zshrc.git' zsh update = vcsh run zsh git pull push = vcsh run zsh git push @@ -100,7 +102,7 @@ not work. ### config.d ### -~/.config/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 @@ -114,15 +116,16 @@ this: [DEFAULT] jobs = 5 - include = cat ~/.config/mr/config.d/* + include = cat $XDG_CONFIG_HOME/mr/config.d/* ### repo.d ### -~/.config/vcsh/repo.d is the directory into which vcsh clones the git -repositories. Since their working trees are configured to be in $HOME, the -files contained in those repositories will be put in $HOME directly (see .zshrc -above). - +$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. +Of course, [mr] [1] will work with this layout if configured according to this +document (see above). vcsh will check if any file it would want to create exists. If it exists, vcsh will throw a warning and exit. Move away your old config and try again. @@ -166,10 +169,10 @@ Make sure none of the following files and directories exist for your test * ~/.gitignore * ~/.mrconfig -* ~/.config/mr/available.d/mr.vcsh -* ~/.config/mr/available.d/zsh.vcsh -* ~/.config/mr/config.d/mr.vcsh -* ~/.config/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. @@ -190,7 +193,7 @@ the template will be stored. mv ~/.zsh ~/zsh.bak mv ~/.zshrc ~/zshrc.bak - cd ~/.config/mr/config.d/ + cd $XDG_CONFIG_HOME/mr/config.d/ ln -s ../available.d/zsh.vcsh . # link, and thereby enable, the zsh repository cd mr up @@ -199,8 +202,8 @@ the template will be stored. Now, it's time to edit the template config and fill it with your own remotes: - vim .config/mr/available.d/mr.vcsh - vim .config/mr/available.d/zsh.vcsh + vim $XDG_CONFIG_HOME/mr/available.d/mr.vcsh + vim $XDG_CONFIG_HOME/mr/available.d/zsh.vcsh And then create your own stuff: @@ -210,8 +213,8 @@ And then create your own stuff: vcsh run foo git commit vcsh run foo git push - cp .config/mr/available.d/mr.vcsh .config/mr/available.d/foo.vcsh - vim .config/mr/available.d/foo.vcsh # add your own repo + cp $XDG_CONFIG_HOME/mr/available.d/mr.vcsh $XDG_CONFIG_HOME/mr/available.d/foo.vcsh + vim $XDG_CONFIG_HOME/mr/available.d/foo.vcsh # add your own repo Done! @@ -242,7 +245,7 @@ copy mine verbatim, either is fine. Grab my mr config. see below for details on how I set this up vcsh clone ssh:///mr.git - cd ~/.config/mr/config.d/ + cd $XDG_CONFIG_HOME/mr/config.d/ ln -s ../available.d/* . @@ -250,7 +253,7 @@ mr is used to actually retrieve configs, etc ~ % cat ~/.mrconfig [DEFAULT] - include = cat ~/.config/mr/config.d/* + include = cat $XDG_CONFIG_HOME/mr/config.d/* ~ % echo $XDG_CONFIG_HOME /home/richih/.config ~ % ls $XDG_CONFIG_HOME/mr/available.d # random selection of my repos diff --git a/vcsh b/vcsh index 1828880..82a98a1 100755 --- a/vcsh +++ b/vcsh @@ -6,13 +6,14 @@ SELF=$(basename $0) [ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config" [ -z "$VCSH_BASE" ] && VCSH_BASE="$XDG_CONFIG_HOME/vcsh/repo.d" -for check_directory in "$VCSH_BASE" +for check_directory in "$VCSH_BASE" "$HOME/.gitignore.d" do if [ ! -d "$check_directory" ]; then if [ -e "$check_directory" ]; then echo "$SELF: error: $check_directory exists but is not a directory" >&2 exit 2 else + echo "$SELF: info: attempting to create $check_directory" mkdir -p "$check_directory" || (echo "$SELF: error: could not create $check_directory" >&2; exit 2) fi fi @@ -74,7 +75,8 @@ init() { exit 20) || exit 20 cd "$GIT_WORK_TREE" git init - git config core.worktree "$GIT_WORK_TREE" + git config core.worktree "$GIT_WORK_TREE" + git config core.excludesfile ".gitignore.d/$REPO_NAME" verbose "init() end" } @@ -137,6 +139,7 @@ elif [ "$1" = 'clone' ]; then git remote add origin "$GIT_REMOTE" git config branch.master.remote origin git config branch.master.merge refs/heads/master + git config core.excludesfile ".gitignore.d/$REPO_NAME" git fetch for object in $(git ls-tree -r origin/master | awk '{print $4}'); do [ -e "$object" ] && @@ -153,7 +156,7 @@ elif [ "$1" = 'clone' ]; then elif [ "$1" = 'init' ]; then verbose "init begin" - [ -z $2 ] && help && echo && echo "$SELF $1: please specify repository to work on" && return 0 + [ -z $2 ] && help && echo && echo "$SELF $1: error: please specify repository to work on" && return 0 export REPO_NAME="$2" export GIT_DIR="$VCSH_BASE/$REPO_NAME.git" init @@ -173,8 +176,9 @@ elif [ "$1" = 'init' ]; then elif [ "$1" = 'seed-gitignore' ]; then verbose "seed-gitignore begin" - [ -z $2 ] && help && echo && echo "$SELF $1: please specify repository to work on" && return 0 + [ -z $2 ] && help && echo && echo "$SELF $1: error: please specify repository to work on" && return 0 use "$2" + git config core.excludesfile ".gitignore.d/$REPO_NAME" files=$(git ls-files) gitignores=$(for file in $(git ls-files); do while true; do @@ -184,7 +188,7 @@ elif [ "$1" = 'seed-gitignore' ]; then done; done | sort -u | sed 's/^/!/') [ -e .gitignore.d/$2 ] && - echo "$SELF: .gitignore.d/$2 exists, moving it to .gitignore.d/$2.bak" && + echo "$SELF: info: .gitignore.d/$2 exists, moving it to .gitignore.d/$2.bak" && mv -f .gitignore.d/$2 .gitignore.d/$2.bak echo '*' > .gitignore.d/$2 for gitignore in $gitignores; do