index : pacman | |
Archlinux32 fork of pacman | gitolite user |
summaryrefslogtreecommitdiff |
-rw-r--r-- | lib/libalpm/sync.c | 251 |
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: */ |