#!/usr/bin/env bash # Copyright (c) 2016 Egor Tensin # This file is part of the "Config file sharing" project. # For details, see https://github.com/egor-tensin/config-links. # Distributed under the MIT License. # This script relies on the availability of native symlinks. # Those are indeed supported by NTFS, but require Administrator privileges for # creation. # It likely won't bother you as long as you don't use the functions defined in # this file. # In any case, you will see `ln` complaining about some access being denied in # case something goes wrong. # # Remember that in order to force `ln` to use native NTFS symlinks, your # `CYGWIN` Windows environment variable value **must** include either # `winsymlinks:native` or `winsymlinks:nativestrict`! # usage: ./links-update [-h|--help] [-d|--database PATH] [-s|--shared-dir DIR] [-m|--mode MODE] [-n|--dry-run] set -o errexit -o nounset -o pipefail shopt -s inherit_errexit lastpipe script_name="$( basename -- "${BASH_SOURCE[0]}" )" readonly script_name script_path="$( realpath --canonicalize-existing -- "${BASH_SOURCE[0]}" )" readonly script_path script_dir="$( dirname -- "$script_path" )" readonly script_dir src_dir="$( cd -- "$script_dir/src" && pwd )" readonly src_dir . "$src_dir/common.sh" . "$src_dir/os.sh" . "$src_dir/path.sh" . "$src_dir/vars.sh" . "$src_dir/db.sh" script_usage() { local msg for msg; do echo "$script_name: $msg" done echo "usage: $script_name [-h|--help] [-d|--database PATH] [-s|--shared-dir DIR] [-m|--mode MODE] [-n|--dry-run] -h,--help show this message and exit -d,--database set database file path -s,--shared-dir set top-level shared directory path (current working directory by default) -m,--mode shared files mode (as in chmod) -n,--dry-run don't actually do anything intrusive" } parse_script_options() { while [ "$#" -gt 0 ]; do local key="$1" shift case "$key" in -h|--help) script_usage exit 0 ;; -n|--dry-run) set_dry_run continue ;; -d|--database|-s|--shared-dir|-m|--mode) ;; *) script_usage "unrecognized parameter: $key" >&2 exit 1 ;; esac if [ "$#" -eq 0 ]; then script_usage "missing argument for parameter: $key" >&2 exit 1 fi local value="$1" shift case "$key" in -d|--database) update_database_path "$value" ;; -s|--shared-dir) update_shared_dir "$value" ;; -m|--mode) mode="$( parse_mode "$value" )" ;; *) script_usage "unrecognized parameter: $key" >&2 exit 1 ;; esac done } mode='' main() { parse_script_options "$@" check_symlinks_enabled read_database unlink_obsolete_entries link_all_entries test -n "$mode" && chmod_entries "$mode" write_database } main "$@"