summaryrefslogtreecommitdiffstats
path: root/intl/update-tzdata.sh
diff options
context:
space:
mode:
Diffstat (limited to 'intl/update-tzdata.sh')
-rwxr-xr-xintl/update-tzdata.sh174
1 files changed, 174 insertions, 0 deletions
diff --git a/intl/update-tzdata.sh b/intl/update-tzdata.sh
new file mode 100755
index 0000000000..62a6cbcae2
--- /dev/null
+++ b/intl/update-tzdata.sh
@@ -0,0 +1,174 @@
+#!/bin/sh
+# 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/.
+
+set -e
+
+# Usage: update-tzdata.sh <tzdata version>
+# E.g., for tzdata2016f: update-tzdata.sh 2016f
+
+# Ensure that $Date$ in the checked-out git files expands timezone-agnostically,
+# so that this script's behavior is consistent when run from any time zone.
+export TZ=UTC
+
+# Also ensure GIT-INFO is consistently English.
+export LANG=en_US.UTF-8
+export LANGUAGE=en_US
+export LC_ALL=en_US.UTF-8
+
+# Path to icupkg executable, typically located at $ICU_DIR/bin/icupkg.
+icu_pkg=
+# Force updates even when current tzdata is newer than the requested version.
+force=false
+# Dry run, doesn't run 'git clone' and 'icupkg'.
+dry=false
+# Compare ICU and local tzdata versions (used by update-icu.sh).
+check_version=false
+
+while getopts ce:fd opt
+do
+ case "$opt" in
+ c) check_version=true;;
+ e) icu_pkg="$OPTARG";;
+ f) force=true;;
+ d) dry=true;;
+ \?)
+ echo >&2 "Usage: $0 [-e <path to icupkg>] [-f] [-d] <tzdata version>"
+ exit 1;;
+ esac
+done
+shift "$((OPTIND - 1))"
+
+if [ $# -ne 1 -a $check_version = false ]; then
+ echo >&2 "Usage: $0 [-e <path to icupkg>] [-f] [-d] <tzdata version>"
+ exit 1
+fi
+
+tzdata_version=$1
+
+icudata_dir=`dirname "$0"`/../config/external/icu/data
+icu_dir=`dirname "$0"`/icu
+tzdata_dir=`dirname "$0"`/tzdata
+tzdata_files="${tzdata_dir}"/files.txt
+tzdata_url=https://github.com/unicode-org/icu-data.git
+icu_tzdata_version=`grep --only-matching --perl-regexp --regexp="tz version:\s+\K.*$" "${icu_dir}"/source/data/misc/zoneinfo64.txt`
+local_tzdata_version=
+if [ -f "${tzdata_dir}"/VERSION ]; then
+ local_tzdata_version=`grep --only-matching --perl-regexp --regexp="^\K[0-9a-z]+" "${tzdata_dir}"/VERSION`
+fi
+
+# Check ICU and current local tzdata versions.
+if [ $check_version = true ]; then
+ if [ ! -z ${local_tzdata_version} ]; then
+ if [ ${local_tzdata_version} \> ${icu_tzdata_version} ]; then
+ echo >&2 "WARN: Local tzdata (${local_tzdata_version}) is newer than ICU tzdata (${icu_tzdata_version}), please run '$0 ${local_tzdata_version}'"
+ else
+ echo "INFO: ICU tzdata ${icu_tzdata_version} is newer than local tzdata (${local_tzdata_version})"
+ fi
+ else
+ echo "INFO: No local tzdata files found"
+ fi
+ exit 0
+fi
+
+# Find icu_pkg if not provided as an argument.
+icu_pkg=${icu_pkg:-`which icupkg`}
+
+# Test if we can execute icupkg.
+if [ ! -x "${icu_pkg}" ]; then
+ echo >&2 "ERROR: icupkg is not an executable"
+ exit 1
+fi
+
+# Check ICU tzdata version.
+if [ ${icu_tzdata_version} \> ${tzdata_version} ]; then
+ if [ $force = false ]; then
+ echo >&2 "ERROR: ICU tzdata (${icu_tzdata_version}) is newer than requested version ${tzdata_version}, use -f to force replacing"
+ exit 1
+ fi
+fi
+
+# Check tzdata version from last checkout.
+if [ -n ${local_tzdata_version} -a ${local_tzdata_version} \> ${tzdata_version} ]; then
+ if [ $force = false ]; then
+ echo >&2 "ERROR: Local tzdata (${local_tzdata_version}) is newer than requested version ${tzdata_version}, use -f to force replacing"
+ exit 1
+ fi
+fi
+
+echo "INFO: Updating tzdata from ${local_tzdata_version:-$icu_tzdata_version} to ${tzdata_version}"
+
+# Search for ICU data files.
+# Little endian data files.
+icudata_file_le=`find "${icudata_dir}" -type f -name 'icudt*l.dat'`
+if [ -f "${icudata_file_le}" ]; then
+ icudata_file_le=`cd "$(dirname "${icudata_file_le}")" && pwd -P`/`basename "${icudata_file_le}"`
+ echo "INFO: ICU data file (little endian): ${icudata_file_le}"
+else
+ echo >&2 "ERROR: ICU data (little endian) file not found"
+ exit 1
+fi
+
+# Big endian data files.
+# Optional until https://bugzilla.mozilla.org/show_bug.cgi?id=1264836 is fixed.
+icudata_file_be=`find "${icudata_dir}" -type f -name 'icudt*b.dat'`
+if [ -f "${icudata_file_be}" ]; then
+ icudata_file_be=`cd "$(dirname "${icudata_file_be}")" && pwd -P`/`basename "${icudata_file_be}"`
+ echo "INFO: ICU data file (big endian): ${icudata_file_be}"
+else
+ echo "INFO: ICU data file (big endian) not found, skipping..."
+fi
+
+# Retrieve tzdata from git.
+if [ $dry = false ]; then
+ echo "INFO: Downloading tzdata${tzdata_version}"
+
+ # Remove intl/tzdata/source, then replace it with a clean export.
+ rm -r "${tzdata_dir}"/source
+ git clone --depth 1 "${tzdata_url}" "${tzdata_dir}"/source
+ git -C "${tzdata_dir}"/source filter-branch --prune-empty --subdirectory-filter tzdata/icunew/${tzdata_version}/44 HEAD
+
+ # Record `git log` and the tzdata version.
+ git -C "${tzdata_dir}"/source log -1 > "${tzdata_dir}"/GIT-INFO
+ echo "${tzdata_version}" > "${tzdata_dir}"/VERSION
+
+ # Remove the .git directory.
+ rm -rf "${tzdata_dir}"/source/.git
+fi
+
+# Update ICU data.
+update_icu_data() {
+ set +e
+
+ local type="$1"
+ local file="$2"
+ local cmd="${icu_pkg} --add ${tzdata_files} --sourcedir ${tzdata_dir}/source/${type} ${file}"
+ eval "${cmd}"
+
+ local exit_status=$?
+
+ if [ $exit_status -ne 0 ]; then
+ echo >&2 "ERROR: Error updating tzdata"
+ echo >&2 "ERROR: If you see an error message like 'format version 03.00 not supported',\n"\
+ " ensure your icupkg version matches the current ICU version."
+ exit $exit_status
+ fi
+
+ set -e
+}
+
+if [ $dry = false ]; then
+ update_icu_data "le" "${icudata_file_le}"
+ if [ -n "${icudata_file_be}" ]; then
+ update_icu_data "be" "${icudata_file_be}"
+ fi
+
+ hg addremove "${tzdata_dir}/source" "${tzdata_dir}/GIT-INFO" "${tzdata_dir}/VERSION" "${icudata_file_le}"
+ if [ -n "${icudata_file_be}" ]; then
+ hg addremove "${icudata_file_be}"
+ fi
+
+ echo "INFO: Successfully updated tzdata!"
+ echo "INFO: Please run js/src/builtin/intl/make_intl_data.py to update additional time zone files for SpiderMonkey."
+fi