Skip to content

Commit 3998570

Browse files
authored
fix(cli): manifest v1 migration (#10540)
update features that got removed/renamed, and also migrate any core crate on any dependency table
1 parent 3beba92 commit 3998570

File tree

2 files changed

+120
-49
lines changed

2 files changed

+120
-49
lines changed

.changes/fix-manifest-migration.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"tauri-cli": patch:bug
3+
"@tauri-apps/cli": patch:bug
4+
---
5+
6+
Fixes v1 migration of Cargo.toml dependencies and features.

tooling/cli/src/migrate/migrations/v1/manifest.rs

Lines changed: 114 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ use crate::{
88
};
99

1010
use anyhow::Context;
11-
use itertools::Itertools;
1211
use tauri_utils_v1::config::Allowlist;
13-
use toml_edit::{Document, Entry, Item, Table, TableLike, Value};
12+
use toml_edit::{Document, Entry, Item, TableLike, Value};
1413

1514
use std::path::Path;
1615

@@ -30,23 +29,47 @@ pub fn migrate(tauri_dir: &Path) -> Result<()> {
3029
fn migrate_manifest(manifest: &mut Document) -> Result<()> {
3130
let version = dependency_version();
3231

33-
let dependencies = manifest
34-
.as_table_mut()
35-
.entry("dependencies")
36-
.or_insert(Item::Table(Table::new()))
37-
.as_table_mut()
38-
.context("manifest dependencies isn't a table")?;
39-
40-
migrate_dependency(dependencies, "tauri", &version, &features_to_remove());
41-
42-
let build_dependencies = manifest
43-
.as_table_mut()
44-
.entry("build-dependencies")
45-
.or_insert(Item::Table(Table::new()))
46-
.as_table_mut()
47-
.context("manifest build-dependencies isn't a table")?;
48-
49-
migrate_dependency(build_dependencies, "tauri-build", &version, &[]);
32+
let remove_features = features_to_remove();
33+
let rename_features = features_to_rename();
34+
let rename_message = rename_features
35+
.iter()
36+
.map(|(from, to)| format!("{from} to {to}"))
37+
.collect::<Vec<_>>()
38+
.join(", ");
39+
40+
for (dependency, table) in [
41+
// normal deps
42+
("tauri", "dependencies"),
43+
("tauri-utils", "dependencies"),
44+
("tauri-runtime", "dependencies"),
45+
("tauri-codegen", "dependencies"),
46+
("tauri-macros", "dependencies"),
47+
("tauri-runtime-wry", "dependencies"),
48+
// dev
49+
("tauri", "dev-dependencies"),
50+
("tauri-utils", "dev-dependencies"),
51+
("tauri-runtime", "dev-dependencies"),
52+
("tauri-codegen", "dev-dependencies"),
53+
("tauri-macros", "dev-dependencies"),
54+
("tauri-runtime-wry", "dev-dependencies"),
55+
// build
56+
("tauri-build", "build-dependencies"),
57+
] {
58+
let items = find_dependency(manifest, dependency, table);
59+
60+
for item in items {
61+
// do not rewrite if dependency uses workspace inheritance
62+
if item
63+
.get("workspace")
64+
.and_then(|v| v.as_bool())
65+
.unwrap_or_default()
66+
{
67+
log::warn!("`{dependency}` dependency has workspace inheritance enabled. This migration must be manually migrated to v2 by changing its version to {version}, removing any of the {remove_features:?} and renaming [{}] Cargo features.", rename_message);
68+
} else {
69+
migrate_dependency(item, &version, &remove_features, &rename_features);
70+
}
71+
}
72+
}
5073

5174
if let Some(lib) = manifest
5275
.as_table_mut()
@@ -82,15 +105,66 @@ fn migrate_manifest(manifest: &mut Document) -> Result<()> {
82105
Ok(())
83106
}
84107

108+
fn find_dependency<'a>(
109+
manifest: &'a mut Document,
110+
name: &'a str,
111+
table: &'a str,
112+
) -> Vec<&'a mut Item> {
113+
let m = manifest.as_table_mut();
114+
for (k, v) in m.iter_mut() {
115+
if let Some(t) = v.as_table_mut() {
116+
if k == table {
117+
if let Some(item) = t.get_mut(name) {
118+
return vec![item];
119+
}
120+
} else if k == "target" {
121+
let mut matching_deps = Vec::new();
122+
for (_, target_value) in t.iter_mut() {
123+
if let Some(target_table) = target_value.as_table_mut() {
124+
if let Some(deps) = target_table.get_mut(table) {
125+
if let Some(item) = deps.as_table_mut().and_then(|t| t.get_mut(name)) {
126+
matching_deps.push(item);
127+
}
128+
}
129+
}
130+
}
131+
return matching_deps;
132+
}
133+
}
134+
}
135+
136+
Vec::new()
137+
}
138+
139+
fn features_to_rename() -> Vec<(&'static str, &'static str)> {
140+
vec![
141+
("window-data-url", "webview-data-url"),
142+
("reqwest-native-tls-vendored", "native-tls-vendored"),
143+
("system-tray", "tray-icon"),
144+
("icon-ico", "image-ico"),
145+
("icon-png", "image-png"),
146+
]
147+
}
148+
85149
fn features_to_remove() -> Vec<&'static str> {
86150
let mut features_to_remove = tauri_utils_v1::config::AllowlistConfig::all_features();
87-
features_to_remove.push("reqwest-client");
88-
features_to_remove.push("reqwest-native-tls-vendored");
89-
features_to_remove.push("process-command-api");
90-
features_to_remove.push("shell-open-api");
91-
features_to_remove.push("windows7-compat");
92-
features_to_remove.push("updater");
93-
features_to_remove.push("system-tray");
151+
features_to_remove.extend(&[
152+
"reqwest-client",
153+
"http-multipart",
154+
"process-command-api",
155+
"shell-open-api",
156+
"os-api",
157+
"global-shortcut",
158+
"clipboard",
159+
"dialog",
160+
"notification",
161+
"fs-extract-api",
162+
"windows7-compat",
163+
"updater",
164+
"cli",
165+
"linux-protocol-headers",
166+
"dox",
167+
]);
94168

95169
// this allowlist feature was not removed
96170
let index = features_to_remove
@@ -117,29 +191,22 @@ fn dependency_version() -> String {
117191
}
118192
}
119193

