summaryrefslogtreecommitdiff
path: root/lib/libalpm/sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libalpm/sync.c')
-rw-r--r--lib/libalpm/sync.c221
1 files changed, 129 insertions, 92 deletions
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index b13a0943..16b1998d 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -87,16 +87,33 @@ void _alpm_sync_free(pmsyncpkg_t *sync)
FREE(sync);
}
+static void synclist_free(alpm_list_t *syncpkgs)
+{
+ if(syncpkgs) {
+ alpm_list_t *tmp;
+ for(tmp = syncpkgs; tmp; tmp = alpm_list_next(tmp)) {
+ if(tmp->data) {
+ _alpm_sync_free(tmp->data);
+ }
+ }
+ alpm_list_free(syncpkgs);
+ }
+
+}
+
/* Find recommended replacements for packages during a sync.
- * (refactored from _alpm_sync_prepare)
*/
static int find_replacements(pmtrans_t *trans, pmdb_t *db_local,
- alpm_list_t *dbs_sync)
+ alpm_list_t *dbs_sync, alpm_list_t **syncpkgs)
{
alpm_list_t *i, *j, *k; /* wow */
ALPM_LOG_FUNC;
+ if(syncpkgs == NULL) {
+ return(-1);
+ }
+
/* check for "recommended" package replacements */
_alpm_log(PM_LOG_DEBUG, "checking for package replacements\n");
for(i = dbs_sync; i; i = i->next) {
@@ -123,121 +140,141 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local,
alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
} else {
/* get confirmation for the replacement */
- int doreplace = 0;
- QUESTION(trans, PM_TRANS_CONV_REPLACE_PKG, lpkg, spkg, db->treename, &doreplace);
+ if(trans) {
+ int doreplace = 0;
+ QUESTION(trans, PM_TRANS_CONV_REPLACE_PKG, lpkg, spkg, db->treename, &doreplace);
+ if(!doreplace) {
+ continue;
+ }
+ }
- if(doreplace) {
- /* if confirmed, add this to the 'final' list, designating 'lpkg' as
- * the package to replace.
- */
- pmsyncpkg_t *sync;
- pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(lpkg), NULL);
- if(dummy == NULL) {
+ /* if confirmed, add this to the 'final' list, designating 'lpkg' as
+ * the package to replace.
+ */
+ pmsyncpkg_t *sync;
+ pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(lpkg), NULL);
+ if(dummy == NULL) {
+ pm_errno = PM_ERR_MEMORY;
+ synclist_free(*syncpkgs);
+ return(-1);
+ }
+ /* check if spkg->name is already in the packages list. */
+ sync = _alpm_sync_find(*syncpkgs, alpm_pkg_get_name(spkg));
+ if(sync) {
+ /* found it -- just append to the replaces list */
+ sync->data = alpm_list_add(sync->data, dummy);
+ } else {
+ /* none found -- enter pkg into the final sync list */
+ sync = _alpm_sync_new(PM_SYNC_TYPE_REPLACE, spkg, NULL);
+ if(sync == NULL) {
+ _alpm_pkg_free(dummy);
pm_errno = PM_ERR_MEMORY;
- goto error;
+ synclist_free(*syncpkgs);
+ return(-1);
}
- /* check if spkg->name is already in the packages list. */
- sync = _alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg));
- if(sync) {
- /* found it -- just append to the replaces list */
- sync->data = alpm_list_add(sync->data, dummy);
- } else {
- /* none found -- enter pkg into the final sync list */
- sync = _alpm_sync_new(PM_SYNC_TYPE_REPLACE, spkg, NULL);
- if(sync == NULL) {
- _alpm_pkg_free(dummy);
- pm_errno = PM_ERR_MEMORY;
- goto error;
- }
- sync->data = alpm_list_add(NULL, dummy);
- trans->packages = alpm_list_add(trans->packages, sync);
- }
- _alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (to be replaced by %s-%s)\n",
- alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg),
- alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
+ sync->data = alpm_list_add(NULL, dummy);
+ *syncpkgs = alpm_list_add(*syncpkgs, sync);
}
+ _alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (to be replaced by %s-%s)\n",
+ alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg),
+ alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
}
}
}
}
return(0);
-error:
- return(-1);
}
-/* TODO reimplement this in terms of alpm_get_upgrades */
-int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync)
+/** Get a list of upgradable packages on the current system
+ * Adds out of date packages to *list.
+ * @arg list pointer to a list of pmsyncpkg_t.
+ */
+int SYMEXPORT alpm_sync_sysupgrade(pmdb_t *db_local,
+ alpm_list_t *dbs_sync, alpm_list_t **syncpkgs)
+{
+ return(_alpm_sync_sysupgrade(NULL, db_local, dbs_sync, syncpkgs));
+}
+
+int _alpm_sync_sysupgrade(pmtrans_t *trans,
+ pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **syncpkgs)
{
alpm_list_t *i, *j;
ALPM_LOG_FUNC;
+ if(syncpkgs == NULL) {
+ return(-1);
+ }
/* check for "recommended" package replacements */
- if(find_replacements(trans, db_local, dbs_sync) == 0) {
- /* match installed packages with the sync dbs and compare versions */
- _alpm_log(PM_LOG_DEBUG, "checking for package upgrades\n");
- for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) {
- int replace=0;
- pmpkg_t *local = i->data;
- pmpkg_t *spkg = NULL;
- pmsyncpkg_t *sync;
-
- for(j = dbs_sync; !spkg && j; j = j->next) {
- 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;
- }
+ if(find_replacements(trans, db_local, dbs_sync, syncpkgs)) {
+ return(-1);
+ }
- /* we don't care about a to-be-replaced package's newer version */
- for(j = trans->packages; j && !replace; j=j->next) {
- sync = j->data;
- if(sync->type == PM_SYNC_TYPE_REPLACE) {
- if(_alpm_pkg_find(alpm_pkg_get_name(spkg), sync->data)) {
- replace=1;
- }
+ /* match installed packages with the sync dbs and compare versions */
+ _alpm_log(PM_LOG_DEBUG, "checking for package upgrades\n");
+ for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) {
+ int replace = 0;
+ pmpkg_t *local = i->data;
+ pmpkg_t *spkg = NULL;
+ pmsyncpkg_t *sync;
+
+ for(j = dbs_sync; !spkg && j; j = j->next) {
+ 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(sync->type == PM_SYNC_TYPE_REPLACE) {
+ if(_alpm_pkg_find(alpm_pkg_get_name(spkg), sync->data)) {
+ replace = 1;
}
}
- if(replace) {
- _alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping\n",
- alpm_pkg_get_name(local));
- continue;
- }
+ }
+ if(replace) {
+ _alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping\n",
+ alpm_pkg_get_name(local));
+ continue;
+ }
- /* compare versions and see if we need to upgrade */
- if(alpm_pkg_compare_versions(local, spkg)) {
- _alpm_log(PM_LOG_DEBUG, "%s elected for upgrade (%s => %s)\n",
- alpm_pkg_get_name(local), alpm_pkg_get_version(local),
- alpm_pkg_get_version(spkg));
- if(!_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) {
- /* If package is in the ignorepkg list, skip it */
- if(_alpm_pkg_should_ignore(spkg)) {
- _alpm_log(PM_LOG_WARNING, _("%s: ignoring package upgrade (%s => %s)\n"),
- alpm_pkg_get_name(local), alpm_pkg_get_version(local),
- alpm_pkg_get_version(spkg));
- continue;
- }
- pmpkg_t *tmp = _alpm_pkg_dup(local);
- if(tmp == NULL) {
- goto error;
- }
- sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, tmp);
- if(sync == NULL) {
- _alpm_pkg_free(tmp);
- goto error;
- }
- trans->packages = alpm_list_add(trans->packages, sync);
+ /* compare versions and see if we need to upgrade */
+ if(alpm_pkg_compare_versions(local, spkg)) {
+ _alpm_log(PM_LOG_DEBUG, "%s elected for upgrade (%s => %s)\n",
+ alpm_pkg_get_name(local), alpm_pkg_get_version(local),
+ alpm_pkg_get_version(spkg));
+ if(!_alpm_sync_find(*syncpkgs, alpm_pkg_get_name(spkg))) {
+ /* If package is in the ignorepkg list, skip it */
+ if(_alpm_pkg_should_ignore(spkg)) {
+ _alpm_log(PM_LOG_WARNING, _("%s: ignoring package upgrade (%s => %s)\n"),
+ alpm_pkg_get_name(local), alpm_pkg_get_version(local),
+ alpm_pkg_get_version(spkg));
+ continue;
+ }
+
+ pmpkg_t *tmp = _alpm_pkg_dup(local);
+ if(tmp == NULL) {
+ pm_errno = PM_ERR_MEMORY;
+ synclist_free(*syncpkgs);
+ return(-1);
+ }
+ sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, tmp);
+ if(sync == NULL) {
+ _alpm_pkg_free(tmp);
+ pm_errno = PM_ERR_MEMORY;
+ synclist_free(*syncpkgs);
+ return(-1);
}
+ *syncpkgs = alpm_list_add(*syncpkgs, sync);
}
}
-
- return(0);
}
-error:
- /* if we're here, it's an error */
- return(-1);
+
+ return(0);
}
int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, char *name)