Skip to content

Commit 7b7c33a

Browse files
authored
fix: removal of multiple packages that clobber each other (#556)
Fixes #554
1 parent 08fc5dd commit 7b7c33a

File tree

3 files changed

+83
-22
lines changed

3 files changed

+83
-22
lines changed

Cargo.toml

+19-19
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ tag-prefix = ""
2424
lto = true
2525

2626
[workspace.dependencies]
27-
anyhow = "1.0.79"
27+
anyhow = "1.0.80"
2828
assert_matches = "1.5.0"
2929
async-compression = { version = "0.4.6", features = [
3030
"gzip",
@@ -44,12 +44,12 @@ bytes = "1.5.0"
4444
bzip2 = "0.4.4"
4545
cache_control = "0.2.0"
4646
cfg-if = "1.0"
47-
chrono = { version = "0.4.33", default-features = false, features = [
47+
chrono = { version = "0.4.34", default-features = false, features = [
4848
"std",
4949
"serde",
5050
"alloc",
5151
] }
52-
clap = { version = "4.4.18", features = ["derive"] }
52+
clap = { version = "4.5.1", features = ["derive"] }
5353
cmake = "0.1.50"
5454
console = { version = "0.15.8", features = ["windows-console-colors"] }
5555
criterion = "0.5"
@@ -70,16 +70,16 @@ hex = "0.4.3"
7070
hex-literal = "0.4.1"
7171
humansize = "2.1.3"
7272
humantime = "2.1.0"
73-
indexmap = "2.2.2"
74-
indicatif = "0.17.7"
75-
insta = { version = "1.34.0" }
73+
indexmap = "2.2.5"
74+
indicatif = "0.17.8"
75+
insta = { version = "1.36.1" }
7676
itertools = "0.12.1"
7777
json-patch = "1.2.0"
7878
keyring = "2.3.2"
7979
lazy-regex = "3.1.0"
8080
lazy_static = "1.4.0"
8181
libc = { version = "0.2" }
82-
libloading = "0.8.1"
82+
libloading = "0.8.2"
8383
libz-sys = { version = "1.1.15", default-features = false }
8484
md-5 = "0.10.6"
8585
memchr = "2.7.1"
@@ -97,20 +97,20 @@ plist = "1"
9797
purl = { version = "0.1.2", features = ["serde"] }
9898
quote = "1.0.35"
9999
rand = "0.8.5"
100-
reflink-copy = "0.1.14"
100+
reflink-copy = "0.1.15"
101101
regex = "1.10.3"
102102
reqwest = { version = "0.11.24", default-features = false }
103103
reqwest-middleware = "0.2.4"
104104
resolvo = { version = "0.4.0" }
105105
retry-policies = { version = "0.2.1", default-features = false }
106106
rstest = { version = "0.18.2" }
107107
rstest_reuse = "0.6.0"
108-
serde = { version = "1.0.196" }
108+
serde = { version = "1.0.197" }
109109
serde-json-python-formatter = "0.1.0"
110-
serde_json = { version = "1.0.113" }
110+
serde_json = { version = "1.0.114" }
111111
serde_repr = "0.1"
112-
serde_with = "3.6.0"
113-
serde_yaml = "0.9.31"
112+
serde_with = "3.6.1"
113+
serde_yaml = "0.9.32"
114114
sha2 = "0.10.8"
115115
shlex = "1.3.0"
116116
similar-asserts = "1.5.0"
@@ -122,26 +122,26 @@ smallvec = { version = "1.13.1", features = [
122122
] }
123123
strum = { version = "0.26.1", features = ["derive"] }
124124
superslice = "1.0.0"
125-
syn = "2.0.48"
126-
sysinfo = "0.30.5"
125+
syn = "2.0.52"
126+
sysinfo = "0.30.6"
127127
tar = "0.4.40"
128128
task-local-extensions = "0.1.4"
129129
tempdir = "0.3.7"
130-
tempfile = "3.9.0"
131-
test-log = "0.2.14"
130+
tempfile = "3.10.1"
131+
test-log = "0.2.15"
132132
thiserror = "1.0"
133-
tokio = { version = "1.35.1", default-features = false }
133+
tokio = { version = "1.36.0", default-features = false }
134134
tokio-stream = "0.1.14"
135135
tokio-util = "0.7.10"
136136
tower = { version = "0.4.13", default-features = false }
137-
tower-http = { version = "0.5.1", default-features = false }
137+
tower-http = { version = "0.5.2", default-features = false }
138138
tracing = "0.1.40"
139139
tracing-subscriber = { version = "0.3.18", default-features = false }
140140
tracing-test = { version = "0.2.4" }
141141
trybuild = { version = "1.0.89" }
142142
url = { version = "2.5.0" }
143143
uuid = { version = "1.7.0", default-features = false }
144-
walkdir = "2.4.0"
144+
walkdir = "2.5.0"
145145
windows-sys = { version = "0.52.0", default-features = false }
146146
zip = { version = "0.6.6", default-features = false }
147147
zstd = { version = "0.13.0", default-features = false }

crates/rattler/src/install/clobber_registry.rs

+62-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,12 @@ impl ClobberRegistry {
160160
.enumerate()
161161
.filter(|(_, n)| clobbered_by_names.contains(n))
162162
.collect::<Vec<_>>();
163-
let winner = sorted_clobbered_by.last().expect("No winner found");
163+
164+
let winner = match sorted_clobbered_by.last() {
165+
Some(winner) => winner,
166+
// In this case, all files have been removed and we can skip any unclobbering
167+
None => continue,
168+
};
164169

165170
if winner.1 == clobbered_by_names[0] {
166171
tracing::info!(
@@ -1084,4 +1089,60 @@ mod tests {
10841089
);
10851090
}
10861091
}
1092+
1093+
// This used to hit an expect in the clobbering code
1094+
#[tokio::test]
1095+
async fn test_transaction_with_clobber_remove_all() {
1096+
let operations = test_operations();
1097+
1098+
let transaction = transaction::Transaction::<PrefixRecord, RepoDataRecord> {
1099+
operations,
1100+
python_info: None,
1101+
current_python_info: None,
1102+
platform: Platform::current(),
1103+
};
1104+
1105+
// execute transaction
1106+
let target_prefix = tempfile::tempdir().unwrap();
1107+
1108+
let packages_dir = tempfile::tempdir().unwrap();
1109+
let cache = PackageCache::new(packages_dir.path());
1110+
1111+
execute_transaction(
1112+
transaction,
1113+
target_prefix.path(),
1114+
&reqwest_middleware::ClientWithMiddleware::from(reqwest::Client::new()),
1115+
&cache,
1116+
&InstallDriver::default(),
1117+
&InstallOptions::default(),
1118+
)
1119+
.await;
1120+
1121+
let prefix_records = PrefixRecord::collect_from_prefix(target_prefix.path()).unwrap();
1122+
1123+
// remove one of the clobbering files
1124+
let transaction = transaction::Transaction::<PrefixRecord, RepoDataRecord> {
1125+
operations: prefix_records
1126+
.iter()
1127+
.map(|r| TransactionOperation::Remove(r.clone()))
1128+
.collect(),
1129+
python_info: None,
1130+
current_python_info: None,
1131+
platform: Platform::current(),
1132+
};
1133+
1134+
let install_driver = InstallDriver::new(100, Some(&prefix_records));
1135+
1136+
execute_transaction(
1137+
transaction,
1138+
target_prefix.path(),
1139+
&reqwest_middleware::ClientWithMiddleware::from(reqwest::Client::new()),
1140+
&cache,
1141+
&install_driver,
1142+
&InstallOptions::default(),
1143+
)
1144+
.await;
1145+
1146+
assert_check_files(target_prefix.path(), &[]);
1147+
}
10871148
}

crates/rattler_solve/tests/backends.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ macro_rules! solver_backend_tests {
273273
assert!(result.is_err());
274274

275275
let err = result.err().unwrap();
276-
insta::assert_display_snapshot!(err);
276+
insta::assert_snapshot!(err);
277277
}
278278

279279
#[test]
@@ -605,7 +605,7 @@ mod resolvo {
605605
);
606606

607607
// We expect an error here. `bors` is pinnend to 1, but we try to install `>=2`.
608-
insta::assert_display_snapshot!(result.unwrap_err());
608+
insta::assert_snapshot!(result.unwrap_err());
609609
}
610610
}
611611

0 commit comments

Comments
 (0)