Skip to content
Closed
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
60 changes: 60 additions & 0 deletions src/resolve.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::<Vec<_>>();
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::<Vec<_>>();

assert_eq!(pkgs, vec!["version_newer"]);
}

#[tokio::test]
async fn test_repo_nover() {
let TestActions { install, .. } = resolve(&["repo_version_test"], Flags::new()).await;
Expand Down
31 changes: 22 additions & 9 deletions src/upgrade.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,28 @@ impl<'a, 'b, E: std::error::Error + Sync + Send + 'static, H: Raur<Err = E> + 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.
Expand Down
Binary file added tests/db/sync/local-repo-with-official.db
Binary file not shown.
Binary file added tests/db/sync/local-repo.db
Binary file not shown.