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