diff --git a/src/rust/README.md b/src/rust/README.md index 022f8abbe..963588c2a 100644 --- a/src/rust/README.md +++ b/src/rust/README.md @@ -18,6 +18,7 @@ Installs Rust, common Rust utilities, and their required dependencies | version | Select or enter a version of Rust to install. | string | latest | | profile | Select a rustup install profile. | string | minimal | | targets | Optional comma separated list of additional Rust targets to install. | string | - | +| components | Optional comma separeated list of rust components to be installed based on input. | string | rust-analyzer,rust-src,rustfmt,clippy | ## Customizations diff --git a/src/rust/devcontainer-feature.json b/src/rust/devcontainer-feature.json index 9c3399ab8..88b64daed 100644 --- a/src/rust/devcontainer-feature.json +++ b/src/rust/devcontainer-feature.json @@ -1,6 +1,6 @@ { "id": "rust", - "version": "1.4.0", + "version": "1.5.0", "name": "Rust", "documentationURL": "https://github.com/devcontainers/features/tree/main/src/rust", "description": "Installs Rust, common Rust utilities, and their required dependencies", @@ -57,7 +57,18 @@ "armv7-unknown-linux-gnueabihf", "x86_64-unknown-redox,x86_64-unknown-uefi" ] - } + }, + "components": { + "type": "string", + "default": "rust-analyzer,rust-src,rustfmt,clippy", + "description": "Optional, comma separated list of Rust components to be installed", + "proposals": [ + "rust-analyzer,rust-src,rustfmt,clippy", + "rust-analyzer,rust-src", + "rustfmt,clippy,rust-docs", + "llvm-tools-preview,rust-src,rustfmt" + ] + } }, "customizations": { "vscode": { diff --git a/src/rust/install.sh b/src/rust/install.sh index 7481a05f5..99a7ba8f5 100755 --- a/src/rust/install.sh +++ b/src/rust/install.sh @@ -10,6 +10,7 @@ RUST_VERSION="${VERSION:-"latest"}" RUSTUP_PROFILE="${PROFILE:-"minimal"}" RUSTUP_TARGETS="${TARGETS:-""}" +IFS=',' read -ra components <<< "${COMPONENTS:-rust-analyzer,rust-src,rustfmt,clippy}" export CARGO_HOME="${CARGO_HOME:-"/usr/local/cargo"}" export RUSTUP_HOME="${RUSTUP_HOME:-"/usr/local/rustup"}" @@ -394,8 +395,19 @@ if [ "${UPDATE_RUST}" = "true" ]; then echo "Updating Rust..." rustup update 2>&1 fi -echo "Installing common Rust dependencies..." -rustup component add rust-analyzer rust-src rustfmt clippy 2>&1 +# Install Rust components +echo "Installing Rust components..." +for component in "${components[@]}"; do + # Trim leading and trailing whitespace + component="${component#"${component%%[![:space:]]*}"}" && component="${component%"${component##*[![:space:]]}"}" + if [ -n "${component}" ]; then + echo "Installing Rust component: ${component}" + if ! rustup component add "${component}" 2>&1; then + echo "Warning: Failed to install component '${component}'. It may not be available for this toolchain." >&2 + exit 1 + fi + fi +done if [ -n "${RUSTUP_TARGETS}" ]; then IFS=',' read -ra targets <<< "${RUSTUP_TARGETS}" diff --git a/test/rust/rust_with_almalinux_8.sh b/test/rust/rust_with_almalinux_8.sh index 0635916aa..7a2872846 100644 --- a/test/rust/rust_with_almalinux_8.sh +++ b/test/rust/rust_with_almalinux_8.sh @@ -5,11 +5,27 @@ set -e # Optional: Import test library source dev-container-features-test-lib +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + # Definition specific tests check "cargo version" cargo --version check "rustc version" rustc --version check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu +# Check that all specified extended components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" +check "rust-docs is installed" check_component_installed "rust-docs" # Report result reportResults diff --git a/test/rust/rust_with_almalinux_9.sh b/test/rust/rust_with_almalinux_9.sh index 0635916aa..7a2872846 100644 --- a/test/rust/rust_with_almalinux_9.sh +++ b/test/rust/rust_with_almalinux_9.sh @@ -5,11 +5,27 @@ set -e # Optional: Import test library source dev-container-features-test-lib +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + # Definition specific tests check "cargo version" cargo --version check "rustc version" rustc --version check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu +# Check that all specified extended components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" +check "rust-docs is installed" check_component_installed "rust-docs" # Report result reportResults diff --git a/test/rust/rust_with_centos.sh b/test/rust/rust_with_centos.sh index 0635916aa..7a2872846 100644 --- a/test/rust/rust_with_centos.sh +++ b/test/rust/rust_with_centos.sh @@ -5,11 +5,27 @@ set -e # Optional: Import test library source dev-container-features-test-lib +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + # Definition specific tests check "cargo version" cargo --version check "rustc version" rustc --version check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu +# Check that all specified extended components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" +check "rust-docs is installed" check_component_installed "rust-docs" # Report result reportResults diff --git a/test/rust/rust_with_custom_components.sh b/test/rust/rust_with_custom_components.sh new file mode 100644 index 000000000..38dbec1ff --- /dev/null +++ b/test/rust/rust_with_custom_components.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -e + +# Optional: Import test library +source dev-container-features-test-lib + +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + +# Helper function to check component is NOT installed +check_component_not_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 1 # Component is installed (failure) + else + return 0 # Component is not installed (success) + fi +} + +# Definition specific tests +check "cargo version" cargo --version +check "rustc version" rustc --version +check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu + +# Check that specified custom components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" + +# Check that clippy NOT installed +check "clippy not installed" check_component_not_installed "clippy" + +# Report result +reportResults + diff --git a/test/rust/rust_with_default_components.sh b/test/rust/rust_with_default_components.sh new file mode 100644 index 000000000..333bb1aa6 --- /dev/null +++ b/test/rust/rust_with_default_components.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +set -e + +# Optional: Import test library +source dev-container-features-test-lib + +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + +# Definition specific tests +check "cargo version" cargo --version +check "rustc version" rustc --version +check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu + +# Check that default components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" + +# Report result +reportResults + diff --git a/test/rust/rust_with_empty_components.sh b/test/rust/rust_with_empty_components.sh new file mode 100644 index 000000000..116f7765a --- /dev/null +++ b/test/rust/rust_with_empty_components.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +set -e + +# Optional: Import test library +source dev-container-features-test-lib + +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + +# Helper function to check component is NOT installed +check_component_not_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 1 # Component is installed (failure) + else + return 0 # Component is not installed (success) + fi +} + +# Definition specific tests +check "cargo version" cargo --version +check "rustc version" rustc --version +check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu + +# Check that no additional components are installed when empty list is provided +# Only the basic rust toolchain should be available +check "basic rust toolchain" rustc --version + +# Verify that default components are automatically installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" + +# Report result +reportResults + diff --git a/test/rust/rust_with_extended_components.sh b/test/rust/rust_with_extended_components.sh new file mode 100644 index 000000000..52fb74390 --- /dev/null +++ b/test/rust/rust_with_extended_components.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -e + +# Optional: Import test library +source dev-container-features-test-lib + +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + +# Definition specific tests +check "cargo version" cargo --version +check "rustc version" rustc --version +check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu + +# Check that all specified extended components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" +check "rust-docs is installed" check_component_installed "rust-docs" + +# Report result +reportResults + diff --git a/test/rust/rust_with_fedora.sh b/test/rust/rust_with_fedora.sh index 0635916aa..7a2872846 100644 --- a/test/rust/rust_with_fedora.sh +++ b/test/rust/rust_with_fedora.sh @@ -5,11 +5,27 @@ set -e # Optional: Import test library source dev-container-features-test-lib +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + # Definition specific tests check "cargo version" cargo --version check "rustc version" rustc --version check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu +# Check that all specified extended components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" +check "rust-docs is installed" check_component_installed "rust-docs" # Report result reportResults diff --git a/test/rust/rust_with_mariner.sh b/test/rust/rust_with_mariner.sh index 0635916aa..7a2872846 100644 --- a/test/rust/rust_with_mariner.sh +++ b/test/rust/rust_with_mariner.sh @@ -5,11 +5,27 @@ set -e # Optional: Import test library source dev-container-features-test-lib +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + # Definition specific tests check "cargo version" cargo --version check "rustc version" rustc --version check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu +# Check that all specified extended components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" +check "rust-docs is installed" check_component_installed "rust-docs" # Report result reportResults diff --git a/test/rust/rust_with_minimal_components.sh b/test/rust/rust_with_minimal_components.sh new file mode 100644 index 000000000..02760ed5b --- /dev/null +++ b/test/rust/rust_with_minimal_components.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -e + +# Optional: Import test library +source dev-container-features-test-lib + +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + +# Helper function to check component is NOT installed +check_component_not_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 1 # Component is installed (failure) + else + return 0 # Component is not installed (success) + fi +} + +# Definition specific tests +check "cargo version" cargo --version +check "rustc version" rustc --version +check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu + +# Check that only specified minimal components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" + +# Check that other default components are NOT installed +check "rustfmt not installed" check_component_not_installed "rustfmt" +check "clippy not installed" check_component_not_installed "clippy" + +# Report result +reportResults + diff --git a/test/rust/rust_with_rockylinux_8.sh b/test/rust/rust_with_rockylinux_8.sh index 0635916aa..7a2872846 100644 --- a/test/rust/rust_with_rockylinux_8.sh +++ b/test/rust/rust_with_rockylinux_8.sh @@ -5,11 +5,27 @@ set -e # Optional: Import test library source dev-container-features-test-lib +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + # Definition specific tests check "cargo version" cargo --version check "rustc version" rustc --version check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu +# Check that all specified extended components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" +check "rust-docs is installed" check_component_installed "rust-docs" # Report result reportResults diff --git a/test/rust/rust_with_rockylinux_9.sh b/test/rust/rust_with_rockylinux_9.sh index 0635916aa..7a2872846 100644 --- a/test/rust/rust_with_rockylinux_9.sh +++ b/test/rust/rust_with_rockylinux_9.sh @@ -5,11 +5,27 @@ set -e # Optional: Import test library source dev-container-features-test-lib +# Helper function to check component is installed +check_component_installed() { + local component=$1 + if rustup component list | grep -q "${component}.*installed"; then + return 0 # Component is installed (success) + else + return 1 # Component is not installed (failure) + fi +} + # Definition specific tests check "cargo version" cargo --version check "rustc version" rustc --version check "correct rust version" rustup target list | grep aarch64-unknown-linux-gnu +# Check that all specified extended components are installed +check "rust-analyzer is installed" check_component_installed "rust-analyzer" +check "rust-src is installed" check_component_installed "rust-src" +check "rustfmt is installed" check_component_installed "rustfmt" +check "clippy is installed" check_component_installed "clippy" +check "rust-docs is installed" check_component_installed "rust-docs" # Report result reportResults diff --git a/test/rust/scenarios.json b/test/rust/scenarios.json index 003417958..21e347947 100644 --- a/test/rust/scenarios.json +++ b/test/rust/scenarios.json @@ -16,12 +16,62 @@ } } }, + "rust_with_default_components": { + "image": "ubuntu:noble", + "features": { + "rust": { + "version": "latest", + "targets": "aarch64-unknown-linux-gnu" + } + } + }, + "rust_with_custom_components": { + "image": "ubuntu:noble", + "features": { + "rust": { + "version": "latest", + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src,rustfmt" + } + } + }, + "rust_with_minimal_components": { + "image": "ubuntu:noble", + "features": { + "rust": { + "version": "latest", + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src" + } + } + }, + "rust_with_extended_components": { + "image": "ubuntu:noble", + "features": { + "rust": { + "version": "latest", + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src,rustfmt,clippy,rust-docs" + } + } + }, + "rust_with_empty_components": { + "image": "ubuntu:noble", + "features": { + "rust": { + "version": "latest", + "targets": "aarch64-unknown-linux-gnu", + "components": "" + } + } + }, "rust_with_centos": { "image": "centos:centos7", "features": { "rust": { "version": "latest", - "targets": "aarch64-unknown-linux-gnu" + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src,rustfmt,clippy,rust-docs" } } }, @@ -30,7 +80,8 @@ "features": { "rust": { "version": "latest", - "targets": "aarch64-unknown-linux-gnu" + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src,rustfmt,clippy,rust-docs" } } }, @@ -39,7 +90,8 @@ "features": { "rust": { "version": "latest", - "targets": "aarch64-unknown-linux-gnu" + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src,rustfmt,clippy,rust-docs" } } }, @@ -48,7 +100,8 @@ "features": { "rust": { "version": "latest", - "targets": "aarch64-unknown-linux-gnu" + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src,rustfmt,clippy,rust-docs" } } }, @@ -57,7 +110,8 @@ "features": { "rust": { "version": "latest", - "targets": "aarch64-unknown-linux-gnu" + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src,rustfmt,clippy,rust-docs" } } }, @@ -66,7 +120,8 @@ "features": { "rust": { "version": "latest", - "targets": "aarch64-unknown-linux-gnu" + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src,rustfmt,clippy,rust-docs" } } }, @@ -75,8 +130,9 @@ "features": { "rust": { "version": "latest", - "targets": "aarch64-unknown-linux-gnu" + "targets": "aarch64-unknown-linux-gnu", + "components": "rust-analyzer,rust-src,rustfmt,clippy,rust-docs" } } } -} \ No newline at end of file +}