| #!/usr/bin/env bash |
| # |
| # Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file |
| # for details. All rights reserved. Use of this source code is governed by a |
| # BSD-style license that can be found in the LICENSE file. |
| # |
| # This script updates the flutter engine DEPS file with the |
| # Dart SDK dependencies. |
| # |
| # Usage: src/flutter/third_party/dart/tools/patches/flutter-engine/apply.sh |
| # (run inside the root of a flutter engine checkout) |
| |
| set -e |
| |
| DIR=$(dirname -- "$(which -- "$0")") |
| . $DIR/../utils.sh |
| |
| ensure_in_checkout_root |
| |
| pinned_dart_sdk=$(get_pinned_dart_version) |
| need_runhooks=false |
| |
| # Update the flutter DEPS with the revisions in the Dart SDK DEPS. |
| src/tools/dart/create_updated_flutter_deps.py |
| if ! (cd src/flutter && git diff --exit-code DEPS); then |
| need_runhooks=true |
| fi |
| |
| if [ $need_runhooks = true ]; then |
| # Check if .gclient configuration specifies a cache_dir. Local caches are used |
| # by bots to reduce amount of Git traffic. .gclient configuration file |
| # is a well-formed Python source so use Python load_source to parse it. |
| # If cache_dir is specified then we need to force update the git cache, |
| # otherwise git fetch below might fail to find tags and commits we are |
| # referencing. |
| # Normally gclient sync would update the cache - but we are bypassing |
| # it here. |
| git_cache=$(python3 -c '\ |
| import importlib.util |
| import importlib.machinery |
| |
| def load_source(modname, filename): |
| loader = importlib.machinery.SourceFileLoader(modname, filename) |
| spec = importlib.util.spec_from_file_location(modname, filename, loader=loader) |
| module = importlib.util.module_from_spec(spec) |
| loader.exec_module(module) |
| return module |
| |
| config = load_source("config", ".gclient"); |
| print(getattr(config, "cache_dir", ""))') |
| |
| # DEPS file might have been patched with new version of packages that |
| # Dart SDK depends on. Get information about dependencies from the |
| # DEPS file and forcefully update checkouts of those dependencies. |
| gclient revinfo --ignore-dep-type=cipd | grep 'src/flutter/third_party/dart/third_party' | while read -r line; do |
| # revinfo would produce lines in the following format: |
| # path: git-url@tag-or-hash |
| # Where no spaces occur inside path, git-url or tag-or-hash. |
| # To extract path and tag-or-hash we replace ': ' and '@' with ' ' |
| # and then create array from the resulting string which splits it |
| # by whitespace. |
| line="${line/: / }" |
| line="${line/@/ }" |
| line=(${line}) |
| dependency_path=${line[0]} |
| repo=${line[1]} |
| dependency_tag_or_hash=${line[2]} |
| |
| # If the dependency does not exist (e.g. was newly added) we need to clone |
| # the repository first into the right location. |
| if [ ! -e ${dependency_path} ]; then |
| git clone ${repo} ${dependency_path} |
| fi |
| # Inside dependency compare HEAD to specified tag-or-hash by rev-parse'ing |
| # them and comparing resulting hashes. |
| # Note: tag^0 forces rev-parse to return commit hash rather then the hash of |
| # the tag object itself. |
| pushd ${dependency_path} > /dev/null |
| if [ $(git rev-parse HEAD) != $(git rev-parse ${dependency_tag_or_hash}^0) ]; then |
| echo "${dependency_path} requires update to match DEPS file" |
| if [ "$git_cache" != "" ]; then |
| echo "--- Forcing update of the git_cache ${git_cache}" |
| git cache fetch -c ${git_cache} --all -v |
| fi |
| git fetch origin |
| git checkout ${dependency_tag_or_hash} |
| fi |
| popd > /dev/null |
| done |
| gclient runhooks |
| fi |