Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions crates/volta-core/src/tool/yarn/fetch.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
//! Provides fetcher for Yarn distributions

use std::env;
use std::fs::File;
use std::path::Path;

Expand Down Expand Up @@ -129,7 +128,7 @@ fn determine_remote_url(version: &Version, hooks: Option<&YarnHooks>) -> Fallibl
hook.resolve(version, &distro_file_name)
}
_ => {
if env::var_os("VOLTA_FEATURE_YARN_3").is_some() && version.major >= 2 {
if version.major >= 2 {
Ok(scoped_public_registry_package(
"@yarnpkg",
"cli-dist",
Expand Down
29 changes: 12 additions & 17 deletions crates/volta-core/src/tool/yarn/resolve.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
//! Provides resolution of Yarn requirements into specific versions

use std::env;

use super::super::registry::{
fetch_npm_registry, public_registry_index, PackageDetails, PackageIndex,
};
Expand Down Expand Up @@ -81,22 +79,20 @@ fn fetch_yarn_index(package: &str) -> Fallible<(String, PackageIndex)> {
}

fn resolve_custom_tag(tag: String) -> Fallible<Version> {
if env::var_os("VOLTA_FEATURE_YARN_3").is_some() {
// first try yarn2+, which uses "@yarnpkg/cli-dist" instead of "yarn"
let (url, mut index) = fetch_yarn_index("@yarnpkg/cli-dist")?;

// first try yarn2+, which uses "@yarnpkg/cli-dist" instead of "yarn"
if let Ok((url, mut index)) = fetch_yarn_index("@yarnpkg/cli-dist") {
if let Some(version) = index.tags.remove(&tag) {
debug!("Found yarn@{} matching tag '{}' from {}", version, tag, url);
if version.major == 2 {
return Err(ErrorKind::Yarn2NotSupported.into());
}
return Ok(version);
}
debug!(
"Did not find yarn matching tag '{}' from @yarnpkg/cli-dist",
tag
);
}
debug!(
"Did not find yarn matching tag '{}' from @yarnpkg/cli-dist",
tag
);

let (url, mut index) = fetch_yarn_index("yarn")?;
match index.tags.remove(&tag) {
Expand All @@ -122,9 +118,8 @@ fn resolve_latest_legacy(url: String) -> Fallible<Version> {
}

fn resolve_semver_from_registry(matching: VersionReq) -> Fallible<Version> {
if env::var_os("VOLTA_FEATURE_YARN_3").is_some() {
// first try yarn2+, which uses "@yarnpkg/cli-dist" instead of "yarn"
let (url, index) = fetch_yarn_index("@yarnpkg/cli-dist")?;
// first try yarn2+, which uses "@yarnpkg/cli-dist" instead of "yarn"
if let Ok((url, index)) = fetch_yarn_index("@yarnpkg/cli-dist") {
let matching_entries: Vec<PackageDetails> = index
.entries
.into_iter()
Expand All @@ -149,11 +144,11 @@ fn resolve_semver_from_registry(matching: VersionReq) -> Fallible<Version> {
}
}
}
debug!(
"Did not find yarn matching requirement '{}' from {}",
matching, url
);
}
debug!(
"Did not find yarn matching requirement '{}' for @yarnpkg/cli-dist",
matching
);

let (url, index) = fetch_yarn_index("yarn")?;

Expand Down
1 change: 0 additions & 1 deletion tests/acceptance/volta_install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,6 @@ fn install_yarn_3_without_node_errors() {
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.env("VOLTA_FEATURE_YARN_3", "true")
.build();

assert_that!(
Expand Down
120 changes: 82 additions & 38 deletions tests/acceptance/volta_pin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,7 @@ fn pin_yarn_no_node() {
let s = sandbox()
.package_json(BASIC_PACKAGE_JSON)
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.build();

Expand All @@ -395,6 +396,7 @@ fn pin_yarn_1() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.build();

Expand All @@ -417,7 +419,6 @@ fn pin_yarn_2_is_error() {
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.env("VOLTA_FEATURE_YARN_3", "true")
.build();

assert_that!(
Expand All @@ -443,7 +444,6 @@ fn pin_yarn_3() {
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.env("VOLTA_FEATURE_YARN_3", "true")
.build();

assert_that!(
Expand All @@ -457,34 +457,12 @@ fn pin_yarn_3() {
)
}

#[test]
fn pin_yarn_3_fails_without_env() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.build();

assert_that!(
s.volta("pin yarn@3"),
execs()
.with_status(ExitCode::NoVersionMatch as i32)
.with_stderr_contains("[..]Could not find Yarn version matching[..]")
);

assert_eq!(
s.read_package_json(),
package_json_with_pinned_node("1.2.3"),
)
}

#[test]
fn pin_yarn_reports_info() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.env(VOLTA_LOGLEVEL, "info")
.build();
Expand All @@ -498,11 +476,13 @@ fn pin_yarn_reports_info() {
}

#[test]
fn pin_yarn_1_latest() {
fn pin_yarn_latest() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.build();

assert_that!(
Expand All @@ -512,60 +492,60 @@ fn pin_yarn_1_latest() {

assert_eq!(
s.read_package_json(),
package_json_with_pinned_node_yarn("1.2.3", "1.12.99"),
package_json_with_pinned_node_yarn("1.2.3", "3.12.99"),
)
}

#[test]
fn pin_yarn_3_latest() {
fn pin_yarn_1_no_version() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.env("VOLTA_FEATURE_YARN_3", "true")
.build();

assert_that!(
s.volta("pin yarn@latest"),
s.volta("pin yarn@1"),
execs().with_status(ExitCode::Success as i32)
);

assert_eq!(
s.read_package_json(),
package_json_with_pinned_node_yarn("1.2.3", "3.12.99"),
package_json_with_pinned_node_yarn("1.2.3", "1.12.99"),
)
}

#[test]
fn pin_yarn_1_no_version() {
fn pin_yarn_3_no_version() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.build();

assert_that!(
s.volta("pin yarn"),
s.volta("pin yarn@3"),
execs().with_status(ExitCode::Success as i32)
);

assert_eq!(
s.read_package_json(),
package_json_with_pinned_node_yarn("1.2.3", "1.12.99"),
package_json_with_pinned_node_yarn("1.2.3", "3.12.99"),
)
}

#[test]
fn pin_yarn_3_no_version() {
fn pin_yarn_no_version() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.env("VOLTA_FEATURE_YARN_3", "true")
.build();

assert_that!(
Expand Down Expand Up @@ -599,12 +579,31 @@ fn pin_yarn_1_missing_release() {
)
}

#[test]
fn pin_yarn_1_missing_release_v2() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.mock_not_found()
.build();

assert_that!(
s.volta("pin yarn@1"),
execs()
.with_status(ExitCode::NetworkError as i32)
.with_stderr_contains("[..]Could not download Yarn version registry")
);

assert_eq!(
s.read_package_json(),
package_json_with_pinned_node("1.2.3"),
)
}

#[test]
fn pin_yarn_3_missing_release() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.mock_not_found()
.env("VOLTA_FEATURE_YARN_3", "true")
.build();

assert_that!(
Expand All @@ -620,11 +619,32 @@ fn pin_yarn_3_missing_release() {
)
}

#[test]
fn pin_yarn_3_missing_release_v2() {
let s = sandbox()
.package_json(&package_json_with_pinned_node("1.2.3"))
.mock_not_found()
.build();

assert_that!(
s.volta("pin yarn@3"),
execs()
.with_status(ExitCode::NetworkError as i32)
.with_stderr_contains("[..]Could not download Yarn version registry")
);

assert_eq!(
s.read_package_json(),
package_json_with_pinned_node("1.2.3"),
)
}

#[test]
fn pin_yarn_leaves_npm() {
let s = sandbox()
.package_json(&package_json_with_pinned_node_npm("1.2.3", "3.4.5"))
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.build();

Expand Down Expand Up @@ -788,12 +808,13 @@ fn pin_npm_bundled_reports_info() {
}

#[test]
fn pin_node_and_yarn() {
fn pin_node_and_yarn1() {
let s = sandbox()
.package_json(BASIC_PACKAGE_JSON)
.node_available_versions(NODE_VERSION_INFO)
.distro_mocks::<NodeFixture>(&NODE_VERSION_FIXTURES)
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.build();

Expand All @@ -808,6 +829,29 @@ fn pin_node_and_yarn() {
)
}

#[test]
fn pin_node_and_yarn3() {
let s = sandbox()
.package_json(BASIC_PACKAGE_JSON)
.node_available_versions(NODE_VERSION_INFO)
.distro_mocks::<NodeFixture>(&NODE_VERSION_FIXTURES)
.yarn_1_available_versions(YARN_1_VERSION_INFO)
.yarn_berry_available_versions(YARN_BERRY_VERSION_INFO)
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.build();

assert_that!(
s.volta("pin node@6 yarn@3"),
execs().with_status(ExitCode::Success as i32)
);

assert_eq!(
s.read_package_json(),
package_json_with_pinned_node_yarn("6.19.62", "3.12.99"),
)
}

#[test]
fn pin_node_does_not_remove_trailing_newline() {
let s = sandbox()
Expand Down
2 changes: 0 additions & 2 deletions tests/acceptance/volta_run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,6 @@ fn command_line_yarn_3() {
.distro_mocks::<Yarn1Fixture>(&YARN_1_VERSION_FIXTURES)
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.env(VOLTA_LOGLEVEL, "debug")
.env("VOLTA_FEATURE_YARN_3", "true")
.build();

assert_that!(
Expand Down Expand Up @@ -386,7 +385,6 @@ fn inherited_yarn_3() {
.distro_mocks::<YarnBerryFixture>(&YARN_BERRY_VERSION_FIXTURES)
.package_json(&package_json_with_pinned_node_yarn("10.99.1040", "3.2.42"))
.env(VOLTA_LOGLEVEL, "debug")
.env("VOLTA_FEATURE_YARN_3", "true")
.build();

assert_that!(
Expand Down
1 change: 0 additions & 1 deletion tests/smoke/autodownload.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ fn autodownload_yarn_1() {
fn autodownload_yarn_3() {
let p = temp_project()
.package_json(PACKAGE_JSON_WITH_PINNED_NODE_YARN_3)
.env("VOLTA_FEATURE_YARN_3", "true")
.build();

assert_that!(
Expand Down
2 changes: 1 addition & 1 deletion tests/smoke/volta_fetch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ fn fetch_yarn_1() {

#[test]
fn fetch_yarn_3() {
let p = temp_project().env("VOLTA_FEATURE_YARN_3", "yes").build();
let p = temp_project().build();

assert_that!(p.volta("fetch yarn@3.2.0"), execs().with_status(0));
assert!(p.yarn_version_is_fetched("3.2.0"));
Expand Down
2 changes: 1 addition & 1 deletion tests/smoke/volta_run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ fn run_yarn_1() {

#[test]
fn run_yarn_3() {
let p = temp_project().env("VOLTA_FEATURE_YARN_3", "ok").build();
let p = temp_project().build();

assert_that!(
p.volta("run --node 16.14.1 --yarn 3.1.1 yarn --version"),
Expand Down