| #!/bin/bash |
| |
| set -e # fail on errors |
| |
| if [[ $(uname) == "Darwin" ]]; then |
| PROG_DIR=$(dirname "$0") |
| else |
| PROG_DIR=$(readlink -f $(dirname "$0")) |
| fi |
| cd "$PROG_DIR" |
| |
| DRY="echo" # default to dry mode unless -f is specified |
| MK_MERGE_MSG="1" # 1 to update the MERGE_MSG, empty to do not generate it |
| MERGE_MSG="" # msg to generate |
| JAR_DETECT="" |
| NAMES_FILTER="" |
| |
| while [[ -n "$1" ]]; do |
| if [[ "$1" == "-f" ]]; then |
| DRY="" |
| elif [[ "$1" == "-m" ]]; then |
| MK_MERGE_MSG="" |
| elif [[ "$1" == "-u" ]]; then |
| JAR_DETECT="auto" |
| elif [[ "$1" == "-o" ]]; then |
| JAR_DETECT="only" |
| elif [[ $JAR_DETECT == "only" && $1 =~ ^[a-z]+ ]]; then |
| NAMES_FILTER="$NAMES_FILTER $1" |
| else |
| echo "Unknown argument: $1" |
| echo "Usage: $0 [-f] [-m] [-u | -o name1.jar ... nameN.jar]" |
| echo " -f: actual do thing. Default is dry-run." |
| echo " -m: do NOT generate a .git/MERGE_MSG" |
| echo " -u: detect and git-revert unchanged JAR files" |
| echo " -o: only keep the given *leaf* filenames (.jar can be omitted)" |
| exit 1 |
| fi |
| shift |
| done |
| |
| if [[ $JAR_DETECT == "only" && -z "$NAMES_FILTER" ]]; then |
| echo "Error: -o must be followed by names of files to keep." |
| exit 1 |
| fi |
| |
| function update() { |
| echo |
| local repo=$1 |
| |
| echo "# Build tools/$repo" |
| |
| local SHA1=$( cd ../../tools/$repo ; git show-ref --head --hash HEAD ) |
| MERGE_MSG="$MERGE_MSG |
| tools/$repo: @ $SHA1" |
| |
| ( $DRY cd ../../tools/$repo && $DRY ./gradlew clean publishLocal pushDistribution ) |
| } |
| |
| function merge_msg() { |
| local dst=.git/MERGE_MSG |
| if [[ -n $DRY ]]; then |
| echo "The following would be output to $dst (use -m to prevent this):" |
| dst=/dev/stdout |
| fi |
| cat >> $dst <<EOMSG |
| Update SDK prebuilts. |
| |
| Origin: |
| $MERGE_MSG |
| |
| EOMSG |
| } |
| |
| function preserve_jars() { |
| JAR_TMP_DIR=`mktemp -d -t prebuilt_update_tmp.XXXXXXXX` |
| N=0 |
| for i in `find . -type f | grep -v "^\./\."` ; do |
| tmpf=`echo $i | tr "./" "__"` |
| dstf="$JAR_TMP_DIR/$tmpf" |
| cp "$i" "$dstf" |
| N=$((N+1)) |
| done |
| echo "# Copied $N files to" $(basename $JAR_TMP_DIR) |
| } |
| |
| function revert_unchanged_jars() { |
| local i tmpf dstf tmp_hash local_hash |
| for i in `find . -type f | grep -v "^\./\."` ; do |
| tmpf=`echo $i | tr "./" "__"` |
| dstf="$JAR_TMP_DIR/$tmpf" |
| tmp_hash=`get_hash $dstf` |
| local_hash=`get_hash $i` |
| if [[ $dst_hash == $src_hash ]]; then |
| echo "# Revert unchanged file $i" |
| $DRY cp "$dstf" "$i" |
| else |
| echo "!--> Keep changed file $i" |
| fi |
| done |
| if [[ -d $JAR_TMP_DIR ]]; then |
| echo "# Cleanup" $(basename $JAR_TMP_DIR) |
| rm -rf $JAR_TMP_DIR |
| fi |
| } |
| |
| function revert_filter_jars() { |
| local i j tmpf dstf keep |
| for i in `find . -type f | grep -v "^\./\."` ; do |
| tmpf=`echo $i | tr "./" "__"` |
| dstf="$JAR_TMP_DIR/$tmpf" |
| if ! diff -q $dstf $i 1>/dev/null ; then |
| j=$(basename "$i") |
| for f in $NAMES_FILTER; do |
| if [[ "$j" == "$f" || "$j" == "$f.jar" ]]; then |
| echo "!--> Keep changed file $i" |
| i="" |
| break |
| fi |
| done |
| if [[ -f "$i" ]]; then |
| echo "# Revert file $i" |
| $DRY cp "$dstf" "$i" |
| fi |
| fi |
| done |
| if [[ -d $JAR_TMP_DIR ]]; then |
| echo "# Cleanup" $(basename $JAR_TMP_DIR) |
| rm -rf $JAR_TMP_DIR |
| fi |
| } |
| |
| function get_hash() { |
| # $1: the file to hash |
| if [[ "${1: -3}" == "jar" ]]; then |
| # Explanation: |
| # - unzip -v prints a "verbose" list of a zip's content including each file path, size, timestamp and CRC32 |
| # - we don't want the timestamp so we use sed to first remove the time (12:34) and the date (13-14-15). |
| # - finally get a md5 of the zip output. |
| # if the md5 changes, the zip's content has changed (new file, different content size, different CRC32) |
| unzip -v $1 | sed -n -e "/[0-9][0-9]:[0-9][0-9]/s/[0-9][0-9]:[0-9][0-9]// ; s/[0-9][0-9]-[0-9][0-9]-[0-9][0-9]//p" | md5sum -b | cut -d " " -f 1 |
| else |
| md5sum -b "$1" | cut -d " " -f 1 |
| fi |
| } |
| |
| |
| if [[ -n $JAR_DETECT ]]; then preserve_jars; fi |
| for r in base swt; do |
| update $r |
| done |
| if [[ -n $MK_MERGE_MSG ]]; then merge_msg; fi |
| if [[ $JAR_DETECT == "auto" ]]; then |
| revert_unchanged_jars |
| elif [[ $JAR_DETECT == "only" ]]; then |
| revert_filter_jars |
| fi |
| if [[ -n $DRY ]]; then |
| echo |
| echo "## WARNING: DRY MODE. Run with -f to actually copy files." |
| fi |
| |