pub use crate::util::srcinfo::fetch_srcinfo;
#[allow(clippy::case_sensitive_file_extension_comparisons)]
pub(super) fn parse_srcinfo_deps(
srcinfo: &str,
) -> (Vec<String>, Vec<String>, Vec<String>, Vec<String>) {
let mut depends = Vec::new();
let mut makedepends = Vec::new();
let mut checkdepends = Vec::new();
let mut optdepends = Vec::new();
for line in srcinfo.lines() {
let line = line.trim();
if line.is_empty() || line.starts_with('#') {
continue;
}
if let Some((key, value)) = line.split_once('=') {
let key = key.trim();
let value = value.trim();
let value_lower = value.to_lowercase();
if value_lower.ends_with(".so")
|| value_lower.contains(".so.")
|| value_lower.contains(".so=")
{
continue;
}
match key {
"depends" => depends.push(value.to_string()),
"makedepends" => makedepends.push(value.to_string()),
"checkdepends" => checkdepends.push(value.to_string()),
"optdepends" => optdepends.push(value.to_string()),
_ => {}
}
}
}
(depends, makedepends, checkdepends, optdepends)
}
#[allow(clippy::case_sensitive_file_extension_comparisons)]
pub(super) fn parse_srcinfo_conflicts(srcinfo: &str) -> Vec<String> {
use super::parse::parse_dep_spec;
let mut conflicts = Vec::new();
for line in srcinfo.lines() {
let line = line.trim();
if line.is_empty() || line.starts_with('#') {
continue;
}
if let Some((key, value)) = line.split_once('=') {
let key = key.trim();
let value = value.trim();
if key == "conflicts" {
let value_lower = value.to_lowercase();
if value_lower.ends_with(".so")
|| value_lower.contains(".so.")
|| value_lower.contains(".so=")
{
continue;
}
let (pkg_name, _) = parse_dep_spec(value);
if !pkg_name.is_empty() {
conflicts.push(pkg_name);
}
}
}
}
conflicts
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_srcinfo_deps() {
let srcinfo = r"
pkgbase = test-package
pkgname = test-package
pkgver = 1.0.0
pkgrel = 1
depends = foo
depends = bar>=1.2.3
makedepends = make
makedepends = gcc
checkdepends = check
optdepends = optional: optional-package
depends = libfoo.so=1-64
";
let (depends, makedepends, checkdepends, optdepends) = parse_srcinfo_deps(srcinfo);
assert_eq!(depends.len(), 2);
assert!(depends.contains(&"foo".to_string()));
assert!(depends.contains(&"bar>=1.2.3".to_string()));
assert_eq!(makedepends.len(), 2);
assert!(makedepends.contains(&"make".to_string()));
assert!(makedepends.contains(&"gcc".to_string()));
assert_eq!(checkdepends.len(), 1);
assert!(checkdepends.contains(&"check".to_string()));
assert_eq!(optdepends.len(), 1);
assert!(optdepends.contains(&"optional: optional-package".to_string()));
}
#[test]
fn test_parse_srcinfo_conflicts() {
let srcinfo = r"
pkgbase = test-package
pkgname = test-package
pkgver = 1.0.0
pkgrel = 1
conflicts = conflicting-pkg1
conflicts = conflicting-pkg2>=2.0
conflicts = libfoo.so=1-64
";
let conflicts = parse_srcinfo_conflicts(srcinfo);
assert_eq!(conflicts.len(), 2);
assert!(conflicts.contains(&"conflicting-pkg1".to_string()));
assert!(conflicts.contains(&"conflicting-pkg2".to_string()));
}
#[test]
fn test_parse_srcinfo_conflicts_empty() {
let srcinfo = r"
pkgbase = test-package
pkgname = test-package
pkgver = 1.0.0
";
let conflicts = parse_srcinfo_conflicts(srcinfo);
assert!(conflicts.is_empty());
}
}