diff --git a/.gitignore b/.gitignore
index 4e57c64..c22b093 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
*~
dist/
build/
-tmp/
+tmp-v1/
+tmp-v2/
diff --git a/build.sh b/build.sh
index a0ff4b7..71ff5dc 100755
--- a/build.sh
+++ b/build.sh
@@ -28,7 +28,7 @@ fi
sh src/rust-installer/gen-installer.sh \
--product-name=multirust \
- --package-name=multirust-0.7.0 \
+ --package-name=multirust-0.8.0 \
--rel-manifest-dir=rustlib \
--success-message=Get-ready-for-Maximum-Rust. \
--image-dir=./build/image \
diff --git a/install.sh b/install.sh
index e5ac27f..3b1a52c 100755
--- a/install.sh
+++ b/install.sh
@@ -2,7 +2,7 @@
set -e
-installer=build/work/multirust-0.7.0/install.sh
+installer=build/work/multirust-0.8.0/install.sh
if [ ! -e "$installer" ]; then
echo 'run ./build.sh first'
diff --git a/src/multirust b/src/multirust
index a144ede..2ff7f6d 100755
--- a/src/multirust
+++ b/src/multirust
@@ -15,6 +15,9 @@
# list-toolchains List all installed toolchains
# remove-override Remove an override, for current directory unless specified
# remove-toolchain Uninstall a toolchain
+# list-available-targets
+# List targets available to install
+# add-target Add additional compilation targets to an existing toolchain
# run Run a command in an environment configured for a toolchain
# delete-data Delete all user metadata, including installed toolchains
# upgrade-data Upgrade the ~/.multirust directory from previous versions
@@ -190,6 +193,25 @@
#
#
+#
+#
+# List the targets available to an installed toolchain
+#
+# Usage:
+# multirust add-target
+#
+#
+
+#
+#
+# Adds the standard library for a given platform to an existing
+# installation.
+#
+# Usage:
+# multirust add-target
+#
+#
+
#
#
# Usage: multirust run [arguments]
@@ -266,7 +288,7 @@ set_globals() {
assert_nz "$0" "\$0 is undefined"
# Some constants
- version=0.7.0
+ version=0.8.0
# NB: This will be replaced by the build script
commit_version=
metadata_version=2
@@ -445,6 +467,7 @@ handle_command_line_args() {
list-toolchains
remove-override
remove-toolchain
+ list-available-toolchains
run
upgrade-data
delete-data
@@ -539,6 +562,23 @@ handle_command_line_args() {
remove_toolchain "$2"
;;
+ list-available-targets)
+ if [ -z "${2-}" ]; then
+ err 'unspecified toolchain. try `multirust help list-available-targets`'
+ fi
+ list_available_targets "$2"
+ ;;
+
+ add-target)
+ if [ -z "${2-}" ]; then
+ err 'unspecified toolchain. try `multirust help add-target`'
+ fi
+ if [ -z "${3-}" ]; then
+ err 'unspecified target. try `multirust help add-target`'
+ fi
+ add_target "$2" "$3"
+ ;;
+
run)
if [ -z "${2-}" ]; then
err 'unspecified toolchain. try `multirust help run`'
@@ -901,6 +941,41 @@ get_toolchain_dir() {
RETVAL="$toolchains_dir/$_toolchain"
}
+list_available_targets() {
+ local _toolchain="$1"
+
+ get_toolchain_dir "$_toolchain"
+ local _dir="$RETVAL"
+
+ if [ ! -e "$_dir" ]; then
+ err "toolchain '$_toolchain' is not installed"
+ exit 1
+ fi
+
+ call_rustup --prefix="$_dir" --list-available-targets
+ if [ $? != 0 ]; then
+ exit 1
+ fi
+}
+
+add_target() {
+ local _toolchain="$1"
+ local _target="$2"
+
+ get_toolchain_dir "$_toolchain"
+ local _dir="$RETVAL"
+
+ if [ ! -e "$_dir" ]; then
+ err "toolchain '$_toolchain' is not installed"
+ exit 1
+ fi
+
+ call_rustup --prefix="$_dir" --add-target="$_target"
+ if [ $? != 0 ]; then
+ exit 1
+ fi
+}
+
# Custom toolchain installation
diff --git a/src/rustup b/src/rustup
index cb03553..92f58d4 160000
--- a/src/rustup
+++ b/src/rustup
@@ -1 +1 @@
-Subproject commit cb03553d51fb3c72b130c91c25d2aed29d217a24
+Subproject commit 92f58d4bfc2698bd508718806d579c18a222f77b
diff --git a/test-v1.sh b/test-v1.sh
new file mode 100755
index 0000000..a68368a
--- /dev/null
+++ b/test-v1.sh
@@ -0,0 +1,1085 @@
+#!/bin/sh
+
+# TODO update notifications
+# TODO CARGO_HOME
+# TODO rpath
+# TODO non-absolute MULTIRUST_HOME
+
+set -e -u
+
+# Prints the absolute path of a directory to stdout
+abs_path() {
+ local _path="$1"
+ # Unset CDPATH because it causes havok: it makes the destination unpredictable
+ # and triggers 'cd' to print the path to stdout. Route `cd`'s output to /dev/null
+ # for good measure.
+ (unset CDPATH && cd "$_path" > /dev/null && pwd)
+}
+
+S="$(abs_path $(dirname $0))"
+
+TMP_DIR="$S/tmp-v1"
+MOCK_DIST_DIR="$TMP_DIR/mock-dist"
+CUSTOM_TOOLCHAINS="$TMP_DIR/custom-toolchains"
+
+# Clean out the tmp dir
+if [ -n "${NO_REBUILD_MOCKS-}" ]; then
+ mv "$MOCK_DIST_DIR" ./mock-backup
+ mv "$CUSTOM_TOOLCHAINS" ./custom-backup
+fi
+rm -Rf "$TMP_DIR"
+mkdir "$TMP_DIR"
+if [ -n "${NO_REBUILD_MOCKS-}" ]; then
+ mv ./mock-backup "$MOCK_DIST_DIR"
+ mv ./custom-backup "$CUSTOM_TOOLCHAINS"
+fi
+
+TEST_DIR="$S/test"
+TEST_SECRET_KEY="$TEST_DIR/secret-key.gpg"
+TEST_PUBLIC_KEY="$TEST_DIR/public-key.gpg"
+MULTIRUST_GPG_KEY="$TEST_DIR/public-key.asc"
+WORK_DIR="$TMP_DIR/work"
+MOCK_BUILD_DIR="$TMP_DIR/mock-build"
+MULTIRUST_HOME="$(cd "$TMP_DIR" && pwd)/multirust"
+VERSION=0.8.0
+MULTIRUST_BIN_DIR="$S/build/work/multirust-$VERSION/multirust/bin"
+MULTIRUST_BIN_DIR_V1="$S/test/multirust-v1/build/work/multirust-0.0.2/multirust/bin"
+
+say() {
+ echo "test: $1"
+}
+
+pre() {
+ echo "test: $1"
+ rm -Rf "$MULTIRUST_HOME"
+ rm -Rf "$WORK_DIR"
+ mkdir -p "$WORK_DIR"
+}
+
+need_ok() {
+ if [ $? -ne 0 ]; then
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ fi
+}
+
+fail() {
+ echo
+ echo "$1"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+}
+
+try() {
+ set +e
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -ne 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+expect_fail() {
+ set +e
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -eq 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+expect_output_ok() {
+ set +e
+ local _expected="$1"
+ shift 1
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -ne 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ elif ! echo "$_output" | grep -q "$_expected"; then
+ echo \$ "$_cmd"
+ /bin/echo "$_output"
+ echo
+ echo "missing expected output '$_expected'"
+ echo
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+expect_output_fail() {
+ set +e
+ local _expected="$1"
+ shift 1
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -eq 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ elif ! echo "$_output" | grep -q "$_expected"; then
+ echo \$ "$_cmd"
+ /bin/echo "$_output"
+ echo
+ echo "missing expected output '$_expected'"
+ echo
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+expect_not_output_ok() {
+ set +e
+ local _expected="$1"
+ shift 1
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -ne 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ elif echo "$_output" | grep -q "$_expected"; then
+ echo \$ "$_cmd"
+ /bin/echo "$_output"
+ echo
+ echo "unexpected output '$_expected'"
+ echo
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+runtest() {
+ local _testname="$1"
+ if [ -n "${TESTNAME-}" ]; then
+ if ! echo "$_testname" | grep -q "$TESTNAME"; then
+ return 0
+ fi
+ fi
+
+ pre "$_testname"
+ "$_testname"
+}
+
+get_architecture() {
+
+ local _ostype="$(uname -s)"
+ local _cputype="$(uname -m)"
+
+ if [ "$_ostype" = Darwin -a "$_cputype" = i386 ]; then
+ # Darwin `uname -s` lies
+ if sysctl hw.optional.x86_64 | grep -q ': 1'; then
+ local _cputype=x86_64
+ fi
+ fi
+
+ case "$_ostype" in
+
+ Linux)
+ local _ostype=unknown-linux-gnu
+ ;;
+
+ FreeBSD)
+ local _ostype=unknown-freebsd
+ ;;
+
+ DragonFly)
+ local _ostype=unknown-dragonfly
+ ;;
+
+ Darwin)
+ local _ostype=apple-darwin
+ ;;
+
+ MINGW* | MSYS*)
+ local _ostype=pc-windows-gnu
+ ;;
+
+ *)
+ err "unrecognized OS type: $_ostype"
+ ;;
+
+ esac
+
+ case "$_cputype" in
+ i386 | i486 | i686 | i786 | x86)
+ local _cputype=i686
+ ;;
+
+ xscale | arm)
+ local _cputype=arm
+ ;;
+
+ armv7l)
+ local _cputype=arm
+ local _ostype="${_ostype}eabihf"
+ ;;
+
+ x86_64 | x86-64 | x64 | amd64)
+ local _cputype=x86_64
+ ;;
+
+ *)
+ err "unknown CPU type: $CFG_CPUTYPE"
+ ;;
+ esac
+
+ # Detect 64-bit linux with 32-bit userland
+ if [ $_ostype = unknown-linux-gnu -a $_cputype = x86_64 ]; then
+ file -L "$SHELL" | grep -q "x86[_-]64"
+ if [ $? != 0 ]; then
+ local _cputype=i686
+ fi
+ fi
+
+ local _arch="$_cputype-$_ostype"
+
+ RETVAL="$_arch"
+}
+
+build_mock_bin() {
+ local _name="$1"
+ local _version="$2"
+ local _version_hash="$3"
+ local _dir="$4"
+
+ cat "$TEST_DIR/mock.sh" | \
+ sed s/@@TEMPLATE_BIN_NAME@@/"$_name"/ | \
+ sed s/@@TEMPLATE_VERSION@@/"$_version"/ | \
+ sed s/@@TEMPLATE_HASH@@/"$_version_hash"/ > "$_dir/$_name"
+
+ chmod a+x "$_dir/$_name"
+}
+
+build_mock_rustc_installer() {
+ local _version="$1"
+ local _version_hash="$2"
+ local _package="$3"
+
+ local _image="$MOCK_BUILD_DIR/image/rustc"
+ mkdir -p "$_image/bin"
+ build_mock_bin rustc "$_version" "$_version_hash" "$_image/bin"
+ build_mock_bin rustdoc "$_version" "$_version_hash" "$_image/bin"
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ mkdir -p "$MOCK_BUILD_DIR/pkg"
+ try sh "$S/src/rust-installer/gen-installer.sh" \
+ --product-name=Rust \
+ --rel-manifest-dir=rustlib \
+ --image-dir="$_image" \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/pkg" \
+ --package-name="rustc-$_package-$_arch" \
+ --component-name=rustc
+}
+
+build_mock_cargo_installer() {
+ local _version="$1"
+ local _version_hash="$2"
+ local _package="$3"
+
+ local _image="$MOCK_BUILD_DIR/image/cargo"
+ mkdir -p "$_image/bin"
+ build_mock_bin cargo "$_version" "$_version_hash" "$_image/bin"
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ mkdir -p "$MOCK_BUILD_DIR/pkg"
+ try sh "$S/src/rust-installer/gen-installer.sh" \
+ --product-name=Cargo \
+ --rel-manifest-dir=rustlib \
+ --image-dir="$_image" \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/pkg" \
+ --package-name="cargo-$_package-$_arch" \
+ --component-name=cargo
+}
+
+build_mock_rust_docs_installer() {
+ local _package="$1"
+
+ local _image="$MOCK_BUILD_DIR/image/docs"
+ mkdir -p "$_image/share/doc/rust/html"
+ echo "test" > "$_image/share/doc/rust/html/index.html"
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ mkdir -p "$MOCK_BUILD_DIR/pkg"
+ try sh "$S/src/rust-installer/gen-installer.sh" \
+ --product-name=Rust-documentation \
+ --rel-manifest-dir=rustlib \
+ --image-dir="$_image" \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/pkg" \
+ --package-name="rust-docs-$_package-$_arch" \
+ --component-name=rust-docs
+}
+
+build_mock_combined_installer() {
+ local _package="$1"
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ local _rustc_tarball="$MOCK_BUILD_DIR/pkg/rustc-$_package-$_arch.tar.gz"
+ local _cargo_tarball="$MOCK_BUILD_DIR/pkg/cargo-$_package-$_arch.tar.gz"
+ local _docs_tarball="$MOCK_BUILD_DIR/pkg/rust-docs-$_package-$_arch.tar.gz"
+ local _inputs="$_rustc_tarball,$_cargo_tarball,$_docs_tarball"
+
+ mkdir -p "$MOCK_BUILD_DIR/dist"
+ try sh "$S/src/rust-installer/combine-installers.sh" \
+ --product-name=Rust \
+ --rel-manifest-dir=rustlib \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/dist" \
+ --package-name="rust-$_package-$_arch" \
+ --input-tarballs="$_inputs"
+}
+
+build_mock_dist_channel() {
+ local _channel="$1"
+ local _date="$2"
+
+ (cd "$MOCK_BUILD_DIR/dist" && ls * > channel-rust-"$_channel")
+ if command -v gpg > /dev/null 2>&1; then
+ (cd "$MOCK_BUILD_DIR/dist" && for i in *; do
+ gpg --no-default-keyring --secret-keyring "$TEST_SECRET_KEY" \
+ --keyring "$TEST_PUBLIC_KEY" \
+ --no-tty --yes -a --detach-sign "$i"
+ done)
+ else
+ say "gpg not found. not testing signature verification"
+ (cd "$MOCK_BUILD_DIR/dist" && for i in *; do echo "nosig" > "$i.asc"; done)
+ fi
+ (cd "$MOCK_BUILD_DIR/dist" && for i in *; do shasum -a256 $i > $i.sha256; done)
+}
+
+build_mock_channel() {
+ local _version="$1"
+ local _version_hash="$2"
+ local _package="$3"
+ local _channel="$4"
+ local _date="$5"
+
+ rm -Rf "$MOCK_BUILD_DIR"
+ mkdir -p "$MOCK_BUILD_DIR"
+
+ say "building mock channel $_version $_version_hash $_package $_channel $_date"
+ build_mock_rustc_installer "$_version" "$_version_hash" "$_package"
+ build_mock_cargo_installer "$_version" "$_version_hash" "$_package"
+ build_mock_rust_docs_installer "$_package"
+ build_mock_combined_installer "$_package"
+ build_mock_dist_channel "$_channel" "$_date"
+
+ mkdir -p "$MOCK_DIST_DIR/dist/$_date"
+ cp "$MOCK_BUILD_DIR/dist"/* "$MOCK_DIST_DIR/dist/$_date/"
+ cp "$MOCK_BUILD_DIR/dist"/* "$MOCK_DIST_DIR/dist/"
+ # Copy the intermediate installers too, though without manifests, checksums, etc.
+ cp "$MOCK_BUILD_DIR/pkg"/* "$MOCK_DIST_DIR/dist/$_date/"
+ cp "$MOCK_BUILD_DIR/pkg"/* "$MOCK_DIST_DIR/dist/"
+
+ mkdir -p "$CUSTOM_TOOLCHAINS/$_date"
+
+ for t in "$MOCK_BUILD_DIR/work/"*; do
+ sh "$t/install.sh" --prefix="$CUSTOM_TOOLCHAINS/$_date/" 2> /dev/null 1> /dev/null
+ done
+}
+
+build_mocks() {
+ if [ -z "${NO_REBUILD_MOCKS-}" ]; then
+ build_mock_channel 1.0.0-nightly hash-nightly-1 nightly nightly 2015-01-01
+ build_mock_channel 1.0.0-beta hash-beta-1 1.0.0-beta beta 2015-01-01
+ build_mock_channel 1.0.0 hash-stable-1 1.0.0 stable 2015-01-01
+
+ build_mock_channel 1.1.0-nightly hash-nightly-2 nightly nightly 2015-01-02
+ build_mock_channel 1.1.0-beta hash-beta-2 1.1.0-beta beta 2015-01-02
+ build_mock_channel 1.1.0 hash-stable-2 1.1.0 stable 2015-01-02
+ fi
+}
+
+set_current_dist_date() {
+ local _dist_date="$1"
+ cp "$MOCK_DIST_DIR/dist/$_dist_date"/* "$MOCK_DIST_DIR/dist/"
+}
+
+# Build the mock revisions
+build_mocks
+
+say "updating submodules"
+try git submodule update --init --recursive
+
+# Build bultirust
+say "building multirust"
+try sh "$S/build.sh"
+
+# Build old-multirusts
+cd "$S/test/multirust-v1" && try sh ./build.sh
+
+get_architecture
+arch="$RETVAL"
+
+# Tell multirust where to put .multirust
+export MULTIRUST_HOME
+# Tell multirust what key to use to verify sigs
+export MULTIRUST_GPG_KEY
+export RUSTUP_GPG_KEY="$MULTIRUST_GPG_KEY"
+
+# Tell multirust where to download stuff from
+MULTIRUST_DIST_SERVER="file://$(cd "$MOCK_DIST_DIR" && pwd)"
+
+# HACK: Frob `/c/` prefix into `c:/` on windows to make curl happy
+case "$arch" in
+*pc-windows*)
+ is_windows=true
+ MULTIRUST_DIST_SERVER=`printf '%s' "$MULTIRUST_DIST_SERVER" | sed s~file:///c/~file://c:/~`
+ ;;
+*)
+ is_windows=false
+ ;;
+esac
+
+export MULTIRUST_DIST_SERVER
+export RUSTUP_DIST_SERVER="$MULTIRUST_DIST_SERVER"
+
+# Set up the PATH to find multirust
+PATH="$MULTIRUST_BIN_DIR:$PATH"
+export PATH
+try test -e "$MULTIRUST_BIN_DIR/multirust"
+
+# Names of custom installers
+local_custom_rust="$MOCK_DIST_DIR/dist/rust-nightly-$arch.tar.gz"
+local_custom_rustc="$MOCK_DIST_DIR/dist/rustc-nightly-$arch.tar.gz"
+local_custom_cargo="$MOCK_DIST_DIR/dist/cargo-nightly-$arch.tar.gz"
+remote_custom_rust="$MULTIRUST_DIST_SERVER/dist/rust-nightly-$arch.tar.gz"
+remote_custom_rustc="$MULTIRUST_DIST_SERVER/dist/rustc-nightly-$arch.tar.gz"
+remote_custom_cargo="$MULTIRUST_DIST_SERVER/dist/cargo-nightly-$arch.tar.gz"
+
+no_args() {
+ expect_output_ok "Usage" multirust
+}
+runtest no_args
+
+uninitialized() {
+ expect_fail rustc
+ expect_output_fail "no default toolchain configured" rustc
+ expect_output_ok "no default toolchain configured" multirust show-default
+}
+runtest uninitialized
+
+default_toolchain() {
+ try multirust default nightly
+ expect_output_ok "nightly" multirust show-default
+}
+runtest default_toolchain
+
+expected_bins_exist() {
+ try multirust default nightly
+ expect_output_ok "1.1.0" rustc --version
+ expect_output_ok "1.1.0" rustdoc --version
+ expect_output_ok "1.1.0" cargo --version
+}
+runtest expected_bins_exist
+
+install_toolchain_from_channel() {
+ try multirust default nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+ try multirust default beta
+ expect_output_ok "hash-beta-2" rustc --version
+ try multirust default stable
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_from_channel
+
+install_toolchain_from_archive() {
+ try multirust default nightly-2015-01-01
+ expect_output_ok "hash-nightly-1" rustc --version
+ try multirust default beta-2015-01-01
+ expect_output_ok "hash-beta-1" rustc --version
+ try multirust default stable-2015-01-01
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_toolchain_from_archive
+
+install_toolchain_linking_from_path() {
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_toolchain_linking_from_path
+
+install_toolchain_from_path() {
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_toolchain_from_path
+
+install_toolchain_linking_from_path_again() {
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_linking_from_path_again
+
+install_toolchain_from_path_again() {
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_from_path_again
+
+install_toolchain_change_from_copy_to_link() {
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_change_from_copy_to_link
+
+install_toolchain_change_from_link_to_copy() {
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_change_from_link_to_copy
+
+install_toolchain_from_custom() {
+ try multirust default custom --installer "$local_custom_rust"
+ expect_output_ok nightly rustc --version
+}
+runtest install_toolchain_from_custom
+
+install_toolchain_from_version() {
+ try multirust default 1.1.0
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_from_version
+
+default_existing_toolchain() {
+ try multirust update nightly
+ expect_output_ok "using existing install for 'nightly'" multirust default nightly
+}
+runtest default_existing_toolchain
+
+update_channel() {
+ set_current_dist_date 2015-01-01
+ try multirust default nightly
+ expect_output_ok "hash-nightly-1" rustc --version
+ set_current_dist_date 2015-01-02
+ try multirust update nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+}
+runtest update_channel
+
+list_toolchains() {
+ try multirust update nightly
+ try multirust update beta-2015-01-01
+ expect_output_ok "nightly" multirust list-toolchains
+ expect_output_ok "beta-2015-01-01" multirust list-toolchains
+}
+runtest list_toolchains
+
+list_toolchain_with_none() {
+ try multirust list-toolchains
+ expect_output_ok "no installed toolchains" multirust list-toolchains
+}
+runtest list_toolchain_with_none
+
+remove_toolchain() {
+ try multirust update nightly
+ try multirust remove-toolchain nightly
+ try multirust list-toolchains
+ expect_output_ok "no installed toolchains" multirust list-toolchains
+}
+runtest remove_toolchain
+
+remove_active_toolchain_error_handling() {
+ try multirust default nightly
+ try multirust remove-toolchain nightly
+ expect_output_fail "toolchain 'nightly' not installed" rustc
+}
+runtest remove_active_toolchain_error_handling
+
+bad_sha_on_manifest() {
+ manifest_hash="$MOCK_DIST_DIR/dist/channel-rust-nightly.sha256"
+ sha=`cat "$manifest_hash"`
+ echo "$sha" | sed s/^......../aaaaaaaa/ > "$manifest_hash"
+ expect_output_fail "checksum failed" multirust default nightly
+ set_current_dist_date 2015-01-02
+}
+runtest bad_sha_on_manifest
+
+bad_sha_on_installer() {
+ for i in "$MOCK_DIST_DIR/dist"/*.sha256; do
+ sha=`cat "$i"`
+ echo "$sha" | sed s/^......../aaaaaaaa/ > "$i"
+ done
+ expect_output_fail "checksum failed" multirust default 1.0.0
+ set_current_dist_date 2015-01-02
+}
+runtest bad_sha_on_installer
+
+delete_data() {
+ try multirust default nightly
+ if [ ! -d "$MULTIRUST_HOME" ]; then
+ fail "no multirust dir"
+ fi
+ try multirust delete-data -y
+ if [ -d "$MULTIRUST_HOME" ]; then
+ fail "multirust dir not removed"
+ fi
+}
+runtest delete_data
+
+install_override_toolchain_from_channel() {
+ try multirust override nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+ try multirust override beta
+ expect_output_ok "hash-beta-2" rustc --version
+ try multirust override stable
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_from_channel
+
+install_override_toolchain_from_archive() {
+ try multirust override nightly-2015-01-01
+ expect_output_ok "hash-nightly-1" rustc --version
+ try multirust override beta-2015-01-01
+ expect_output_ok "hash-beta-1" rustc --version
+ try multirust override stable-2015-01-01
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_override_toolchain_from_archive
+
+install_override_toolchain_linking_path() {
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_override_toolchain_linking_path
+
+install_override_toolchain_from_path() {
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_override_toolchain_from_path
+
+install_override_toolchain_linking_path_again() {
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_linking_path_again
+
+install_override_toolchain_from_path_again() {
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_from_path_again
+
+install_override_toolchain_change_from_copy_to_link() {
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_change_from_copy_to_link
+
+install_override_toolchain_change_from_link_to_copy() {
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_change_from_link_to_copy
+
+install_override_toolchain_from_version() {
+ try multirust override 1.1.0
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_from_version
+
+override_overrides_default() {
+ try multirust default nightly
+ try multirust override beta
+ expect_output_ok "beta" rustc --version
+}
+runtest override_overrides_default
+
+multiple_overrides() {
+ mkdir -p "$WORK_DIR/dir1"
+ mkdir -p "$WORK_DIR/dir2"
+ try multirust default nightly
+ (cd "$WORK_DIR/dir1" && try multirust override beta)
+ (cd "$WORK_DIR/dir2" && try multirust override stable)
+ expect_output_ok "nightly" rustc --version
+ (cd "$WORK_DIR/dir1" && expect_output_ok "beta" rustc --version)
+ (cd "$WORK_DIR/dir2" && expect_output_ok "stable" rustc --version)
+}
+runtest multiple_overrides
+
+change_override() {
+ try multirust override nightly
+ try multirust override beta
+ expect_output_ok "beta" rustc --version
+}
+runtest change_override
+
+show_override() {
+ try multirust override nightly
+ expect_output_ok "override toolchain: nightly" multirust show-override
+ expect_output_ok "override reason: directory override for '`pwd`'" multirust show-override
+ expect_output_ok "override location: $MULTIRUST_HOME/toolchains/nightly" multirust show-override
+ expect_output_ok "hash-nightly-2" multirust show-override
+}
+runtest show_override
+
+show_override_no_override() {
+ try multirust default nightly
+ expect_output_ok "no override" multirust show-override
+}
+runtest show_override_no_override
+
+show_override_no_override_no_default() {
+ expect_output_ok "no override" multirust show-override
+}
+runtest show_override_no_override_no_default
+
+show_override_no_override_show_default() {
+ try multirust default nightly
+ expect_output_ok "no override" multirust show-override
+ expect_output_ok "default toolchain: nightly" multirust show-override
+}
+runtest show_override_no_override_show_default
+
+show_override_from_MULTIRUST_TOOLCHAIN() {
+ try multirust update beta
+ try multirust override nightly
+ export MULTIRUST_TOOLCHAIN=beta
+ expect_output_ok "override toolchain: beta" multirust show-override
+ expect_output_ok "override reason: environment override" multirust show-override
+ expect_output_ok "override location: $MULTIRUST_HOME/toolchains/beta" multirust show-override
+ expect_output_ok "hash-beta-2" multirust show-override
+ unset MULTIRUST_TOOLCHAIN
+}
+runtest show_override_from_MULTIRUST_TOOLCHAIN
+
+remove_override_no_default() {
+ try multirust override nightly
+ try multirust remove-override
+ expect_output_fail "no default toolchain configured" rustc
+}
+runtest remove_override_no_default
+
+remove_override_with_default() {
+ try multirust default nightly
+ try multirust override beta
+ try multirust remove-override
+ expect_output_ok "nightly" rustc --version
+}
+runtest remove_override_with_default
+
+remove_override_with_multiple_overrides() {
+ mkdir -p "$WORK_DIR/dir1"
+ mkdir -p "$WORK_DIR/dir2"
+ try multirust default nightly
+ (cd "$WORK_DIR/dir1" && try multirust override beta)
+ (cd "$WORK_DIR/dir2" && try multirust override stable)
+ expect_output_ok "nightly" rustc --version
+ (cd "$WORK_DIR/dir1" && try multirust remove-override)
+ (cd "$WORK_DIR/dir1" && expect_output_ok "nightly" rustc --version)
+ (cd "$WORK_DIR/dir2" && expect_output_ok "stable" rustc --version)
+}
+runtest remove_override_with_multiple_overrides
+
+custom_no_installer_specified() {
+ expect_output_fail "unspecified installer" multirust update nightly --installer
+}
+runtest custom_no_installer_specified
+
+custom_invalid_names() {
+ expect_output_fail "invalid custom toolchain name: 'nightly'" \
+ multirust update nightly --installer "$local_custom_rust"
+ expect_output_fail "invalid custom toolchain name: 'beta'" \
+ multirust update beta --installer "$local_custom_rust"
+ expect_output_fail "invalid custom toolchain name: 'stable'" \
+ multirust update stable --installer "$local_custom_rust"
+}
+runtest custom_invalid_names
+
+custom_invalid_names_with_archive_dates() {
+ expect_output_fail "invalid custom toolchain name: 'nightly-2015-01-01'" \
+ multirust update nightly-2015-01-01 --installer "$local_custom_rust"
+ expect_output_fail "invalid custom toolchain name: 'beta-2015-01-01'" \
+ multirust update beta-2015-01-01 --installer "$local_custom_rust"
+ expect_output_fail "invalid custom toolchain name: 'stable-2015-01-01'" \
+ multirust update stable-2015-01-01 --installer "$local_custom_rust"
+}
+runtest custom_invalid_names_with_archive_dates
+
+custom_local() {
+ try multirust update custom --installer "$local_custom_rust"
+ try multirust default custom
+ expect_output_ok nightly rustc --version
+}
+runtest custom_local
+
+custom_remote() {
+ try multirust update custom --installer "$remote_custom_rust"
+ try multirust default custom
+ expect_output_ok nightly rustc --version
+}
+runtest custom_remote
+
+custom_multiple_local() {
+ try multirust update custom --installer "$local_custom_rustc,$local_custom_cargo"
+ try multirust default custom
+ expect_output_ok nightly rustc --version
+ expect_output_ok nightly cargo --version
+}
+runtest custom_multiple_local
+
+custom_multiple_remote() {
+ try multirust update custom --installer "$remote_custom_rustc,$remote_custom_cargo"
+ try multirust default custom
+ expect_output_ok nightly rustc --version
+ expect_output_ok nightly cargo --version
+}
+runtest custom_multiple_remote
+
+remove_custom() {
+ try multirust update custom --installer "$remote_custom_rustc,$remote_custom_cargo"
+ try multirust remove-toolchain custom
+ expect_output_ok "no installed toolchains" multirust list-toolchains
+}
+runtest remove_custom
+
+update_toolchain_linking_path() {
+ try multirust update custom --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ try multirust default custom
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest update_toolchain_linking_path
+
+update_toolchain_from_path() {
+ try multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ try multirust default custom
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest update_toolchain_from_path
+
+update_toolchain_change_from_copy_to_link() {
+ try multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ try multirust default custom
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust update custom --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ try multirust default custom
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest update_toolchain_change_from_copy_to_link
+
+update_toolchain_change_from_link_to_copy() {
+ try multirust update custom --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ try multirust default custom
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ try multirust default custom
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest update_toolchain_change_from_link_to_copy
+
+custom_dir_invalid_names() {
+ expect_output_fail "invalid custom toolchain name: 'nightly'" \
+ multirust update nightly --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_fail "invalid custom toolchain name: 'beta'" \
+ multirust update beta --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_fail "invalid custom toolchain name: 'stable'" \
+ multirust update stable --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+}
+runtest custom_dir_invalid_names
+
+custom_without_rustc() {
+ rm -Rf "$CUSTOM_TOOLCHAINS/broken"
+ cp -R "$CUSTOM_TOOLCHAINS/2015-01-01" "$CUSTOM_TOOLCHAINS/broken"
+ rm "$CUSTOM_TOOLCHAINS/broken/bin/rustc"
+ expect_output_fail "no rustc in custom toolchain at " \
+ multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/broken"
+ rm -Rf "$CUSTOM_TOOLCHAINS/broken"
+}
+runtest custom_without_rustc
+
+no_update_on_channel_when_data_has_not_changed() {
+ try multirust update nightly
+ expect_output_ok "'nightly' is already up to date" multirust update nightly
+}
+runtest no_update_on_channel_when_data_has_not_changed
+
+update_on_channel_when_data_has_changed() {
+ set_current_dist_date 2015-01-01
+ try multirust default nightly
+ expect_output_ok "hash-nightly-1" rustc --version
+ set_current_dist_date 2015-01-02
+ try multirust update nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+}
+runtest update_on_channel_when_data_has_changed
+
+with_multirust_from_v1_error() {
+ # No windows support in v1
+ if [ "$is_windows" != true ]; then
+ try "$MULTIRUST_BIN_DIR_V1/multirust" default nightly
+ expect_output_fail "metadata version is 1, need 2" multirust default nightly
+ fi
+}
+runtest with_multirust_from_v1_error
+
+upgrade_from_v1_to_v2() {
+ if [ "$is_windows" != true ]; then
+ try "$MULTIRUST_BIN_DIR_V1/multirust" default nightly
+ try multirust upgrade-data
+ try multirust default nightly
+ fi
+}
+runtest upgrade_from_v1_to_v2
+
+update_no_toolchain_means_update_all() {
+ set_current_dist_date 2015-01-01
+ try multirust update
+ expect_output_ok "using existing" multirust default nightly
+ expect_output_ok "hash-nightly-1" rustc --version
+ expect_output_ok "using existing" multirust default beta
+ expect_output_ok "hash-beta-1" rustc --version
+ expect_output_ok "using existing" multirust default stable
+ expect_output_ok "hash-stable-1" rustc --version
+ set_current_dist_date 2015-01-02
+ expect_output_ok "updating existing" multirust update nightly
+ try multirust update
+ expect_output_ok "using existing" multirust default nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+ expect_output_ok "using existing" multirust default beta
+ expect_output_ok "hash-beta-2" rustc --version
+ expect_output_ok "using existing" multirust default stable
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest update_no_toolchain_means_update_all
+
+run_command() {
+ try multirust update nightly
+ try multirust default beta
+ expect_output_ok "nightly" multirust run nightly rustc --version
+}
+runtest run_command
+
+remove_toolchain_then_add_again() {
+ # Issue 53
+ try multirust default beta
+ try multirust remove-toolchain beta
+ try multirust update beta
+ try rustc --version
+}
+runtest remove_toolchain_then_add_again
+
+ctl_default_toolchain_no_default() {
+ expect_output_fail "no default toolchain configured" multirust ctl default-toolchain
+}
+runtest ctl_default_toolchain_no_default
+
+ctl_default_toolchain_with_default_no_override() {
+ try multirust default beta
+ expect_output_ok "beta" multirust ctl default-toolchain
+}
+runtest ctl_default_toolchain_with_default_no_override
+
+ctl_default_toolchain_with_default_and_override() {
+ try multirust default beta
+ try multirust override nightly
+ expect_output_ok "beta" multirust ctl default-toolchain
+}
+runtest ctl_default_toolchain_with_default_and_override
+
+echo
+echo "SUCCESS!"
+echo
diff --git a/test-v2.sh b/test-v2.sh
new file mode 100755
index 0000000..a8c0b44
--- /dev/null
+++ b/test-v2.sh
@@ -0,0 +1,1251 @@
+#!/bin/sh
+
+# TODO update notifications
+# TODO CARGO_HOME
+# TODO rpath
+# TODO non-absolute MULTIRUST_HOME
+
+set -e -u
+
+# Prints the absolute path of a directory to stdout
+abs_path() {
+ local _path="$1"
+ # Unset CDPATH because it causes havok: it makes the destination unpredictable
+ # and triggers 'cd' to print the path to stdout. Route `cd`'s output to /dev/null
+ # for good measure.
+ (unset CDPATH && cd "$_path" > /dev/null && pwd)
+}
+
+S="$(abs_path $(dirname $0))"
+
+TMP_DIR="$S/tmp-v2"
+MOCK_DIST_DIR="$TMP_DIR/mock-dist"
+CUSTOM_TOOLCHAINS="$TMP_DIR/custom-toolchains"
+
+# Clean out the tmp dir
+if [ -n "${NO_REBUILD_MOCKS-}" ]; then
+ mv "$MOCK_DIST_DIR" ./mock-backup
+ mv "$CUSTOM_TOOLCHAINS" ./custom-backup
+fi
+rm -Rf "$TMP_DIR"
+mkdir "$TMP_DIR"
+if [ -n "${NO_REBUILD_MOCKS-}" ]; then
+ mv ./mock-backup "$MOCK_DIST_DIR"
+ mv ./custom-backup "$CUSTOM_TOOLCHAINS"
+fi
+
+TEST_DIR="$S/test"
+TEST_SECRET_KEY="$TEST_DIR/secret-key.gpg"
+TEST_PUBLIC_KEY="$TEST_DIR/public-key.gpg"
+MULTIRUST_GPG_KEY="$TEST_DIR/public-key.asc"
+WORK_DIR="$TMP_DIR/work"
+MOCK_BUILD_DIR="$TMP_DIR/mock-build"
+MULTIRUST_HOME="$(cd "$TMP_DIR" && pwd)/multirust"
+VERSION=0.8.0
+MULTIRUST_BIN_DIR="$S/build/work/multirust-$VERSION/multirust/bin"
+MULTIRUST_BIN_DIR_V1="$S/test/multirust-v1/build/work/multirust-0.0.2/multirust/bin"
+
+CROSS_ARCH1="x86_64-unknown-linux-musl"
+CROSS_ARCH2="arm-linux-androideabi"
+
+say() {
+ echo "test: $1"
+}
+
+pre() {
+ echo "test: $1"
+ rm -Rf "$MULTIRUST_HOME"
+ rm -Rf "$WORK_DIR"
+ mkdir -p "$WORK_DIR"
+}
+
+need_ok() {
+ if [ $? -ne 0 ]; then
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ fi
+}
+
+fail() {
+ echo
+ echo "$1"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+}
+
+try() {
+ set +e
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -ne 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+expect_fail() {
+ set +e
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -eq 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+expect_output_ok() {
+ set +e
+ local _expected="$1"
+ shift 1
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -ne 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ elif ! echo "$_output" | grep -q "$_expected"; then
+ echo \$ "$_cmd"
+ /bin/echo "$_output"
+ echo
+ echo "missing expected output '$_expected'"
+ echo
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+expect_output_fail() {
+ set +e
+ local _expected="$1"
+ shift 1
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -eq 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ elif ! echo "$_output" | grep -q "$_expected"; then
+ echo \$ "$_cmd"
+ /bin/echo "$_output"
+ echo
+ echo "missing expected output '$_expected'"
+ echo
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+expect_not_output_ok() {
+ set +e
+ local _expected="$1"
+ shift 1
+ _cmd="$@"
+ _output=`$@ 2>&1`
+ if [ $? -ne 0 ]; then
+ echo \$ "$_cmd"
+ # Using /bin/echo to avoid escaping
+ /bin/echo "$_output"
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ elif echo "$_output" | grep -q "$_expected"; then
+ echo \$ "$_cmd"
+ /bin/echo "$_output"
+ echo
+ echo "unexpected output '$_expected'"
+ echo
+ echo
+ echo "TEST FAILED!"
+ echo
+ exit 1
+ else
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
+ echo \$ "$_cmd"
+ fi
+ if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
+ /bin/echo "$_output"
+ fi
+ fi
+ set -e
+}
+
+runtest() {
+ local _testname="$1"
+ if [ -n "${TESTNAME-}" ]; then
+ if ! echo "$_testname" | grep -q "$TESTNAME"; then
+ return 0
+ fi
+ fi
+
+ pre "$_testname"
+ "$_testname"
+}
+
+get_architecture() {
+
+ local _ostype="$(uname -s)"
+ local _cputype="$(uname -m)"
+
+ if [ "$_ostype" = Darwin -a "$_cputype" = i386 ]; then
+ # Darwin `uname -s` lies
+ if sysctl hw.optional.x86_64 | grep -q ': 1'; then
+ local _cputype=x86_64
+ fi
+ fi
+
+ case "$_ostype" in
+
+ Linux)
+ local _ostype=unknown-linux-gnu
+ ;;
+
+ FreeBSD)
+ local _ostype=unknown-freebsd
+ ;;
+
+ DragonFly)
+ local _ostype=unknown-dragonfly
+ ;;
+
+ Darwin)
+ local _ostype=apple-darwin
+ ;;
+
+ MINGW* | MSYS*)
+ local _ostype=pc-windows-gnu
+ ;;
+
+ *)
+ err "unrecognized OS type: $_ostype"
+ ;;
+
+ esac
+
+ case "$_cputype" in
+ i386 | i486 | i686 | i786 | x86)
+ local _cputype=i686
+ ;;
+
+ xscale | arm)
+ local _cputype=arm
+ ;;
+
+ armv7l)
+ local _cputype=arm
+ local _ostype="${_ostype}eabihf"
+ ;;
+
+ x86_64 | x86-64 | x64 | amd64)
+ local _cputype=x86_64
+ ;;
+
+ *)
+ err "unknown CPU type: $CFG_CPUTYPE"
+ ;;
+ esac
+
+ # Detect 64-bit linux with 32-bit userland
+ if [ $_ostype = unknown-linux-gnu -a $_cputype = x86_64 ]; then
+ file -L "$SHELL" | grep -q "x86[_-]64"
+ if [ $? != 0 ]; then
+ local _cputype=i686
+ fi
+ fi
+
+ local _arch="$_cputype-$_ostype"
+
+ RETVAL="$_arch"
+}
+
+build_mock_bin() {
+ local _name="$1"
+ local _version="$2"
+ local _version_hash="$3"
+ local _dir="$4"
+
+ cat "$TEST_DIR/mock.sh" | \
+ sed s/@@TEMPLATE_BIN_NAME@@/"$_name"/ | \
+ sed s/@@TEMPLATE_VERSION@@/"$_version"/ | \
+ sed s/@@TEMPLATE_HASH@@/"$_version_hash"/ > "$_dir/$_name"
+
+ chmod a+x "$_dir/$_name"
+}
+
+build_mock_rustc_installer() {
+ local _version="$1"
+ local _version_hash="$2"
+ local _package="$3"
+
+ local _image="$MOCK_BUILD_DIR/image/rustc"
+ mkdir -p "$_image/bin"
+ build_mock_bin rustc "$_version" "$_version_hash" "$_image/bin"
+ build_mock_bin rustdoc "$_version" "$_version_hash" "$_image/bin"
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ mkdir -p "$MOCK_BUILD_DIR/dist"
+ try sh "$S/src/rust-installer/gen-installer.sh" \
+ --product-name=Rust \
+ --rel-manifest-dir=rustlib \
+ --image-dir="$_image" \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/dist" \
+ --package-name="rustc-$_package-$_arch" \
+ --component-name=rustc
+}
+
+build_mock_cargo_installer() {
+ local _version="$1"
+ local _version_hash="$2"
+ local _package="$3"
+
+ local _image="$MOCK_BUILD_DIR/image/cargo"
+ mkdir -p "$_image/bin"
+ build_mock_bin cargo "$_version" "$_version_hash" "$_image/bin"
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ mkdir -p "$MOCK_BUILD_DIR/dist"
+ try sh "$S/src/rust-installer/gen-installer.sh" \
+ --product-name=Cargo \
+ --rel-manifest-dir=rustlib \
+ --image-dir="$_image" \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/dist" \
+ --package-name="cargo-$_package-$_arch" \
+ --component-name=cargo
+}
+
+
+build_mock_std_installer() {
+ local _package="$1"
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ local _image="$MOCK_BUILD_DIR/image/std"
+ mkdir -p "$_image/lib/rustlib/$_arch/lib/"
+ echo "test" > "$_image/lib/rustlib/$_arch/lib/libstd.rlib"
+
+ mkdir -p "$MOCK_BUILD_DIR/dist"
+ try sh "$S/src/rust-installer/gen-installer.sh" \
+ --product-name=Rust-std \
+ --rel-manifest-dir=rustlib \
+ --image-dir="$_image" \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/dist" \
+ --package-name="rust-std-$_package-$_arch" \
+ --component-name=rust-std-$_arch
+}
+
+build_mock_cross_std_installer() {
+ local _package="$1"
+ local _arch="$2"
+ local _date="$3"
+
+ local _image="$MOCK_BUILD_DIR/image/std"
+ mkdir -p "$_image/lib/rustlib/$_arch/lib/"
+ # Just some files to test for
+ echo "test" > "$_image/lib/rustlib/$_arch/lib/libstd.rlib"
+ echo "test" > "$_image/lib/rustlib/$_arch/lib/$_date"
+
+ mkdir -p "$MOCK_BUILD_DIR/dist"
+ try sh "$S/src/rust-installer/gen-installer.sh" \
+ --product-name=Rust-std \
+ --rel-manifest-dir=rustlib \
+ --image-dir="$_image" \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/dist" \
+ --package-name="rust-std-$_package-$_arch" \
+ --component-name=rust-std-$_arch
+}
+
+build_mock_rust_docs_installer() {
+ local _package="$1"
+
+ local _image="$MOCK_BUILD_DIR/image/docs"
+ mkdir -p "$_image/share/doc/rust/html"
+ echo "test" > "$_image/share/doc/rust/html/index.html"
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ mkdir -p "$MOCK_BUILD_DIR/dist"
+ try sh "$S/src/rust-installer/gen-installer.sh" \
+ --product-name=Rust-documentation \
+ --rel-manifest-dir=rustlib \
+ --image-dir="$_image" \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/dist" \
+ --package-name="rust-docs-$_package-$_arch" \
+ --component-name=rust-docs
+}
+
+build_mock_combined_installer() {
+ local _package="$1"
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ local _rustc_tarball="$MOCK_BUILD_DIR/dist/rustc-$_package-$_arch.tar.gz"
+ local _cargo_tarball="$MOCK_BUILD_DIR/dist/cargo-$_package-$_arch.tar.gz"
+ local _std_tarball="$MOCK_BUILD_DIR/dist/rust-std-$_package-$_arch.tar.gz"
+ local _docs_tarball="$MOCK_BUILD_DIR/dist/rust-docs-$_package-$_arch.tar.gz"
+ local _inputs="$_rustc_tarball,$_cargo_tarball,$_docs_tarball,$_std_tarball"
+
+ mkdir -p "$MOCK_BUILD_DIR/dist"
+ try sh "$S/src/rust-installer/combine-installers.sh" \
+ --product-name=Rust \
+ --rel-manifest-dir=rustlib \
+ --work-dir="$MOCK_BUILD_DIR/work" \
+ --output-dir="$MOCK_BUILD_DIR/dist" \
+ --package-name="rust-$_package-$_arch" \
+ --input-tarballs="$_inputs"
+}
+
+build_mock_sums_and_sigs() {
+ if command -v gpg > /dev/null 2>&1; then
+ (cd "$MOCK_BUILD_DIR/dist" && for i in *; do
+ gpg --no-default-keyring --secret-keyring "$TEST_SECRET_KEY" \
+ --keyring "$TEST_PUBLIC_KEY" \
+ --no-tty --yes -a --detach-sign "$i"
+ done)
+ else
+ say "gpg not found. not testing signature verification"
+ (cd "$MOCK_BUILD_DIR/dist" && for i in *; do echo "nosig" > "$i.asc"; done)
+ fi
+ (cd "$MOCK_BUILD_DIR/dist" && for i in *; do shasum -a256 $i > $i.sha256; done)
+}
+
+build_mock_channel_manifest() {
+ local _channel="$1"
+ local _date="$2"
+ local _version="$3"
+
+ # Build the v1 manifest for upgrade tests
+ (cd "$MOCK_BUILD_DIR/dist" && ls * > channel-rust-"$_channel")
+
+ get_architecture
+ local _arch="$RETVAL"
+
+ local _rust_tarball="$(frob_win_path "file://$MOCK_DIST_DIR/dist/$_date/rust-$_package-$_arch.tar.gz")"
+ local _rustc_tarball="$(frob_win_path "file://$MOCK_DIST_DIR/dist/$_date/rustc-$_package-$_arch.tar.gz")"
+ local _cargo_tarball="$(frob_win_path "file://$MOCK_DIST_DIR/dist/$_date/cargo-$_package-$_arch.tar.gz")"
+ local _std_tarball="$(frob_win_path "file://$MOCK_DIST_DIR/dist/$_date/rust-std-$_package-$_arch.tar.gz")"
+ local _cross_std_tarball1="$(frob_win_path "file://$MOCK_DIST_DIR/dist/$_date/rust-std-$_package-$CROSS_ARCH1.tar.gz")"
+ local _cross_std_tarball2="$(frob_win_path "file://$MOCK_DIST_DIR/dist/$_date/rust-std-$_package-$CROSS_ARCH2.tar.gz")"
+ local _docs_tarball="$(frob_win_path "file://$MOCK_DIST_DIR/dist/$_date/rust-docs-$_package-$_arch.tar.gz")"
+
+ local _manifest="$MOCK_BUILD_DIR/dist/channel-rust-$_channel.toml"
+
+ printf "%s\n" "manifest-version = \"2\"" >> "$_manifest"
+ printf "%s\n" "date = \"$_date\"" >> "$_manifest"
+
+ # the 'rust' package
+ printf "%s\n" "[pkg.rust]" >> "$_manifest"
+ printf "%s\n" "version = \"$_version\"" >> "$_manifest"
+ printf "%s\n" "[pkg.rust.target.$_arch]" >> "$_manifest"
+ printf "%s\n" "url = \"$_rust_tarball\"" >> "$_manifest"
+ printf "%s\n" "[[pkg.rust.target.$_arch.components]]" >> "$_manifest"
+ printf "%s\n" "pkg = \"rustc\"" >> "$_manifest"
+ printf "%s\n" "target = \"$_arch\"" >> "$_manifest"
+ printf "%s\n" "[[pkg.rust.target.$_arch.components]]" >> "$_manifest"
+ printf "%s\n" "pkg = \"rust-docs\"" >> "$_manifest"
+ printf "%s\n" "target = \"$_arch\"" >> "$_manifest"
+ printf "%s\n" "[[pkg.rust.target.$_arch.components]]" >> "$_manifest"
+ printf "%s\n" "pkg = \"cargo\"" >> "$_manifest"
+ printf "%s\n" "target = \"$_arch\"" >> "$_manifest"
+ printf "%s\n" "[[pkg.rust.target.$_arch.components]]" >> "$_manifest"
+ printf "%s\n" "pkg = \"rust-std\"" >> "$_manifest"
+ printf "%s\n" "target = \"$_arch\"" >> "$_manifest"
+ printf "%s\n" "[[pkg.rust.target.$_arch.extensions]]" >> "$_manifest"
+ printf "%s\n" "pkg = \"rust-std\"" >> "$_manifest"
+ printf "%s\n" "target = \"$CROSS_ARCH1\"" >> "$_manifest"
+ printf "%s\n" "[[pkg.rust.target.$_arch.extensions]]" >> "$_manifest"
+ printf "%s\n" "pkg = \"rust-std\"" >> "$_manifest"
+ printf "%s\n" "target = \"$CROSS_ARCH2\"" >> "$_manifest"
+
+ # the other packages
+ printf "%s\n" "[pkg.rustc]" >> "$_manifest"
+ printf "%s\n" "version = \"$_version\"" >> "$_manifest"
+ printf "%s\n" "[pkg.rustc.target.$_arch]" >> "$_manifest"
+ printf "%s\n" "url = \"$_rustc_tarball\"" >> "$_manifest"
+ printf "%s\n" "[pkg.rust-docs]" >> "$_manifest"
+ printf "%s\n" "version = \"$_version\"" >> "$_manifest"
+ printf "%s\n" "[pkg.rust-docs.target.$_arch]" >> "$_manifest"
+ printf "%s\n" "url = \"$_docs_tarball\"" >> "$_manifest"
+ printf "%s\n" "[pkg.cargo]" >> "$_manifest"
+ printf "%s\n" "version = \"$_version\"" >> "$_manifest"
+ printf "%s\n" "[pkg.cargo.target.$_arch]" >> "$_manifest"
+ printf "%s\n" "url = \"$_cargo_tarball\"" >> "$_manifest"
+ printf "%s\n" "[pkg.rust-std]" >> "$_manifest"
+ printf "%s\n" "version = \"$_version\"" >> "$_manifest"
+ printf "%s\n" "[pkg.rust-std.target.$_arch]" >> "$_manifest"
+ printf "%s\n" "url = \"$_std_tarball\"" >> "$_manifest"
+ printf "%s\n" "[pkg.rust-std.target.$CROSS_ARCH1]" >> "$_manifest"
+ printf "%s\n" "url = \"$_cross_std_tarball1\"" >> "$_manifest"
+ printf "%s\n" "[pkg.rust-std.target.$CROSS_ARCH2]" >> "$_manifest"
+ printf "%s\n" "url = \"$_cross_std_tarball2\"" >> "$_manifest"
+}
+
+build_mock_channel() {
+ local _version="$1"
+ local _version_hash="$2"
+ local _package="$3"
+ local _channel="$4"
+ local _date="$5"
+
+ rm -Rf "$MOCK_BUILD_DIR"
+ mkdir -p "$MOCK_BUILD_DIR"
+
+ say "building mock channel $_version $_version_hash $_package $_channel $_date"
+ build_mock_std_installer "$_package"
+ build_mock_cross_std_installer "$_package" "$CROSS_ARCH1" "$_date"
+ build_mock_cross_std_installer "$_package" "$CROSS_ARCH2" "$_date"
+ build_mock_rustc_installer "$_version" "$_version_hash" "$_package"
+ build_mock_cargo_installer "$_version" "$_version_hash" "$_package"
+ build_mock_rust_docs_installer "$_package"
+ build_mock_combined_installer "$_package"
+ build_mock_channel_manifest "$_channel" "$_date" "$_version"
+ build_mock_channel_manifest "$_version" "$_date" "$_version"
+ build_mock_sums_and_sigs
+
+ mkdir -p "$MOCK_DIST_DIR/dist/$_date"
+ cp "$MOCK_BUILD_DIR/dist"/* "$MOCK_DIST_DIR/dist/$_date/"
+ cp "$MOCK_BUILD_DIR/dist"/* "$MOCK_DIST_DIR/dist/"
+
+ mkdir -p "$CUSTOM_TOOLCHAINS/$_date"
+
+ for t in "$MOCK_BUILD_DIR/work/"*; do
+ sh "$t/install.sh" --prefix="$CUSTOM_TOOLCHAINS/$_date/" 2> /dev/null 1> /dev/null
+ done
+}
+
+build_mocks() {
+ if [ -z "${NO_REBUILD_MOCKS-}" ]; then
+ build_mock_channel 1.0.0-nightly hash-nightly-1 nightly nightly 2015-01-01
+ build_mock_channel 1.0.0-beta hash-beta-1 1.0.0-beta beta 2015-01-01
+ build_mock_channel 1.0.0 hash-stable-1 1.0.0 stable 2015-01-01
+
+ build_mock_channel 1.1.0-nightly hash-nightly-2 nightly nightly 2015-01-02
+ build_mock_channel 1.1.0-beta hash-beta-2 1.1.0-beta beta 2015-01-02
+ build_mock_channel 1.1.0 hash-stable-2 1.1.0 stable 2015-01-02
+ fi
+}
+
+set_current_dist_date() {
+ local _dist_date="$1"
+ cp "$MOCK_DIST_DIR/dist/$_dist_date"/* "$MOCK_DIST_DIR/dist/"
+}
+
+frob_win_path() {
+ local _path="$1"
+
+ get_architecture
+ arch="$RETVAL"
+
+ # HACK: Frob `/c/` prefix into `c:/` on windows to make curl happy
+ case "$arch" in
+ *pc-windows*)
+ printf '%s' "$_path" | sed s~file:///c/~file://c:/~
+ ;;
+ *)
+ printf '%s' "$_path"
+ ;;
+ esac
+}
+
+# Build the mock revisions
+build_mocks
+
+say "updating submodules"
+try git submodule update --init --recursive
+
+# Build bultirust
+say "building multirust"
+try sh "$S/build.sh"
+
+# Build old-multirusts
+cd "$S/test/multirust-v1" && try sh ./build.sh
+
+get_architecture
+arch="$RETVAL"
+
+case "$arch" in
+*pc-windows*)
+ is_windows=true
+ ;;
+*)
+ is_windows=false
+ ;;
+esac
+
+# Tell multirust where to put .multirust
+export MULTIRUST_HOME
+# Tell multirust what key to use to verify sigs
+export MULTIRUST_GPG_KEY
+export RUSTUP_GPG_KEY="$MULTIRUST_GPG_KEY"
+
+# Tell multirust where to download stuff from
+MULTIRUST_DIST_SERVER="$(frob_win_path "file://$(cd "$MOCK_DIST_DIR" && pwd)")"
+
+export MULTIRUST_DIST_SERVER
+export RUSTUP_DIST_SERVER="$MULTIRUST_DIST_SERVER"
+
+# Set up the PATH to find multirust
+PATH="$MULTIRUST_BIN_DIR:$PATH"
+export PATH
+try test -e "$MULTIRUST_BIN_DIR/multirust"
+
+# Names of custom installers
+local_custom_rust="$MOCK_DIST_DIR/dist/rust-nightly-$arch.tar.gz"
+local_custom_rustc="$MOCK_DIST_DIR/dist/rustc-nightly-$arch.tar.gz"
+local_custom_cargo="$MOCK_DIST_DIR/dist/cargo-nightly-$arch.tar.gz"
+remote_custom_rust="$MULTIRUST_DIST_SERVER/dist/rust-nightly-$arch.tar.gz"
+remote_custom_rustc="$MULTIRUST_DIST_SERVER/dist/rustc-nightly-$arch.tar.gz"
+remote_custom_cargo="$MULTIRUST_DIST_SERVER/dist/cargo-nightly-$arch.tar.gz"
+
+no_args() {
+ expect_output_ok "Usage" multirust
+}
+runtest no_args
+
+uninitialized() {
+ expect_fail rustc
+ expect_output_fail "no default toolchain configured" rustc
+ expect_output_ok "no default toolchain configured" multirust show-default
+}
+runtest uninitialized
+
+default_toolchain() {
+ try multirust default nightly
+ expect_output_ok "nightly" multirust show-default
+}
+runtest default_toolchain
+
+expected_bins_exist() {
+ try multirust default nightly
+ expect_output_ok "1.1.0" rustc --version
+ expect_output_ok "1.1.0" rustdoc --version
+ expect_output_ok "1.1.0" cargo --version
+}
+runtest expected_bins_exist
+
+install_toolchain_from_channel() {
+ try multirust default nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+ try multirust default beta
+ expect_output_ok "hash-beta-2" rustc --version
+ try multirust default stable
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_from_channel
+
+install_toolchain_from_archive() {
+ try multirust default nightly-2015-01-01
+ expect_output_ok "hash-nightly-1" rustc --version
+ try multirust default beta-2015-01-01
+ expect_output_ok "hash-beta-1" rustc --version
+ try multirust default stable-2015-01-01
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_toolchain_from_archive
+
+install_toolchain_linking_from_path() {
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_toolchain_linking_from_path
+
+install_toolchain_from_path() {
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_toolchain_from_path
+
+install_toolchain_linking_from_path_again() {
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_linking_from_path_again
+
+install_toolchain_from_path_again() {
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_from_path_again
+
+install_toolchain_change_from_copy_to_link() {
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_change_from_copy_to_link
+
+install_toolchain_change_from_link_to_copy() {
+ try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_change_from_link_to_copy
+
+install_toolchain_from_custom() {
+ try multirust default custom --installer "$local_custom_rust"
+ expect_output_ok nightly rustc --version
+}
+runtest install_toolchain_from_custom
+
+install_toolchain_from_version() {
+ try multirust default 1.1.0
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_toolchain_from_version
+
+default_existing_toolchain() {
+ try multirust update nightly
+ expect_output_ok "using existing install for 'nightly'" multirust default nightly
+}
+runtest default_existing_toolchain
+
+update_channel() {
+ set_current_dist_date 2015-01-01
+ try multirust default nightly
+ expect_output_ok "hash-nightly-1" rustc --version
+ set_current_dist_date 2015-01-02
+ try multirust update nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+}
+runtest update_channel
+
+list_toolchains() {
+ try multirust update nightly
+ try multirust update beta-2015-01-01
+ expect_output_ok "nightly" multirust list-toolchains
+ expect_output_ok "beta-2015-01-01" multirust list-toolchains
+}
+runtest list_toolchains
+
+list_toolchain_with_none() {
+ try multirust list-toolchains
+ expect_output_ok "no installed toolchains" multirust list-toolchains
+}
+runtest list_toolchain_with_none
+
+remove_toolchain() {
+ try multirust update nightly
+ try multirust remove-toolchain nightly
+ try multirust list-toolchains
+ expect_output_ok "no installed toolchains" multirust list-toolchains
+}
+runtest remove_toolchain
+
+remove_active_toolchain_error_handling() {
+ try multirust default nightly
+ try multirust remove-toolchain nightly
+ expect_output_fail "toolchain 'nightly' not installed" rustc
+}
+runtest remove_active_toolchain_error_handling
+
+bad_sha_on_manifest() {
+ # Have to break both v1 and v2 manifest hashes to trigger the failure
+ manifest_hash="$MOCK_DIST_DIR/dist/channel-rust-nightly.sha256"
+ sha=`cat "$manifest_hash"`
+ echo "$sha" | sed s/^......../aaaaaaaa/ > "$manifest_hash"
+ manifest_hash="$MOCK_DIST_DIR/dist/channel-rust-nightly.toml.sha256"
+ sha=`cat "$manifest_hash"`
+ echo "$sha" | sed s/^......../aaaaaaaa/ > "$manifest_hash"
+ expect_output_fail "checksum failed" multirust default nightly
+ set_current_dist_date 2015-01-02
+}
+runtest bad_sha_on_manifest
+
+bad_sha_on_installer() {
+ for i in "$MOCK_DIST_DIR/dist"/*.sha256; do
+ sha=`cat "$i"`
+ echo "$sha" | sed s/^......../aaaaaaaa/ > "$i"
+ done
+ expect_output_fail "checksum failed" multirust default 1.0.0
+ set_current_dist_date 2015-01-02
+}
+runtest bad_sha_on_installer
+
+delete_data() {
+ try multirust default nightly
+ if [ ! -d "$MULTIRUST_HOME" ]; then
+ fail "no multirust dir"
+ fi
+ try multirust delete-data -y
+ if [ -d "$MULTIRUST_HOME" ]; then
+ fail "multirust dir not removed"
+ fi
+}
+runtest delete_data
+
+install_override_toolchain_from_channel() {
+ try multirust override nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+ try multirust override beta
+ expect_output_ok "hash-beta-2" rustc --version
+ try multirust override stable
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_from_channel
+
+install_override_toolchain_from_archive() {
+ try multirust override nightly-2015-01-01
+ expect_output_ok "hash-nightly-1" rustc --version
+ try multirust override beta-2015-01-01
+ expect_output_ok "hash-beta-1" rustc --version
+ try multirust override stable-2015-01-01
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_override_toolchain_from_archive
+
+install_override_toolchain_linking_path() {
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_override_toolchain_linking_path
+
+install_override_toolchain_from_path() {
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest install_override_toolchain_from_path
+
+install_override_toolchain_linking_path_again() {
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_linking_path_again
+
+install_override_toolchain_from_path_again() {
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_from_path_again
+
+install_override_toolchain_change_from_copy_to_link() {
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_change_from_copy_to_link
+
+install_override_toolchain_change_from_link_to_copy() {
+ try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_change_from_link_to_copy
+
+install_override_toolchain_from_version() {
+ try multirust override 1.1.0
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest install_override_toolchain_from_version
+
+override_overrides_default() {
+ try multirust default nightly
+ try multirust override beta
+ expect_output_ok "beta" rustc --version
+}
+runtest override_overrides_default
+
+multiple_overrides() {
+ mkdir -p "$WORK_DIR/dir1"
+ mkdir -p "$WORK_DIR/dir2"
+ try multirust default nightly
+ (cd "$WORK_DIR/dir1" && try multirust override beta)
+ (cd "$WORK_DIR/dir2" && try multirust override stable)
+ expect_output_ok "nightly" rustc --version
+ (cd "$WORK_DIR/dir1" && expect_output_ok "beta" rustc --version)
+ (cd "$WORK_DIR/dir2" && expect_output_ok "stable" rustc --version)
+}
+runtest multiple_overrides
+
+change_override() {
+ try multirust override nightly
+ try multirust override beta
+ expect_output_ok "beta" rustc --version
+}
+runtest change_override
+
+show_override() {
+ try multirust override nightly
+ expect_output_ok "override toolchain: nightly" multirust show-override
+ expect_output_ok "override reason: directory override for '`pwd`'" multirust show-override
+ expect_output_ok "override location: $MULTIRUST_HOME/toolchains/nightly" multirust show-override
+ expect_output_ok "hash-nightly-2" multirust show-override
+}
+runtest show_override
+
+show_override_no_override() {
+ try multirust default nightly
+ expect_output_ok "no override" multirust show-override
+}
+runtest show_override_no_override
+
+show_override_no_override_no_default() {
+ expect_output_ok "no override" multirust show-override
+}
+runtest show_override_no_override_no_default
+
+show_override_no_override_show_default() {
+ try multirust default nightly
+ expect_output_ok "no override" multirust show-override
+ expect_output_ok "default toolchain: nightly" multirust show-override
+}
+runtest show_override_no_override_show_default
+
+show_override_from_MULTIRUST_TOOLCHAIN() {
+ try multirust update beta
+ try multirust override nightly
+ export MULTIRUST_TOOLCHAIN=beta
+ expect_output_ok "override toolchain: beta" multirust show-override
+ expect_output_ok "override reason: environment override" multirust show-override
+ expect_output_ok "override location: $MULTIRUST_HOME/toolchains/beta" multirust show-override
+ expect_output_ok "hash-beta-2" multirust show-override
+ unset MULTIRUST_TOOLCHAIN
+}
+runtest show_override_from_MULTIRUST_TOOLCHAIN
+
+remove_override_no_default() {
+ try multirust override nightly
+ try multirust remove-override
+ expect_output_fail "no default toolchain configured" rustc
+}
+runtest remove_override_no_default
+
+remove_override_with_default() {
+ try multirust default nightly
+ try multirust override beta
+ try multirust remove-override
+ expect_output_ok "nightly" rustc --version
+}
+runtest remove_override_with_default
+
+remove_override_with_multiple_overrides() {
+ mkdir -p "$WORK_DIR/dir1"
+ mkdir -p "$WORK_DIR/dir2"
+ try multirust default nightly
+ (cd "$WORK_DIR/dir1" && try multirust override beta)
+ (cd "$WORK_DIR/dir2" && try multirust override stable)
+ expect_output_ok "nightly" rustc --version
+ (cd "$WORK_DIR/dir1" && try multirust remove-override)
+ (cd "$WORK_DIR/dir1" && expect_output_ok "nightly" rustc --version)
+ (cd "$WORK_DIR/dir2" && expect_output_ok "stable" rustc --version)
+}
+runtest remove_override_with_multiple_overrides
+
+custom_no_installer_specified() {
+ expect_output_fail "unspecified installer" multirust update nightly --installer
+}
+runtest custom_no_installer_specified
+
+custom_invalid_names() {
+ expect_output_fail "invalid custom toolchain name: 'nightly'" \
+ multirust update nightly --installer "$local_custom_rust"
+ expect_output_fail "invalid custom toolchain name: 'beta'" \
+ multirust update beta --installer "$local_custom_rust"
+ expect_output_fail "invalid custom toolchain name: 'stable'" \
+ multirust update stable --installer "$local_custom_rust"
+}
+runtest custom_invalid_names
+
+custom_invalid_names_with_archive_dates() {
+ expect_output_fail "invalid custom toolchain name: 'nightly-2015-01-01'" \
+ multirust update nightly-2015-01-01 --installer "$local_custom_rust"
+ expect_output_fail "invalid custom toolchain name: 'beta-2015-01-01'" \
+ multirust update beta-2015-01-01 --installer "$local_custom_rust"
+ expect_output_fail "invalid custom toolchain name: 'stable-2015-01-01'" \
+ multirust update stable-2015-01-01 --installer "$local_custom_rust"
+}
+runtest custom_invalid_names_with_archive_dates
+
+custom_local() {
+ try multirust update custom --installer "$local_custom_rust"
+ try multirust default custom
+ expect_output_ok nightly rustc --version
+}
+runtest custom_local
+
+custom_remote() {
+ try multirust update custom --installer "$remote_custom_rust"
+ try multirust default custom
+ expect_output_ok nightly rustc --version
+}
+runtest custom_remote
+
+custom_multiple_local() {
+ try multirust update custom --installer "$local_custom_rustc,$local_custom_cargo"
+ try multirust default custom
+ expect_output_ok nightly rustc --version
+ expect_output_ok nightly cargo --version
+}
+runtest custom_multiple_local
+
+custom_multiple_remote() {
+ try multirust update custom --installer "$remote_custom_rustc,$remote_custom_cargo"
+ try multirust default custom
+ expect_output_ok nightly rustc --version
+ expect_output_ok nightly cargo --version
+}
+runtest custom_multiple_remote
+
+remove_custom() {
+ try multirust update custom --installer "$remote_custom_rustc,$remote_custom_cargo"
+ try multirust remove-toolchain custom
+ expect_output_ok "no installed toolchains" multirust list-toolchains
+}
+runtest remove_custom
+
+update_toolchain_linking_path() {
+ try multirust update custom --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ try multirust default custom
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest update_toolchain_linking_path
+
+update_toolchain_from_path() {
+ try multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ try multirust default custom
+ expect_output_ok "hash-stable-1" rustc --version
+}
+runtest update_toolchain_from_path
+
+update_toolchain_change_from_copy_to_link() {
+ try multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ try multirust default custom
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust update custom --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ try multirust default custom
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest update_toolchain_change_from_copy_to_link
+
+update_toolchain_change_from_link_to_copy() {
+ try multirust update custom --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ try multirust default custom
+ expect_output_ok "hash-stable-1" rustc --version
+ try multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
+ try multirust default custom
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest update_toolchain_change_from_link_to_copy
+
+custom_dir_invalid_names() {
+ expect_output_fail "invalid custom toolchain name: 'nightly'" \
+ multirust update nightly --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_fail "invalid custom toolchain name: 'beta'" \
+ multirust update beta --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+ expect_output_fail "invalid custom toolchain name: 'stable'" \
+ multirust update stable --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
+}
+runtest custom_dir_invalid_names
+
+custom_without_rustc() {
+ rm -Rf "$CUSTOM_TOOLCHAINS/broken"
+ cp -R "$CUSTOM_TOOLCHAINS/2015-01-01" "$CUSTOM_TOOLCHAINS/broken"
+ rm "$CUSTOM_TOOLCHAINS/broken/bin/rustc"
+ expect_output_fail "no rustc in custom toolchain at " \
+ multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/broken"
+ rm -Rf "$CUSTOM_TOOLCHAINS/broken"
+}
+runtest custom_without_rustc
+
+no_update_on_channel_when_data_has_not_changed() {
+ try multirust update nightly
+ expect_output_ok "'nightly' is already up to date" multirust update nightly
+}
+runtest no_update_on_channel_when_data_has_not_changed
+
+update_on_channel_when_data_has_changed() {
+ set_current_dist_date 2015-01-01
+ try multirust default nightly
+ expect_output_ok "hash-nightly-1" rustc --version
+ set_current_dist_date 2015-01-02
+ try multirust update nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+}
+runtest update_on_channel_when_data_has_changed
+
+with_multirust_from_v1_error() {
+ # No windows support in v1
+ if [ "$is_windows" != true ]; then
+ try "$MULTIRUST_BIN_DIR_V1/multirust" default nightly
+ expect_output_fail "metadata version is 1, need 2" multirust default nightly
+ fi
+}
+runtest with_multirust_from_v1_error
+
+upgrade_from_v1_to_v2() {
+ if [ "$is_windows" != true ]; then
+ try "$MULTIRUST_BIN_DIR_V1/multirust" default nightly
+ try multirust upgrade-data
+ try multirust default nightly
+ fi
+}
+runtest upgrade_from_v1_to_v2
+
+update_no_toolchain_means_update_all() {
+ set_current_dist_date 2015-01-01
+ try multirust update
+ expect_output_ok "using existing" multirust default nightly
+ expect_output_ok "hash-nightly-1" rustc --version
+ expect_output_ok "using existing" multirust default beta
+ expect_output_ok "hash-beta-1" rustc --version
+ expect_output_ok "using existing" multirust default stable
+ expect_output_ok "hash-stable-1" rustc --version
+ set_current_dist_date 2015-01-02
+ expect_output_ok "updating existing" multirust update nightly
+ try multirust update
+ expect_output_ok "using existing" multirust default nightly
+ expect_output_ok "hash-nightly-2" rustc --version
+ expect_output_ok "using existing" multirust default beta
+ expect_output_ok "hash-beta-2" rustc --version
+ expect_output_ok "using existing" multirust default stable
+ expect_output_ok "hash-stable-2" rustc --version
+}
+runtest update_no_toolchain_means_update_all
+
+run_command() {
+ try multirust update nightly
+ try multirust default beta
+ expect_output_ok "nightly" multirust run nightly rustc --version
+}
+runtest run_command
+
+remove_toolchain_then_add_again() {
+ # Issue 53
+ try multirust default beta
+ try multirust remove-toolchain beta
+ try multirust update beta
+ try rustc --version
+}
+runtest remove_toolchain_then_add_again
+
+ctl_default_toolchain_no_default() {
+ expect_output_fail "no default toolchain configured" multirust ctl default-toolchain
+}
+runtest ctl_default_toolchain_no_default
+
+ctl_default_toolchain_with_default_no_override() {
+ try multirust default beta
+ expect_output_ok "beta" multirust ctl default-toolchain
+}
+runtest ctl_default_toolchain_with_default_no_override
+
+ctl_default_toolchain_with_default_and_override() {
+ try multirust default beta
+ try multirust override nightly
+ expect_output_ok "beta" multirust ctl default-toolchain
+}
+runtest ctl_default_toolchain_with_default_and_override
+
+list_available_targets_no_toolchain() {
+ expect_output_fail "toolchain 'bogus' is not installed" multirust list-available-targets bogus
+}
+runtest list_available_targets_no_toolchain
+
+list_available_targets() {
+ try multirust default nightly
+ expect_output_ok "$CROSS_ARCH1" multirust list-available-targets nightly
+ expect_output_ok "$CROSS_ARCH2" multirust list-available-targets nightly
+}
+runtest list_available_targets
+
+add_target() {
+ try multirust default nightly
+ try multirust add-target nightly "$CROSS_ARCH1"
+ try test -e "$MULTIRUST_HOME/toolchains/nightly/lib/rustlib/$CROSS_ARCH1/lib/libstd.rlib"
+}
+runtest add_target
+
+add_target_bogus() {
+ try multirust default nightly
+ expect_output_fail "unable to find package url" multirust add-target nightly bogus
+}
+runtest add_target_bogus
+
+add_target_no_toolchain() {
+ expect_output_fail "toolchain 'bogus' is not installed" multirust add-target bogus "$CROSS_ARCH1"
+}
+runtest add_target_no_toolchain
+
+echo
+echo "SUCCESS!"
+echo
diff --git a/test.sh b/test.sh
index cf71d79..bb5a538 100755
--- a/test.sh
+++ b/test.sh
@@ -1,1085 +1,17 @@
#!/bin/sh
-# TODO update notifications
-# TODO CARGO_HOME
-# TODO rpath
-# TODO non-absolute MULTIRUST_HOME
-
set -e -u
-# Prints the absolute path of a directory to stdout
-abs_path() {
- local _path="$1"
- # Unset CDPATH because it causes havok: it makes the destination unpredictable
- # and triggers 'cd' to print the path to stdout. Route `cd`'s output to /dev/null
- # for good measure.
- (unset CDPATH && cd "$_path" > /dev/null && pwd)
-}
-
-S="$(abs_path $(dirname $0))"
-
-TMP_DIR="$S/tmp"
-MOCK_DIST_DIR="$S/tmp/mock-dist"
-CUSTOM_TOOLCHAINS="$S/tmp/custom-toolchains"
-
-# Clean out the tmp dir
-if [ -n "${NO_REBUILD_MOCKS-}" ]; then
- mv "$MOCK_DIST_DIR" ./mock-backup
- mv "$CUSTOM_TOOLCHAINS" ./custom-backup
-fi
-rm -Rf "$TMP_DIR"
-mkdir "$TMP_DIR"
-if [ -n "${NO_REBUILD_MOCKS-}" ]; then
- mv ./mock-backup "$MOCK_DIST_DIR"
- mv ./custom-backup "$CUSTOM_TOOLCHAINS"
-fi
-
-TEST_DIR="$S/test"
-TEST_SECRET_KEY="$TEST_DIR/secret-key.gpg"
-TEST_PUBLIC_KEY="$TEST_DIR/public-key.gpg"
-MULTIRUST_GPG_KEY="$TEST_DIR/public-key.asc"
-WORK_DIR="$S/tmp/work"
-MOCK_BUILD_DIR="$S/tmp/mock-build"
-MULTIRUST_HOME="$(cd "$TMP_DIR" && pwd)/multirust"
-VERSION=0.7.0
-MULTIRUST_BIN_DIR="$S/build/work/multirust-$VERSION/multirust/bin"
-MULTIRUST_BIN_DIR_V1="$S/test/multirust-v1/build/work/multirust-0.0.2/multirust/bin"
-
-say() {
- echo "test: $1"
-}
-
-pre() {
- echo "test: $1"
- rm -Rf "$MULTIRUST_HOME"
- rm -Rf "$WORK_DIR"
- mkdir -p "$WORK_DIR"
-}
-
-need_ok() {
- if [ $? -ne 0 ]; then
- echo
- echo "TEST FAILED!"
- echo
- exit 1
- fi
-}
-
-fail() {
- echo
- echo "$1"
- echo
- echo "TEST FAILED!"
- echo
- exit 1
-}
-
-try() {
- set +e
- _cmd="$@"
- _output=`$@ 2>&1`
- if [ $? -ne 0 ]; then
- echo \$ "$_cmd"
- # Using /bin/echo to avoid escaping
- /bin/echo "$_output"
- echo
- echo "TEST FAILED!"
- echo
- exit 1
- else
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
- echo \$ "$_cmd"
- fi
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
- /bin/echo "$_output"
- fi
- fi
- set -e
-}
-
-expect_fail() {
- set +e
- _cmd="$@"
- _output=`$@ 2>&1`
- if [ $? -eq 0 ]; then
- echo \$ "$_cmd"
- # Using /bin/echo to avoid escaping
- /bin/echo "$_output"
- echo
- echo "TEST FAILED!"
- echo
- exit 1
- else
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
- echo \$ "$_cmd"
- fi
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
- /bin/echo "$_output"
- fi
- fi
- set -e
-}
-
-expect_output_ok() {
- set +e
- local _expected="$1"
- shift 1
- _cmd="$@"
- _output=`$@ 2>&1`
- if [ $? -ne 0 ]; then
- echo \$ "$_cmd"
- # Using /bin/echo to avoid escaping
- /bin/echo "$_output"
- echo
- echo "TEST FAILED!"
- echo
- exit 1
- elif ! echo "$_output" | grep -q "$_expected"; then
- echo \$ "$_cmd"
- /bin/echo "$_output"
- echo
- echo "missing expected output '$_expected'"
- echo
- echo
- echo "TEST FAILED!"
- echo
- exit 1
- else
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
- echo \$ "$_cmd"
- fi
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
- /bin/echo "$_output"
- fi
- fi
- set -e
-}
-
-expect_output_fail() {
- set +e
- local _expected="$1"
- shift 1
- _cmd="$@"
- _output=`$@ 2>&1`
- if [ $? -eq 0 ]; then
- echo \$ "$_cmd"
- # Using /bin/echo to avoid escaping
- /bin/echo "$_output"
- echo
- echo "TEST FAILED!"
- echo
- exit 1
- elif ! echo "$_output" | grep -q "$_expected"; then
- echo \$ "$_cmd"
- /bin/echo "$_output"
- echo
- echo "missing expected output '$_expected'"
- echo
- echo
- echo "TEST FAILED!"
- echo
- exit 1
- else
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
- echo \$ "$_cmd"
- fi
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
- /bin/echo "$_output"
- fi
- fi
- set -e
-}
-
-expect_not_output_ok() {
- set +e
- local _expected="$1"
- shift 1
- _cmd="$@"
- _output=`$@ 2>&1`
- if [ $? -ne 0 ]; then
- echo \$ "$_cmd"
- # Using /bin/echo to avoid escaping
- /bin/echo "$_output"
- echo
- echo "TEST FAILED!"
- echo
- exit 1
- elif echo "$_output" | grep -q "$_expected"; then
- echo \$ "$_cmd"
- /bin/echo "$_output"
- echo
- echo "unexpected output '$_expected'"
- echo
- echo
- echo "TEST FAILED!"
- echo
- exit 1
- else
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_CMD-}" ]; then
- echo \$ "$_cmd"
- fi
- if [ -n "${VERBOSE-}" -o -n "${VERBOSE_OUTPUT-}" ]; then
- /bin/echo "$_output"
- fi
- fi
- set -e
-}
-
-runtest() {
- local _testname="$1"
- if [ -n "${TESTNAME-}" ]; then
- if ! echo "$_testname" | grep -q "$TESTNAME"; then
- return 0
- fi
- fi
-
- pre "$_testname"
- "$_testname"
-}
-
-get_architecture() {
-
- local _ostype="$(uname -s)"
- local _cputype="$(uname -m)"
-
- if [ "$_ostype" = Darwin -a "$_cputype" = i386 ]; then
- # Darwin `uname -s` lies
- if sysctl hw.optional.x86_64 | grep -q ': 1'; then
- local _cputype=x86_64
- fi
- fi
-
- case "$_ostype" in
-
- Linux)
- local _ostype=unknown-linux-gnu
- ;;
-
- FreeBSD)
- local _ostype=unknown-freebsd
- ;;
-
- DragonFly)
- local _ostype=unknown-dragonfly
- ;;
-
- Darwin)
- local _ostype=apple-darwin
- ;;
-
- MINGW* | MSYS*)
- local _ostype=pc-windows-gnu
- ;;
-
- *)
- err "unrecognized OS type: $_ostype"
- ;;
-
- esac
-
- case "$_cputype" in
- i386 | i486 | i686 | i786 | x86)
- local _cputype=i686
- ;;
-
- xscale | arm)
- local _cputype=arm
- ;;
-
- armv7l)
- local _cputype=arm
- local _ostype="${_ostype}eabihf"
- ;;
-
- x86_64 | x86-64 | x64 | amd64)
- local _cputype=x86_64
- ;;
-
- *)
- err "unknown CPU type: $CFG_CPUTYPE"
- ;;
- esac
-
- # Detect 64-bit linux with 32-bit userland
- if [ $_ostype = unknown-linux-gnu -a $_cputype = x86_64 ]; then
- file -L "$SHELL" | grep -q "x86[_-]64"
- if [ $? != 0 ]; then
- local _cputype=i686
- fi
- fi
-
- local _arch="$_cputype-$_ostype"
-
- RETVAL="$_arch"
-}
-
-build_mock_bin() {
- local _name="$1"
- local _version="$2"
- local _version_hash="$3"
- local _dir="$4"
-
- cat "$TEST_DIR/mock.sh" | \
- sed s/@@TEMPLATE_BIN_NAME@@/"$_name"/ | \
- sed s/@@TEMPLATE_VERSION@@/"$_version"/ | \
- sed s/@@TEMPLATE_HASH@@/"$_version_hash"/ > "$_dir/$_name"
-
- chmod a+x "$_dir/$_name"
-}
-
-build_mock_rustc_installer() {
- local _version="$1"
- local _version_hash="$2"
- local _package="$3"
-
- local _image="$MOCK_BUILD_DIR/image/rustc"
- mkdir -p "$_image/bin"
- build_mock_bin rustc "$_version" "$_version_hash" "$_image/bin"
- build_mock_bin rustdoc "$_version" "$_version_hash" "$_image/bin"
-
- get_architecture
- local _arch="$RETVAL"
-
- mkdir -p "$MOCK_BUILD_DIR/pkg"
- try sh "$S/src/rust-installer/gen-installer.sh" \
- --product-name=Rust \
- --rel-manifest-dir=rustlib \
- --image-dir="$_image" \
- --work-dir="$MOCK_BUILD_DIR/work" \
- --output-dir="$MOCK_BUILD_DIR/pkg" \
- --package-name="rustc-$_package-$_arch" \
- --component-name=rustc
-}
-
-build_mock_cargo_installer() {
- local _version="$1"
- local _version_hash="$2"
- local _package="$3"
-
- local _image="$MOCK_BUILD_DIR/image/cargo"
- mkdir -p "$_image/bin"
- build_mock_bin cargo "$_version" "$_version_hash" "$_image/bin"
-
- get_architecture
- local _arch="$RETVAL"
-
- mkdir -p "$MOCK_BUILD_DIR/pkg"
- try sh "$S/src/rust-installer/gen-installer.sh" \
- --product-name=Cargo \
- --rel-manifest-dir=rustlib \
- --image-dir="$_image" \
- --work-dir="$MOCK_BUILD_DIR/work" \
- --output-dir="$MOCK_BUILD_DIR/pkg" \
- --package-name="cargo-$_package-$_arch" \
- --component-name=cargo
-}
-
-build_mock_rust_docs_installer() {
- local _package="$1"
-
- local _image="$MOCK_BUILD_DIR/image/docs"
- mkdir -p "$_image/share/doc/rust/html"
- echo "test" > "$_image/share/doc/rust/html/index.html"
-
- get_architecture
- local _arch="$RETVAL"
-
- mkdir -p "$MOCK_BUILD_DIR/pkg"
- try sh "$S/src/rust-installer/gen-installer.sh" \
- --product-name=Rust-documentation \
- --rel-manifest-dir=rustlib \
- --image-dir="$_image" \
- --work-dir="$MOCK_BUILD_DIR/work" \
- --output-dir="$MOCK_BUILD_DIR/pkg" \
- --package-name="rust-docs-$_package-$_arch" \
- --component-name=rust-docs
-}
-
-build_mock_combined_installer() {
- local _package="$1"
-
- get_architecture
- local _arch="$RETVAL"
-
- local _rustc_tarball="$MOCK_BUILD_DIR/pkg/rustc-$_package-$_arch.tar.gz"
- local _cargo_tarball="$MOCK_BUILD_DIR/pkg/cargo-$_package-$_arch.tar.gz"
- local _docs_tarball="$MOCK_BUILD_DIR/pkg/rust-docs-$_package-$_arch.tar.gz"
- local _inputs="$_rustc_tarball,$_cargo_tarball,$_docs_tarball"
-
- mkdir -p "$MOCK_BUILD_DIR/dist"
- try sh "$S/src/rust-installer/combine-installers.sh" \
- --product-name=Rust \
- --rel-manifest-dir=rustlib \
- --work-dir="$MOCK_BUILD_DIR/work" \
- --output-dir="$MOCK_BUILD_DIR/dist" \
- --package-name="rust-$_package-$_arch" \
- --input-tarballs="$_inputs"
-}
-
-build_mock_dist_channel() {
- local _channel="$1"
- local _date="$2"
-
- (cd "$MOCK_BUILD_DIR/dist" && ls * > channel-rust-"$_channel")
- if command -v gpg > /dev/null 2>&1; then
- (cd "$MOCK_BUILD_DIR/dist" && for i in *; do
- gpg --no-default-keyring --secret-keyring "$TEST_SECRET_KEY" \
- --keyring "$TEST_PUBLIC_KEY" \
- --no-tty --yes -a --detach-sign "$i"
- done)
- else
- say "gpg not found. not testing signature verification"
- (cd "$MOCK_BUILD_DIR/dist" && for i in *; do echo "nosig" > "$i.asc"; done)
- fi
- (cd "$MOCK_BUILD_DIR/dist" && for i in *; do shasum -a256 $i > $i.sha256; done)
-}
-
-build_mock_channel() {
- local _version="$1"
- local _version_hash="$2"
- local _package="$3"
- local _channel="$4"
- local _date="$5"
-
- rm -Rf "$MOCK_BUILD_DIR"
- mkdir -p "$MOCK_BUILD_DIR"
-
- say "building mock channel $_version $_version_hash $_package $_channel $_date"
- build_mock_rustc_installer "$_version" "$_version_hash" "$_package"
- build_mock_cargo_installer "$_version" "$_version_hash" "$_package"
- build_mock_rust_docs_installer "$_package"
- build_mock_combined_installer "$_package"
- build_mock_dist_channel "$_channel" "$_date"
-
- mkdir -p "$MOCK_DIST_DIR/dist/$_date"
- cp "$MOCK_BUILD_DIR/dist"/* "$MOCK_DIST_DIR/dist/$_date/"
- cp "$MOCK_BUILD_DIR/dist"/* "$MOCK_DIST_DIR/dist/"
- # Copy the intermediate installers too, though without manifests, checksums, etc.
- cp "$MOCK_BUILD_DIR/pkg"/* "$MOCK_DIST_DIR/dist/$_date/"
- cp "$MOCK_BUILD_DIR/pkg"/* "$MOCK_DIST_DIR/dist/"
-
- mkdir -p "$CUSTOM_TOOLCHAINS/$_date"
-
- for t in "$MOCK_BUILD_DIR/work/"*; do
- sh "$t/install.sh" --prefix="$CUSTOM_TOOLCHAINS/$_date/" 2> /dev/null 1> /dev/null
- done
-}
-
-build_mocks() {
- if [ -z "${NO_REBUILD_MOCKS-}" ]; then
- build_mock_channel 1.0.0-nightly hash-nightly-1 nightly nightly 2015-01-01
- build_mock_channel 1.0.0-beta hash-beta-1 1.0.0-beta beta 2015-01-01
- build_mock_channel 1.0.0 hash-stable-1 1.0.0 stable 2015-01-01
-
- build_mock_channel 1.1.0-nightly hash-nightly-2 nightly nightly 2015-01-02
- build_mock_channel 1.1.0-beta hash-beta-2 1.1.0-beta beta 2015-01-02
- build_mock_channel 1.1.0 hash-stable-2 1.1.0 stable 2015-01-02
- fi
-}
-
-set_current_dist_date() {
- local _dist_date="$1"
- cp "$MOCK_DIST_DIR/dist/$_dist_date"/* "$MOCK_DIST_DIR/dist/"
-}
-
-# Build the mock revisions
-build_mocks
-
-say "updating submodules"
-try git submodule update --init --recursive
-
-# Build bultirust
-say "building multirust"
-try sh "$S/build.sh"
-
-# Build old-multirusts
-cd "$S/test/multirust-v1" && try sh ./build.sh
-
-get_architecture
-arch="$RETVAL"
-
-# Tell multirust where to put .multirust
-export MULTIRUST_HOME
-# Tell multirust what key to use to verify sigs
-export MULTIRUST_GPG_KEY
-export RUSTUP_GPG_KEY="$MULTIRUST_GPG_KEY"
-
-# Tell multirust where to download stuff from
-MULTIRUST_DIST_SERVER="file://$(cd "$MOCK_DIST_DIR" && pwd)"
+S="$(dirname $0)"
-# HACK: Frob `/c/` prefix into `c:/` on windows to make curl happy
-case "$arch" in
-*pc-windows*)
- is_windows=true
- MULTIRUST_DIST_SERVER=`printf '%s' "$MULTIRUST_DIST_SERVER" | sed s~file:///c/~file://c:/~`
- ;;
-*)
- is_windows=false
- ;;
-esac
-
-export MULTIRUST_DIST_SERVER
-export RUSTUP_DIST_SERVER="$MULTIRUST_DIST_SERVER"
-
-# Set up the PATH to find multirust
-PATH="$MULTIRUST_BIN_DIR:$PATH"
-export PATH
-try test -e "$MULTIRUST_BIN_DIR/multirust"
-
-# Names of custom installers
-local_custom_rust="$MOCK_DIST_DIR/dist/rust-nightly-$arch.tar.gz"
-local_custom_rustc="$MOCK_DIST_DIR/dist/rustc-nightly-$arch.tar.gz"
-local_custom_cargo="$MOCK_DIST_DIR/dist/cargo-nightly-$arch.tar.gz"
-remote_custom_rust="$MULTIRUST_DIST_SERVER/dist/rust-nightly-$arch.tar.gz"
-remote_custom_rustc="$MULTIRUST_DIST_SERVER/dist/rustc-nightly-$arch.tar.gz"
-remote_custom_cargo="$MULTIRUST_DIST_SERVER/dist/cargo-nightly-$arch.tar.gz"
-
-no_args() {
- expect_output_ok "Usage" multirust
-}
-runtest no_args
-
-uninitialized() {
- expect_fail rustc
- expect_output_fail "no default toolchain configured" rustc
- expect_output_ok "no default toolchain configured" multirust show-default
-}
-runtest uninitialized
-
-default_toolchain() {
- try multirust default nightly
- expect_output_ok "nightly" multirust show-default
-}
-runtest default_toolchain
-
-expected_bins_exist() {
- try multirust default nightly
- expect_output_ok "1.1.0" rustc --version
- expect_output_ok "1.1.0" rustdoc --version
- expect_output_ok "1.1.0" cargo --version
-}
-runtest expected_bins_exist
-
-install_toolchain_from_channel() {
- try multirust default nightly
- expect_output_ok "hash-nightly-2" rustc --version
- try multirust default beta
- expect_output_ok "hash-beta-2" rustc --version
- try multirust default stable
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_toolchain_from_channel
-
-install_toolchain_from_archive() {
- try multirust default nightly-2015-01-01
- expect_output_ok "hash-nightly-1" rustc --version
- try multirust default beta-2015-01-01
- expect_output_ok "hash-beta-1" rustc --version
- try multirust default stable-2015-01-01
- expect_output_ok "hash-stable-1" rustc --version
-}
-runtest install_toolchain_from_archive
-
-install_toolchain_linking_from_path() {
- try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
-}
-runtest install_toolchain_linking_from_path
-
-install_toolchain_from_path() {
- try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
-}
-runtest install_toolchain_from_path
-
-install_toolchain_linking_from_path_again() {
- try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
- try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_toolchain_linking_from_path_again
-
-install_toolchain_from_path_again() {
- try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
- try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_toolchain_from_path_again
-
-install_toolchain_change_from_copy_to_link() {
- try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
- try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_toolchain_change_from_copy_to_link
-
-install_toolchain_change_from_link_to_copy() {
- try multirust default default-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
- try multirust default default-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_toolchain_change_from_link_to_copy
-
-install_toolchain_from_custom() {
- try multirust default custom --installer "$local_custom_rust"
- expect_output_ok nightly rustc --version
-}
-runtest install_toolchain_from_custom
-
-install_toolchain_from_version() {
- try multirust default 1.1.0
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_toolchain_from_version
-
-default_existing_toolchain() {
- try multirust update nightly
- expect_output_ok "using existing install for 'nightly'" multirust default nightly
-}
-runtest default_existing_toolchain
-
-update_channel() {
- set_current_dist_date 2015-01-01
- try multirust default nightly
- expect_output_ok "hash-nightly-1" rustc --version
- set_current_dist_date 2015-01-02
- try multirust update nightly
- expect_output_ok "hash-nightly-2" rustc --version
-}
-runtest update_channel
-
-list_toolchains() {
- try multirust update nightly
- try multirust update beta-2015-01-01
- expect_output_ok "nightly" multirust list-toolchains
- expect_output_ok "beta-2015-01-01" multirust list-toolchains
-}
-runtest list_toolchains
-
-list_toolchain_with_none() {
- try multirust list-toolchains
- expect_output_ok "no installed toolchains" multirust list-toolchains
-}
-runtest list_toolchain_with_none
-
-remove_toolchain() {
- try multirust update nightly
- try multirust remove-toolchain nightly
- try multirust list-toolchains
- expect_output_ok "no installed toolchains" multirust list-toolchains
-}
-runtest remove_toolchain
-
-remove_active_toolchain_error_handling() {
- try multirust default nightly
- try multirust remove-toolchain nightly
- expect_output_fail "toolchain 'nightly' not installed" rustc
-}
-runtest remove_active_toolchain_error_handling
-
-bad_sha_on_manifest() {
- manifest_hash="$MOCK_DIST_DIR/dist/channel-rust-nightly.sha256"
- sha=`cat "$manifest_hash"`
- echo "$sha" | sed s/^......../aaaaaaaa/ > "$manifest_hash"
- expect_output_fail "checksum failed" multirust default nightly
- set_current_dist_date 2015-01-02
-}
-runtest bad_sha_on_manifest
-
-bad_sha_on_installer() {
- for i in "$MOCK_DIST_DIR/dist"/*.sha256; do
- sha=`cat "$i"`
- echo "$sha" | sed s/^......../aaaaaaaa/ > "$i"
- done
- expect_output_fail "checksum failed" multirust default 1.0.0
- set_current_dist_date 2015-01-02
-}
-runtest bad_sha_on_installer
-
-delete_data() {
- try multirust default nightly
- if [ ! -d "$MULTIRUST_HOME" ]; then
- fail "no multirust dir"
- fi
- try multirust delete-data -y
- if [ -d "$MULTIRUST_HOME" ]; then
- fail "multirust dir not removed"
- fi
-}
-runtest delete_data
-
-install_override_toolchain_from_channel() {
- try multirust override nightly
- expect_output_ok "hash-nightly-2" rustc --version
- try multirust override beta
- expect_output_ok "hash-beta-2" rustc --version
- try multirust override stable
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_override_toolchain_from_channel
-
-install_override_toolchain_from_archive() {
- try multirust override nightly-2015-01-01
- expect_output_ok "hash-nightly-1" rustc --version
- try multirust override beta-2015-01-01
- expect_output_ok "hash-beta-1" rustc --version
- try multirust override stable-2015-01-01
- expect_output_ok "hash-stable-1" rustc --version
-}
-runtest install_override_toolchain_from_archive
-
-install_override_toolchain_linking_path() {
- try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
-}
-runtest install_override_toolchain_linking_path
-
-install_override_toolchain_from_path() {
- try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
-}
-runtest install_override_toolchain_from_path
-
-install_override_toolchain_linking_path_again() {
- try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
- try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_override_toolchain_linking_path_again
-
-install_override_toolchain_from_path_again() {
- try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
- try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_override_toolchain_from_path_again
-
-install_override_toolchain_change_from_copy_to_link() {
- try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
- try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_override_toolchain_change_from_copy_to_link
-
-install_override_toolchain_change_from_link_to_copy() {
- try multirust override stable-from-path --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_ok "hash-stable-1" rustc --version
- try multirust override stable-from-path --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_override_toolchain_change_from_link_to_copy
-
-install_override_toolchain_from_version() {
- try multirust override 1.1.0
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest install_override_toolchain_from_version
-
-override_overrides_default() {
- try multirust default nightly
- try multirust override beta
- expect_output_ok "beta" rustc --version
-}
-runtest override_overrides_default
-
-multiple_overrides() {
- mkdir -p "$WORK_DIR/dir1"
- mkdir -p "$WORK_DIR/dir2"
- try multirust default nightly
- (cd "$WORK_DIR/dir1" && try multirust override beta)
- (cd "$WORK_DIR/dir2" && try multirust override stable)
- expect_output_ok "nightly" rustc --version
- (cd "$WORK_DIR/dir1" && expect_output_ok "beta" rustc --version)
- (cd "$WORK_DIR/dir2" && expect_output_ok "stable" rustc --version)
-}
-runtest multiple_overrides
-
-change_override() {
- try multirust override nightly
- try multirust override beta
- expect_output_ok "beta" rustc --version
-}
-runtest change_override
-
-show_override() {
- try multirust override nightly
- expect_output_ok "override toolchain: nightly" multirust show-override
- expect_output_ok "override reason: directory override for '`pwd`'" multirust show-override
- expect_output_ok "override location: $MULTIRUST_HOME/toolchains/nightly" multirust show-override
- expect_output_ok "hash-nightly-2" multirust show-override
-}
-runtest show_override
-
-show_override_no_override() {
- try multirust default nightly
- expect_output_ok "no override" multirust show-override
-}
-runtest show_override_no_override
-
-show_override_no_override_no_default() {
- expect_output_ok "no override" multirust show-override
-}
-runtest show_override_no_override_no_default
-
-show_override_no_override_show_default() {
- try multirust default nightly
- expect_output_ok "no override" multirust show-override
- expect_output_ok "default toolchain: nightly" multirust show-override
-}
-runtest show_override_no_override_show_default
-
-show_override_from_MULTIRUST_TOOLCHAIN() {
- try multirust update beta
- try multirust override nightly
- export MULTIRUST_TOOLCHAIN=beta
- expect_output_ok "override toolchain: beta" multirust show-override
- expect_output_ok "override reason: environment override" multirust show-override
- expect_output_ok "override location: $MULTIRUST_HOME/toolchains/beta" multirust show-override
- expect_output_ok "hash-beta-2" multirust show-override
- unset MULTIRUST_TOOLCHAIN
-}
-runtest show_override_from_MULTIRUST_TOOLCHAIN
-
-remove_override_no_default() {
- try multirust override nightly
- try multirust remove-override
- expect_output_fail "no default toolchain configured" rustc
-}
-runtest remove_override_no_default
-
-remove_override_with_default() {
- try multirust default nightly
- try multirust override beta
- try multirust remove-override
- expect_output_ok "nightly" rustc --version
-}
-runtest remove_override_with_default
-
-remove_override_with_multiple_overrides() {
- mkdir -p "$WORK_DIR/dir1"
- mkdir -p "$WORK_DIR/dir2"
- try multirust default nightly
- (cd "$WORK_DIR/dir1" && try multirust override beta)
- (cd "$WORK_DIR/dir2" && try multirust override stable)
- expect_output_ok "nightly" rustc --version
- (cd "$WORK_DIR/dir1" && try multirust remove-override)
- (cd "$WORK_DIR/dir1" && expect_output_ok "nightly" rustc --version)
- (cd "$WORK_DIR/dir2" && expect_output_ok "stable" rustc --version)
-}
-runtest remove_override_with_multiple_overrides
-
-custom_no_installer_specified() {
- expect_output_fail "unspecified installer" multirust update nightly --installer
-}
-runtest custom_no_installer_specified
-
-custom_invalid_names() {
- expect_output_fail "invalid custom toolchain name: 'nightly'" \
- multirust update nightly --installer "$local_custom_rust"
- expect_output_fail "invalid custom toolchain name: 'beta'" \
- multirust update beta --installer "$local_custom_rust"
- expect_output_fail "invalid custom toolchain name: 'stable'" \
- multirust update stable --installer "$local_custom_rust"
-}
-runtest custom_invalid_names
-
-custom_invalid_names_with_archive_dates() {
- expect_output_fail "invalid custom toolchain name: 'nightly-2015-01-01'" \
- multirust update nightly-2015-01-01 --installer "$local_custom_rust"
- expect_output_fail "invalid custom toolchain name: 'beta-2015-01-01'" \
- multirust update beta-2015-01-01 --installer "$local_custom_rust"
- expect_output_fail "invalid custom toolchain name: 'stable-2015-01-01'" \
- multirust update stable-2015-01-01 --installer "$local_custom_rust"
-}
-runtest custom_invalid_names_with_archive_dates
-
-custom_local() {
- try multirust update custom --installer "$local_custom_rust"
- try multirust default custom
- expect_output_ok nightly rustc --version
-}
-runtest custom_local
-
-custom_remote() {
- try multirust update custom --installer "$remote_custom_rust"
- try multirust default custom
- expect_output_ok nightly rustc --version
-}
-runtest custom_remote
-
-custom_multiple_local() {
- try multirust update custom --installer "$local_custom_rustc,$local_custom_cargo"
- try multirust default custom
- expect_output_ok nightly rustc --version
- expect_output_ok nightly cargo --version
-}
-runtest custom_multiple_local
-
-custom_multiple_remote() {
- try multirust update custom --installer "$remote_custom_rustc,$remote_custom_cargo"
- try multirust default custom
- expect_output_ok nightly rustc --version
- expect_output_ok nightly cargo --version
-}
-runtest custom_multiple_remote
-
-remove_custom() {
- try multirust update custom --installer "$remote_custom_rustc,$remote_custom_cargo"
- try multirust remove-toolchain custom
- expect_output_ok "no installed toolchains" multirust list-toolchains
-}
-runtest remove_custom
-
-update_toolchain_linking_path() {
- try multirust update custom --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- try multirust default custom
- expect_output_ok "hash-stable-1" rustc --version
-}
-runtest update_toolchain_linking_path
-
-update_toolchain_from_path() {
- try multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- try multirust default custom
- expect_output_ok "hash-stable-1" rustc --version
-}
-runtest update_toolchain_from_path
-
-update_toolchain_change_from_copy_to_link() {
- try multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- try multirust default custom
- expect_output_ok "hash-stable-1" rustc --version
- try multirust update custom --link-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- try multirust default custom
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest update_toolchain_change_from_copy_to_link
-
-update_toolchain_change_from_link_to_copy() {
- try multirust update custom --link-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- try multirust default custom
- expect_output_ok "hash-stable-1" rustc --version
- try multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/2015-01-02"
- try multirust default custom
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest update_toolchain_change_from_link_to_copy
-
-custom_dir_invalid_names() {
- expect_output_fail "invalid custom toolchain name: 'nightly'" \
- multirust update nightly --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_fail "invalid custom toolchain name: 'beta'" \
- multirust update beta --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
- expect_output_fail "invalid custom toolchain name: 'stable'" \
- multirust update stable --copy-local "$CUSTOM_TOOLCHAINS/2015-01-01"
-}
-runtest custom_dir_invalid_names
-
-custom_without_rustc() {
- rm -Rf "$CUSTOM_TOOLCHAINS/broken"
- cp -R "$CUSTOM_TOOLCHAINS/2015-01-01" "$CUSTOM_TOOLCHAINS/broken"
- rm "$CUSTOM_TOOLCHAINS/broken/bin/rustc"
- expect_output_fail "no rustc in custom toolchain at " \
- multirust update custom --copy-local "$CUSTOM_TOOLCHAINS/broken"
- rm -Rf "$CUSTOM_TOOLCHAINS/broken"
-}
-runtest custom_without_rustc
-
-no_update_on_channel_when_data_has_not_changed() {
- try multirust update nightly
- expect_output_ok "'nightly' is already up to date" multirust update nightly
-}
-runtest no_update_on_channel_when_data_has_not_changed
-
-update_on_channel_when_data_has_changed() {
- set_current_dist_date 2015-01-01
- try multirust default nightly
- expect_output_ok "hash-nightly-1" rustc --version
- set_current_dist_date 2015-01-02
- try multirust update nightly
- expect_output_ok "hash-nightly-2" rustc --version
-}
-runtest update_on_channel_when_data_has_changed
-
-with_multirust_from_v1_error() {
- # No windows support in v1
- if [ "$is_windows" != true ]; then
- try "$MULTIRUST_BIN_DIR_V1/multirust" default nightly
- expect_output_fail "metadata version is 1, need 2" multirust default nightly
- fi
-}
-runtest with_multirust_from_v1_error
-
-upgrade_from_v1_to_v2() {
- if [ "$is_windows" != true ]; then
- try "$MULTIRUST_BIN_DIR_V1/multirust" default nightly
- try multirust upgrade-data
- try multirust default nightly
- fi
-}
-runtest upgrade_from_v1_to_v2
-
-update_no_toolchain_means_update_all() {
- set_current_dist_date 2015-01-01
- try multirust update
- expect_output_ok "using existing" multirust default nightly
- expect_output_ok "hash-nightly-1" rustc --version
- expect_output_ok "using existing" multirust default beta
- expect_output_ok "hash-beta-1" rustc --version
- expect_output_ok "using existing" multirust default stable
- expect_output_ok "hash-stable-1" rustc --version
- set_current_dist_date 2015-01-02
- expect_output_ok "updating existing" multirust update nightly
- try multirust update
- expect_output_ok "using existing" multirust default nightly
- expect_output_ok "hash-nightly-2" rustc --version
- expect_output_ok "using existing" multirust default beta
- expect_output_ok "hash-beta-2" rustc --version
- expect_output_ok "using existing" multirust default stable
- expect_output_ok "hash-stable-2" rustc --version
-}
-runtest update_no_toolchain_means_update_all
-
-run_command() {
- try multirust update nightly
- try multirust default beta
- expect_output_ok "nightly" multirust run nightly rustc --version
-}
-runtest run_command
-
-remove_toolchain_then_add_again() {
- # Issue 53
- try multirust default beta
- try multirust remove-toolchain beta
- try multirust update beta
- try rustc --version
-}
-runtest remove_toolchain_then_add_again
-
-ctl_default_toolchain_no_default() {
- expect_output_fail "no default toolchain configured" multirust ctl default-toolchain
-}
-runtest ctl_default_toolchain_no_default
-
-ctl_default_toolchain_with_default_no_override() {
- try multirust default beta
- expect_output_ok "beta" multirust ctl default-toolchain
-}
-runtest ctl_default_toolchain_with_default_no_override
+echo
+echo "Running v1 metadata test suite"
+echo
-ctl_default_toolchain_with_default_and_override() {
- try multirust default beta
- try multirust override nightly
- expect_output_ok "beta" multirust ctl default-toolchain
-}
-runtest ctl_default_toolchain_with_default_and_override
+"$S/test-v1.sh" || return 1
echo
-echo "SUCCESS!"
+echo "Running v2 metadata test suite"
echo
+
+"$S/test-v2.sh" || return 1