#!/bin/bash # Copyright (c) 2012 The Native Client Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # This script must be run from the native_client/tools directory. # It canonicalizes the timestamps of all the files in the argument # directories to the svn revision date of the last commit that might # have changed the toolchain contents. This way, if all the files # are identical in two builds, the tarballs will be identical too. # Fail if any command fails or if any undefined $variable is evaluated. set -u -e -o pipefail # Choose the appropriate svn command to use (taken from glibc_revision.sh). if [ "`uname -s`" = Darwin -o "`uname -o`" != "Cygwin" ]; then SVN=svn else SVN=svn.bat fi # These are the files whose commits represent "changing the toolchain". timestamp_files='Makefile REVISIONS' # Get the time a file was last changed by a subversion commit (YYYYMMDDHHMMSS). # svn info emits a line like: # Text Last Updated: 2011-12-22 00:44:12 +0000 (Thu, 22 Dec 2011) # This function turns that into: # 20111222004412 # Such strings are comparable as integers to deduce their order in time. svn_timestamp() { LC_ALL=C TZ=UTC $SVN info "$1" | sed -n 's/^Text Last Updated: \([0-9]\{4\}\)-\([0-9]\{1,2\}\)-\([0-9]\{1,2\}\) \([0-9]\{1,2\}\):\([0-9]\{1,2\}\):\([0-9]\{1,2\}\) .*$/\1\2\3\4\5\6/p' } # Find the latest timestamp among the $timestamp_files. timestamp=0 for timestamp_file in $timestamp_files; do file_timestamp=`svn_timestamp "$timestamp_file"` if [ "$file_timestamp" -gt $timestamp ]; then timestamp=$file_timestamp fi done if [ $timestamp -eq 0 ]; then echo >&2 "Failed to glean svn revision timestamp from $timestamp_files" exit 1 fi # Turn that comparable number into the format "touch -t" wants. # That is, "YYYYMMDDHHMMSS" becomes "YYYYMMDDHHMM.SS". touch_timestamp="${timestamp%??}.${timestamp#????????????}" # Use that as the modification time of all the files that will go into the # toolchain tarball. find "$@" -print0 | TZ=UTC xargs -0 touch -m -t "$touch_timestamp"