blob: c67fd264037c3eb27ed0ba189c3749d73b1faf57 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
#!/usr/bin/env bash
# Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com>
# This file is part of the "Configuration 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: ./update.sh [-h|--help] [-d|--database PATH] [-s|--shared-dir DIR] [-n|--dry-run]
set -o errexit
set -o nounset
set -o pipefail
script_name="$( basename -- "${BASH_SOURCE[0]}" )"
readonly script_name
script_dir="$( dirname -- "${BASH_SOURCE[0]}" )"
script_dir="$( cd -- "$script_dir" && pwd )"
readonly script_dir
src_dir="$( cd -- "$script_dir/../src" && pwd )"
readonly src_dir
. "$src_dir/common.sh"
. "$src_dir/path.sh"
. "$src_dir/vars.sh"
. "$src_dir/db.sh"
# Cygwin-related stuff
os="$( uname -o )"
readonly os
is_cygwin() {
test "$os" == 'Cygwin'
}
check_symlinks_enabled_cygwin() {
case "${CYGWIN-}" in
*winsymlinks:native*) ;;
*winsymlinks:nativestrict*) ;;
*)
dump "native Windows symlinks aren't enabled in Cygwin" >&2
return 1
;;
esac
}
# Main routines
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] [-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)
-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)
;;
*)
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"
;;
*)
script_usage "unrecognized parameter: $key" >&2
exit 1
;;
esac
done
}
check_symlinks_enabled() {
if is_cygwin; then
check_symlinks_enabled_cygwin
else
return 0
fi
}
main() {
parse_script_options "$@"
check_symlinks_enabled
ensure_database_exists
read_database
unlink_obsolete_entries
link_all_entries
write_database
}
main "$@"
|