#!/bin/bash # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # # This tool generates full update packages for the update system. # Author: Darin Fisher # . $(dirname "$0")/common.sh # ----------------------------------------------------------------------------- print_usage() { notice "Usage: $(basename $0) [OPTIONS] ARCHIVE DIRECTORY" } if [ $# = 0 ]; then print_usage exit 1 fi if [ $1 = -h ]; then print_usage notice "" notice "The contents of DIRECTORY will be stored in ARCHIVE." notice "" notice "Options:" notice " -h show this help text" notice " -q be less verbose" notice "" exit 1 fi if [ $1 = -q ]; then QUIET=1 export QUIET shift fi # ----------------------------------------------------------------------------- mar_command="$MAR -V ${MOZ_PRODUCT_VERSION:?} -H ${MAR_CHANNEL_ID:?}" archive="$1" targetdir="$2" # Prevent the workdir from being inside the targetdir so it isn't included in # the update mar. if [ $(echo "$targetdir" | grep -c '\/$') = 1 ]; then # Remove the / targetdir=$(echo "$targetdir" | sed -e 's:\/$::') fi workdir="$targetdir.work" updatemanifestv3="$workdir/updatev3.manifest" targetfiles="updatev3.manifest" mkdir -p "$workdir" # Generate a list of all files in the target directory. pushd "$targetdir" if test $? -ne 0 ; then exit 1 fi if [ ! -f "precomplete" ]; then if [ ! -f "Contents/Resources/precomplete" ]; then notice "precomplete file is missing!" exit 1 fi fi list_files files popd # Add the type of update to the beginning of the update manifests. > "$updatemanifestv3" notice "" notice "Adding type instruction to update manifests" notice " type complete" echo "type \"complete\"" >> "$updatemanifestv3" notice "" notice "Adding file add instructions to update manifests" num_files=${#files[*]} for ((i=0; $i<$num_files; i=$i+1)); do f="${files[$i]}" if check_for_add_if_not_update "$f"; then make_add_if_not_instruction "$f" "$updatemanifestv3" else make_add_instruction "$f" "$updatemanifestv3" fi dir=$(dirname "$f") mkdir -p "$workdir/$dir" $XZ $XZ_OPT --compress $BCJ_OPTIONS --lzma2 --format=xz --check=crc64 --force --stdout "$targetdir/$f" > "$workdir/$f" copy_perm "$targetdir/$f" "$workdir/$f" targetfiles="$targetfiles \"$f\"" done # Append remove instructions for any dead files. notice "" notice "Adding file and directory remove instructions from file 'removed-files'" append_remove_instructions "$targetdir" "$updatemanifestv3" $XZ $XZ_OPT --compress $BCJ_OPTIONS --lzma2 --format=xz --check=crc64 --force "$updatemanifestv3" && mv -f "$updatemanifestv3.xz" "$updatemanifestv3" mar_command="$mar_command -C \"$workdir\" -c output.mar" eval "$mar_command $targetfiles" mv -f "$workdir/output.mar" "$archive" # cleanup rm -fr "$workdir" notice "" notice "Finished" notice ""