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
### 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
### 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
[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.
* ~/.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.
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
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:
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!
Grab my mr config. see below for details on how I set this up
vcsh clone ssh://<remote>/mr.git
- cd ~/.config/mr/config.d/
+ cd $XDG_CONFIG_HOME/mr/config.d/
ln -s ../available.d/* .
~ % 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
[ -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
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"
}
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" ] &&
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
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
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