mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-22 15:58:50 -05:00
pulled out conflict checkings from checkdeps() in its own function: checkconflicts()
This commit is contained in:
parent
83839f9513
commit
6dd2ecf4fa
@ -197,69 +197,33 @@ int add_prepare(pmtrans_t *trans, pmdb_t *db, PMList **data)
|
||||
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
|
||||
ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
|
||||
|
||||
if(data) {
|
||||
*data = NULL;
|
||||
}
|
||||
|
||||
/* Check dependencies
|
||||
*/
|
||||
if(!(trans->flags & PM_TRANS_FLAG_NODEPS)) {
|
||||
EVENT(trans, PM_TRANS_EVT_CHECKDEPS_START, NULL, NULL);
|
||||
|
||||
_alpm_log(PM_LOG_FLOW1, "looking for conflicts or unsatisfied dependencies");
|
||||
/* look for unsatisfied dependencies */
|
||||
_alpm_log(PM_LOG_FLOW1, "looking for unsatisfied dependencies");
|
||||
lp = checkdeps(db, trans->type, trans->packages);
|
||||
if(lp != NULL) {
|
||||
PMList *i;
|
||||
int errorout = 0;
|
||||
|
||||
/* look for unsatisfied dependencies */
|
||||
_alpm_log(PM_LOG_FLOW2, "looking for unsatisfied dependencies");
|
||||
for(i = lp; i; i = i->next) {
|
||||
pmdepmissing_t* miss = i->data;
|
||||
|
||||
if(miss->type == PM_DEP_TYPE_DEPEND || miss->type == PM_DEP_TYPE_REQUIRED) {
|
||||
if(!errorout) {
|
||||
errorout = 1;
|
||||
}
|
||||
if(data) {
|
||||
if((miss = (pmdepmissing_t *)malloc(sizeof(pmdepmissing_t))) == NULL) {
|
||||
FREELIST(lp);
|
||||
FREELIST(*data);
|
||||
RET_ERR(PM_ERR_MEMORY, -1);
|
||||
}
|
||||
*miss = *(pmdepmissing_t*)i->data;
|
||||
*data = pm_list_add(*data, miss);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(errorout) {
|
||||
if(data) {
|
||||
*data = lp;
|
||||
} else {
|
||||
FREELIST(lp);
|
||||
RET_ERR(PM_ERR_UNSATISFIED_DEPS, -1);
|
||||
}
|
||||
RET_ERR(PM_ERR_UNSATISFIED_DEPS, -1);
|
||||
}
|
||||
|
||||
/* no unsatisfied deps, so look for conflicts */
|
||||
_alpm_log(PM_LOG_FLOW2, "looking for conflicts");
|
||||
for(i = lp; i; i = i->next) {
|
||||
pmdepmissing_t* miss = (pmdepmissing_t *)i->data;
|
||||
if(miss->type == PM_DEP_TYPE_CONFLICT) {
|
||||
if(!errorout) {
|
||||
errorout = 1;
|
||||
}
|
||||
if(data) {
|
||||
if((miss = (pmdepmissing_t *)malloc(sizeof(pmdepmissing_t))) == NULL) {
|
||||
FREELIST(lp);
|
||||
FREELIST(*data);
|
||||
RET_ERR(PM_ERR_MEMORY, -1);
|
||||
}
|
||||
*miss = *(pmdepmissing_t*)i->data;
|
||||
*data = pm_list_add(*data, miss);
|
||||
}
|
||||
}
|
||||
}
|
||||
FREELIST(lp);
|
||||
if(errorout) {
|
||||
RET_ERR(PM_ERR_CONFLICTING_DEPS, -1);
|
||||
/* no unsatisfied deps, so look for conflicts */
|
||||
_alpm_log(PM_LOG_FLOW1, "looking for conflicts");
|
||||
lp = checkconflicts(db, trans->packages);
|
||||
if(lp != NULL) {
|
||||
if(data) {
|
||||
*data = lp;
|
||||
} else {
|
||||
FREELIST(lp);
|
||||
}
|
||||
RET_ERR(PM_ERR_CONFLICTING_DEPS, -1);
|
||||
}
|
||||
|
||||
/* re-order w.r.t. dependencies */
|
||||
@ -284,6 +248,8 @@ int add_prepare(pmtrans_t *trans, pmdb_t *db, PMList **data)
|
||||
if(lp != NULL) {
|
||||
if(data) {
|
||||
*data = lp;
|
||||
} else {
|
||||
FREELIST(lp);
|
||||
}
|
||||
FREELIST(skiplist);
|
||||
RET_ERR(PM_ERR_FILE_CONFLICTS, -1);
|
||||
|
@ -29,8 +29,180 @@
|
||||
#include <sys/stat.h>
|
||||
/* pacman */
|
||||
#include "util.h"
|
||||
#include "log.h"
|
||||
#include "cache.h"
|
||||
#include "deps.h"
|
||||
#include "conflict.h"
|
||||
|
||||
/* Returns a PMList* of missing_t pointers.
|
||||
*
|
||||
* conflicts are always name only
|
||||
*/
|
||||
PMList *checkconflicts(pmdb_t *db, PMList *packages)
|
||||
{
|
||||
pmpkg_t *info = NULL;
|
||||
PMList *i, *j, *k;
|
||||
PMList *baddeps = NULL;
|
||||
pmdepmissing_t *miss = NULL;
|
||||
|
||||
if(db == NULL) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
for(i = packages; i; i = i->next) {
|
||||
pmpkg_t *tp = i->data;
|
||||
if(tp == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for(j = tp->conflicts; j; j = j->next) {
|
||||
if(!strcmp(tp->name, j->data)) {
|
||||
/* a package cannot conflict with itself -- that's just not nice */
|
||||
continue;
|
||||
}
|
||||
/* CHECK 1: check targets against database */
|
||||
for(k = db_get_pkgcache(db); k; k = k->next) {
|
||||
pmpkg_t *dp = (pmpkg_t *)k->data;
|
||||
if(!strcmp(dp->name, tp->name)) {
|
||||
/* a package cannot conflict with itself -- that's just not nice */
|
||||
continue;
|
||||
}
|
||||
if(!strcmp(j->data, dp->name)) {
|
||||
/* conflict */
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, dp->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: targs vs db: adding %s as a conflict for %s",
|
||||
dp->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
} else {
|
||||
/* see if dp provides something in tp's conflict list */
|
||||
PMList *m;
|
||||
for(m = dp->provides; m; m = m->next) {
|
||||
if(!strcmp(m->data, j->data)) {
|
||||
/* confict */
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, dp->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: targs vs db: adding %s as a conflict for %s",
|
||||
dp->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* CHECK 2: check targets against targets */
|
||||
for(k = packages; k; k = k->next) {
|
||||
pmpkg_t *otp = (pmpkg_t *)k->data;
|
||||
if(!strcmp(otp->name, tp->name)) {
|
||||
/* a package cannot conflict with itself -- that's just not nice */
|
||||
continue;
|
||||
}
|
||||
if(!strcmp(otp->name, (char *)j->data)) {
|
||||
/* otp is listed in tp's conflict list */
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, otp->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: targs vs targs: adding %s as a conflict for %s",
|
||||
otp->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
} else {
|
||||
/* see if otp provides something in tp's conflict list */
|
||||
PMList *m;
|
||||
for(m = otp->provides; m; m = m->next) {
|
||||
if(!strcmp(m->data, j->data)) {
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, otp->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: targs vs targs: adding %s as a conflict for %s",
|
||||
otp->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* CHECK 3: check database against targets */
|
||||
for(k = db_get_pkgcache(db); k; k = k->next) {
|
||||
info = k->data;
|
||||
if(!strcmp(info->name, tp->name)) {
|
||||
/* a package cannot conflict with itself -- that's just not nice */
|
||||
continue;
|
||||
}
|
||||
for(j = info->conflicts; j; j = j->next) {
|
||||
if(!strcmp((char *)j->data, tp->name)) {
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, info->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: db vs targs: adding %s as a conflict for %s",
|
||||
info->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
} else {
|
||||
/* see if the db package conflicts with something we provide */
|
||||
PMList *m;
|
||||
for(m = info->conflicts; m; m = m->next) {
|
||||
PMList *n;
|
||||
for(n = tp->provides; n; n = n->next) {
|
||||
if(!strcmp(m->data, n->data)) {
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, info->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: db vs targs: adding %s as a conflict for %s",
|
||||
info->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(baddeps);
|
||||
}
|
||||
|
||||
PMList *db_find_conflicts(pmdb_t *db, PMList *targets, char *root, PMList **skip_list)
|
||||
{
|
||||
PMList *i, *j, *k;
|
||||
|
@ -23,6 +23,7 @@
|
||||
|
||||
#include "db.h"
|
||||
|
||||
PMList *checkconflicts(pmdb_t *db, PMList *packages);
|
||||
PMList *db_find_conflicts(pmdb_t *db, PMList *targets, char *root, PMList **skip_list);
|
||||
|
||||
#endif /* _ALPM_CONFLICT_H */
|
||||
|
@ -37,6 +37,25 @@
|
||||
|
||||
extern pmhandle_t *handle;
|
||||
|
||||
static pmdepmissing_t *depmissing_new(const char *target, unsigned char type, unsigned char depmod,
|
||||
const char *depname, const char *depversion)
|
||||
{
|
||||
pmdepmissing_t *miss;
|
||||
|
||||
miss = (pmdepmissing_t *)malloc(sizeof(pmdepmissing_t));
|
||||
if(miss == NULL) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
STRNCPY(miss->target, target, PKG_NAME_LEN);
|
||||
miss->type = type;
|
||||
miss->depend.mod = depmod;
|
||||
STRNCPY(miss->depend.name, depname, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.version, depversion, PKG_VERSION_LEN);
|
||||
|
||||
return(miss);
|
||||
}
|
||||
|
||||
/* Re-order a list of target packages with respect to their dependencies.
|
||||
*
|
||||
* Example (PM_TRANS_TYPE_ADD):
|
||||
@ -121,13 +140,11 @@ PMList *sortbydeps(PMList *targets, int mode)
|
||||
|
||||
/* Returns a PMList* of missing_t pointers.
|
||||
*
|
||||
* conflicts are always name only, but dependencies can include versions
|
||||
* with depmod operators.
|
||||
* dependencies can include versions with depmod operators.
|
||||
*
|
||||
*/
|
||||
PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages)
|
||||
{
|
||||
pmpkg_t *info = NULL;
|
||||
pmdepend_t depend;
|
||||
PMList *i, *j, *k;
|
||||
int cmp;
|
||||
@ -218,158 +235,13 @@ PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages)
|
||||
}
|
||||
}
|
||||
if(op == PM_TRANS_TYPE_ADD || op == PM_TRANS_TYPE_UPGRADE) {
|
||||
/* DEPENDENCIES -- look for unsatisfied dependencies */
|
||||
for(i = packages; i; i = i->next) {
|
||||
pmpkg_t *tp = i->data;
|
||||
if(tp == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* CONFLICTS */
|
||||
for(j = tp->conflicts; j; j = j->next) {
|
||||
if(!strcmp(tp->name, j->data)) {
|
||||
/* a package cannot conflict with itself -- that's just not nice */
|
||||
continue;
|
||||
}
|
||||
/* CHECK 1: check targets against database */
|
||||
for(k = db_get_pkgcache(db); k; k = k->next) {
|
||||
pmpkg_t *dp = (pmpkg_t *)k->data;
|
||||
if(!strcmp(dp->name, tp->name)) {
|
||||
/* a package cannot conflict with itself -- that's just not nice */
|
||||
continue;
|
||||
}
|
||||
if(!strcmp(j->data, dp->name)) {
|
||||
/* conflict */
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, dp->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: targs vs db: adding %s as a conflict for %s",
|
||||
dp->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
} else {
|
||||
/* see if dp provides something in tp's conflict list */
|
||||
PMList *m;
|
||||
for(m = dp->provides; m; m = m->next) {
|
||||
if(!strcmp(m->data, j->data)) {
|
||||
/* confict */
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, dp->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: targs vs db: adding %s as a conflict for %s",
|
||||
dp->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* CHECK 2: check targets against targets */
|
||||
for(k = packages; k; k = k->next) {
|
||||
pmpkg_t *otp = (pmpkg_t *)k->data;
|
||||
if(!strcmp(otp->name, tp->name)) {
|
||||
/* a package cannot conflict with itself -- that's just not nice */
|
||||
continue;
|
||||
}
|
||||
if(!strcmp(otp->name, (char *)j->data)) {
|
||||
/* otp is listed in tp's conflict list */
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, otp->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: targs vs targs: adding %s as a conflict for %s",
|
||||
otp->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
} else {
|
||||
/* see if otp provides something in tp's conflict list */
|
||||
PMList *m;
|
||||
for(m = otp->provides; m; m = m->next) {
|
||||
if(!strcmp(m->data, j->data)) {
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, otp->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: targs vs targs: adding %s as a conflict for %s",
|
||||
otp->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* CHECK 3: check database against targets */
|
||||
for(k = db_get_pkgcache(db); k; k = k->next) {
|
||||
info = k->data;
|
||||
if(!strcmp(info->name, tp->name)) {
|
||||
/* a package cannot conflict with itself -- that's just not nice */
|
||||
continue;
|
||||
}
|
||||
for(j = info->conflicts; j; j = j->next) {
|
||||
if(!strcmp((char *)j->data, tp->name)) {
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, info->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: db vs targs: adding %s as a conflict for %s",
|
||||
info->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
} else {
|
||||
/* see if the db package conflicts with something we provide */
|
||||
PMList *m;
|
||||
for(m = info->conflicts; m; m = m->next) {
|
||||
PMList *n;
|
||||
for(n = tp->provides; n; n = n->next) {
|
||||
if(!strcmp(m->data, n->data)) {
|
||||
MALLOC(miss, sizeof(pmdepmissing_t));
|
||||
miss->type = PM_DEP_TYPE_CONFLICT;
|
||||
miss->depend.mod = PM_DEP_MOD_ANY;
|
||||
miss->depend.version[0] = '\0';
|
||||
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
|
||||
STRNCPY(miss->depend.name, info->name, PKG_NAME_LEN);
|
||||
if(!pm_list_is_in(miss, baddeps)) {
|
||||
_alpm_log(PM_LOG_FLOW2, "checkdeps: db vs targs: adding %s as a conflict for %s",
|
||||
info->name, tp->name);
|
||||
baddeps = pm_list_add(baddeps, miss);
|
||||
} else {
|
||||
FREE(miss);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* DEPENDENCIES -- look for unsatisfied dependencies */
|
||||
for(j = tp->depends; j; j = j->next) {
|
||||
/* split into name/version pairs */
|
||||
splitdep((char *)j->data, &depend);
|
||||
@ -650,6 +522,8 @@ int resolvedeps(pmdb_t *local, PMList *dbs_sync, pmpkg_t *syncpkg, PMList *list,
|
||||
for(i = deps; i; i = i->next) {
|
||||
int found = 0;
|
||||
pmdepmissing_t *miss = i->data;
|
||||
pmpkg_t *sync = NULL;
|
||||
int provisio_match = 0;
|
||||
|
||||
/* XXX: conflicts are now treated specially in the _add and _sync functions */
|
||||
|
||||
@ -658,106 +532,102 @@ int resolvedeps(pmdb_t *local, PMList *dbs_sync, pmpkg_t *syncpkg, PMList *list,
|
||||
RET_ERR(???, -1);
|
||||
} else*/
|
||||
|
||||
if(miss->type == PM_DEP_TYPE_DEPEND) {
|
||||
pmpkg_t *sync = NULL;
|
||||
int provisio_match = 0;
|
||||
|
||||
/* check if one of the packages in *list already provides this dependency */
|
||||
for(j = list; j; j = j->next) {
|
||||
pmpkg_t *sp = (pmpkg_t*)j->data;
|
||||
for(k = sp->provides; k; k = k->next) {
|
||||
if(!strcmp(miss->depend.name, k->data)) {
|
||||
_alpm_log(PM_LOG_DEBUG, "%s provides dependency %s -- skipping", sp->name, miss->depend.name);
|
||||
provisio_match = 1;
|
||||
}
|
||||
/* check if one of the packages in *list already provides this dependency */
|
||||
for(j = list; j; j = j->next) {
|
||||
pmpkg_t *sp = (pmpkg_t*)j->data;
|
||||
for(k = sp->provides; k; k = k->next) {
|
||||
if(!strcmp(miss->depend.name, k->data)) {
|
||||
_alpm_log(PM_LOG_DEBUG, "%s provides dependency %s -- skipping", sp->name, miss->depend.name);
|
||||
provisio_match = 1;
|
||||
}
|
||||
}
|
||||
if(provisio_match) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if(provisio_match) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* find the package in one of the repositories */
|
||||
/* check literals */
|
||||
for(j = dbs_sync; !sync && j; j = j->next) {
|
||||
PMList *k;
|
||||
pmdb_t *dbs = j->data;
|
||||
for(k = db_get_pkgcache(dbs); !sync && k; k = k->next) {
|
||||
pmpkg_t *pkg = k->data;
|
||||
if(!strcmp(miss->depend.name, pkg->name)) {
|
||||
sync = pkg;
|
||||
}
|
||||
/* find the package in one of the repositories */
|
||||
/* check literals */
|
||||
for(j = dbs_sync; !sync && j; j = j->next) {
|
||||
PMList *k;
|
||||
pmdb_t *dbs = j->data;
|
||||
for(k = db_get_pkgcache(dbs); !sync && k; k = k->next) {
|
||||
pmpkg_t *pkg = k->data;
|
||||
if(!strcmp(miss->depend.name, pkg->name)) {
|
||||
sync = pkg;
|
||||
}
|
||||
}
|
||||
/* check provides */
|
||||
for(j = dbs_sync; !sync && j; j = j->next) {
|
||||
PMList *provides;
|
||||
pmdb_t *dbs = j->data;
|
||||
provides = _alpm_db_whatprovides(dbs, miss->depend.name);
|
||||
if(provides) {
|
||||
sync = provides->data;
|
||||
}
|
||||
FREELISTPTR(provides);
|
||||
}
|
||||
/* check provides */
|
||||
for(j = dbs_sync; !sync && j; j = j->next) {
|
||||
PMList *provides;
|
||||
pmdb_t *dbs = j->data;
|
||||
provides = _alpm_db_whatprovides(dbs, miss->depend.name);
|
||||
if(provides) {
|
||||
sync = provides->data;
|
||||
}
|
||||
if(sync == NULL) {
|
||||
_alpm_log(PM_LOG_ERROR, "cannot resolve dependencies for \"%s\" (\"%s\" is not in the package set)",
|
||||
miss->target, miss->depend.name);
|
||||
pm_errno = PM_ERR_UNRESOLVABLE_DEPS;
|
||||
goto error;
|
||||
FREELISTPTR(provides);
|
||||
}
|
||||
if(sync == NULL) {
|
||||
_alpm_log(PM_LOG_ERROR, "cannot resolve dependencies for \"%s\" (\"%s\" is not in the package set)",
|
||||
miss->target, miss->depend.name);
|
||||
pm_errno = PM_ERR_UNRESOLVABLE_DEPS;
|
||||
goto error;
|
||||
}
|
||||
found = 0;
|
||||
for(j = list; j && !found; j = j->next) {
|
||||
pmpkg_t *tmp = j->data;
|
||||
if(tmp && !strcmp(tmp->name, sync->name)) {
|
||||
_alpm_log(PM_LOG_DEBUG, "dependency %s is already in the target list - skipping",
|
||||
sync->name);
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
if(found) {
|
||||
/* this dep is already in the target list */
|
||||
continue;
|
||||
}
|
||||
|
||||
found = 0;
|
||||
for(j = trail; j; j = j->next) {
|
||||
pmpkg_t *tmp = j->data;
|
||||
if(tmp && !strcmp(tmp->name, sync->name)) {
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
/* check pmo_ignorepkg and pmo_s_ignore to make sure we haven't pulled in
|
||||
* something we're not supposed to.
|
||||
*/
|
||||
int usedep = 1;
|
||||
found = 0;
|
||||
for(j = list; j && !found; j = j->next) {
|
||||
pmpkg_t *tmp = j->data;
|
||||
if(tmp && !strcmp(tmp->name, sync->name)) {
|
||||
_alpm_log(PM_LOG_DEBUG, "dependency %s is already in the target list - skipping",
|
||||
sync->name);
|
||||
for(j = handle->ignorepkg; j && !found; j = j->next) {
|
||||
if(!strcmp(j->data, sync->name)) {
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
if(found) {
|
||||
/* this dep is already in the target list */
|
||||
continue;
|
||||
pmpkg_t *dummypkg = pkg_new(miss->target, NULL);
|
||||
QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, dummypkg, sync, NULL, &usedep);
|
||||
FREEPKG(dummypkg);
|
||||
}
|
||||
|
||||
found = 0;
|
||||
for(j = trail; j; j = j->next) {
|
||||
pmpkg_t *tmp = j->data;
|
||||
if(tmp && !strcmp(tmp->name, sync->name)) {
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
/* check pmo_ignorepkg and pmo_s_ignore to make sure we haven't pulled in
|
||||
* something we're not supposed to.
|
||||
*/
|
||||
int usedep = 1;
|
||||
found = 0;
|
||||
for(j = handle->ignorepkg; j && !found; j = j->next) {
|
||||
if(!strcmp(j->data, sync->name)) {
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
if(found) {
|
||||
pmpkg_t *dummypkg = pkg_new(miss->target, NULL);
|
||||
QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, dummypkg, sync, NULL, &usedep);
|
||||
FREEPKG(dummypkg);
|
||||
}
|
||||
if(usedep) {
|
||||
trail = pm_list_add(trail, sync);
|
||||
if(resolvedeps(local, dbs_sync, sync, list, trail, trans)) {
|
||||
goto error;
|
||||
}
|
||||
_alpm_log(PM_LOG_DEBUG, "pulling dependency %s (needed by %s)",
|
||||
sync->name, syncpkg->name);
|
||||
list = pm_list_add(list, sync);
|
||||
} else {
|
||||
_alpm_log(PM_LOG_ERROR, "cannot resolve dependencies for \"%s\"", miss->target);
|
||||
pm_errno = PM_ERR_UNRESOLVABLE_DEPS;
|
||||
if(usedep) {
|
||||
trail = pm_list_add(trail, sync);
|
||||
if(resolvedeps(local, dbs_sync, sync, list, trail, trans)) {
|
||||
goto error;
|
||||
}
|
||||
_alpm_log(PM_LOG_DEBUG, "pulling dependency %s (needed by %s)",
|
||||
sync->name, syncpkg->name);
|
||||
list = pm_list_add(list, sync);
|
||||
} else {
|
||||
/* cycle detected -- skip it */
|
||||
_alpm_log(PM_LOG_DEBUG, "dependency cycle detected: %s", sync->name);
|
||||
_alpm_log(PM_LOG_ERROR, "cannot resolve dependencies for \"%s\"", miss->target);
|
||||
pm_errno = PM_ERR_UNRESOLVABLE_DEPS;
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
/* cycle detected -- skip it */
|
||||
_alpm_log(PM_LOG_DEBUG, "dependency cycle detected: %s", sync->name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -83,7 +83,8 @@ int remove_prepare(pmtrans_t *trans, pmdb_t *db, PMList **data)
|
||||
EVENT(trans, PM_TRANS_EVT_CHECKDEPS_START, NULL, NULL);
|
||||
|
||||
_alpm_log(PM_LOG_FLOW1, "looking for unsatisfied dependencies");
|
||||
if((lp = checkdeps(db, trans->type, trans->packages)) != NULL) {
|
||||
lp = checkdeps(db, trans->type, trans->packages);
|
||||
if(lp != NULL) {
|
||||
if(trans->flags & PM_TRANS_FLAG_CASCADE) {
|
||||
while(lp) {
|
||||
PMList *j;
|
||||
@ -101,6 +102,8 @@ int remove_prepare(pmtrans_t *trans, pmdb_t *db, PMList **data)
|
||||
} else {
|
||||
if(data) {
|
||||
*data = lp;
|
||||
} else {
|
||||
FREELIST(lp);
|
||||
}
|
||||
RET_ERR(PM_ERR_UNSATISFIED_DEPS, -1);
|
||||
}
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "db.h"
|
||||
#include "cache.h"
|
||||
#include "deps.h"
|
||||
#include "conflict.h"
|
||||
#include "trans.h"
|
||||
#include "sync.h"
|
||||
#include "versioncmp.h"
|
||||
@ -196,6 +197,7 @@ int sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync)
|
||||
}
|
||||
|
||||
/* match installed packages with the sync dbs and compare versions */
|
||||
_alpm_log(PM_LOG_FLOW1, "checking for package upgrades");
|
||||
for(i = db_get_pkgcache(db_local); i; i = i->next) {
|
||||
int cmp;
|
||||
int replace = 0;
|
||||
@ -402,44 +404,29 @@ int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **
|
||||
|
||||
/* check for inter-conflicts and whatnot */
|
||||
EVENT(trans, PM_TRANS_EVT_INTERCONFLICTS_START, NULL, NULL);
|
||||
|
||||
_alpm_log(PM_LOG_FLOW1, "looking for unresolvable dependencies");
|
||||
deps = checkdeps(db_local, PM_TRANS_TYPE_UPGRADE, list);
|
||||
if(deps) {
|
||||
if(data) {
|
||||
*data = deps;
|
||||
deps = NULL;
|
||||
}
|
||||
pm_errno = PM_ERR_UNSATISFIED_DEPS;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* no unresolvable deps, so look for conflicts */
|
||||
_alpm_log(PM_LOG_FLOW1, "looking for conflicts");
|
||||
deps = checkconflicts(db_local, list);
|
||||
if(deps) {
|
||||
int errorout = 0;
|
||||
|
||||
_alpm_log(PM_LOG_FLOW1, "looking for unresolvable dependencies");
|
||||
for(i = deps; i; i = i->next) {
|
||||
pmdepmissing_t *miss = i->data;
|
||||
if(miss->type == PM_DEP_TYPE_DEPEND || miss->type == PM_DEP_TYPE_REQUIRED) {
|
||||
if(!errorout) {
|
||||
errorout = 1;
|
||||
}
|
||||
if(data) {
|
||||
if((miss = (pmdepmissing_t *)malloc(sizeof(pmdepmissing_t))) == NULL) {
|
||||
FREELIST(*data);
|
||||
pm_errno = PM_ERR_MEMORY;
|
||||
goto error;
|
||||
}
|
||||
*miss = *(pmdepmissing_t *)i->data;
|
||||
*data = pm_list_add(*data, miss);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(errorout) {
|
||||
pm_errno = PM_ERR_UNSATISFIED_DEPS;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* no unresolvable deps, so look for conflicts */
|
||||
_alpm_log(PM_LOG_FLOW1, "looking for conflicts");
|
||||
for(i = deps; i && !errorout; i = i->next) {
|
||||
pmdepmissing_t *miss = i->data;
|
||||
PMList *k;
|
||||
int found = 0;
|
||||
|
||||
if(miss->type != PM_DEP_TYPE_CONFLICT) {
|
||||
continue;
|
||||
}
|
||||
|
||||
_alpm_log(PM_LOG_FLOW2, "package %s is conflicting with %s",
|
||||
miss->target, miss->depend.name);
|
||||
|
||||
@ -634,6 +621,7 @@ int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **
|
||||
pm_errno = PM_ERR_UNSATISFIED_DEPS;
|
||||
goto error;
|
||||
}
|
||||
FREELIST(deps);
|
||||
}
|
||||
FREELISTPTR(list);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user