You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
4.2 KiB
161 lines
4.2 KiB
#!/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 |
|
|
|
|