Skip to content

Commit 88d55a8

Browse files
committed
Auto merge of #13682 - Flowrey:fixes-13578, r=epage
Maintain sorting of dependency features Fixes #13578
2 parents 18181c6 + 318072f commit 88d55a8

File tree

13 files changed

+199
-2
lines changed

13 files changed

+199
-2
lines changed

src/cargo/util/toml_mut/dependency.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ use std::fmt::{Display, Formatter};
44
use std::path::{Path, PathBuf};
55

66
use indexmap::IndexSet;
7+
use itertools::Itertools;
78
use toml_edit::KeyMut;
89

910
use super::manifest::str_or_1_len_table;
1011
use crate::core::GitReference;
1112
use crate::core::SourceId;
1213
use crate::core::Summary;
14+
use crate::util::toml_mut::is_sorted;
1315
use crate::CargoResult;
1416
use crate::GlobalContext;
1517

@@ -588,8 +590,13 @@ impl Dependency {
588590
.collect::<Option<IndexSet<_>>>()
589591
})
590592
.unwrap_or_default();
593+
let is_already_sorted = is_sorted(features.iter());
591594
features.extend(new_features.iter().map(|s| s.as_str()));
592-
let features = features.into_iter().collect::<toml_edit::Value>();
595+
let features = if is_already_sorted {
596+
features.into_iter().sorted().collect::<toml_edit::Value>()
597+
} else {
598+
features.into_iter().collect::<toml_edit::Value>()
599+
};
593600
table.set_dotted(false);
594601
overwrite_value(table, "features", features);
595602
} else {

tests/testsuite/cargo_add/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ mod path_inferred_name;
111111
mod path_inferred_name_conflicts_full_feature;
112112
mod path_normalized_name;
113113
mod preserve_dep_std_table;
114+
mod preserve_features_sorted;
114115
mod preserve_features_table;
116+
mod preserve_features_unsorted;
115117
mod preserve_sorted;
116118
mod preserve_unsorted;
117119
mod public;

tests/testsuite/cargo_add/overwrite_inline_features/out/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ edition = "2015"
88
[dependencies]
99
unrelateed-crate = "99999.0.0"
1010
# Before your-face
11-
your-face = { version = "99999.0.0", features = ["eyes", "nose", "mouth", "ears"] } # After your-face
11+
your-face = { version = "99999.0.0", features = ["ears", "eyes", "mouth", "nose"] } # After your-face
1212
# End
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[workspace]
2+
3+
[package]
4+
name = "cargo-list-test-fixture"
5+
version = "0.0.0"
6+
edition = "2015"
7+
8+
[dependencies]
9+
my-package = { version = "99999.0.0", features = ["a", "b", "c", "e"] }

tests/testsuite/cargo_add/preserve_features_sorted/in/src/lib.rs

Whitespace-only changes.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use cargo_test_support::compare::assert_ui;
2+
use cargo_test_support::current_dir;
3+
use cargo_test_support::file;
4+
use cargo_test_support::prelude::*;
5+
use cargo_test_support::str;
6+
use cargo_test_support::Project;
7+
8+
#[cargo_test]
9+
fn case() {
10+
cargo_test_support::registry::init();
11+
cargo_test_support::registry::Package::new("my-package", "99999.0.0+my-package")
12+
.feature("a", &[])
13+
.feature("b", &[])
14+
.feature("c", &[])
15+
.feature("d", &[])
16+
.feature("e", &[])
17+
.publish();
18+
19+
let project = Project::from_template(current_dir!().join("in"));
20+
let project_root = project.root();
21+
let cwd = &project_root;
22+
23+
snapbox::cmd::Command::cargo_ui()
24+
.arg("add")
25+
.arg_line("my-package -F d")
26+
.current_dir(cwd)
27+
.assert()
28+
.success()
29+
.stdout_matches(str![""])
30+
.stderr_matches(file!["stderr.term.svg"]);
31+
32+
assert_ui().subset_matches(current_dir!().join("out"), &project_root);
33+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[workspace]
2+
3+
[package]
4+
name = "cargo-list-test-fixture"
5+
version = "0.0.0"
6+
edition = "2015"
7+
8+
[dependencies]
9+
my-package = { version = "99999.0.0", features = ["a", "b", "c", "d", "e"] }
Lines changed: 43 additions & 0 deletions
Loading
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[workspace]
2+
3+
[package]
4+
name = "cargo-list-test-fixture"
5+
version = "0.0.0"
6+
edition = "2015"
7+
8+
[dependencies]
9+
my-package = { version = "99999.0.0", features = ["b", "a", "d", "c"] }

tests/testsuite/cargo_add/preserve_features_unsorted/in/src/lib.rs

Whitespace-only changes.

0 commit comments

Comments
 (0)