xref: /aosp_15_r20/prebuilts/devtools/update_jars.sh (revision 4bfccde5c7e9ea06f821db40ef0af54f6695c320)
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