-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathinstall
executable file
·170 lines (148 loc) · 5.97 KB
/
install
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# This file is not intended for direct execution
if [ -n "$ZSH_VERSION" ]; then
case $ZSH_EVAL_CONTEXT in
*file)
;;
*file:cmdsubst)
;;
*)
echo 'This script is not intended for direct Zsh execution'
exit
;;
esac
elif [ -n "$BASH_VERSION" ]; then
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
echo 'This script is not intended for direct bash execution'
exit
fi
else
# Only Zsh and Bash supported
echo 'This script requires Zsh or Bash'
exit
fi
__install_main() {
local SH_SOURCE_FILE SH_SOURCE_DIR SH_SOURCE_FILE_ESCAPED
if [ -n "$ZSH_VERSION" ]; then
SH_SOURCE_FILE=${(%):-%x}
elif [ -n "$BASH_VERSION" ]; then
SH_SOURCE_FILE=${BASH_SOURCE[0]}
fi
while [[ -L "$SH_SOURCE_FILE" ]]; do
SH_SOURCE_FILE=$(readlink "$SH_SOURCE_FILE")
done
SH_SOURCE_DIR=$(dirname "$SH_SOURCE_FILE")
SH_SOURCE_DIR=`cd "$SH_SOURCE_DIR" >/dev/null; pwd`
SH_SOURCE_FILE=$(basename "$SH_SOURCE_FILE")
SH_SOURCE_FILE_ESCAPED=${SH_SOURCE_FILE// /_}
# SH_SOURCE_DIR is a full path to the location of this script
eval "$(cat <<EOF
__get_${SH_SOURCE_FILE_ESCAPED}_dir() {
echo $SH_SOURCE_DIR
}
__get_${SH_SOURCE_FILE_ESCAPED}_file() {
echo $SH_SOURCE_FILE
}
__get_sh_scripts_dir() {
echo "$SH_SOURCE_DIR"
}
__get_sh_scripts_file() {
echo "$SH_SOURCE_FILE"
}
EOF
)"
local SH_COLOR_DEFS
if [[ -e "$SH_SOURCE_DIR/configure_colors" ]]; then
SH_COLOR_DEFS=`cat "$SH_SOURCE_DIR/configure_colors"`
fi
local SH_OS_DEFS
if [[ -e "$SH_SOURCE_DIR/configure_os" ]]; then
SH_OS_DEFS=`cat "$SH_SOURCE_DIR/configure_os"`
fi
eval "$(cat <<EOF
__sh_color_definitions() {
echo "$SH_COLOR_DEFS"
}
__sh_os_definitions() {
echo "$SH_OS_DEFS"
}
EOF
)"
eval "$(__sh_color_definitions)"
eval "$(__sh_os_definitions)"
if [[ $SH_OS_TYPE == Windows ]]; then
if [[ $SH_OS_DISTRO == Msys ]]; then
if [[ "$MSYS" == "winsymlinks:nativestrict" ]]; then
echo
else
echo
echo -e $COLOR_YELLOW_BOLD'WARNING:'$COLOR_NONE' Set '$COLOR_CYAN_BOLD'MSYS=winsymlinks:nativestrict'$COLOR_NONE' in your Windows environment,'
echo -e 'then rerun the installer in a new Bash window as administrator.'
echo
exit
fi
local TEMFILE
TEMPFILE=${TMPDIR:-/tmp}/$RANDOM
if ln -s $SH_SOURCE_DIR/$SH_SOURCE_FILE $TEMPFILE >/dev/null 2>&1; then
rm $TEMPFILE
else
echo -e $COLOR_YELLOW'WARNING:'$COLOR_NONE' Open new Bash windows as administrator, set '$COLOR_CYAN'export HOME='$HOME$COLOR_NONE
echo -e 'and rerun the installer.'
echo
exit
fi
else
echo
echo -e $COLOR_RED_BOLD'WARNING:'$COLOR_NONE' Unsupported Windows environment.'
echo
exit
fi
fi
local OS_TYPE_SUFFIX OS_DISTRO_SUFFIX OS_RELEASE_SUFFIX
OS_TYPE_SUFFIX=`echo $SH_OS_TYPE | tr '[A-Z]' '[a-z]'`
OS_DISTRO_SUFFIX=`echo $SH_OS_DISTRO | tr '[A-Z]' '[a-z]'`
OS_RELEASE_SUFFIX=`echo $SH_OS_DISTRO | tr '[A-Z]' '[a-z]'`
local FILES CURRENT_FILE SOURCE_FILE LINK_FILE LINK_TARGET_FILE
FILES=( zshrc bash_profile bashrc bash_logout inputrc vimrc tmux.conf configure_colors configure_os )
for CURRENT_FILE in "${FILES[@]}"; do
SOURCE_FILE=$SH_SOURCE_DIR/$CURRENT_FILE
if [[ -e $SOURCE_FILE'_'$OS_TYPE_SUFFIX'_'$OS_DISTRO_SUFFIX'_'$OS_RELEASE_SUFFIX ]]; then
SOURCE_FILE=$SOURCE_FILE'_'$OS_TYPE_SUFFIX'_'$OS_DISTRO_SUFFIX'_'$OS_RELEASE_SUFFIX
elif [[ -e $SOURCE_FILE'_'$OS_TYPE_SUFFIX'_'$OS_DISTRO_SUFFIX ]]; then
SOURCE_FILE=$SOURCE_FILE'_'$OS_TYPE_SUFFIX'_'$OS_DISTRO_SUFFIX
elif [[ -e $SOURCE_FILE'_'$OS_TYPE_SUFFIX ]]; then
SOURCE_FILE=$SOURCE_FILE'_'$OS_TYPE_SUFFIX
fi
LINK_FILE=$HOME/.$CURRENT_FILE
if [[ -e "$LINK_FILE" ]]; then
if [[ ! -L "$LINK_FILE" ]]; then
echo -e $COLOR_YELLOW_BOLD$LINK_FILE$COLOR_NONE': Exists and cannot be linked to '$COLOR_CYAN_BOLD$SOURCE_FILE$COLOR_NONE
else
LINK_TARGET_FILE=$LINK_FILE
while [[ -L "$LINK_TARGET_FILE" ]]; do
LINK_TARGET_FILE=$(readlink "$LINK_TARGET_FILE")
done
if [[ "$LINK_TARGET_FILE" == "$SOURCE_FILE" ]]; then
echo -e $COLOR_GREEN_BOLD$LINK_FILE$COLOR_NONE': Already linked and points to '$COLOR_CYAN_BOLD$SOURCE_FILE$COLOR_NONE
else
echo -e $COLOR_YELLOW_BOLD$LINK_FILE$COLOR_NONE': Already linked but points to '$COLOR_YELLOW_BOLD$LINK_TARGET_FILE$COLOR_NONE' instead of '$COLOR_CYAN_BOLD$SOURCE_FILE$COLOR_NONE
fi
fi
else
if [[ -e $SOURCE_FILE'_'$OS_TYPE_SUFFIX'_'$OS_DISTRO_SUFFIX'_'$OS_RELEASE_SUFFIX ]]; then
SOURCE_FILE=$SOURCE_FILE'_'$OS_TYPE_SUFFIX'_'$OS_DISTRO_SUFFIX'_'$OS_RELEASE_SUFFIX
elif [[ -e $SOURCE_FILE'_'$OS_TYPE_SUFFIX'_'$OS_DISTRO_SUFFIX ]]; then
SOURCE_FILE=$SOURCE_FILE'_'$OS_TYPE_SUFFIX'_'$OS_DISTRO_SUFFIX
elif [[ -e $SOURCE_FILE'_'$OS_TYPE_SUFFIX ]]; then
SOURCE_FILE=$SOURCE_FILE'_'$OS_TYPE_SUFFIX
fi
if [[ -f "$SOURCE_FILE" ]]; then
echo -e $COLOR_GREEN_BOLD$LINK_FILE$COLOR_NONE': Created as a symbolic link and points to '$COLOR_CYAN_BOLD$SOURCE_FILE$COLOR_NONE
ln -s "$SOURCE_FILE" "$LINK_FILE"
else
echo -e $COLOR_RED_BOLD$LINK_FILE$COLOR_NONE': Cannot be linked to non-existing '$COLOR_RED_BOLD$SOURCE_FILE$COLOR_NONE
fi
fi
done
}
__install_main "$@"
unset -f __install_main