5
5
# If no version is given, it falls back to the value of DEFAULT_MILL_VERSION
6
6
#
7
7
# Project page: https://github.com/lefou/millw
8
+ # Script Version: 0.4.2
8
9
#
9
10
# If you want to improve this script, please also contribute your changes back!
10
11
#
11
12
# Licensed under the Apache License, Version 2.0
12
13
13
14
14
- DEFAULT_MILL_VERSION=0.9.5
15
+ DEFAULT_MILL_VERSION=0.10.0
15
16
16
17
set -e
17
18
18
19
MILL_REPO_URL=" https://github.com/com-lihaoyi/mill"
19
20
21
+ if [ -z " ${CURL_CMD} " ] ; then
22
+ CURL_CMD=curl
23
+ fi
24
+
20
25
# Explicit commandline argument takes precedence over all other methods
21
- if [ " x $1 " = " x --mill-version" ] ; then
26
+ if [ " $1 " = " --mill-version" ] ; then
22
27
shift
23
28
if [ " x$1 " != " x" ] ; then
24
29
MILL_VERSION=" $1 "
25
30
shift
26
31
else
27
- echo " You specified --mill-version without a version."
28
- echo " Please provide a version that matches one provided on"
29
- echo " ${MILL_REPO_URL} /releases"
32
+ echo " You specified --mill-version without a version." 1>&2
33
+ echo " Please provide a version that matches one provided on" 1>&2
34
+ echo " ${MILL_REPO_URL} /releases" 1>&2
30
35
false
31
36
fi
32
37
fi
35
40
# We reuse it's value and skip searching for a value.
36
41
37
42
# If not already set, read .mill-version file
38
- if [ " x ${MILL_VERSION} " = " x " ] ; then
43
+ if [ -z " ${MILL_VERSION} " ] ; then
39
44
if [ -f " .mill-version" ] ; then
40
45
MILL_VERSION=" $( head -n 1 .mill-version 2> /dev/null) "
41
46
fi
42
47
fi
43
48
44
- if [ " x ${XDG_CACHE_HOME} " != " x " ] ; then
49
+ if [ -n " ${XDG_CACHE_HOME} " ] ; then
45
50
MILL_DOWNLOAD_PATH=" ${XDG_CACHE_HOME} /mill/download"
46
51
else
47
52
MILL_DOWNLOAD_PATH=" ${HOME} /.cache/mill/download"
48
53
fi
49
54
50
55
# If not already set, try to fetch newest from Github
51
- if [ " x ${MILL_VERSION} " = " x " ] ; then
56
+ if [ -z " ${MILL_VERSION} " ] ; then
52
57
# TODO: try to load latest version from release page
53
- echo " No mill version specified."
54
- echo " You should provide a version via '.mill-version' file or --mill-version option."
58
+ echo " No mill version specified." 1>&2
59
+ echo " You should provide a version via '.mill-version' file or --mill-version option." 1>&2
55
60
56
61
mkdir -p " ${MILL_DOWNLOAD_PATH} "
57
- LANG=C touch -d ' 1 hour ago' " ${MILL_DOWNLOAD_PATH} /.expire_latest"
58
- if [ " ${MILL_DOWNLOAD_PATH} /.latest" -nt " ${MILL_DOWNLOAD_PATH} /.expire_latest" ] ; then
62
+ LANG=C touch -d ' 1 hour ago' " ${MILL_DOWNLOAD_PATH} /.expire_latest" 2> /dev/null || (
63
+ # we might be on OSX or BSD which don't have -d option for touch
64
+ # but probably a -A [-][[hh]mm]SS
65
+ touch " ${MILL_DOWNLOAD_PATH} /.expire_latest" ; touch -A -010000 " ${MILL_DOWNLOAD_PATH} /.expire_latest"
66
+ ) || (
67
+ # in case we still failed, we retry the first touch command with the intention
68
+ # to show the (previously suppressed) error message
69
+ LANG=C touch -d ' 1 hour ago' " ${MILL_DOWNLOAD_PATH} /.expire_latest"
70
+ )
71
+
72
+ # POSIX shell variant of bash's -nt operator, see https://unix.stackexchange.com/a/449744/6993
73
+ # if [ "${MILL_DOWNLOAD_PATH}/.latest" -nt "${MILL_DOWNLOAD_PATH}/.expire_latest" ] ; then
74
+ if [ -n " $( find -L " ${MILL_DOWNLOAD_PATH} /.latest" -prune -newer " ${MILL_DOWNLOAD_PATH} /.expire_latest" ) " ]; then
59
75
# we know a current latest version
60
- MILL_VERSION=" $( head -n 1 ${MILL_DOWNLOAD_PATH} /.latest 2> /dev/null) "
76
+ MILL_VERSION=$( head -n 1 " ${MILL_DOWNLOAD_PATH} " /.latest 2> /dev/null)
61
77
fi
62
78
63
- if [ " x ${MILL_VERSION} " = " x " ] ; then
79
+ if [ -z " ${MILL_VERSION} " ] ; then
64
80
# we don't know a current latest version
65
- echo " Retrieving latest mill version ..."
66
- LANG=C curl -s -i -f -I ${MILL_REPO_URL} /releases/latest 2> /dev/null | grep --ignore-case Location: | sed s' /^.*tag\///' | tr -d ' \r\n' > " ${MILL_DOWNLOAD_PATH} /.latest"
67
- MILL_VERSION=" $( head -n 1 ${MILL_DOWNLOAD_PATH} /.latest 2> /dev/null) "
81
+ echo " Retrieving latest mill version ..." 1>&2
82
+ LANG=C ${CURL_CMD} -s -i -f -I ${MILL_REPO_URL} /releases/latest 2> /dev/null | grep --ignore-case Location: | sed s' /^.*tag\///' | tr -d ' \r\n' > " ${MILL_DOWNLOAD_PATH} /.latest"
83
+ MILL_VERSION=$( head -n 1 " ${MILL_DOWNLOAD_PATH} " /.latest 2> /dev/null)
68
84
fi
69
85
70
- if [ " x ${MILL_VERSION} " = " x " ] ; then
86
+ if [ -z " ${MILL_VERSION} " ] ; then
71
87
# Last resort
72
88
MILL_VERSION=" ${DEFAULT_MILL_VERSION} "
73
- echo " Falling back to hardcoded mill version ${MILL_VERSION} "
89
+ echo " Falling back to hardcoded mill version ${MILL_VERSION} " 1>&2
74
90
else
75
- echo " Using mill version ${MILL_VERSION} "
91
+ echo " Using mill version ${MILL_VERSION} " 1>&2
76
92
fi
77
93
fi
78
94
79
95
MILL=" ${MILL_DOWNLOAD_PATH} /${MILL_VERSION} "
80
96
97
+ try_to_use_system_mill () {
98
+ MILL_IN_PATH=" $( command -v mill || true) "
99
+
100
+ if [ -z " ${MILL_IN_PATH} " ]; then
101
+ return
102
+ fi
103
+
104
+ UNIVERSAL_SCRIPT_MAGIC=" @ 2>/dev/null # 2>nul & echo off & goto BOF"
105
+
106
+ if ! head -c 128 " ${MILL_IN_PATH} " | grep -qF " ${UNIVERSAL_SCRIPT_MAGIC} " ; then
107
+ if [ -n " ${MILLW_VERBOSE} " ]; then
108
+ echo " Could not determine mill version of ${MILL_IN_PATH} , as it does not start with the universal script magic2" 1>&2
109
+ fi
110
+ return
111
+ fi
112
+
113
+ # Roughly the size of the universal script.
114
+ MILL_VERSION_SEARCH_RANGE=" 2403"
115
+ MILL_IN_PATH_VERSION=$( head -c " ${MILL_VERSION_SEARCH_RANGE} " " ${MILL_IN_PATH} " | \
116
+ sed -n ' s/^.*-DMILL_VERSION=\([^\s]*\) .*$/\1/p' | \
117
+ head -n 1)
118
+
119
+ if [ -z " ${MILL_IN_PATH_VERSION} " ]; then
120
+ echo " Could not determine mill version, even though ${MILL_IN_PATH} has the universal script magic" 1>&2
121
+ return
122
+ fi
123
+
124
+ if [ " ${MILL_IN_PATH_VERSION} " = " ${MILL_VERSION} " ]; then
125
+ MILL=" ${MILL_IN_PATH} "
126
+ fi
127
+ }
128
+ try_to_use_system_mill
129
+
81
130
# If not already downloaded, download it
82
131
if [ ! -s " ${MILL} " ] ; then
83
-
132
+
84
133
# support old non-XDG download dir
85
134
MILL_OLD_DOWNLOAD_PATH=" ${HOME} /.mill/download"
86
135
OLD_MILL=" ${MILL_OLD_DOWNLOAD_PATH} /${MILL_VERSION} "
87
136
if [ -x " ${OLD_MILL} " ] ; then
88
137
MILL=" ${OLD_MILL} "
89
138
else
90
- VERSION_PREFIX=" $( echo -n $MILL_VERSION | cut -b -4) "
139
+ VERSION_PREFIX=" $( echo $MILL_VERSION | cut -b -4) "
91
140
case $VERSION_PREFIX in
92
141
0.0. | 0.1. | 0.2. | 0.3. | 0.4. )
93
142
DOWNLOAD_SUFFIX=" "
@@ -98,10 +147,11 @@ if [ ! -s "${MILL}" ] ; then
98
147
esac
99
148
unset VERSION_PREFIX
100
149
101
- DOWNLOAD_FILE=$( mktemp mill.XXXX )
150
+ DOWNLOAD_FILE=$( mktemp mill.XXXXXX )
102
151
# TODO: handle command not found
103
- echo " Downloading mill ${MILL_VERSION} from ${MILL_REPO_URL} /releases ..."
104
- curl -L -o " ${DOWNLOAD_FILE} " " ${MILL_REPO_URL} /releases/download/${MILL_VERSION%% -* } /${MILL_VERSION}${DOWNLOAD_SUFFIX} "
152
+ echo " Downloading mill ${MILL_VERSION} from ${MILL_REPO_URL} /releases ..." 1>&2
153
+ MILL_VERSION_TAG=$( echo $MILL_VERSION | sed -E ' s/([^-]+)(-M[0-9]+)?(-.*)?/\1\2/' )
154
+ ${CURL_CMD} -f -L -o " ${DOWNLOAD_FILE} " " ${MILL_REPO_URL} /releases/download/${MILL_VERSION_TAG} /${MILL_VERSION}${DOWNLOAD_SUFFIX} "
105
155
chmod +x " ${DOWNLOAD_FILE} "
106
156
mkdir -p " ${MILL_DOWNLOAD_PATH} "
107
157
mv " ${DOWNLOAD_FILE} " " ${MILL} "
@@ -115,6 +165,7 @@ unset MILL_DOWNLOAD_PATH
115
165
unset MILL_OLD_DOWNLOAD_PATH
116
166
unset OLD_MILL
117
167
unset MILL_VERSION
168
+ unset MILL_VERSION_TAG
118
169
unset MILL_REPO_URL
119
170
120
- exec $ MILL " $@ "
171
+ exec " ${ MILL} " " $@ "
0 commit comments