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