From feef14e9d74bff79b1b8dc1e82a414b41377fde7 Mon Sep 17 00:00:00 2001 From: jofas Date: Mon, 6 Mar 2023 13:04:38 +0100 Subject: [PATCH] breaking endless loop on cyclic features in cargo-add --- src/cargo/ops/cargo_add/mod.rs | 3 ++- tests/testsuite/cargo_add/cyclic_features/in | 1 + .../cargo_add/cyclic_features/mod.rs | 25 +++++++++++++++++++ .../cargo_add/cyclic_features/out/Cargo.toml | 8 ++++++ .../cargo_add/cyclic_features/stderr.log | 5 ++++ .../cargo_add/cyclic_features/stdout.log | 0 tests/testsuite/cargo_add/mod.rs | 7 ++++++ 7 files changed, 48 insertions(+), 1 deletion(-) create mode 120000 tests/testsuite/cargo_add/cyclic_features/in create mode 100644 tests/testsuite/cargo_add/cyclic_features/mod.rs create mode 100644 tests/testsuite/cargo_add/cyclic_features/out/Cargo.toml create mode 100644 tests/testsuite/cargo_add/cyclic_features/stderr.log create mode 100644 tests/testsuite/cargo_add/cyclic_features/stdout.log diff --git a/src/cargo/ops/cargo_add/mod.rs b/src/cargo/ops/cargo_add/mod.rs index c22466399e7..5c519ac09f0 100644 --- a/src/cargo/ops/cargo_add/mod.rs +++ b/src/cargo/ops/cargo_add/mod.rs @@ -726,7 +726,8 @@ impl DependencyUI { .get(next) .into_iter() .flatten() - .map(|s| s.as_str()), + .map(|s| s.as_str()) + .filter(|s| !activated.contains(s)), ); activated.extend( self.available_features diff --git a/tests/testsuite/cargo_add/cyclic_features/in b/tests/testsuite/cargo_add/cyclic_features/in new file mode 120000 index 00000000000..6c6a27fcfb5 --- /dev/null +++ b/tests/testsuite/cargo_add/cyclic_features/in @@ -0,0 +1 @@ +../add-basic.in \ No newline at end of file diff --git a/tests/testsuite/cargo_add/cyclic_features/mod.rs b/tests/testsuite/cargo_add/cyclic_features/mod.rs new file mode 100644 index 00000000000..5dffac323c6 --- /dev/null +++ b/tests/testsuite/cargo_add/cyclic_features/mod.rs @@ -0,0 +1,25 @@ +use cargo_test_support::compare::assert_ui; +use cargo_test_support::prelude::*; +use cargo_test_support::Project; + +use crate::cargo_add::init_registry; +use cargo_test_support::curr_dir; + +#[cargo_test] +fn case() { + init_registry(); + let project = Project::from_template(curr_dir!().join("in")); + let project_root = project.root(); + let cwd = &project_root; + + snapbox::cmd::Command::cargo_ui() + .arg("add") + .arg_line("test_cyclic_features") + .current_dir(cwd) + .assert() + .success() + .stdout_matches_path(curr_dir!().join("stdout.log")) + .stderr_matches_path(curr_dir!().join("stderr.log")); + + assert_ui().subset_matches(curr_dir!().join("out"), &project_root); +} diff --git a/tests/testsuite/cargo_add/cyclic_features/out/Cargo.toml b/tests/testsuite/cargo_add/cyclic_features/out/Cargo.toml new file mode 100644 index 00000000000..27a5c31f867 --- /dev/null +++ b/tests/testsuite/cargo_add/cyclic_features/out/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] + +[package] +name = "cargo-list-test-fixture" +version = "0.0.0" + +[dependencies] +test_cyclic_features = "0.1.1" diff --git a/tests/testsuite/cargo_add/cyclic_features/stderr.log b/tests/testsuite/cargo_add/cyclic_features/stderr.log new file mode 100644 index 00000000000..2d4a2db4a37 --- /dev/null +++ b/tests/testsuite/cargo_add/cyclic_features/stderr.log @@ -0,0 +1,5 @@ + Updating `dummy-registry` index + Adding test_cyclic_features v0.1.1 to dependencies. + Features: + + feature-one + + feature-two diff --git a/tests/testsuite/cargo_add/cyclic_features/stdout.log b/tests/testsuite/cargo_add/cyclic_features/stdout.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_add/mod.rs b/tests/testsuite/cargo_add/mod.rs index d824aed0a42..ca58474d219 100644 --- a/tests/testsuite/cargo_add/mod.rs +++ b/tests/testsuite/cargo_add/mod.rs @@ -4,6 +4,7 @@ mod add_normalized_name_external; mod build; mod build_prefer_existing_version; mod change_rename_target; +mod cyclic_features; mod default_features; mod deprecated_default_features; mod deprecated_section; @@ -165,6 +166,12 @@ fn add_registry_packages(alt: bool) { cargo_test_support::registry::Package::new("test_nonbreaking", "0.1.1") .alternative(alt) .publish(); + cargo_test_support::registry::Package::new("test_cyclic_features", "0.1.1") + .alternative(alt) + .feature("default", &["feature-one", "feature-two"]) + .feature("feature-one", &["feature-two"]) + .feature("feature-two", &["feature-one"]) + .publish(); // Normalization cargo_test_support::registry::Package::new("linked-hash-map", "0.5.4")