feat(bundler): added provides, conflicts and replaces for deb and rpm (#9331)

* feat(bundler): added provides, conflicts and replaces for deb and rpm packages

* added change file

* update .changes/deb-rpm-provides-conflicts-replaces.md according to review

Co-authored-by: Amr Bashir <amr.bashir2015@gmail.com>

* inlined provides/conflicts/replaces(obsoletes) variables

* fmt
This commit is contained in:
Mariotaku 2024-04-04 01:02:56 +09:00 committed by GitHub
parent 2f20fdf1d6
commit 36b4c12497
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 224 additions and 0 deletions

View File

@ -0,0 +1,6 @@
---
'tauri-bundler': 'minor:feat'
'tauri-utils': 'minor:feat'
---
Added support for `provides`, `conflicts` and `replaces` (`obsoletes` for RPM) options for `bundler > deb` and `bundler > rpm` configs.

View File

@ -2422,6 +2422,36 @@
"type": "string" "type": "string"
} }
}, },
"provides": {
"description": "The list of dependencies the package provides.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"conflicts": {
"description": "The list of package conflicts.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"replaces": {
"description": "The list of package replaces.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"files": { "files": {
"description": "The files to include on the package.", "description": "The files to include on the package.",
"default": {}, "default": {},
@ -2503,6 +2533,36 @@
"type": "string" "type": "string"
} }
}, },
"provides": {
"description": "The list of RPM dependencies your application provides.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"conflicts": {
"description": "The list of RPM dependencies your application conflicts with. They must not be present in order for the package to be installed.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"obsoletes": {
"description": "The list of RPM dependencies your application supersedes - if this package is installed, packages listed as “obsoletes” will be automatically removed (if they are present).",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"release": { "release": {
"description": "The RPM release tag.", "description": "The RPM release tag.",
"default": "1", "default": "1",

View File

@ -323,6 +323,12 @@ pub struct AppImageConfig {
pub struct DebConfig { pub struct DebConfig {
/// The list of deb dependencies your application relies on. /// The list of deb dependencies your application relies on.
pub depends: Option<Vec<String>>, pub depends: Option<Vec<String>>,
/// The list of dependencies the package provides.
pub provides: Option<Vec<String>>,
/// The list of package conflicts.
pub conflicts: Option<Vec<String>>,
/// The list of package replaces.
pub replaces: Option<Vec<String>>,
/// The files to include on the package. /// The files to include on the package.
#[serde(default)] #[serde(default)]
pub files: HashMap<PathBuf, PathBuf>, pub files: HashMap<PathBuf, PathBuf>,
@ -384,6 +390,14 @@ pub struct LinuxConfig {
pub struct RpmConfig { pub struct RpmConfig {
/// The list of RPM dependencies your application relies on. /// The list of RPM dependencies your application relies on.
pub depends: Option<Vec<String>>, pub depends: Option<Vec<String>>,
/// The list of RPM dependencies your application provides.
pub provides: Option<Vec<String>>,
/// The list of RPM dependencies your application conflicts with. They must not be present
/// in order for the package to be installed.
pub conflicts: Option<Vec<String>>,
/// The list of RPM dependencies your application supersedes - if this package is installed,
/// packages listed as “obsoletes” will be automatically removed (if they are present).
pub obsoletes: Option<Vec<String>>,
/// The RPM release tag. /// The RPM release tag.
#[serde(default = "default_release")] #[serde(default = "default_release")]
pub release: String, pub release: String,
@ -420,6 +434,9 @@ impl Default for RpmConfig {
fn default() -> Self { fn default() -> Self {
Self { Self {
depends: None, depends: None,
provides: None,
conflicts: None,
obsoletes: None,
release: default_release(), release: default_release(),
epoch: 0, epoch: 0,
files: Default::default(), files: Default::default(),

View File

@ -182,6 +182,33 @@ fn generate_control_file(
if !dependencies.is_empty() { if !dependencies.is_empty() {
writeln!(file, "Depends: {}", dependencies.join(", "))?; writeln!(file, "Depends: {}", dependencies.join(", "))?;
} }
let provides = settings
.deb()
.provides
.as_ref()
.cloned()
.unwrap_or_default();
if !provides.is_empty() {
writeln!(file, "Provides: {}", provides.join(", "))?;
}
let conflicts = settings
.deb()
.conflicts
.as_ref()
.cloned()
.unwrap_or_default();
if !conflicts.is_empty() {
writeln!(file, "Conflicts: {}", conflicts.join(", "))?;
}
let replaces = settings
.deb()
.replaces
.as_ref()
.cloned()
.unwrap_or_default();
if !replaces.is_empty() {
writeln!(file, "Replaces: {}", replaces.join(", "))?;
}
let mut short_description = settings.short_description().trim(); let mut short_description = settings.short_description().trim();
if short_description.is_empty() { if short_description.is_empty() {
short_description = "(none)"; short_description = "(none)";

View File

@ -58,6 +58,39 @@ pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
builder = builder.requires(Dependency::any(dep)); builder = builder.requires(Dependency::any(dep));
} }
// Add provides
for dep in settings
.rpm()
.provides
.as_ref()
.cloned()
.unwrap_or_default()
{
builder = builder.provides(Dependency::any(dep));
}
// Add conflicts
for dep in settings
.rpm()
.conflicts
.as_ref()
.cloned()
.unwrap_or_default()
{
builder = builder.conflicts(Dependency::any(dep));
}
// Add obsoletes
for dep in settings
.rpm()
.obsoletes
.as_ref()
.cloned()
.unwrap_or_default()
{
builder = builder.obsoletes(Dependency::any(dep));
}
// Add binaries // Add binaries
for bin in settings.binaries() { for bin in settings.binaries() {
let src = settings.binary_path(bin); let src = settings.binary_path(bin);

View File

@ -168,6 +168,12 @@ pub struct DebianSettings {
// OS-specific settings: // OS-specific settings:
/// the list of debian dependencies. /// the list of debian dependencies.
pub depends: Option<Vec<String>>, pub depends: Option<Vec<String>>,
/// the list of dependencies the package provides.
pub provides: Option<Vec<String>>,
/// the list of package conflicts.
pub conflicts: Option<Vec<String>>,
/// the list of package replaces.
pub replaces: Option<Vec<String>>,
/// List of custom files to add to the deb package. /// List of custom files to add to the deb package.
/// Maps the path on the debian package to the path of the file to include (relative to the current working directory). /// Maps the path on the debian package to the path of the file to include (relative to the current working directory).
pub files: HashMap<PathBuf, PathBuf>, pub files: HashMap<PathBuf, PathBuf>,
@ -214,6 +220,14 @@ pub struct AppImageSettings {
pub struct RpmSettings { pub struct RpmSettings {
/// The list of RPM dependencies your application relies on. /// The list of RPM dependencies your application relies on.
pub depends: Option<Vec<String>>, pub depends: Option<Vec<String>>,
/// The list of RPM dependencies your application provides.
pub provides: Option<Vec<String>>,
/// The list of RPM dependencies your application conflicts with. They must not be present
/// in order for the package to be installed.
pub conflicts: Option<Vec<String>>,
/// The list of RPM dependencies your application supersedes - if this package is installed,
/// packages listed as “obsoletes” will be automatically removed (if they are present).
pub obsoletes: Option<Vec<String>>,
/// The RPM release tag. /// The RPM release tag.
pub release: String, pub release: String,
/// The RPM epoch. /// The RPM epoch.

View File

@ -2422,6 +2422,36 @@
"type": "string" "type": "string"
} }
}, },
"provides": {
"description": "The list of dependencies the package provides.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"conflicts": {
"description": "The list of package conflicts.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"replaces": {
"description": "The list of package replaces.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"files": { "files": {
"description": "The files to include on the package.", "description": "The files to include on the package.",
"default": {}, "default": {},
@ -2503,6 +2533,36 @@
"type": "string" "type": "string"
} }
}, },
"provides": {
"description": "The list of RPM dependencies your application provides.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"conflicts": {
"description": "The list of RPM dependencies your application conflicts with. They must not be present in order for the package to be installed.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"obsoletes": {
"description": "The list of RPM dependencies your application supersedes - if this package is installed, packages listed as “obsoletes” will be automatically removed (if they are present).",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"release": { "release": {
"description": "The RPM release tag.", "description": "The RPM release tag.",
"default": "1", "default": "1",

View File

@ -1208,6 +1208,7 @@ fn tauri_config_to_bundle_settings(
.unwrap_or(BundleResources::List(Vec::new())); .unwrap_or(BundleResources::List(Vec::new()));
#[allow(unused_mut)] #[allow(unused_mut)]
let mut depends_deb = config.linux.deb.depends.unwrap_or_default(); let mut depends_deb = config.linux.deb.depends.unwrap_or_default();
#[allow(unused_mut)] #[allow(unused_mut)]
let mut depends_rpm = config.linux.rpm.depends.unwrap_or_default(); let mut depends_rpm = config.linux.rpm.depends.unwrap_or_default();
@ -1330,6 +1331,9 @@ fn tauri_config_to_bundle_settings(
} else { } else {
Some(depends_deb) Some(depends_deb)
}, },
provides: config.linux.deb.provides,
conflicts: config.linux.deb.conflicts,
replaces: config.linux.deb.replaces,
files: config.linux.deb.files, files: config.linux.deb.files,
desktop_template: config.linux.deb.desktop_template, desktop_template: config.linux.deb.desktop_template,
section: config.linux.deb.section, section: config.linux.deb.section,
@ -1349,6 +1353,9 @@ fn tauri_config_to_bundle_settings(
} else { } else {
Some(depends_rpm) Some(depends_rpm)
}, },
provides: config.linux.rpm.provides,
conflicts: config.linux.rpm.conflicts,
obsoletes: config.linux.rpm.obsoletes,
release: config.linux.rpm.release, release: config.linux.rpm.release,
epoch: config.linux.rpm.epoch, epoch: config.linux.rpm.epoch,
files: config.linux.rpm.files, files: config.linux.rpm.files,