X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=dotfiles.sh;h=cf3af80cbdc0925dea8f49bbd3fd52ff34c49f8d;hb=4b2cc72e9d4875658425a8a0f302c074e45d78dd;hp=d838e60a38df79987ac4d1040f866c474073d43b;hpb=193ed92127b56c8536ee269c47657c20e38f54ff;p=dotfiles-framework.git diff --git a/dotfiles.sh b/dotfiles.sh index d838e60..cf3af80 100755 --- a/dotfiles.sh +++ b/dotfiles.sh @@ -2,6 +2,21 @@ # # Dotfiles management script. For details, run # $ dotfiles.sh --help +# +# Copyright (C) 2011-2012 W. Trevor King +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . VERSION='0.2' DOTFILES_DIR="${PWD}" @@ -242,7 +257,7 @@ function link_file() echo "link ${TARGET}/${FILE} to ${DOTFILES_DIR}/${REPO}/patched-src/${FILE}" else echo -n 'link ' - "${LN}" -sv "${DOTFILES_DIR}/${REPO}/patched-src/${FILE}" "${TARGET}/${FILE}" || return 1 + "${LN}" -rsv "${DOTFILES_DIR}/${REPO}/patched-src/${FILE}" "${TARGET}/${FILE}" || return 1 fi } @@ -508,36 +523,47 @@ function link_help() cat <<-EOF - usage: $0 ${COMMAND} [--force|--force-file] [--dry-run] [--no-backup] [REPO] + usage: $0 ${COMMAND} [--force] [--force-dir] [--force-file] [--force-link] + [--dry-run] [--no-backup] [REPO] Where 'REPO' is the name the dotfiles repository to link. If it is not given, all repositories will be linked. - By default, link.sh only replaces missing files and simlinks. You - can optionally overwrite any local files by passing the --force - option. + By default, ${COMMAND} only replaces missing directories, files, + simlinks. You can optionally overwrite any local stuff by passing + the --force option. If you only want to overwrite a particular + type, use the more granular --force-dir, etc. EOF } function link() { - FORCE='no' # If 'file', overwrite existing files. - # If 'yes', overwrite existing files and dirs. + FORCE_DIR='no' # If 'yes', overwrite existing directories. + FORCE_FILE='no' # If 'yes', overwrite existing files. + FORCE_LINK='no' # If 'yes', overwrite existing symlinks. DRY_RUN='no' # If 'yes', disable any actions that change the filesystem - BACKUP='yes' + BACKUP_OPT='yes' while [ "${1::2}" = '--' ]; do case "${1}" in '--force') - FORCE='yes' + FORCE_DIR='yes' + FORCE_FILE='yes' + FORCE_LINK='yes' + ;; + '--force-dir') + FORCE_DIR='yes' ;; '--force-file') - FORCE='file' + FORCE_FILE='yes' + ;; + '--force-link') + FORCE_LINK='yes' ;; '--dry-run') DRY_RUN='yes' ;; '--no-backup') - BACKUP='no' + BACKUP_OPT='no' ;; *) echo "ERROR: invalid option to link (${1})" >&2 @@ -551,17 +577,24 @@ function link() DOTFILES_SRC="${DOTFILES_DIR}/${REPO}/patched-src" while read FILE; do + BACKUP="${BACKUP_OPT}" if [ "${DOTFILES_SRC}/${FILE}" -ef "${TARGET}/${FILE}" ]; then - continue # already simlinked - fi - if [ -d "${DOTFILES_SRC}/${FILE}" ] && [ -d "${TARGET}/${FILE}" ] && \ - [ "${FORCE}" != 'yes' ]; then - echo "use --force to override the existing directory: ${TARGET}/${FILE}" - continue # allow unlinked directories - fi - if [ -e "$TARGET/${FILE}" ] && [ "${FORCE}" = 'no' ]; then - echo "use --force to override the existing target: ${TARGET}/${FILE}" - continue # target already exists + if [ "${FORCE_LINK}" = 'no' ]; then + # don't prompt about --force-link, because this will happen a lot + continue # already simlinked + else + # don't backup links that already point to the right place + BACKUP='no' + fi + else + if [ -d "${DOTFILES_SRC}/${FILE}" ] && [ -d "${TARGET}/${FILE}" ] && \ + [ "${FORCE_DIR}" = 'no' ]; then + echo "use --force-dir to override the existing directory: ${TARGET}/${FILE}" + continue # allow unlinked directories + elif [ -f "${TARGET}/${FILE}" ] && [ "${FORCE_FILE}" = 'no' ]; then + echo "use --force-file to override the existing target: ${TARGET}/${FILE}" + continue # target already exists + fi fi link_file "${REPO}" "${FILE}" || return 1 done <<-EOF @@ -612,7 +645,7 @@ function disconnect() BASHRC='no' while read FILE; do - if [ "${FILE}" = '.bashrc' ] && [ "$TARGET" -ef "${HOME}" ]; then + if [ "${FILE}" = '.bashrc' ] && [ "${TARGET}" -ef "${HOME}" ]; then BASHRC='yes' fi if [ "${DOTFILES_SRC}/${FILE}" -ef "${TARGET}/${FILE}" ] && [ -h "${TARGET}/${FILE}" ]; then