Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 43 additions & 14 deletions src/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1380,26 +1380,54 @@ fn check_actions(
);
}

let build_only_targets = if install_targets {
None
} else {
let mut build_only_targets = HashSet::new();

for base in &actions.build {
match base {
Base::Aur(base) => build_only_targets.extend(
base.pkgs
.iter()
.filter(|pkg| pkg.target)
.map(|pkg| pkg.pkg.name.clone()),
),
Base::Pkgbuild(base) => build_only_targets.extend(
base.pkgs
.iter()
.filter(|pkg| pkg.target)
.map(|pkg| pkg.pkg.pkgname.clone()),
),
}
}

Some(build_only_targets)
};

let filter_build_only_targets = |conflicts: &mut Vec<Conflict>| {
if let Some(build_only_targets) = build_only_targets.as_ref() {
conflicts.retain_mut(|conflict| {
if build_only_targets.contains(&conflict.pkg) {
return false;
}

conflict
.conflicting
.retain(|pkg| !build_only_targets.contains(&pkg.pkg));
!conflict.conflicting.is_empty()
});
}
};

let conflicts = if !config.chroot || install_targets {
println!(
"{} {}",
c.action.paint("::"),
c.bold.paint(tr!("Calculating conflicts..."))
);
// Hack to ignore conflicts on -B
// Only ignores conflicts for the last package instead of all targets
// As in theory one target could depend on another and thus must be installed
let mut conflicts = actions.calculate_conflicts(!config.chroot);
if !install_targets {
if let Some(build) = actions.build.last() {
let pkgs = build.packages().map(|s| s.to_string()).collect::<Vec<_>>();
conflicts.retain(|c| {
!c.conflicting
.iter()
.all(|conflicting| pkgs.contains(&conflicting.pkg))
});
}
}
filter_build_only_targets(&mut conflicts);
conflicts
} else {
Vec::new()
Expand All @@ -1409,7 +1437,8 @@ fn check_actions(
c.action.paint("::"),
c.bold.paint(tr!("Calculating inner conflicts..."))
);
let inner_conflicts = actions.calculate_inner_conflicts(!config.chroot);
let mut inner_conflicts = actions.calculate_inner_conflicts(!config.chroot);
filter_build_only_targets(&mut inner_conflicts);

if !conflicts.is_empty() || !inner_conflicts.is_empty() {
eprintln!();
Expand Down
6 changes: 6 additions & 0 deletions testdata/clone/devel-bin/.SRCINFO
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
pkgbase = devel-bin
pkgver = 1
pkgrel = 1
arch = any

pkgname = devel-bin
5 changes: 5 additions & 0 deletions testdata/clone/devel-bin/PKGBUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pkgname=devel-bin
pkgver=1
pkgrel=1
arch=(any)
conflicts=(devel)
6 changes: 6 additions & 0 deletions tests/common/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,3 +199,9 @@ async fn devel() {
let a = db.pkg("devel").unwrap();
assert_eq!(a.version().as_str(), "2-1");
}

#[tokio::test]
async fn build_only_conflict_with_installed_pkg() {
let (_, ret) = run(&["-B", "testdata/clone/devel-bin"]).await.unwrap();
assert_eq!(ret, 0);
}
Loading