diff --git a/src/resolve.rs b/src/resolve.rs index 68f8d82..26c51b0 100644 --- a/src/resolve.rs +++ b/src/resolve.rs @@ -1919,6 +1919,66 @@ mod tests { assert_eq!(pkgs, vec!["pacaur", "version_newer", "version_older"]); } + #[tokio::test] + async fn test_aur_updates_with_local_repos() { + let alpm = Alpm::new("/", "tests/db").unwrap(); + alpm.register_syncdb("core", SigLevel::NONE).unwrap(); + alpm.register_syncdb("extra", SigLevel::NONE).unwrap(); + alpm.register_syncdb("community", SigLevel::NONE).unwrap(); + alpm.register_syncdb("multilib", SigLevel::NONE).unwrap(); + alpm.register_syncdb("local-repo", SigLevel::NONE).unwrap(); + + let raur = raur(); + let mut cache = HashSet::new(); + let mut handle = Resolver::new( + &alpm, + &mut cache, + &raur, + Flags::new() | Flags::ENABLE_DOWNGRADE, + ); + let pkgs = handle + .updates(Some(&["local-repo"])) + .await + .unwrap() + .aur_updates; + let mut pkgs = pkgs + .iter() + .map(|p| p.remote.name.as_str()) + .collect::>(); + pkgs.sort(); + + assert_eq!(pkgs, vec!["pacaur", "version_newer", "version_older"]); + } + + #[tokio::test] + async fn test_aur_updates_excludes_official_in_local_repo() { + let alpm = Alpm::new("/", "tests/db").unwrap(); + alpm.register_syncdb("core", SigLevel::NONE).unwrap(); + alpm.register_syncdb("extra", SigLevel::NONE).unwrap(); + alpm.register_syncdb("community", SigLevel::NONE).unwrap(); + alpm.register_syncdb("multilib", SigLevel::NONE).unwrap(); + alpm.register_syncdb("local-repo-with-official", SigLevel::NONE) + .unwrap(); + + let mut mock_raur = crate::tests::MockRaur::new(); + mock_raur.pkg("version_newer").version("100-1"); + mock_raur.pkg("glibc").version("999-1"); + + let mut cache = HashSet::new(); + let mut handle = Resolver::new(&alpm, &mut cache, &mock_raur, Flags::new()); + let pkgs = handle + .updates(Some(&["local-repo-with-official"])) + .await + .unwrap() + .aur_updates; + let pkgs = pkgs + .iter() + .map(|p| p.remote.name.as_str()) + .collect::>(); + + assert_eq!(pkgs, vec!["version_newer"]); + } + #[tokio::test] async fn test_repo_nover() { let TestActions { install, .. } = resolve(&["repo_version_test"], Flags::new()).await; diff --git a/src/upgrade.rs b/src/upgrade.rs index a49cd7e..91212a9 100644 --- a/src/upgrade.rs +++ b/src/upgrade.rs @@ -54,15 +54,28 @@ impl<'a, 'b, E: std::error::Error + Sync + Send + 'static, H: Raur + Sy ) -> Vec<&'c alpm::Package> { let dbs = alpm.syncdbs(); - if let Some(local) = local { - local.iter().flat_map(|db| db.pkgs()).collect() - } else { - alpm.localdb() - .pkgs() - .into_iter() - .filter(|p| dbs.pkg(p.name()).is_err()) - .collect() - } + alpm.localdb() + .pkgs() + .into_iter() + .filter(|p| { + for db in dbs.iter() { + if db.pkg(p.name()).is_ok() { + let is_local_repo = local + .as_ref() + .map_or(false, |l| l.iter().any(|ld| ld.name() == db.name())); + if !is_local_repo { + return false; + } + } + } + if let Some(ref local) = local { + if local.pkg(p.name()).is_ok() { + return true; + } + } + dbs.pkg(p.name()).is_err() + }) + .collect() } /// Get aur packages need to be updated. diff --git a/tests/db/sync/local-repo-with-official.db b/tests/db/sync/local-repo-with-official.db new file mode 100644 index 0000000..ebbbd7c Binary files /dev/null and b/tests/db/sync/local-repo-with-official.db differ diff --git a/tests/db/sync/local-repo.db b/tests/db/sync/local-repo.db new file mode 100644 index 0000000..f7e64be Binary files /dev/null and b/tests/db/sync/local-repo.db differ