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.c251
1 files changed, 68 insertions, 183 deletions
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index e1ab1c92..608ee4fc 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -48,34 +48,6 @@
#include "dload.h"
#include "delta.h"
-pmsyncpkg_t *_alpm_sync_new(pmpkgreason_t newreason, pmpkg_t *spkg, alpm_list_t *removes)
-{
- pmsyncpkg_t *sync;
-
- ALPM_LOG_FUNC;
-
- CALLOC(sync, 1, sizeof(pmsyncpkg_t), RET_ERR(PM_ERR_MEMORY, NULL));
-
- sync->newreason = newreason;
- sync->pkg = spkg;
- sync->removes = removes;
-
- return(sync);
-}
-
-void _alpm_sync_free(pmsyncpkg_t *sync)
-{
- ALPM_LOG_FUNC;
-
- if(sync == NULL) {
- return;
- }
-
- alpm_list_free(sync->removes);
- sync->removes = NULL;
- FREE(sync);
-}
-
/* Find recommended replacements for packages during a sync.
*/
static int find_replacements(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync)
@@ -118,30 +90,25 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *db
/* if confirmed, add this to the 'final' list, designating 'lpkg' as
* the package to replace.
*/
- pmsyncpkg_t *sync;
/* check if spkg->name is already in the packages list. */
/* TODO: same package name doesn't mean same package */
- sync = _alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg));
- if(sync) {
+ pmpkg_t *tpkg = _alpm_pkg_find(trans->packages, alpm_pkg_get_name(spkg));
+ if(tpkg) {
/* found it -- just append to the removes list */
- sync->removes = alpm_list_add(sync->removes, lpkg);
+ tpkg->removes = alpm_list_add(tpkg->removes, lpkg);
/* check the to-be-replaced package's reason field */
- if(lpkg->reason == PM_PKG_REASON_EXPLICIT) {
- sync->newreason = PM_PKG_REASON_EXPLICIT;
+ if(alpm_pkg_get_reason(lpkg) == PM_PKG_REASON_EXPLICIT) {
+ tpkg->reason = PM_PKG_REASON_EXPLICIT;
}
} else {
/* none found -- enter pkg into the final sync list */
/* copy over reason */
- sync = _alpm_sync_new(alpm_pkg_get_reason(lpkg), spkg, NULL);
- if(sync == NULL) {
- pm_errno = PM_ERR_MEMORY;
- return(-1);
- }
- sync->removes = alpm_list_add(NULL, lpkg);
+ spkg->reason = alpm_pkg_get_reason(lpkg);
+ spkg->removes = alpm_list_add(NULL, lpkg);
_alpm_log(PM_LOG_DEBUG, "adding package %s-%s to the transaction targets\n",
alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
- trans->packages = alpm_list_add(trans->packages, sync);
+ trans->packages = alpm_list_add(trans->packages, spkg);
}
_alpm_log(PM_LOG_DEBUG, "%s-%s elected for removal (to be replaced by %s-%s)\n",
alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg),
@@ -202,8 +169,8 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_s
/* compute the to-be-replaced packages for efficiency */
for(i = trans->packages; i; i = i->next) {
- pmsyncpkg_t *sync = i->data;
- for(j = sync->removes; j; j = j->next) {
+ pmpkg_t *spkg = i->data;
+ for(j = spkg->removes; j; j = j->next) {
replaced = alpm_list_add(replaced, j->data);
}
}
@@ -230,20 +197,16 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_s
continue;
}
- /* add the upgrade package to our pmsyncpkg_t list */
- if(_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) {
+ /* add the upgrade package to the target list */
+ if(_alpm_pkg_find(trans->packages, alpm_pkg_get_name(spkg))) {
/* avoid duplicated targets */
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(replaced);
- return(-1);
- }
_alpm_log(PM_LOG_DEBUG, "adding package %s-%s to the transaction targets\n",
alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
- trans->packages = alpm_list_add(trans->packages, sync);
+ /* we don't set any reason here,
+ it will be calculated from local package in add_commit */
+ trans->packages = alpm_list_add(trans->packages, spkg);
}
}
@@ -301,7 +264,7 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
return(-1);
}
- if(_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) {
+ if(_alpm_pkg_find(trans->packages, alpm_pkg_get_name(spkg))) {
RET_ERR(PM_ERR_TRANS_DUP_TARGET, -1);
}
@@ -328,28 +291,14 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
}
/* add the package to the transaction */
- pmsyncpkg_t *sync = _alpm_sync_new(PM_PKG_REASON_EXPLICIT, spkg, NULL);
- if(sync == NULL) {
- return(-1);
- }
+ spkg->reason = PM_PKG_REASON_EXPLICIT;
_alpm_log(PM_LOG_DEBUG, "adding package %s-%s to the transaction targets\n",
alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
- trans->packages = alpm_list_add(trans->packages, sync);
+ trans->packages = alpm_list_add(trans->packages, spkg);
return(0);
}
-/* Helper functions for alpm_list_remove
-*/
-static int syncpkg_cmp(const void *s1, const void *s2)
-{
- const pmsyncpkg_t *sp1 = s1;
- const pmsyncpkg_t *sp2 = s2;
- pmpkg_t *p1 = alpm_sync_get_pkg(sp1);
- pmpkg_t *p2 = alpm_sync_get_pkg(sp2);
- return(strcmp(alpm_pkg_get_name(p1), alpm_pkg_get_name(p2)));
-}
-
/** Compute the size of the files that will be downloaded to install a
* package.
* @param newpkg the new package to upgrade to
@@ -399,8 +348,8 @@ static int compute_download_size(pmpkg_t *newpkg)
int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **data)
{
alpm_list_t *deps = NULL;
- alpm_list_t *list = NULL, *remove = NULL; /* allow checkdeps usage with trans->packages */
alpm_list_t *unresolvable = NULL;
+ alpm_list_t *remove = NULL; /* allow checkdeps usage with trans->packages */
alpm_list_t *i, *j;
int ret = 0;
@@ -413,12 +362,9 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
*data = NULL;
}
- if(trans->flags & PM_TRANS_FLAG_NODEPS) {
- for(i = trans->packages; i; i = i->next) {
- pmsyncpkg_t *sync = i->data;
- list = alpm_list_add(list, sync->pkg);
- }
- } else {
+ if(!(trans->flags & PM_TRANS_FLAG_NODEPS)) {
+ alpm_list_t *resolved = NULL; /* target list after resolvedeps */
+
/* Build up list by repeatedly resolving each transaction package */
/* Resolve targets dependencies */
EVENT(trans, PM_TRANS_EVT_RESOLVEDEPS_START, NULL, NULL);
@@ -426,8 +372,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
/* build remove list for resolvedeps */
for(i = trans->packages; i; i = i->next) {
- pmsyncpkg_t *sync = i->data;
- for(j = sync->removes; j; j = j->next) {
+ pmpkg_t *spkg = i->data;
+ for(j = spkg->removes; j; j = j->next) {
remove = alpm_list_add(remove, j->data);
}
}
@@ -435,11 +381,11 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
/* Resolve packages in the transaction one at a time, in addtion
building up a list of packages which could not be resolved. */
for(i = trans->packages; i; i = i->next) {
- pmpkg_t *pkg = ((pmsyncpkg_t *) i->data)->pkg;
- if(_alpm_resolvedeps(db_local, dbs_sync, pkg, &list, remove, data) == -1) {
+ pmpkg_t *pkg = i->data;
+ if(_alpm_resolvedeps(db_local, dbs_sync, pkg, &resolved, remove, data) == -1) {
unresolvable = alpm_list_add(unresolvable, pkg);
}
- /* Else, [list] now additionally contains [pkg] and all of its
+ /* Else, [resolved] now additionally contains [pkg] and all of its
dependencies not already on the list */
}
@@ -462,50 +408,32 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
}
} else {
/* pm_errno is set by resolvedeps */
+ alpm_list_free(resolved);
ret = -1;
goto cleanup;
}
}
- /* Add all packages which were "pulled" (i.e. weren't already in the
- transaction) to the transaction in pmsyncpkg_t structures */
- for(i = list; i; i = i->next) {
- pmpkg_t *spkg = i->data;
- for(j = trans->packages; j; j = j->next) {
- if(_alpm_pkg_cmp(spkg, ((pmsyncpkg_t *) j->data)->pkg) == 0) {
- spkg = NULL;
- break;
- }
- }
- if (spkg == NULL) {
- continue;
- }
+ /* Unresolvable packages will be removed from the target list, so
+ we free the transaction specific field: pkg->removes */
+ for(i = unresolvable; i; i = i->next) {
+ pmpkg_t *pkg = i->data;
+ alpm_list_free(pkg->removes);
+ pkg->removes = NULL;
+ }
- pmsyncpkg_t *sync = _alpm_sync_new(PM_PKG_REASON_DEPEND, spkg, NULL);
- if(sync == NULL) {
- ret = -1;
- goto cleanup;
+ /* Set DEPEND reason for pulled packages */
+ for(i = resolved; i; i = i->next) {
+ pmpkg_t *pkg = i->data;
+ if(!_alpm_pkg_find(trans->packages, pkg->name)) {
+ pkg->reason = PM_PKG_REASON_DEPEND;
}
- trans->packages = alpm_list_add(trans->packages, sync);
- _alpm_log(PM_LOG_DEBUG, "adding package %s-%s to the transaction targets\n",
- alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
}
/* re-order w.r.t. dependencies */
- alpm_list_t *sortlist = _alpm_sortbydeps(list, 0);
- alpm_list_t *newpkgs = NULL;
- for(i = sortlist; i; i = i->next) {
- for(j = trans->packages; j; j = j->next) {
- pmsyncpkg_t *s = j->data;
- if(s->pkg == i->data) {
- newpkgs = alpm_list_add(newpkgs, s);
- break;
- }
- }
- }
- alpm_list_free(sortlist);
alpm_list_free(trans->packages);
- trans->packages = newpkgs;
+ trans->packages = _alpm_sortbydeps(resolved, 0);
+ alpm_list_free(resolved);
EVENT(trans, PM_TRANS_EVT_RESOLVEDEPS_DONE, NULL, NULL);
}
@@ -518,15 +446,15 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
/* 1. check for conflicts in the target list */
_alpm_log(PM_LOG_DEBUG, "check targets vs targets\n");
- deps = _alpm_innerconflicts(list);
+ deps = _alpm_innerconflicts(trans->packages);
for(i = deps; i; i = i->next) {
pmconflict_t *conflict = i->data;
- pmsyncpkg_t *rsync, *sync, *sync1, *sync2;
+ pmpkg_t *rsync, *sync, *sync1, *sync2;
/* have we already removed one of the conflicting targets? */
- sync1 = _alpm_sync_find(trans->packages, conflict->package1);
- sync2 = _alpm_sync_find(trans->packages, conflict->package2);
+ sync1 = _alpm_pkg_find(trans->packages, conflict->package1);
+ sync2 = _alpm_pkg_find(trans->packages, conflict->package2);
if(!sync1 || !sync2) {
continue;
}
@@ -537,10 +465,10 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
/* if sync1 provides sync2, we remove sync2 from the targets, and vice versa */
pmdepend_t *dep1 = _alpm_splitdep(conflict->package1);
pmdepend_t *dep2 = _alpm_splitdep(conflict->package2);
- if(alpm_depcmp(sync1->pkg, dep2)) {
+ if(alpm_depcmp(sync1, dep2)) {
rsync = sync2;
sync = sync1;
- } else if(alpm_depcmp(sync2->pkg, dep1)) {
+ } else if(alpm_depcmp(sync2, dep1)) {
rsync = sync1;
sync = sync2;
} else {
@@ -565,13 +493,10 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
/* Prints warning */
_alpm_log(PM_LOG_WARNING,
_("removing '%s' from target list because it conflicts with '%s'\n"),
- rsync->pkg->name, sync->pkg->name);
- void *vpkg;
- trans->packages = alpm_list_remove(trans->packages, rsync,
- syncpkg_cmp, &vpkg);
- pmsyncpkg_t *syncpkg = vpkg;
- list = alpm_list_remove(list, syncpkg->pkg, _alpm_pkg_cmp, NULL);
- _alpm_sync_free(syncpkg);
+ rsync->name, sync->name);
+ alpm_list_free(rsync->removes); /* rsync is not transaction target anymore */
+ rsync->removes = NULL;
+ trans->packages = alpm_list_remove(trans->packages, rsync, _alpm_pkg_cmp, NULL);
continue;
}
@@ -581,7 +506,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
/* 2. we check for target vs db conflicts (and resolve)*/
_alpm_log(PM_LOG_DEBUG, "check targets vs db and db vs targets\n");
- deps = _alpm_outerconflicts(db_local, list);
+ deps = _alpm_outerconflicts(db_local, trans->packages);
for(i = deps; i; i = i->next) {
pmconflict_t *conflict = i->data;
@@ -590,8 +515,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
we ask the user */
int found = 0;
for(j = trans->packages; j && !found; j = j->next) {
- pmsyncpkg_t *sync = j->data;
- if(_alpm_pkg_find(sync->removes, conflict->package2)) {
+ pmpkg_t *spkg = j->data;
+ if(_alpm_pkg_find(spkg->removes, conflict->package2)) {
found = 1;
}
}
@@ -602,7 +527,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
_alpm_log(PM_LOG_DEBUG, "package '%s' conflicts with '%s'\n",
conflict->package1, conflict->package2);
- pmsyncpkg_t *sync = _alpm_sync_find(trans->packages, conflict->package1);
+ pmpkg_t *sync = _alpm_pkg_find(trans->packages, conflict->package1);
pmpkg_t *local = _alpm_db_get_pkgfromcache(db_local, conflict->package2);
int doremove = 0;
QUESTION(trans, PM_TRANS_CONV_CONFLICT_PKG, conflict->package1,
@@ -636,14 +561,14 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
alpm_list_free(remove);
remove = NULL;
for(i = trans->packages; i; i = i->next) {
- pmsyncpkg_t *sync = i->data;
- for(j = sync->removes; j; j = j->next) {
+ pmpkg_t *spkg = i->data;
+ for(j = spkg->removes; j; j = j->next) {
remove = alpm_list_add(remove, j->data);
}
}
_alpm_log(PM_LOG_DEBUG, "checking dependencies\n");
- deps = alpm_checkdeps(_alpm_db_get_pkgcache(db_local), 1, remove, list);
+ deps = alpm_checkdeps(_alpm_db_get_pkgcache(db_local), 1, remove, trans->packages);
if(deps) {
pm_errno = PM_ERR_UNSATISFIED_DEPS;
ret = -1;
@@ -656,7 +581,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
goto cleanup;
}
}
- for(i = list; i; i = i->next) {
+ for(i = trans->packages; i; i = i->next) {
/* update download size field */
pmpkg_t *spkg = i->data;
if(compute_download_size(spkg) != 0) {
@@ -666,7 +591,6 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
}
cleanup:
- alpm_list_free(list);
alpm_list_free(remove);
alpm_list_free(unresolvable);
@@ -705,8 +629,7 @@ static int apply_deltas(pmtrans_t *trans)
const char *cachedir = _alpm_filecache_setup();
for(i = trans->packages; i; i = i->next) {
- pmsyncpkg_t *sync = i->data;
- pmpkg_t *spkg = sync->pkg;
+ pmpkg_t *spkg = i->data;
alpm_list_t *delta_path = spkg->delta_path;
alpm_list_t *dlts = NULL;
@@ -838,8 +761,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
off_t total_size = (off_t)0;
/* sum up the download size for each package and store total */
for(i = trans->packages; i; i = i->next) {
- pmsyncpkg_t *sync = i->data;
- pmpkg_t *spkg = sync->pkg;
+ pmpkg_t *spkg = i->data;
total_size += spkg->download_size;
}
handle->totaldlcb(total_size);
@@ -850,8 +772,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
pmdb_t *current = i->data;
for(j = trans->packages; j; j = j->next) {
- pmsyncpkg_t *sync = j->data;
- pmpkg_t *spkg = sync->pkg;
+ pmpkg_t *spkg = j->data;
pmdb_t *dbs = spkg->origin_data.db;
if(current == dbs) {
@@ -943,8 +864,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
errors = 0;
for(i = trans->packages; i; i = i->next) {
- pmsyncpkg_t *sync = i->data;
- pmpkg_t *spkg = sync->pkg;
+ pmpkg_t *spkg = i->data;
const char *filename = alpm_pkg_get_filename(spkg);
const char *md5sum = alpm_pkg_get_md5sum(spkg);
@@ -987,10 +907,10 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
/* adding targets */
for(i = trans->packages; i; i = i->next) {
- pmsyncpkg_t *sync = i->data;
+ pmpkg_t *spkg = i->data;
alpm_list_t *j;
/* remove transaction */
- for(j = sync->removes; j; j = j->next) {
+ for(j = spkg->removes; j; j = j->next) {
pmpkg_t *pkg = j->data;
if(!_alpm_pkg_find(tr_remove->packages, pkg->name)) {
if(_alpm_trans_addtarget(tr_remove, pkg->name) == -1) {
@@ -1000,7 +920,6 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
}
}
/* upgrade transaction */
- pmpkg_t *spkg = sync->pkg;
const char *fname;
char *fpath;
@@ -1019,8 +938,8 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
/* using alpm_list_last() is ok because addtarget() adds the new target at the
* end of the tr->packages list */
- spkg = alpm_list_last(tr_upgrade->packages)->data;
- spkg->reason = sync->newreason;
+ pmpkg_t *ipkg = alpm_list_last(tr_upgrade->packages)->data;
+ ipkg->reason = spkg->reason;
}
/* fileconflict check */
@@ -1076,38 +995,4 @@ error:
return(ret);
}
-pmsyncpkg_t *_alpm_sync_find(alpm_list_t *syncpkgs, const char* pkgname)
-{
- alpm_list_t *i;
- for(i = syncpkgs; i; i = i->next) {
- pmsyncpkg_t *syncpkg = i->data;
- if(!syncpkg) {
- continue;
- }
-
- pmpkg_t *pkg = alpm_sync_get_pkg(syncpkg);
- if(strcmp(alpm_pkg_get_name(pkg), pkgname) == 0) {
- return(syncpkg);
- }
- }
-
- return(NULL); /* not found */
-}
-
-pmpkg_t SYMEXPORT *alpm_sync_get_pkg(const pmsyncpkg_t *sync)
-{
- /* Sanity checks */
- ASSERT(sync != NULL, return(NULL));
-
- return sync->pkg;
-}
-
-alpm_list_t SYMEXPORT *alpm_sync_get_removes(const pmsyncpkg_t *sync)
-{
- /* Sanity checks */
- ASSERT(sync != NULL, return(NULL));
-
- return sync->removes;
-}
-
/* vim: set ts=2 sw=2 noet: */