3 # ***** BEGIN LICENSE BLOCK *****
4 # Version: MPL 1.1/GPL 2.0/LGPL 2.1
6 # The contents of this file are subject to the Mozilla Public License Version
7 # 1.1 (the "License"); you may not use this file except in compliance with
8 # the License. You may obtain a copy of the License at
9 # http://www.mozilla.org/MPL/
11 # Software distributed under the License is distributed on an "AS IS" basis,
12 # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 # for the specific language governing rights and limitations under the
16 # The Original Code is Mozilla Update Packaging.
18 # The Initial Developer of the Original Code is
19 # Merrimack Valley Library Consortium.
20 # Portions created by the Initial Developer are Copyright (C) 2010
21 # the Initial Developer. All Rights Reserved.
24 # Thomas Berezansky <tsbere@mvlc.org>
26 # Alternatively, the contents of this file may be used under the terms of
27 # either the GNU General Public License Version 2 or later (the "GPL"), or
28 # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 # in which case the provisions of the GPL or the LGPL are applicable instead
30 # of those above. If you wish to allow use of your version of this file only
31 # under the terms of either the GPL or the LGPL, and not to allow others to
32 # use your version of this file under the terms of the MPL, indicate your
33 # decision by deleting the provisions above and replace them with the notice
34 # and other provisions required by the GPL or the LGPL. If you do not delete
35 # the provisions above, a recipient may use your version of this file under
36 # the terms of any one of the MPL, the GPL or the LGPL.
38 # ***** END LICENSE BLOCK *****
40 # Portions of this code were based on code by Darin Fisher found here:
41 # http://mxr.mozilla.org/mozilla/source/tools/update-packaging/
43 prefix=${1:-/openils/var/updates}
54 echo "Building Generic Updates only"
58 echo "Building Windows Updates only"
62 echo "Building Linux (32 bit) Updates only"
66 echo "Building Linux (64 bit) Updates only"
70 echo "Building Extension Updates only"
74 echo "Building All Updates"
84 echo "Extension only - No client"
87 echo "Building Client(s)"
91 echo "Not Building Client(s)"
95 function unwrap_update
100 find "$2" -type f -exec mv {} {}.bz2 \;
101 find "$2" -type f -name '*.bz2' -exec $BZIP2 -d {} \;
109 MANIFEST="$WORK/update.manifest"
110 ARCHIVEFILES="update.manifest"
114 for FILE in `find "$NEW" -type f`; do
117 for FILE in `find "$OLD" -type f`; do
120 $BZIP2 -z9 "$MANIFEST"
121 mv "$MANIFEST.bz2" "$MANIFEST"
127 CHECK_FILE="${1#$NEW/}"
128 if [ $CHECK_FILE == "update.manifest" -o $CHECK_FILE == "defaults/preferences/developers.js" -o $CHECK_FILE == "defaults/preferences/aa_per_machine.js" ]; then
129 echo "Skipping $CHECK_FILE";
132 DIR=$(dirname "$WORK/$CHECK_FILE")
133 if [ ! -f "$OLD/$CHECK_FILE" ]; then
134 echo "add \"$CHECK_FILE\"" >> "$MANIFEST"
136 $BZIP2 -cz9 "$NEW/$CHECK_FILE" > "$WORK/$CHECK_FILE"
137 if [ -x "$NEW/$CHECK_FILE" ]; then
138 chmod 0755 "$WORK/$CHECK_FILE"
140 chmod 0644 "$WORK/$CHECK_FILE"
142 ARCHIVEFILES="$ARCHIVEFILES \"$CHECK_FILE\""
144 elif ! diff "$OLD/$CHECK_FILE" "$NEW/$CHECK_FILE" > /dev/null; then
146 $MBSDIFF "$OLD/$CHECK_FILE" "$NEW/$CHECK_FILE" "$WORK/$CHECK_FILE.patch"
147 $BZIP2 -z9 "$WORK/$CHECK_FILE.patch"
148 $BZIP2 -cz9 "$NEW/$CHECK_FILE" > "$WORK/$CHECK_FILE"
149 PATCHSIZE=`du -b "$WORK/$CHECK_FILE.patch.bz2"`
150 FULLSIZE=`du -b "$WORK/$CHECK_FILE"`
151 PATCHSIZE="${PATCHSIZE%% *}"
152 FULLSIZE="${FULLSIZE%% *}"
153 if [ $PATCHSIZE -lt $FULLSIZE ]; then
154 rm -f "$WORK/$CHECK_FILE"
155 mv "$WORK/$CHECK_FILE.patch.bz2" "$WORK/$CHECK_FILE.patch"
156 echo "patch \"$CHECK_FILE.patch\" \"$CHECK_FILE\"" >> "$MANIFEST"
157 ARCHIVEFILES="$ARCHIVEFILES \"$CHECK_FILE.patch\""
159 rm -f "$WORK/$CHECK_FILE.patch.bz2"
160 if [ -x "$NEW/$CHECK_FILE" ]; then
161 chmod 0755 "$WORK/$CHECK_FILE"
163 chmod 0644 "$WORK/$CHECK_FILE"
165 echo "add \"$CHECK_FILE\"" >> "$MANIFEST"
166 ARCHIVEFILES="$ARCHIVEFILES \"$CHECK_FILE\""
169 rm -f "$OLD/$CHECK_FILE"
175 if [ $RM_FILE != "update.manifest" -a $RM_FILE != "defaults/preferences/developers.js" -a $RM_FILE != "defaults/preferences/aa_per_machine.js" -a $RM_FILE != "defaults/preferences/autoupdate.js" -a $RM_FILE != "defaults/preferences/autochannel.js" ]; then
176 echo "remove \"$RM_FILE\"" >> "$MANIFEST"
180 function build_update
182 eval "$MAR -C \"$WORK\" -c output.mar $ARCHIVEFILES"
183 mv "$WORK/output.mar" "$1"
192 if which mbsdiff; then
193 MBSDIFF=${MBSDIFF:-mbsdiff}
195 if [ ! -x "$MAR" -o ! -x "$MBSDIFF" ]; then
196 if [ ! -f "external/limbar/tool/mar" -o ! -f "external/libmar/tool/mbsdiff" ]; then
201 MAR="$PWD/external/libmar/tool/mar"
202 MBSDIFF="$PWD/external/libmar/tool/mbsdiff"
206 function make_full_update
208 echo "Making full update"
211 prep_update client oldclient client.working
212 build_update "full_update.mar"
214 mv full_update.mar "$PUBPATH/$VERSION.mar"
215 echo "Making full update patch def"
216 mkdir -p "$PATCHPATH"
217 HASH=$(sha512sum "$PUBPATH/$VERSION.mar")
218 SIZE=$(du -b "$PUBPATH/$VERSION.mar")
219 echo "<patch type=\"complete\" URL=\"$VERSION.mar\" hashFunction=\"sha512\" hashValue=\"${HASH%% *}\" size=\"${SIZE%% *}\"/>" > "$PATCHPATH/$VERSION.patchline"
222 function make_partial_update
224 PREV_VERSION="${1%.mar}"
225 if [ "$VERSION" == "$PREV_VERSION" ]; then
226 echo "Skipping partial update for same version"
229 echo "Making partial update from $PREV_VERSION"
232 unwrap_update "$ARCHIVEPATH/$1" oldclient
233 prep_update client oldclient client.working
234 build_update "partial_update.mar"
235 mv partial_update.mar "$PUBPATH/$PREV_VERSION-$VERSION.mar"
236 echo "Making partial update patch def"
237 mkdir -p "$PATCHPATH"
238 HASH=$(sha512sum "$PUBPATH/$PREV_VERSION-$VERSION.mar")
239 SIZE=$(du -b "$PUBPATH/$PREV_VERSION-$VERSION.mar")
240 echo "<patch type=\"partial\" URL=\"$PREV_VERSION-$VERSION.mar\" hashFunction=\"sha512\" hashValue=\"${HASH%% *}\" size=\"${SIZE%% *}\"/>" > "$PATCHPATH/$PREV_VERSION-$VERSION.patchline"
243 function make_partial_updates
245 echo "Checking for partial update source files"
246 if [ -d "$ARCHIVEPATH" ]; then
247 for OLDVER in `find "$ARCHIVEPATH" -maxdepth 1 -name '*.mar'`; do
248 make_partial_update "${OLDVER##*/}"
251 mkdir -p "$ARCHIVEPATH"
252 echo "Copying full update to archive"
253 cp "$PUBPATH/$VERSION.mar" "$ARCHIVEPATH"
254 echo "Updating current version file"
255 echo "$VERSION" > "$PATCHPATH/VERSION"
258 function cleanup_files
260 echo "Cleaning up previous update mar files and update patch files"
261 find "$PUBPATH" -maxdepth 1 -name "*.mar" ! -name "*$VERSION.mar" -delete -print
262 find "$PATCHPATH" -maxdepth 1 -name "*.patch" ! -name "*$VERSION.patch" -delete -print
265 # First, do we have the mar and mbsdiff tools?
267 VERSION=`cat build/VERSION`
269 # Generic Updates - No XULRunner packaged, channel of "release"
270 # NOTE: Generic updates CAN update Windows/Linux builds, and will do so if you don't build platform specific ones
271 if [ $GEN_UPDATES -eq 1 ]; then
272 PATCHPATH="$prefix/patch"
273 PUBPATH="$prefix/pub"
274 ARCHIVEPATH="$prefix/archives"
275 if [ $CLIENTS -eq 1 ]; then
277 mkdir -p "$prefix/pub/clients/"
278 find "$prefix/pub/clients/" -name '*_client.xpi' -delete
279 mv evergreen_staff_client.xpi "$prefix/pub/clients/${VERSION}_client.xpi"
288 # Windows Updates - Windows XULRunner, update channel of "win"
289 if [ $WIN_UPDATES -eq 1 ]; then
290 PATCHPATH="$prefix/patch/win"
291 PUBPATH="$prefix/pub/win"
292 ARCHIVEPATH="$prefix/archives/win"
293 if [ $CLIENTS -eq 1 ]; then
295 mkdir -p "$prefix/pub/clients/"
296 find "$prefix/pub/clients/" -name '*_setup.exe' -delete
297 mv evergreen_staff_client_setup.exe "$prefix/pub/clients/${VERSION}_setup.exe"
306 # Linux 32 bit Updates - Linux XULRunner, update channel of "lin"
307 if [ $LINUX32_UPDATES -eq 1 ]; then
308 PATCHPATH="$prefix/patch/lin"
309 PUBPATH="$prefix/pub/lin"
310 ARCHIVEPATH="$prefix/archives/lin"
311 if [ $CLIENTS -eq 1 ]; then
313 mkdir -p "$prefix/pub/clients/"
314 find "$prefix/pub/clients/" -name '*_i686.tar.bz2' -delete
315 mv evergreen_staff_client_i686.tar.bz2 "$prefix/pub/clients/${VERSION}_i686.tar.bz2"
317 make linux32-xulrunner
324 # Linux 64 bit Updates - Linux XULRunner, update channel of "lin64"
325 if [ $LINUX64_UPDATES -eq 1 ]; then
326 PATCHPATH="$prefix/patch/lin64"
327 PUBPATH="$prefix/pub/lin64"
328 ARCHIVEPATH="$prefix/archives/lin64"
329 if [ $CLIENTS -eq 1 ]; then
331 mkdir -p "$prefix/pub/clients/"
332 find "$prefix/pub/clients/" -name '*_x86_64.tar.bz2' -delete
333 mv evergreen_staff_client_x86_64.tar.bz2 "$prefix/pub/clients/${VERSION}_x86_64.tar.bz2"
335 make linux64-xulrunner
343 # Not really "Updates" so much as "Update", plural for consistency in command.
344 # Extensions don't do partial updates. Or at least not that I found docs for.
345 if [ $EXT_UPDATES -eq 1 ]; then
347 mkdir -p "$prefix/pub/"
348 find "$prefix/pub/" -maxdepth 1 -name '*_extension.xpi' -delete
349 mv evergreen.xpi "$prefix/pub/${VERSION}_extension.xpi"
350 SHA512=$(sha512sum "$prefix/pub/${VERSION}_extension.xpi")
352 sed -e "s|<em:version>.*</em:version>|<em:version>$VERSION</em:version>|" -e "s|<em:updateLink>.*</em:updateLink>|<em:updateLink>https://::HOSTNAME::/updates/${VERSION}_extension.xpi</em:updateLink>|" -e "s|<em:updateHash>.*</em:updateHash>|<em:updateHash>sha512:$SHA512</em:updateHash>|" update.rdf > "$prefix/patch/update.rdf"