update-tzdata.sh (5818B)
1 #!/bin/sh 2 # This Source Code Form is subject to the terms of the Mozilla Public 3 # License, v. 2.0. If a copy of the MPL was not distributed with this 4 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 6 set -e 7 8 # Usage: update-tzdata.sh <tzdata version> 9 # E.g., for tzdata2016f: update-tzdata.sh 2016f 10 11 # Ensure that $Date$ in the checked-out git files expands timezone-agnostically, 12 # so that this script's behavior is consistent when run from any time zone. 13 export TZ=UTC 14 15 # Also ensure GIT-INFO is consistently English. 16 export LANG=en_US.UTF-8 17 export LANGUAGE=en_US 18 export LC_ALL=en_US.UTF-8 19 20 # Path to icupkg executable, typically located at $ICU_DIR/bin/icupkg. 21 icu_pkg= 22 # Force updates even when current tzdata is newer than the requested version. 23 force=false 24 # Dry run, doesn't run 'git clone' and 'icupkg'. 25 dry=false 26 # Compare ICU and local tzdata versions (used by update-icu.sh). 27 check_version=false 28 29 while getopts ce:fd opt 30 do 31 case "$opt" in 32 c) check_version=true;; 33 e) icu_pkg="$OPTARG";; 34 f) force=true;; 35 d) dry=true;; 36 \?) 37 echo >&2 "Usage: $0 [-e <path to icupkg>] [-f] [-d] <tzdata version>" 38 exit 1;; 39 esac 40 done 41 shift "$((OPTIND - 1))" 42 43 if [ $# -ne 1 -a $check_version = false ]; then 44 echo >&2 "Usage: $0 [-e <path to icupkg>] [-f] [-d] <tzdata version>" 45 exit 1 46 fi 47 48 tzdata_version=$1 49 50 icudata_dir=`dirname "$0"`/../config/external/icu/data 51 icu_dir=`dirname "$0"`/icu 52 tzdata_dir=`dirname "$0"`/tzdata 53 tzdata_files="${tzdata_dir}"/files.txt 54 tzdata_url=https://github.com/unicode-org/icu-data.git 55 icu_tzdata_version=`grep --only-matching --perl-regexp --regexp="tz version:\s+\K.*$" "${icu_dir}"/source/data/misc/zoneinfo64.txt` 56 local_tzdata_version= 57 if [ -f "${tzdata_dir}"/VERSION ]; then 58 local_tzdata_version=`grep --only-matching --perl-regexp --regexp="^\K[0-9a-z]+" "${tzdata_dir}"/VERSION` 59 fi 60 61 # Check ICU and current local tzdata versions. 62 if [ $check_version = true ]; then 63 if [ ! -z ${local_tzdata_version} ]; then 64 if [ ${local_tzdata_version} \> ${icu_tzdata_version} ]; then 65 echo >&2 "WARN: Local tzdata (${local_tzdata_version}) is newer than ICU tzdata (${icu_tzdata_version}), please run '$0 ${local_tzdata_version}'" 66 else 67 echo "INFO: ICU tzdata ${icu_tzdata_version} is newer than local tzdata (${local_tzdata_version})" 68 fi 69 else 70 echo "INFO: No local tzdata files found" 71 fi 72 exit 0 73 fi 74 75 # Find icu_pkg if not provided as an argument. 76 icu_pkg=${icu_pkg:-`which icupkg`} 77 78 # Test if we can execute icupkg. 79 if [ ! -x "${icu_pkg}" ]; then 80 echo >&2 "ERROR: icupkg is not an executable" 81 exit 1 82 fi 83 84 # Check ICU tzdata version. 85 if [ ${icu_tzdata_version} \> ${tzdata_version} ]; then 86 if [ $force = false ]; then 87 echo >&2 "ERROR: ICU tzdata (${icu_tzdata_version}) is newer than requested version ${tzdata_version}, use -f to force replacing" 88 exit 1 89 fi 90 fi 91 92 # Check tzdata version from last checkout. 93 if [ -n ${local_tzdata_version} -a ${local_tzdata_version} \> ${tzdata_version} ]; then 94 if [ $force = false ]; then 95 echo >&2 "ERROR: Local tzdata (${local_tzdata_version}) is newer than requested version ${tzdata_version}, use -f to force replacing" 96 exit 1 97 fi 98 fi 99 100 echo "INFO: Updating tzdata from ${local_tzdata_version:-$icu_tzdata_version} to ${tzdata_version}" 101 102 # Search for ICU data files. 103 # Little endian data files. 104 icudata_file_le=`find "${icudata_dir}" -type f -name 'icudt*l.dat'` 105 if [ -f "${icudata_file_le}" ]; then 106 icudata_file_le=`cd "$(dirname "${icudata_file_le}")" && pwd -P`/`basename "${icudata_file_le}"` 107 echo "INFO: ICU data file (little endian): ${icudata_file_le}" 108 else 109 echo >&2 "ERROR: ICU data (little endian) file not found" 110 exit 1 111 fi 112 113 # Big endian data files. 114 # Optional until https://bugzilla.mozilla.org/show_bug.cgi?id=1264836 is fixed. 115 icudata_file_be=`find "${icudata_dir}" -type f -name 'icudt*b.dat'` 116 if [ -f "${icudata_file_be}" ]; then 117 icudata_file_be=`cd "$(dirname "${icudata_file_be}")" && pwd -P`/`basename "${icudata_file_be}"` 118 echo "INFO: ICU data file (big endian): ${icudata_file_be}" 119 else 120 echo "INFO: ICU data file (big endian) not found, skipping..." 121 fi 122 123 # Retrieve tzdata from git. 124 if [ $dry = false ]; then 125 echo "INFO: Downloading tzdata${tzdata_version}" 126 127 # Remove intl/tzdata/source, then replace it with a clean export. 128 rm -r "${tzdata_dir}"/source 129 git clone --depth 1 "${tzdata_url}" "${tzdata_dir}"/source 130 git -C "${tzdata_dir}"/source filter-branch --prune-empty --subdirectory-filter tzdata/icunew/${tzdata_version}/44 HEAD 131 132 # Record `git log` and the tzdata version. 133 git -C "${tzdata_dir}"/source log -1 > "${tzdata_dir}"/GIT-INFO 134 echo "${tzdata_version}" > "${tzdata_dir}"/VERSION 135 136 # Remove the .git directory. 137 rm -rf "${tzdata_dir}"/source/.git 138 fi 139 140 # Update ICU data. 141 update_icu_data() { 142 set +e 143 144 local type="$1" 145 local file="$2" 146 local cmd="${icu_pkg} --add ${tzdata_files} --sourcedir ${tzdata_dir}/source/${type} ${file}" 147 eval "${cmd}" 148 149 local exit_status=$? 150 151 if [ $exit_status -ne 0 ]; then 152 echo >&2 "ERROR: Error updating tzdata" 153 echo >&2 "ERROR: If you see an error message like 'format version 03.00 not supported',\n"\ 154 " ensure your icupkg version matches the current ICU version." 155 exit $exit_status 156 fi 157 158 set -e 159 } 160 161 if [ $dry = false ]; then 162 update_icu_data "le" "${icudata_file_le}" 163 if [ -n "${icudata_file_be}" ]; then 164 update_icu_data "be" "${icudata_file_be}" 165 fi 166 167 hg addremove "${tzdata_dir}/source" "${tzdata_dir}/GIT-INFO" "${tzdata_dir}/VERSION" "${icudata_file_le}" 168 if [ -n "${icudata_file_be}" ]; then 169 hg addremove "${icudata_file_be}" 170 fi 171 172 echo "INFO: Successfully updated tzdata!" 173 echo "INFO: Please run js/src/builtin/intl/make_intl_data.py to update additional time zone files for SpiderMonkey." 174 fi