diff options
author | Mike Burns <mike@mike-burns.com> | 2013-07-08 17:08:50 +0200 |
---|---|---|
committer | Mike Burns <mike@mike-burns.com> | 2013-07-09 21:24:19 +0200 |
commit | f126c5cfcd68e28720cc5cd2d368734d89a5875e (patch) | |
tree | 52a11f057023ef8204e0e83752a07303325e3634 /bin | |
parent | 2e2573fbe07d8a1750ccdda7e0a146fef55fd50d (diff) |
Support multiple source directories
The `rcup` and `mkrc` commands now support multiple source directories.
This is useful for sharing dotfiles between friends, spliting dotfiles
into private and public ones, or other such situations.
In `mkrc` this support means that you can specify the destination
directory for your dotfile, either from the command-line or from you
`~/.rcrc` configuration.
In `rcup` this means that it will recur through all source directories,
in order, creating the symlinks as needed. This means that duplicated
files will not be overridden. The order can be specified by the `-d`
option, which can be repeated, or by the `DOTFILES_DIRS` option in your
`~/.rcrc` configuration. The `-d` option overrides the configuration.
For example, this configuration file will update from the two
directories in order:
DOTFILES_DIRS="/home/mike/.dotfiles/public /home/mike/.dotfiles/private"
Any source directories that don't exist are skipped.
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/mkrc | 30 | ||||
-rwxr-xr-x | bin/rcup | 63 |
2 files changed, 61 insertions, 32 deletions
@@ -2,42 +2,52 @@ # set -x -DOTFILES=$HOME/.dotfiles +DEFAULT_DOTFILES_DIR=$HOME/.dotfiles MV=mv INSTALL=rcup ROOT_DIR=$HOME destination() { - if [ $# -eq 0 ]; then - echo $DOTFILES + if [ $# -eq 2 ]; then + echo $1 else - echo $DOTFILES/tag-$2 + echo $1/tag-$3 fi } install_dotfile() { prior_wd=`pwd` - cd $DOTFILES - $INSTALL -t ${2:--} $1 + cd $1 + $INSTALL -t ${3:--} $2 cd $prior_wd } +if [ -e $HOME/.rcrc ]; then + . $HOME/.rcrc +fi + . `dirname $0`/../libexec/rcm/rcm.sh if [ $# -eq 0 ]; then - echo "Usage: dotfiles-add [-t tag] filename ..." + echo "Usage: dotfiles-add [-d dir] [-t tag] [-v] [-q] filename ..." exit 1 fi +for DOTFILES_DIR in $DOTFILES_DIRS $DEFAULT_DOTFILES_DIR; do + break +done + tag= verbosity=0 version=0 -while getopts Vvqt: opt; do + +while getopts Vvqt:d: opt; do case "$opt" in t) tag=$OPTARG;; v) verbosity=$(($verbosity + 1));; q) verbosity=$(($verbosity - 1));; + d) DOTFILES_DIR=$OPTARG;; V) version=1 esac done @@ -62,8 +72,8 @@ files=$@ for file in $files; do dotless=`echo $file | sed -e "s|$ROOT_DIR/||" | sed -e 's/^\.//'` - dest=`destination $dotless $tag` + dest=`destination $DOTFILES_DIR $dotless $tag` mkdir -p $dest/`dirname $dotless` $MV $file $dest/$dotless - install_dotfile $dotless $tag + install_dotfile $DOTFILES_DIR $dotless $tag done @@ -5,14 +5,12 @@ REPLACE_ALL=0 DEST_DIR=$HOME -DOTFILES_DIR=$HOME/.dotfiles +DEFAULT_DOTFILES_DIR=$HOME/.dotfiles HOSTNAME=`hostname -s` -HOST_FILES=$DOTFILES_DIR/host-$HOSTNAME DEBUG=: PRINT=echo VERBOSE=: PROMPT=echo -DIR_STACK=":$DOTFILES_DIR" MKDIR=mkdir LN=ln RM=rm @@ -138,11 +136,13 @@ handle_command_line() { arg_tags="" verbosity=0 version=0 - while getopts Vqvt: opt; do + dotfiles_dirs= + while getopts Vqvt:d: opt; do case "$opt" in t) arg_tags="$arg_tags $OPTARG";; v) verbosity=$(($verbosity + 1));; q) verbosity=$(($verbosity - 1));; + d) dotfiles_dirs="$dotfiles_dirs $OPTARG";; V) version=1 esac done @@ -173,6 +173,10 @@ handle_command_line() { TAGS=$arg_tags fi + if [ "x$dotfiles_dirs" != "x" ]; then + DOTFILES_DIRS=$dotfiles_dirs + fi + FILES=$@ } @@ -183,34 +187,49 @@ fi . `dirname $0`/../libexec/rcm/rcm.sh handle_command_line $* -cd $DOTFILES_DIR +if [ "x$DOTFILES_DIRS" = "x" ]; then + DOTFILES_DIRS="$DOTFILES_DIRS $DEFAULT_DOTFILES_DIR" +fi + +for DOTFILES_DIR in $DOTFILES_DIRS; do -for file in ${FILES:-*}; do - host_portion=`echo $file | sed -e 's/host-.*/host-/'` - tag_portion=`echo $file | sed -e 's/tag-.*/tag-/'` - if ! metafile $file $host_portion $tag_portion; then - handle_file $file $DEST_DIR $DOTFILES_DIR 0 + if [ ! -d $DOTFILES_DIR ]; then + $VERBOSE "skipping non-existent directory: $DOTFILES_DIR" + continue fi -done -cd $DOTFILES_DIR + cd $DOTFILES_DIR + DIR_STACK=":$DOTFILES_DIR" -if [ -d $HOST_FILES ]; then - pushdir `basename $HOST_FILES` for file in ${FILES:-*}; do - handle_file $file $DEST_DIR $HOST_FILES 0 + host_portion=`echo $file | sed -e 's/host-.*/host-/'` + tag_portion=`echo $file | sed -e 's/tag-.*/tag-/'` + if ! metafile $file $host_portion $tag_portion; then + handle_file $file $DEST_DIR $DOTFILES_DIR 0 + fi done - popdir -fi -cd $DOTFILES_DIR + cd $DOTFILES_DIR -for tag in $TAGS; do - if [ -d tag-$tag ]; then - pushdir `basename tag-$tag` + host_files=$DOTFILES_DIR/host-$HOSTNAME + if [ -d $host_files ]; then + pushdir `basename $host_files` for file in ${FILES:-*}; do - handle_file $file $DEST_DIR $DOTFILES_DIR/tag-$tag 0 + handle_file $file $DEST_DIR $host_files 0 done popdir fi + + cd $DOTFILES_DIR + + for tag in $TAGS; do + if [ -d tag-$tag ]; then + pushdir `basename tag-$tag` + for file in ${FILES:-*}; do + handle_file $file $DEST_DIR $DOTFILES_DIR/tag-$tag 0 + done + popdir + fi + done + done |