`ln -r/--relative` was introduced in 8.16 (2012-03-26), and some
systems I have accounts on have yet to make the upgrade. Because
relative-vs-absolute linking is rarely important, it's better to avoid
relying on an up-to-date `ln`.
# usage: link_file REPO FILE
#
# Create the symbolic link to the version of FILE in the REPO
# usage: link_file REPO FILE
#
# Create the symbolic link to the version of FILE in the REPO
-# repository, overriding the target if it exists.
+# repository, overriding the target if it exists. If you want to
+# override the options passed to ${LN}, set LINK_OPTS.
function link_file()
{
REPO=$(nonempty_option 'link_file' 'REPO' "${1}") || return 1
FILE=$(nonempty_option 'link_file' 'FILE' "${2}") || return 1
function link_file()
{
REPO=$(nonempty_option 'link_file' 'REPO' "${1}") || return 1
FILE=$(nonempty_option 'link_file' 'FILE' "${2}") || return 1
+ LINK_OPTS="${LINK_OPTS:--sv}" # default to `-sv`
if [ "${BACKUP}" = 'yes' ]; then
if [ -e "${TARGET}/${FILE}" ] || [ -h "${TARGET}/${FILE}" ]; then
if [ "${DRY_RUN}" = 'yes' ]; then
if [ "${BACKUP}" = 'yes' ]; then
if [ -e "${TARGET}/${FILE}" ] || [ -h "${TARGET}/${FILE}" ]; then
if [ "${DRY_RUN}" = 'yes' ]; then
if [ "${DRY_RUN}" = 'yes' ]; then
echo "link ${TARGET}/${FILE} to ${DOTFILES_DIR}/${REPO}/patched-src/${FILE}"
else
if [ "${DRY_RUN}" = 'yes' ]; then
echo "link ${TARGET}/${FILE} to ${DOTFILES_DIR}/${REPO}/patched-src/${FILE}"
else
+ SOURCE="${DOTFILES_DIR}/${REPO}/patched-src/${FILE}"
- "${LN}" -rsv "${DOTFILES_DIR}/${REPO}/patched-src/${FILE}" "${TARGET}/${FILE}" || return 1
+ "${LN}" ${LINK_OPTS} "${SOURCE}" "${TARGET}/${FILE}" || return 1
cat <<-EOF
usage: $0 ${COMMAND} [--force] [--force-dir] [--force-file] [--force-link]
cat <<-EOF
usage: $0 ${COMMAND} [--force] [--force-dir] [--force-file] [--force-link]
- [--dry-run] [--no-backup] [REPO]
+ [--dry-run] [--no-backup] [--relative] [REPO]
Where 'REPO' is the name the dotfiles repository to link. If it
is not given, all repositories will be linked.
Where 'REPO' is the name the dotfiles repository to link. If it
is not given, all repositories will be linked.
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.
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.
+
+ If you have coreutils 8.16 (2012-03-26) or greater, you can set
+ the --relative option to create symlinks that use relative paths.
FORCE_LINK='no' # If 'yes', overwrite existing symlinks.
DRY_RUN='no' # If 'yes', disable any actions that change the filesystem
BACKUP_OPT='yes'
FORCE_LINK='no' # If 'yes', overwrite existing symlinks.
DRY_RUN='no' # If 'yes', disable any actions that change the filesystem
BACKUP_OPT='yes'
while [ "${1::2}" = '--' ]; do
case "${1}" in
'--force')
while [ "${1::2}" = '--' ]; do
case "${1}" in
'--force')
'--no-backup')
BACKUP_OPT='no'
;;
'--no-backup')
BACKUP_OPT='no'
;;
+ '--relative')
+ LINK_OPTS="${LINK_OPTS} --relative"
+ ;;
*)
echo "ERROR: invalid option to link (${1})" >&2
return 1
*)
echo "ERROR: invalid option to link (${1})" >&2
return 1