1*4bfccde5SXin Li#!/bin/bash 2*4bfccde5SXin Li 3*4bfccde5SXin Liset -e # fail on errors 4*4bfccde5SXin Li 5*4bfccde5SXin Liif [[ $(uname) == "Darwin" ]]; then 6*4bfccde5SXin Li PROG_DIR=$(dirname "$0") 7*4bfccde5SXin Lielse 8*4bfccde5SXin Li PROG_DIR=$(readlink -f $(dirname "$0")) 9*4bfccde5SXin Lifi 10*4bfccde5SXin Licd "$PROG_DIR" 11*4bfccde5SXin Li 12*4bfccde5SXin LiDRY="echo" # default to dry mode unless -f is specified 13*4bfccde5SXin LiMK_MERGE_MSG="1" # 1 to update the MERGE_MSG, empty to do not generate it 14*4bfccde5SXin LiMERGE_MSG="" # msg to generate 15*4bfccde5SXin LiJAR_DETECT="" 16*4bfccde5SXin LiNAMES_FILTER="" 17*4bfccde5SXin Li 18*4bfccde5SXin Liwhile [[ -n "$1" ]]; do 19*4bfccde5SXin Li if [[ "$1" == "-f" ]]; then 20*4bfccde5SXin Li DRY="" 21*4bfccde5SXin Li elif [[ "$1" == "-m" ]]; then 22*4bfccde5SXin Li MK_MERGE_MSG="" 23*4bfccde5SXin Li elif [[ "$1" == "-u" ]]; then 24*4bfccde5SXin Li JAR_DETECT="auto" 25*4bfccde5SXin Li elif [[ "$1" == "-o" ]]; then 26*4bfccde5SXin Li JAR_DETECT="only" 27*4bfccde5SXin Li elif [[ $JAR_DETECT == "only" && $1 =~ ^[a-z]+ ]]; then 28*4bfccde5SXin Li NAMES_FILTER="$NAMES_FILTER $1" 29*4bfccde5SXin Li else 30*4bfccde5SXin Li echo "Unknown argument: $1" 31*4bfccde5SXin Li echo "Usage: $0 [-f] [-m] [-u | -o name1.jar ... nameN.jar]" 32*4bfccde5SXin Li echo " -f: actual do thing. Default is dry-run." 33*4bfccde5SXin Li echo " -m: do NOT generate a .git/MERGE_MSG" 34*4bfccde5SXin Li echo " -u: detect and git-revert unchanged JAR files" 35*4bfccde5SXin Li echo " -o: only keep the given *leaf* filenames (.jar can be omitted)" 36*4bfccde5SXin Li exit 1 37*4bfccde5SXin Li fi 38*4bfccde5SXin Li shift 39*4bfccde5SXin Lidone 40*4bfccde5SXin Li 41*4bfccde5SXin Liif [[ $JAR_DETECT == "only" && -z "$NAMES_FILTER" ]]; then 42*4bfccde5SXin Li echo "Error: -o must be followed by names of files to keep." 43*4bfccde5SXin Li exit 1 44*4bfccde5SXin Lifi 45*4bfccde5SXin Li 46*4bfccde5SXin Lifunction update() { 47*4bfccde5SXin Li echo 48*4bfccde5SXin Li local repo=$1 49*4bfccde5SXin Li 50*4bfccde5SXin Li echo "# Build tools/$repo" 51*4bfccde5SXin Li 52*4bfccde5SXin Li local SHA1=$( cd ../../tools/$repo ; git show-ref --head --hash HEAD ) 53*4bfccde5SXin Li MERGE_MSG="$MERGE_MSG 54*4bfccde5SXin Litools/$repo: @ $SHA1" 55*4bfccde5SXin Li 56*4bfccde5SXin Li ( $DRY cd ../../tools/$repo && $DRY ./gradlew clean publishLocal pushDistribution ) 57*4bfccde5SXin Li} 58*4bfccde5SXin Li 59*4bfccde5SXin Lifunction merge_msg() { 60*4bfccde5SXin Li local dst=.git/MERGE_MSG 61*4bfccde5SXin Li if [[ -n $DRY ]]; then 62*4bfccde5SXin Li echo "The following would be output to $dst (use -m to prevent this):" 63*4bfccde5SXin Li dst=/dev/stdout 64*4bfccde5SXin Li fi 65*4bfccde5SXin Li cat >> $dst <<EOMSG 66*4bfccde5SXin LiUpdate SDK prebuilts. 67*4bfccde5SXin Li 68*4bfccde5SXin LiOrigin: 69*4bfccde5SXin Li$MERGE_MSG 70*4bfccde5SXin Li 71*4bfccde5SXin LiEOMSG 72*4bfccde5SXin Li} 73*4bfccde5SXin Li 74*4bfccde5SXin Lifunction preserve_jars() { 75*4bfccde5SXin Li JAR_TMP_DIR=`mktemp -d -t prebuilt_update_tmp.XXXXXXXX` 76*4bfccde5SXin Li N=0 77*4bfccde5SXin Li for i in `find . -type f | grep -v "^\./\."` ; do 78*4bfccde5SXin Li tmpf=`echo $i | tr "./" "__"` 79*4bfccde5SXin Li dstf="$JAR_TMP_DIR/$tmpf" 80*4bfccde5SXin Li cp "$i" "$dstf" 81*4bfccde5SXin Li N=$((N+1)) 82*4bfccde5SXin Li done 83*4bfccde5SXin Li echo "# Copied $N files to" $(basename $JAR_TMP_DIR) 84*4bfccde5SXin Li} 85*4bfccde5SXin Li 86*4bfccde5SXin Lifunction revert_unchanged_jars() { 87*4bfccde5SXin Li local i tmpf dstf tmp_hash local_hash 88*4bfccde5SXin Li for i in `find . -type f | grep -v "^\./\."` ; do 89*4bfccde5SXin Li tmpf=`echo $i | tr "./" "__"` 90*4bfccde5SXin Li dstf="$JAR_TMP_DIR/$tmpf" 91*4bfccde5SXin Li tmp_hash=`get_hash $dstf` 92*4bfccde5SXin Li local_hash=`get_hash $i` 93*4bfccde5SXin Li if [[ $dst_hash == $src_hash ]]; then 94*4bfccde5SXin Li echo "# Revert unchanged file $i" 95*4bfccde5SXin Li $DRY cp "$dstf" "$i" 96*4bfccde5SXin Li else 97*4bfccde5SXin Li echo "!--> Keep changed file $i" 98*4bfccde5SXin Li fi 99*4bfccde5SXin Li done 100*4bfccde5SXin Li if [[ -d $JAR_TMP_DIR ]]; then 101*4bfccde5SXin Li echo "# Cleanup" $(basename $JAR_TMP_DIR) 102*4bfccde5SXin Li rm -rf $JAR_TMP_DIR 103*4bfccde5SXin Li fi 104*4bfccde5SXin Li} 105*4bfccde5SXin Li 106*4bfccde5SXin Lifunction revert_filter_jars() { 107*4bfccde5SXin Li local i j tmpf dstf keep 108*4bfccde5SXin Li for i in `find . -type f | grep -v "^\./\."` ; do 109*4bfccde5SXin Li tmpf=`echo $i | tr "./" "__"` 110*4bfccde5SXin Li dstf="$JAR_TMP_DIR/$tmpf" 111*4bfccde5SXin Li if ! diff -q $dstf $i 1>/dev/null ; then 112*4bfccde5SXin Li j=$(basename "$i") 113*4bfccde5SXin Li for f in $NAMES_FILTER; do 114*4bfccde5SXin Li if [[ "$j" == "$f" || "$j" == "$f.jar" ]]; then 115*4bfccde5SXin Li echo "!--> Keep changed file $i" 116*4bfccde5SXin Li i="" 117*4bfccde5SXin Li break 118*4bfccde5SXin Li fi 119*4bfccde5SXin Li done 120*4bfccde5SXin Li if [[ -f "$i" ]]; then 121*4bfccde5SXin Li echo "# Revert file $i" 122*4bfccde5SXin Li $DRY cp "$dstf" "$i" 123*4bfccde5SXin Li fi 124*4bfccde5SXin Li fi 125*4bfccde5SXin Li done 126*4bfccde5SXin Li if [[ -d $JAR_TMP_DIR ]]; then 127*4bfccde5SXin Li echo "# Cleanup" $(basename $JAR_TMP_DIR) 128*4bfccde5SXin Li rm -rf $JAR_TMP_DIR 129*4bfccde5SXin Li fi 130*4bfccde5SXin Li} 131*4bfccde5SXin Li 132*4bfccde5SXin Lifunction get_hash() { 133*4bfccde5SXin Li # $1: the file to hash 134*4bfccde5SXin Li if [[ "${1: -3}" == "jar" ]]; then 135*4bfccde5SXin Li # Explanation: 136*4bfccde5SXin Li # - unzip -v prints a "verbose" list of a zip's content including each file path, size, timestamp and CRC32 137*4bfccde5SXin Li # - we don't want the timestamp so we use sed to first remove the time (12:34) and the date (13-14-15). 138*4bfccde5SXin Li # - finally get a md5 of the zip output. 139*4bfccde5SXin Li # if the md5 changes, the zip's content has changed (new file, different content size, different CRC32) 140*4bfccde5SXin Li 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 141*4bfccde5SXin Li else 142*4bfccde5SXin Li md5sum -b "$1" | cut -d " " -f 1 143*4bfccde5SXin Li fi 144*4bfccde5SXin Li} 145*4bfccde5SXin Li 146*4bfccde5SXin Li 147*4bfccde5SXin Liif [[ -n $JAR_DETECT ]]; then preserve_jars; fi 148*4bfccde5SXin Lifor r in base swt; do 149*4bfccde5SXin Li update $r 150*4bfccde5SXin Lidone 151*4bfccde5SXin Liif [[ -n $MK_MERGE_MSG ]]; then merge_msg; fi 152*4bfccde5SXin Liif [[ $JAR_DETECT == "auto" ]]; then 153*4bfccde5SXin Li revert_unchanged_jars 154*4bfccde5SXin Lielif [[ $JAR_DETECT == "only" ]]; then 155*4bfccde5SXin Li revert_filter_jars 156*4bfccde5SXin Lifi 157*4bfccde5SXin Liif [[ -n $DRY ]]; then 158*4bfccde5SXin Li echo 159*4bfccde5SXin Li echo "## WARNING: DRY MODE. Run with -f to actually copy files." 160*4bfccde5SXin Lifi 161*4bfccde5SXin Li 162