-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·134 lines (123 loc) · 3.32 KB
/
install.sh
File metadata and controls
executable file
·134 lines (123 loc) · 3.32 KB
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
#!/bin/sh
# vim: foldmethod=marker foldmarker={,}
#
# 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 <http://www.gnu.org/licenses/>.
#
# Copyright 2014 Jeremy Brubaker <jbru362@gmail.com>
#
# Documentation {
#
# Manpage {
# NAME:
# install.sh
#
# SYNOPSIS:
# install.sh [OPTION]
# (see print_help() below for more)
#
# DESCRIPTION:
# Install files in local directory
#
# Install all files in local directory to DESTDIR (default
# is $HOME/bin), excluding any files in .ignore and
# .ignore.<hostname>. The ignore files support shell globbing.
#
# BUGS:
# - None so far
#}
print_help() {
cat <<EOF
Usage: install.sh [OPTION]
Install scripts and binaries to DESTDIR (default is $HOME/bin).
-n=HOST use HOST as the hostname
-f overwrite existing files and links
-d=DEST install to DEST instead of $HOME/bin
-V explain what is being done
-h display this help and exit
EOF
}
#}
logmsg () {
# Output messages
#
# Depends on $VERBOSE
test $VERBOSE = 'yes' && echo "$*"
}
logerror () {
# Output error messages
echo "$*" >&2
}
# Process options {
#
# Flag Variables
#
FORCE='no'
VERBOSE='no'
DESTDIR="$HOME/bin"
HOST=$( hostname )
IGNOREFILE=.ignore # list of files that shouldn't be linked
HOSTIGNORE=$IGNOREFILE.$HOST # host-specific ignore file
while getopts "n:fd:Vh" opt; do
case $opt in
n) HOST=$OPTARG; HOSTIGNORE="$IGNOREFILE.$h" ;;
f) FORCE='yes' ;;
d) DESTDIR=$OPTARG ;;
V) VERBOSE='yes' ;;
h) print_help; exit ;;
*) print_help; exit ;;
esac
done
# Convert flag variables to install(1) options
if test $VERBOSE = 'yes'; then
verbose='-v' # install(1) verbose flag
else
verbose=
fi
if test $FORCE = 'yes'; then
force=
else
force='-b' # install(1) backup
fi
if ! test -d "$DESTDIR" && ! mkdir -p "$DESTDIR"; then
logerror "FATAL: Could not create $DESTDIR. Exiting!"
exit
fi
# }
# Action happens here, following these rules:
#
# - skip files in .ignore and .ignore.<host>
# - skip files if copy in DESTDIR is newer
# - if -f was *not* specified
# - Backup existing files
# - Skip if backup exists
# - else -f *was* specified
# - Overwrite existing links and files
#
for f in *; do
# skip ignored files. Works with shell globs
for p in $(cat $IGNOREFILE $HOSTIGNORE 2>/dev/null); do
test $f = $p && continue 2 # continue OUTER loop
done
if test $FORCE = 'no' && test -e "$DESTDIR/.$f~"; then
# skip if -f not specified and backup exists
logmsg "Backup .$f~ already exists. Skipping"
continue
fi
# install
if ! [ -L "$f" ]; then
install $verbose $force -t "$DESTDIR" -- "$f"
else
cp $verbose $force -d --preserve=all "$f" "$DESTDIR"
fi
done