blob: 4fe6dd67a07c7d14210c98bdeb0b135eef60d54c (
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
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
#!/usr/bin/env bash
#
# Library to push and pull binary artifacts from a remote repository using CURL.
remote_urlget="http://repo.typesafe.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
remote_urlpush="http://typesafe.artifactoryonline.com/typesafe/scala-sha-bootstrap/org/scala-lang/bootstrap"
libraryJar="$(pwd)/lib/scala-library.jar"
desired_ext=".desired.sha1"
push_jar="$(pwd)/tools/push.jar"
if [[ "$OSTYPE" == *Cygwin* || "$OSTYPE" == *cygwin* ]]; then push_jar="$(cygpath -m "$push_jar")"; fi
# Cache dir has .sbt in it to line up with SBT build.
cache_dir="${HOME}/.sbt/cache/scala"
# Checks whether or not curl is installed and issues a warning on failure.
checkCurl() {
if ! which curl >/dev/null; then
cat <<EOM
No means of downloading or uploading binary artifacts found.
Please install curl for your OS. e.g.
* sudo apt-get install curl
* brew install curl
EOM
fi
}
# Executes the `curl` command to publish artifacts into a maven/ivy repository.
# Arugment 1 - The location to publish the file.
# Argument 2 - The file to publish.
# Argument 3 - The user to publish as.
# Argument 4 - The password for the user.
curlUpload() {
checkCurl
local remote_location=$1
local data=$2
local user=$3
local password=$4
local url="${remote_urlpush}/${remote_location}"
java -jar $push_jar "$data" "$url" "$user" "$password"
if (( $? != 0 )); then
echo "Error uploading $data to $url"
echo "$url"
exit 1
fi
}
# Executes the `curl` command to download a file.
# Argument 1 - The location to store the file.
# Argument 2 - The URL to download.
curlDownload() {
checkCurl
local jar=$1
local url=$2
if [[ "$OSTYPE" == *Cygwin* || "$OSTYPE" == *cygwin* ]]; then
jar=$(cygpath -m $1)
fi
http_code=$(curl --write-out '%{http_code}' --silent --fail --output "$jar" "$url")
if (( $? != 0 )); then
echo "Error downloading $jar: response code: $http_code"
echo "$url"
exit 1
fi
}
# Pushes a local JAR file to the remote repository and updates the .desired.sha1 file.
# Argument 1 - The JAR file to update.
# Argument 2 - The root directory of the project.
# Argument 3 - The user to use when publishing artifacts.
# Argument 4 - The password to use when publishing artifacts.
pushJarFile() {
local jar=$1
local basedir=$2
local user=$3
local pw=$4
local jar_dir=$(dirname $jar)
local jar_name=${jar#$jar_dir/}
pushd $jar_dir >/dev/null
local version=$(makeJarSha $jar_name)
local remote_uri=${version}${jar#$basedir}
echo " Pushing to ${remote_urlpush}/${remote_uri} ..."
echo " $curl"
curlUpload $remote_uri $jar_name $user $pw
echo " Making new sha1 file ...."
echo "$version ?$jar_name" > "${jar_name}${desired_ext}"
popd >/dev/null
# TODO - Git remove jar and git add jar.desired.sha1
# rm $jar
}
makeJarSha() {
local jar=$1
if which sha1sum 2>/dev/null >/dev/null; then
shastring=$(sha1sum "$jar")
echo "$shastring" | sed 's/ .*//'
elif which shasum 2>/dev/null >/dev/null; then
shastring=$(shasum "$jar")
echo "$shastring" | sed 's/ .*//'
else
shastring=$(openssl sha1 "$jar")
echo "$shastring" | sed 's/^.*= //'
fi
}
getJarSha() {
local jar=$1
if [[ ! -f "$jar" ]]; then
echo ""
else
echo $(makeJarSha $jar)
fi
}
# Tests whether or not the .desired.sha1 hash matches a given file.
# Arugment 1 - The jar file to test validity.
# Returns: Empty string on failure, "OK" on success.
isJarFileValid() {
local jar=$1
if [[ ! -f "$jar" ]]; then
echo ""
else
local jar_dir=$(dirname $jar)
local jar_name=${jar#$jar_dir/}
pushd $jar_dir >/dev/null
local valid=$(shasum -p --check ${jar_name}${desired_ext} 2>/dev/null)
echo "${valid#$jar_name: }"
popd >/dev/null
fi
}
# Pushes any jar file in the local repository for which the corresponding SHA1 hash is invalid or nonexistent.
# Argument 1 - The base directory of the project.
# Argument 2 - The user to use when pushing artifacts.
# Argument 3 - The password to use when pushing artifacts.
pushJarFiles() {
local basedir=$1
local user=$2
local password=$3
# TODO - ignore target/ and build/
local jarFiles="$(find ${basedir}/lib -name "*.jar") $(find ${basedir}/test/files -name "*.jar") $(find ${basedir}/tools -name "*.jar")"
local changed="no"
for jar in $jarFiles; do
local valid=$(isJarFileValid $jar)
if [[ "$valid" != "OK" ]]; then
echo "$jar has changed, pushing changes...."
changed="yes"
pushJarFile $jar $basedir $user $password
fi
done
if test "$changed" == "no"; then
echo "No jars have been changed."
else
echo "Binary changes have been pushed. You may now submit the new *${desired_ext} files to git."
fi
}
checkJarSha() {
local jar=$1
local sha=$2
local testsha=$(getJarSha "$jar")
if test "$sha" == "$testsha"; then
echo "OK"
fi
}
makeCacheLocation() {
local uri=$1
local sha=$2
local cache_loc="$cache_dir/$uri"
local cdir=$(dirname $cache_loc)
if [[ ! -d "$cdir" ]]; then
mkdir -p "$cdir"
fi
echo "$cache_loc"
}
# Pulls a single binary artifact from a remote repository.
# Argument 1 - The uri to the file that should be downloaded.
# Argument 2 - SHA of the file...
# Returns: Cache location.
pullJarFileToCache() {
local uri=$1
local sha=$2
local cache_loc="$(makeCacheLocation $uri)"
# TODO - Check SHA of local cache is accurate.
if test -f "$cache_loc" && test "$(checkJarSha "$cache_loc" "$sha")" != "OK"; then
echo "Found bad cached file: $cache_loc"
rm -f "$cache_loc"
fi
if [[ ! -f "$cache_loc" ]]; then
# Note: After we follow up with JFrog, we should check the more stable raw file server first
# before hitting the more flaky artifactory.
curlDownload $cache_loc ${remote_urlget}/${uri}
if test "$(checkJarSha "$cache_loc" "$sha")" != "OK"; then
echo "Trouble downloading $uri. Please try pull-binary-libs again when your internet connection is stable."
exit 2
fi
fi
}
# Pulls a single binary artifact from a remote repository.
# Argument 1 - The jar file that needs to be downloaded.
# Argument 2 - The root directory of the project.
pullJarFile() {
local jar=$1
local basedir=$2
local sha1=$(cat ${jar}${desired_ext})
local jar_dir=$(dirname $jar)
local jar_name=${jar#$jar_dir/}
local version=${sha1% ?$jar_name}
local remote_uri=${version}/${jar#$basedir/}
echo "Resolving [${remote_uri}]"
pullJarFileToCache $remote_uri $version
local cached_file=$(makeCacheLocation $remote_uri)
cp $cached_file $jar
}
# Pulls binary artifacts from the remote repository.
# Argument 1 - The directory to search for *.desired.sha1 files that need to be retrieved.
pullJarFiles() {
local basedir=$1
local desiredFiles="$(find ${basedir}/lib -name *${desired_ext}) $(find ${basedir}/test/files -name *${desired_ext}) $(find ${basedir}/tools -name *${desired_ext})"
for sha in $desiredFiles; do
jar=${sha%$desired_ext}
local valid=$(isJarFileValid $jar)
if [[ "$valid" != "OK" ]]; then
pullJarFile $jar $basedir
fi
done
}
|