1#!/bin/bash
2set -e
3# Manages a rustup toolchain called "miri".
4#
5# All commands set "miri" as the override toolchain for the current directory,
6# and make the `rust-version` file match that toolchain.
7#
8# USAGE:
9#
10# ./rustup-toolchain: Update "miri" toolchain to match `rust-version` (the known-good version for this commit).
11#
12# ./rustup-toolchain HEAD: Update "miri" toolchain and `rust-version` file to latest rustc HEAD.
13#
14# ./rustup-toolchain $COMMIT: Update "miri" toolchain and `rust-version` file to match that commit.
15
16# Make sure rustup-toolchain-install-master is installed.
17if ! which rustup-toolchain-install-master >/dev/null; then
18    echo "Please install rustup-toolchain-install-master by running 'cargo install rustup-toolchain-install-master'"
19    exit 1
20fi
21
22# Determine new commit.
23if [[ "$1" == "" ]]; then
24    NEW_COMMIT=$(cat rust-version)
25elif [[ "$1" == "HEAD" ]]; then
26    NEW_COMMIT=$(git ls-remote https://github.com/rust-lang/rust/ HEAD | cut -f 1)
27else
28    NEW_COMMIT="$1"
29fi
30echo "$NEW_COMMIT" > rust-version
31
32# Check if we already are at that commit.
33CUR_COMMIT=$(rustc +miri --version -v 2>/dev/null | egrep "^commit-hash: " | cut -d " " -f 2)
34if [[ "$CUR_COMMIT" == "$NEW_COMMIT" ]]; then
35    echo "miri toolchain is already at commit $CUR_COMMIT."
36    rustup override set miri
37    exit 0
38fi
39
40# Install and setup new toolchain.
41rustup toolchain uninstall miri
42rustup-toolchain-install-master -n miri -c cargo -c rust-src -c rustc-dev -c llvm-tools -- "$NEW_COMMIT"
43rustup override set miri
44
45# Cleanup.
46cargo clean
47