Skip to content

Commit 0347ff5

Browse files
committed
Attempt to cache git modules
1 parent 8dfc25e commit 0347ff5

File tree

4 files changed

+91
-7
lines changed

4 files changed

+91
-7
lines changed

.travis.yml

+16-6
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,14 @@ before_script:
133133
script:
134134
- >
135135
if [ "$ALLOW_PR" = "" ] && [ "$TRAVIS_BRANCH" != "auto" ]; then
136-
echo skipping, not a full build;
137-
elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
138-
travis_retry stamp sh -c 'git submodule deinit -f . && git submodule update --init' &&
139-
stamp src/ci/run.sh;
136+
echo skipping, not a full build
140137
else
141-
travis_retry stamp sh -c 'git submodule deinit -f . && git submodule update --init' &&
142-
stamp src/ci/docker/run.sh $IMAGE;
138+
stamp src/ci/init_repo.sh . "$HOME/rustsrc" &&
139+
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
140+
stamp src/ci/run.sh;
141+
else
142+
stamp src/ci/docker/run.sh $IMAGE;
143+
fi
143144
fi
144145
145146
after_success:
@@ -157,20 +158,29 @@ after_failure:
157158
- cat /tmp/sccache.log
158159

159160
# Save tagged docker images we created and load them if they're available
161+
# Travis saves caches whether the build failed or not, nuke rustsrc if
162+
# the failure was while updating it (as it may be in an bad state)
163+
# https://github.com/travis-ci/travis-ci/issues/4472
160164
before_cache:
161165
- docker history -q rust-ci |
162166
grep -v missing |
163167
xargs docker save |
164168
gzip > $HOME/docker/rust-ci.tar.gz
169+
- if [ ! -f $HOME/rustsrc/cache_valid1 ]; then
170+
echo "WARNING rustsrc cache was invalid when saving";
171+
rm -rf $HOME/rustsrc && mkdir $HOME/rustsrc;
172+
fi
165173
before_install:
166174
- zcat $HOME/docker/rust-ci.tar.gz | docker load || true
175+
- mkdir -p $HOME/rustsrc
167176

168177
notifications:
169178
email: false
170179

171180
cache:
172181
directories:
173182
- $HOME/docker
183+
- $HOME/rustsrc
174184

175185
before_deploy:
176186
- mkdir -p deploy/$TRAVIS_COMMIT

appveyor.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ install:
141141
- set SCCACHE_ERROR_LOG=%CD%/sccache.log
142142

143143
test_script:
144-
- appveyor-retry sh -c 'git submodule deinit -f . && git submodule update --init'
144+
- mkdir C:\cache\rustsrc
145+
- sh src/ci/init_repo.sh . /c/cache/rustsrc
145146
- set SRC=.
146147
- set NO_CCACHE=1
147148
- sh src/ci/run.sh
@@ -150,6 +151,7 @@ on_failure:
150151
- cat %CD%/sccache.log
151152

152153
cache:
154+
- C:\cache\rustsrc
153155
- "build/i686-pc-windows-msvc/llvm -> src/rustllvm/llvm-rebuild-trigger"
154156
- "build/x86_64-pc-windows-msvc/llvm -> src/rustllvm/llvm-rebuild-trigger"
155157
- "i686-pc-windows-msvc/llvm -> src/rustllvm/llvm-rebuild-trigger"

src/ci/docker/run.sh

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ exec docker \
5757
--env DEPLOY_ALT=$DEPLOY_ALT \
5858
--env LOCAL_USER_ID=`id -u` \
5959
--volume "$HOME/.cargo:/cargo" \
60+
--volume "$HOME/rustsrc:$HOME/rustsrc" \
6061
--privileged \
6162
--rm \
6263
rust-ci \

src/ci/init_repo.sh

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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

Comments
 (0)