[pacman-dev] [PATCH 1/2] Add two pactests for group and --needed interaction
The first step for resolving FS#20221. sync023 is the case from the bug report; sync022 is already working fine but we have no tests at all that test the --needed option in any form. Signed-off-by: Dan McGee <dan@archlinux.org> --- test/pacman/tests/sync022.py | 25 +++++++++++++++++++++++++ test/pacman/tests/sync023.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 0 deletions(-) create mode 100644 test/pacman/tests/sync022.py create mode 100644 test/pacman/tests/sync023.py diff --git a/test/pacman/tests/sync022.py b/test/pacman/tests/sync022.py new file mode 100644 index 0000000..eebbe07 --- /dev/null +++ b/test/pacman/tests/sync022.py @@ -0,0 +1,25 @@ +self.description = "Install a group from a sync db using --needed" + +lp1 = pmpkg("pkg1") +lp2 = pmpkg("pkg2") +lp3 = pmpkg("pkg3") + +sp1 = pmpkg("pkg1", "1.1-1") +sp2 = pmpkg("pkg2") +sp3 = pmpkg("pkg3") + +for p in lp1, lp2, lp3, sp1, sp2, sp3: + setattr(p, "groups", ["grp"]) + +for p in lp1, lp2, lp3: + self.addpkg2db("local", p) + +for p in sp1, sp2, sp3: + self.addpkg2db("sync", p); + +self.args = "-S --needed grp" + +self.addrule("PACMAN_RETCODE=0") +for p in sp1, sp2, sp3: + self.addrule("PKG_EXIST=%s" % p.name) +self.addrule("PKG_VERSION=pkg1|1.1-1") diff --git a/test/pacman/tests/sync023.py b/test/pacman/tests/sync023.py new file mode 100644 index 0000000..9253497 --- /dev/null +++ b/test/pacman/tests/sync023.py @@ -0,0 +1,31 @@ +self.description = "Install a group from a sync db using --needed (testing repo)" + +lp1 = pmpkg("pkg1", "1.1-1") +lp2 = pmpkg("pkg2") +lp3 = pmpkg("pkg3") + +sp1 = pmpkg("pkg1") +sp2 = pmpkg("pkg2") +sp3 = pmpkg("pkg3") +newp1 = pmpkg("pkg1", "1.1-1") + +for p in lp1, lp2, lp3, sp1, sp2, sp3, newp1: + setattr(p, "groups", ["grp"]) + +for p in lp1, lp2, lp3: + self.addpkg2db("local", p) + +self.addpkg2db("testing", newp1); + +for p in sp1, sp2, sp3: + self.addpkg2db("sync", p); + +self.args = "-S --needed grp" + +self.addrule("PACMAN_RETCODE=0") +for p in sp1, sp2, sp3: + self.addrule("PKG_EXIST=%s" % p.name) +# The newer version should still be installed +self.addrule("PKG_VERSION=pkg1|1.1-1") + +self.expectfailure = True -- 1.7.2
As reported in FS#20221, we don't always do the right thing when installing a group and using the --needed option. This was due to the code pulling packages based on what was already in the transaction's add list, but completely ignoring the fact that we may have already seen and skipped this same package in an earlier repository. Add a list to the private _alpm_sync_pkg() function that allows us to have this extra information so we don't mistakenly downgrade a package when using --needed. Signed-off-by: Dan McGee <dan@archlinux.org> --- I have these queued up for maint locally. Let me know if there are any objections to doing that, but given that I actually added some tests I'm pretty confident this didn't break anything else. -Dan lib/libalpm/sync.c | 12 ++++++++---- test/pacman/tests/sync023.py | 2 -- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 68ee8dc..bc7c3dc 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -202,7 +202,7 @@ int SYMEXPORT alpm_sync_sysupgrade(int enable_downgrade) return(0); } -int _alpm_sync_pkg(pmpkg_t *spkg) +int _alpm_sync_pkg(pmpkg_t *spkg, alpm_list_t *pkg_list) { pmtrans_t *trans; pmdb_t *db_local; @@ -213,7 +213,7 @@ int _alpm_sync_pkg(pmpkg_t *spkg) trans = handle->trans; db_local = handle->db_local; - if(_alpm_pkg_find(trans->add, alpm_pkg_get_name(spkg))) { + if(_alpm_pkg_find(pkg_list, alpm_pkg_get_name(spkg))) { RET_ERR(PM_ERR_TRANS_DUP_TARGET, -1); } @@ -251,6 +251,7 @@ int _alpm_sync_pkg(pmpkg_t *spkg) int _alpm_sync_target(alpm_list_t *dbs_sync, char *target) { alpm_list_t *i, *j; + alpm_list_t *known_pkgs = NULL; pmpkg_t *spkg; pmdepend_t *dep; /* provisions and dependencies are also allowed */ pmgrp_t *grp; @@ -267,7 +268,7 @@ int _alpm_sync_target(alpm_list_t *dbs_sync, char *target) _alpm_dep_free(dep); if(spkg != NULL) { - return(_alpm_sync_pkg(spkg)); + return(_alpm_sync_pkg(spkg, handle->trans->add)); } _alpm_log(PM_LOG_DEBUG, "%s package not found, searching for group...\n", target); @@ -278,17 +279,20 @@ int _alpm_sync_target(alpm_list_t *dbs_sync, char *target) found = 1; for(j = alpm_grp_get_pkgs(grp); j; j = j->next) { pmpkg_t *pkg = j->data; - if(_alpm_sync_pkg(pkg) == -1) { + if(_alpm_sync_pkg(pkg, known_pkgs) == -1) { if(pm_errno == PM_ERR_TRANS_DUP_TARGET || pm_errno == PM_ERR_PKG_IGNORED) { /* just skip duplicate or ignored targets */ continue; } else { + alpm_list_free(known_pkgs); return(-1); } } + known_pkgs = alpm_list_add(known_pkgs, pkg); } } } + alpm_list_free(known_pkgs); if(!found) { /* pass through any 'found but ignored' errors */ diff --git a/test/pacman/tests/sync023.py b/test/pacman/tests/sync023.py index 9253497..8233ab7 100644 --- a/test/pacman/tests/sync023.py +++ b/test/pacman/tests/sync023.py @@ -27,5 +27,3 @@ self.addrule("PKG_EXIST=%s" % p.name) # The newer version should still be installed self.addrule("PKG_VERSION=pkg1|1.1-1") - -self.expectfailure = True -- 1.7.2
participants (1)
-
Dan McGee