mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-22 15:58:50 -05:00
alpm_sync_sysupgrade split
This patch indroduces a new public alpm_sync_newversion, which scans for new version of a package in sync repos. Hopefully this will reduce code duplication in the future: * check-for-pacman-new-version from front-end can be easier * -Qu refactoring Signed-off-by: Nagy Gabor <ngaba@bibl.u-szeged.hu> Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
This commit is contained in:
parent
05d5634958
commit
7dc37109b0
@ -249,6 +249,7 @@ const alpm_list_t *alpm_grp_get_pkgs(const pmgrp_t *grp);
|
|||||||
pmpkgreason_t alpm_sync_get_newreason(const pmsyncpkg_t *sync);
|
pmpkgreason_t alpm_sync_get_newreason(const pmsyncpkg_t *sync);
|
||||||
pmpkg_t *alpm_sync_get_pkg(const pmsyncpkg_t *sync);
|
pmpkg_t *alpm_sync_get_pkg(const pmsyncpkg_t *sync);
|
||||||
alpm_list_t *alpm_sync_get_removes(const pmsyncpkg_t *sync);
|
alpm_list_t *alpm_sync_get_removes(const pmsyncpkg_t *sync);
|
||||||
|
pmpkg_t *alpm_sync_newversion(pmpkg_t *pkg, alpm_list_t *dbs_sync);
|
||||||
int alpm_sync_sysupgrade(pmdb_t *db_local,
|
int alpm_sync_sysupgrade(pmdb_t *db_local,
|
||||||
alpm_list_t *dbs_sync, alpm_list_t **syncpkgs);
|
alpm_list_t *dbs_sync, alpm_list_t **syncpkgs);
|
||||||
|
|
||||||
|
@ -160,6 +160,35 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local,
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Check for new version of pkg in sync repos
|
||||||
|
* (only the first occurrence is considered in sync)
|
||||||
|
*/
|
||||||
|
pmpkg_t SYMEXPORT *alpm_sync_newversion(pmpkg_t *pkg, alpm_list_t *dbs_sync)
|
||||||
|
{
|
||||||
|
alpm_list_t *i;
|
||||||
|
pmpkg_t *spkg = NULL;
|
||||||
|
|
||||||
|
for(i = dbs_sync; !spkg && i; i = i->next) {
|
||||||
|
spkg = _alpm_db_get_pkgfromcache(i->data, alpm_pkg_get_name(pkg));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(spkg == NULL) {
|
||||||
|
_alpm_log(PM_LOG_DEBUG, "'%s' not found in sync db => no upgrade\n",
|
||||||
|
alpm_pkg_get_name(pkg));
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* compare versions and see if spkg is an upgrade */
|
||||||
|
if(_alpm_pkg_compare_versions(pkg, spkg)) {
|
||||||
|
_alpm_log(PM_LOG_DEBUG, "new version of '%s' found (%s => %s)\n",
|
||||||
|
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg),
|
||||||
|
alpm_pkg_get_version(spkg));
|
||||||
|
return(spkg);
|
||||||
|
} else {
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Get a list of upgradable packages on the current system
|
/** Get a list of upgradable packages on the current system
|
||||||
* Adds out of date packages to *list.
|
* Adds out of date packages to *list.
|
||||||
* @arg list pointer to a list of pmsyncpkg_t.
|
* @arg list pointer to a list of pmsyncpkg_t.
|
||||||
@ -173,7 +202,7 @@ int SYMEXPORT alpm_sync_sysupgrade(pmdb_t *db_local,
|
|||||||
int _alpm_sync_sysupgrade(pmtrans_t *trans,
|
int _alpm_sync_sysupgrade(pmtrans_t *trans,
|
||||||
pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **syncpkgs)
|
pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **syncpkgs)
|
||||||
{
|
{
|
||||||
alpm_list_t *i, *j;
|
alpm_list_t *i, *j, *replaced = NULL;
|
||||||
|
|
||||||
ALPM_LOG_FUNC;
|
ALPM_LOG_FUNC;
|
||||||
|
|
||||||
@ -185,63 +214,55 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans,
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* match installed packages with the sync dbs and compare versions */
|
/* compute the to-be-replaced packages for efficiency */
|
||||||
|
for(i = *syncpkgs; i; i = i->next) {
|
||||||
|
pmsyncpkg_t *sync = i->data;
|
||||||
|
for(j = sync->removes; j; j = j->next) {
|
||||||
|
replaced = alpm_list_add(replaced, j->data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for all not-replaced local package we check for upgrade */
|
||||||
_alpm_log(PM_LOG_DEBUG, "checking for package upgrades\n");
|
_alpm_log(PM_LOG_DEBUG, "checking for package upgrades\n");
|
||||||
for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) {
|
for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) {
|
||||||
int replace = 0;
|
|
||||||
pmpkg_t *local = i->data;
|
pmpkg_t *local = i->data;
|
||||||
pmpkg_t *spkg = NULL;
|
|
||||||
pmsyncpkg_t *sync;
|
|
||||||
|
|
||||||
for(j = dbs_sync; !spkg && j; j = j->next) {
|
if(_alpm_pkg_find(alpm_pkg_get_name(local), replaced)) {
|
||||||
spkg = _alpm_db_get_pkgfromcache(j->data, alpm_pkg_get_name(local));
|
|
||||||
}
|
|
||||||
if(spkg == NULL) {
|
|
||||||
_alpm_log(PM_LOG_DEBUG, "'%s' not found in sync db -- skipping\n",
|
|
||||||
alpm_pkg_get_name(local));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we don't care about a to-be-replaced package's newer version */
|
|
||||||
for(j = *syncpkgs; j && !replace; j=j->next) {
|
|
||||||
sync = j->data;
|
|
||||||
if(_alpm_pkg_find(alpm_pkg_get_name(spkg), sync->removes)) {
|
|
||||||
replace = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(replace) {
|
|
||||||
_alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping\n",
|
_alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping\n",
|
||||||
alpm_pkg_get_name(local));
|
alpm_pkg_get_name(local));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* compare versions and see if we need to upgrade */
|
pmpkg_t *spkg = alpm_sync_newversion(local, dbs_sync);
|
||||||
if(_alpm_pkg_compare_versions(local, spkg)) {
|
if(spkg) {
|
||||||
_alpm_log(PM_LOG_DEBUG, "%s elected for upgrade (%s => %s)\n",
|
/* we found a new version */
|
||||||
alpm_pkg_get_name(local), alpm_pkg_get_version(local),
|
/* skip packages in IgnorePkg or in IgnoreGroup */
|
||||||
alpm_pkg_get_version(spkg));
|
if(_alpm_pkg_should_ignore(spkg)) {
|
||||||
if(!_alpm_sync_find(*syncpkgs, alpm_pkg_get_name(spkg))) {
|
_alpm_log(PM_LOG_WARNING, _("%s: ignoring package upgrade (%s => %s)\n"),
|
||||||
/* If package is in the ignorepkg list, skip it */
|
alpm_pkg_get_name(local), alpm_pkg_get_version(local),
|
||||||
if(_alpm_pkg_should_ignore(spkg)) {
|
alpm_pkg_get_version(spkg));
|
||||||
_alpm_log(PM_LOG_WARNING, _("%s: ignoring package upgrade (%s => %s)\n"),
|
continue;
|
||||||
alpm_pkg_get_name(local), alpm_pkg_get_version(local),
|
|
||||||
alpm_pkg_get_version(spkg));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we can set any reason here, it will be overridden by add_commit */
|
|
||||||
sync = _alpm_sync_new(PM_PKG_REASON_EXPLICIT, spkg, NULL);
|
|
||||||
if(sync == NULL) {
|
|
||||||
alpm_list_free_inner(*syncpkgs, (alpm_list_fn_free)_alpm_sync_free);
|
|
||||||
alpm_list_free(*syncpkgs);
|
|
||||||
*syncpkgs = NULL;
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
*syncpkgs = alpm_list_add(*syncpkgs, sync);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* add the upgrade package to our pmsyncpkg_t list */
|
||||||
|
if(_alpm_sync_find(*syncpkgs, alpm_pkg_get_name(spkg))) {
|
||||||
|
/* it is already there, done */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* we can set any reason here, it will be overridden by add_commit */
|
||||||
|
pmsyncpkg_t *sync = _alpm_sync_new(PM_PKG_REASON_EXPLICIT, spkg, NULL);
|
||||||
|
if(sync == NULL) {
|
||||||
|
alpm_list_free_inner(*syncpkgs, (alpm_list_fn_free)_alpm_sync_free);
|
||||||
|
alpm_list_free(*syncpkgs);
|
||||||
|
*syncpkgs = NULL;
|
||||||
|
alpm_list_free(replaced);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
*syncpkgs = alpm_list_add(*syncpkgs, sync);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alpm_list_free(replaced);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user