xref: /aosp_15_r20/external/skia/third_party/expat/roll-expat.sh (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1#!/bin/bash
2
3EXPAT_GIT_REPO=https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git
4EXPAT_GIT_REF=origin/upstream/master
5EXPAT_GIT_DIR=third_party/externals/expat
6EXPAT_BUILD_DIR=$(dirname -- "$0")
7
8previousrev() {
9  STEP="original revision" &&
10  EXPAT_PREVIOUS_REV=$(git grep "${EXPAT_GIT_REPO}" HEAD~1 -- DEPS | sed 's!.*'${EXPAT_GIT_REPO}'@\([[:xdigit:]]\{40\}\).*!\1!')
11}
12
13nextrev() {
14  STEP="next revision" &&
15  git -C "${EXPAT_GIT_DIR}" fetch &&
16  EXPAT_NEXT_REV=$(git -C "${EXPAT_GIT_DIR}" rev-parse ${EXPAT_GIT_REF})
17}
18
19rolldeps() {
20  STEP="roll-deps" &&
21  sed -i'' -e "s!${EXPAT_GIT_REPO}@${EXPAT_PREVIOUS_REV}!${EXPAT_GIT_REPO}@${EXPAT_NEXT_REV}!" DEPS &&
22  tools/git-sync-deps &&
23  git add DEPS
24}
25
26check_all_files_are_categorized() {
27  #for each file name in ${EXPAT_GIT_DIR}/expat/lib/*.{c,h}
28  #  if the file name is not present in BUILD.gn
29  #    should be added to BUILD.gn (in 'unused_sources' if unwanted)
30
31  #for each file name \"expat/lib/.*\" in BUILD.gn
32  #  if the file name does not exist
33  #    should be removed from BUILD.gn
34
35  STEP="Updating BUILD.gn" &&
36  EXPAT_BUILD_DIR_REL=$(realpath --relative-to="${EXPAT_GIT_DIR}" "${EXPAT_BUILD_DIR}")
37  ( # Create subshell for IFS, CDPATH, and cd.
38    # This implementation doesn't handle '"' or '\n' in file names.
39    IFS=$'\n' &&
40    CDPATH= &&
41    cd -- "${EXPAT_GIT_DIR}" &&
42
43    EXPAT_SOURCE_MISSING=false &&
44    find "expat/lib" -type f \( -name "*.c" -o -name "*.h" \) | while read EXPAT_SOURCE
45    do
46      if ! grep -qF "$EXPAT_SOURCE" "${EXPAT_BUILD_DIR_REL}/BUILD.gn"; then
47        if ! ${EXPAT_SOURCE_MISSING}; then
48          echo "Is in expat/lib/*.{c,h} but not in BUILD.gn:"
49          EXPAT_SOURCE_MISSING=true
50        fi
51        echo "      \"\$_src/${EXPAT_SOURCE}\","
52      fi
53    done &&
54
55    GN_SOURCE_MISSING=false &&
56    grep -oE "\"\\\$_src/[^\"]+\"" "${EXPAT_BUILD_DIR_REL}/BUILD.gn" | sed 's@^"._src/\(.*\).$@\1@' | while read GN_SOURCE
57    do
58      if [ ! -f "${GN_SOURCE}" ]; then
59        if ! ${GN_SOURCE_MISSING}; then
60          echo "Is referenced in BUILD.gn but does not exist:" &&
61          GN_SOURCE_MISSING=true
62        fi
63        echo "\"${GN_SOURCE}\""
64      fi
65    done &&
66
67    GN_SOURCE_DUPLICATES=$(sort "${EXPAT_BUILD_DIR_REL}/BUILD.gn" | uniq -d | grep -oE "\"\\\$_src/[^\"]+\"")
68    if [ ! -z ${GN_SOURCE_DUPLICATES} ]; then
69      echo "Is listed more than once in BUILD.gn:" &&
70      echo ${GN_SOURCE_DUPLICATES}
71    fi
72  )
73}
74
75update_expat_config_h() {
76  STEP="update expat config.h" &&
77  ( cd "${EXPAT_GIT_DIR}/expat" &&
78    ./buildconf.sh &&
79    ./configure) &&
80  cp "${EXPAT_GIT_DIR}/expat/expat_config.h" "${EXPAT_BUILD_DIR}/include/expat_config/" &&
81  patch -d "${EXPAT_BUILD_DIR}" -p3 < "${EXPAT_BUILD_DIR}/0001-Do-not-claim-getrandom.patch" &&
82  patch -d "${EXPAT_BUILD_DIR}" -p3 < "${EXPAT_BUILD_DIR}/0002-Do-not-claim-arc4random_buf.patch" &&
83  git add "${EXPAT_BUILD_DIR}/include/expat_config/expat_config.h"
84}
85
86commit() {
87  STEP="commit" &&
88  EXPAT_PREVIOUS_REV_SHORT=$(expr substr "${EXPAT_PREVIOUS_REV}" 1 8) &&
89  EXPAT_NEXT_REV_SHORT=$(expr substr "${EXPAT_NEXT_REV}" 1 8) &&
90  EXPAT_COMMIT_COUNT=$(git -C ${EXPAT_GIT_DIR} rev-list --count ${EXPAT_PREVIOUS_REV}..${EXPAT_NEXT_REV}) &&
91  git commit -m"Roll Expat from ${EXPAT_PREVIOUS_REV_SHORT} to ${EXPAT_NEXT_REV_SHORT} (${EXPAT_COMMIT_COUNT} commits)
92
93${EXPAT_GIT_REPO}/+log/${EXPAT_PREVIOUS_REV}..${EXPAT_NEXT_REV}
94
95Disable: treat-URL-as-trailer"
96}
97
98previousrev &&
99nextrev &&
100rolldeps "$@" &&
101update_expat_config_h &&
102check_all_files_are_categorized &&
103commit &&
104true || { echo "Failed step ${STEP}"; exit 1; }
105