|
| 1 | +#!/bin/bash |
| 2 | +# Copyright 2016 The Rust Project Developers. See the COPYRIGHT |
| 3 | +# file at the top-level directory of this distribution and at |
| 4 | +# http://rust-lang.org/COPYRIGHT. |
| 5 | +# |
| 6 | +# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or |
| 7 | +# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
| 8 | +# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your |
| 9 | +# option. This file may not be copied, modified, or distributed |
| 10 | +# except according to those terms. |
| 11 | + |
| 12 | +set -o errexit |
| 13 | +set -o pipefail |
| 14 | +set -o nounset |
| 15 | + |
| 16 | +set -o xtrace |
| 17 | + |
| 18 | +ci_dir=$(cd $(dirname $0) && pwd) |
| 19 | +. "$ci_dir/shared.sh" |
| 20 | + |
| 21 | +REPO_DIR="$1" |
| 22 | +CACHE_DIR="$2" |
| 23 | + |
| 24 | +cache_src_dir="$CACHE_DIR/src" |
| 25 | +# If the layout of the cache directory changes, bump the number here |
| 26 | +# (and anywhere else this file is referenced) so the cache is wiped |
| 27 | +cache_valid_file="$CACHE_DIR/cache_valid1" |
| 28 | + |
| 29 | +if [ ! -d "$REPO_DIR" -o ! -d "$REPO_DIR/.git" ]; then |
| 30 | + echo "Error: $REPO_DIR does not exist or is not a git repo" |
| 31 | + exit 1 |
| 32 | +fi |
| 33 | +cd $REPO_DIR |
| 34 | +if [ ! -d "$CACHE_DIR" ]; then |
| 35 | + echo "Error: $CACHE_DIR does not exist or is not an absolute path" |
| 36 | + exit 1 |
| 37 | +fi |
| 38 | + |
| 39 | +# Wipe the cache if it's not valid, or mark it as invalid while we update it |
| 40 | +if [ ! -f "$cache_valid_file" ]; then |
| 41 | + rm -rf "$CACHE_DIR" && mkdir "$CACHE_DIR" |
| 42 | +else |
| 43 | + rm "$cache_valid_file" |
| 44 | +fi |
| 45 | + |
| 46 | +# Update the cache (a pristine copy of the rust source master) |
| 47 | +if [ ! -d "$cache_src_dir/.git" ]; then |
| 48 | + retry sh -c "rm -rf $cache_src_dir && mkdir -p $cache_src_dir && \ |
| 49 | + git clone https://github.com/rust-lang/rust.git $cache_src_dir" |
| 50 | +fi |
| 51 | +retry sh -c "cd $cache_src_dir && git reset --hard && git pull" |
| 52 | +retry sh -c "cd $cache_src_dir && \ |
| 53 | + git submodule deinit -f . && git submodule sync && git submodule update --init" |
| 54 | + |
| 55 | +# Cache was updated without errors, mark it as valid |
| 56 | +touch "$cache_valid_file" |
| 57 | + |
| 58 | +# Update the submodules of the repo we're in, using the pristine repo as |
| 59 | +# a cache for any object files |
| 60 | +# No, `git submodule foreach` won't work: |
| 61 | +# http://stackoverflow.com/questions/12641469/list-submodules-in-a-git-repository |
| 62 | +modules="$(git config --file .gitmodules --get-regexp '\.path$' | cut -d' ' -f2)" |
| 63 | +for module in $modules; do |
| 64 | + if [ ! -d "$cache_src_dir/$module" ]; then |
| 65 | + echo "WARNING: $module not found in pristine repo" |
| 66 | + retry sh -c "git submodule deinit -f $module && git submodule update --init $module" |
| 67 | + continue |
| 68 | + fi |
| 69 | + retry sh -c "git submodule deinit -f $module && \ |
| 70 | + git submodule update --init --reference $cache_src_dir/$module $module" |
| 71 | +done |
0 commit comments