120-
fn migrate_dependency(dependencies: &mut Table, name: &str, version: &str, remove: &[&str]) {
121-
let item = dependencies.entry(name).or_insert(Item::None);
122-
123-
// do not rewrite if dependency uses workspace inheritance
124-
if item
125-
.get("workspace")
126-
.and_then(|v| v.as_bool())
127-
.unwrap_or_default()
128-
{
129-
log::info!("`{name}` dependency has workspace inheritance enabled. The features array won't be automatically rewritten. Remove features: [{}]", remove.iter().join(", "));
130-
return;
131-
}
132-
194+
fn migrate_dependency(item: &mut Item, version: &str, remove: &[&str], rename: &[(&str, &str)]) {
133195
if let Some(dep) = item.as_table_mut() {
134-
migrate_dependency_table(dep, version, remove);
196+
migrate_dependency_table(dep, version, remove, rename);
135197
} else if let Some(Value::InlineTable(table)) = item.as_value_mut() {
136-
migrate_dependency_table(table, version, remove);
198+
migrate_dependency_table(table, version, remove, rename);
137199
} else if item.as_str().is_some() {
138200
*item = Item::Value(version.into());
139201
}
140202
}
141203

142-
fn migrate_dependency_table<D: TableLike>(dep: &mut D, version: &str, remove: &[&str]) {
204+
fn migrate_dependency_table<D: TableLike>(
205+
dep: &mut D,
206+
version: &str,
207+
remove: &[&str],
208+
rename: &[(&str, &str)],
209+
) {
143210
*dep.entry("version").or_insert(Item::None) = Item::Value(version.into());
144211
let manifest_features = dep.entry("features").or_insert(Item::None);
145212
if let Some(features_array) = manifest_features.as_array_mut() {
@@ -150,19 +217,17 @@ fn migrate_dependency_table<D: TableLike>(dep: &mut D, version: &str, remove: &[
150217
let index = i - 1;
151218
if let Some(f) = features_array.get(index).and_then(|f| f.as_str()) {
152219
if remove.contains(&f) {
153-
let f = f.to_string();
154220
features_array.remove(index);
155-
if f == "reqwest-native-tls-vendored" {
156-
add_features.push("native-tls-vendored");
157-
} else if f == "system-tray" {
158-
add_features.push("tray-icon");
159-
}
221+
} else if let Some((_from, rename_to)) = rename.iter().find(|(from, _to)| *from == f) {
222+
features_array.remove(index);
223+
add_features.push(rename_to);
160224
}
161225
}
162226
i -= 1;
163227
}
228+
164229
for f in add_features {
165-
features_array.push(f);
230+
features_array.push(f.to_string());
166231
}
167232
}
168233
}

0 commit comments

Comments
 (0)