| #!/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 |