Turned pmdepmissing_t into an opaque structure

This commit is contained in:
Aurelien Foret 2005-03-29 20:31:03 +00:00
parent e5389ddc62
commit 95ea99e197
5 changed files with 103 additions and 71 deletions

View File

@ -150,14 +150,13 @@ int add_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
for(j = lp; j; j = j->next) {
pmdepmissing_t* miss = j->data;
if(miss->type == PM_DEP_DEPEND || miss->type == PM_DEP_REQUIRED) {
if(miss->type == PM_DEP_TYPE_DEPEND || miss->type == PM_DEP_TYPE_REQUIRED) {
if(!errorout) {
errorout = 1;
}
if((miss = (pmdepmissing_t *)malloc(sizeof(pmdepmissing_t))) == NULL) {
FREELIST(lp);
/* ORE, needed or not ?
FREELIST(*data);*/
FREELIST(*data);
RET_ERR(PM_ERR_MEMORY, -1);
}
*miss = *(pmdepmissing_t*)j->data;
@ -173,7 +172,7 @@ int add_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
_alpm_log(PM_LOG_FLOW2, "looking for conflicts");
for(j = lp; j; j = j->next) {
pmdepmissing_t* miss = (pmdepmissing_t *)j->data;
if(miss->type == PM_DEP_CONFLICT) {
if(miss->type == PM_DEP_TYPE_CONFLICT) {
if(!errorout) {
errorout = 1;
}

View File

@ -564,6 +564,31 @@ int alpm_trans_release()
return(0);
}
/*
* Dependencies
*/
void *alpm_dep_getinfo(pmdepmissing_t *miss, unsigned char parm)
{
void *data;
/* Sanity checks */
ASSERT(miss != NULL, return(NULL));
switch(parm) {
case PM_DEP_TARGET: data = (void *)(int)miss->target; break;
case PM_DEP_TYPE: data = (void *)(int)miss->type; break;
case PM_DEP_MOD: data = (void *)(int)miss->depend.mod; break;
case PM_DEP_NAME: data = miss->depend.name; break;
case PM_DEP_VERSION: data = miss->depend.version; break;
default:
data = NULL;
break;
}
return(data);
}
/*
* Log facilities
*/

View File

@ -38,9 +38,7 @@ typedef struct __pmpkg_t PM_PKG;
typedef struct __pmgrp_t PM_GRP;
typedef struct __pmsync_t PM_SYNC;
typedef struct __pmtrans_t PM_TRANS;
/* ORE
typedef struct __pmdepend_t PM_DEP;
typedef struct __pmdepmissing_t PM_DEPMISS; */
typedef struct __pmdepmissing_t PM_DEPMISS;
/*
* Library
@ -226,33 +224,6 @@ enum {
PM_TRANS_TARGETS
};
/* Dependencies */
enum {
PM_DEP_ANY = 1,
PM_DEP_EQ,
PM_DEP_GE,
PM_DEP_LE
};
enum {
PM_DEP_DEPEND = 1,
PM_DEP_REQUIRED,
PM_DEP_CONFLICT
};
/* ORE
to be deprecated in favor of PM_DEP and PM_DEPMISS (opaque) */
typedef struct __pmdepend_t {
unsigned short mod;
char name[256];
char version[64];
} pmdepend_t;
typedef struct __pmdepmissing_t {
unsigned char type;
char target[256];
pmdepend_t depend;
} pmdepmissing_t;
void *alpm_trans_getinfo(unsigned char parm);
int alpm_trans_init(unsigned char type, unsigned char flags, alpm_trans_cb cb);
int alpm_trans_addtarget(char *target);
@ -260,6 +231,32 @@ int alpm_trans_prepare(PM_LIST **data);
int alpm_trans_commit();
int alpm_trans_release();
/*
* Dependencies
*/
enum {
PM_DEP_MOD_ANY = 1,
PM_DEP_MOD_EQ,
PM_DEP_MOD_GE,
PM_DEP_MOD_LE
};
enum {
PM_DEP_TYPE_DEPEND = 1,
PM_DEP_TYPE_REQUIRED,
PM_DEP_TYPE_CONFLICT
};
/* Dependencies parameters */
enum {
PM_DEP_TARGET = 1,
PM_DEP_TYPE,
PM_DEP_MOD,
PM_DEP_NAME,
PM_DEP_VERSION
};
void *alpm_dep_getinfo(PM_DEPMISS *miss, unsigned char parm);
/*
* PM_LIST helpers
*/

View File

@ -126,7 +126,7 @@ PMList *sortbydeps(PMList *targets, int mode)
* with depmod operators.
*
*/
PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages)
{
pmpkg_t *info = NULL;
pmdepend_t depend;
@ -186,7 +186,7 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
FREELISTPTR(provides);
}
found = 0;
if(depend.mod == PM_DEP_ANY) {
if(depend.mod == PM_DEP_MOD_ANY) {
found = 1;
} else {
/* note that we use the version from the NEW package in the check */
@ -198,15 +198,15 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
}
cmp = rpmvercmp(ver, depend.version);
switch(depend.mod) {
case PM_DEP_EQ: found = (cmp == 0); break;
case PM_DEP_GE: found = (cmp >= 0); break;
case PM_DEP_LE: found = (cmp <= 0); break;
case PM_DEP_MOD_EQ: found = (cmp == 0); break;
case PM_DEP_MOD_GE: found = (cmp >= 0); break;
case PM_DEP_MOD_LE: found = (cmp <= 0); break;
}
FREE(ver);
}
if(!found) {
MALLOC(miss, sizeof(pmdepmissing_t));
miss->type = PM_DEP_REQUIRED;
miss->type = PM_DEP_TYPE_REQUIRED;
miss->depend.mod = depend.mod;
STRNCPY(miss->target, p->name, PKG_NAME_LEN);
STRNCPY(miss->depend.name, depend.name, PKG_NAME_LEN);
@ -234,8 +234,8 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
pmpkg_t *dp = (pmpkg_t *)k->data;
if(!strcmp(j->data, dp->name)) {
MALLOC(miss, sizeof(pmdepmissing_t));
miss->type = PM_DEP_CONFLICT;
miss->depend.mod = PM_DEP_ANY;
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);
@ -249,8 +249,8 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
pmpkg_t *a = (pmpkg_t *)k->data;
if(!strcmp(a->name, (char *)j->data)) {
MALLOC(miss, sizeof(pmdepmissing_t));
miss->type = PM_DEP_CONFLICT;
miss->depend.mod = PM_DEP_ANY;
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, a->name, PKG_NAME_LEN);
@ -266,8 +266,8 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
for(j = info->conflicts; j; j = j->next) {
if(!strcmp((char *)j->data, tp->name)) {
MALLOC(miss, sizeof(pmdepmissing_t));
miss->type = PM_DEP_CONFLICT;
miss->depend.mod = PM_DEP_ANY;
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);
@ -292,8 +292,8 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
}
// we treat this just like a conflict
MALLOC(miss, sizeof(pmdepmissing_t));
miss->type = CONFLICT;
miss->depend.mod = PM_DEP_ANY;
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, k->data, PKG_NAME_LEN);
@ -314,7 +314,7 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
for(k = db_get_pkgcache(db); k && !found; k = k->next) {
pmpkg_t *p = (pmpkg_t *)k->data;
if(!strcmp(p->name, depend.name)) {
if(depend.mod == PM_DEP_ANY) {
if(depend.mod == PM_DEP_MOD_ANY) {
/* accept any version */
found = 1;
} else {
@ -329,9 +329,9 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
}
cmp = rpmvercmp(ver, depend.version);
switch(depend.mod) {
case PM_DEP_EQ: found = (cmp == 0); break;
case PM_DEP_GE: found = (cmp >= 0); break;
case PM_DEP_LE: found = (cmp <= 0); break;
case PM_DEP_MOD_EQ: found = (cmp == 0); break;
case PM_DEP_MOD_GE: found = (cmp >= 0); break;
case PM_DEP_MOD_LE: found = (cmp <= 0); break;
}
FREE(ver);
}
@ -342,7 +342,7 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
pmpkg_t *p = (pmpkg_t *)k->data;
/* see if the package names match OR if p provides depend.name */
if(!strcmp(p->name, depend.name) || pm_list_is_strin(depend.name, p->provides)) {
if(depend.mod == PM_DEP_ANY) {
if(depend.mod == PM_DEP_MOD_ANY) {
/* accept any version */
found = 1;
} else {
@ -357,9 +357,9 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
}
cmp = rpmvercmp(ver, depend.version);
switch(depend.mod) {
case PM_DEP_EQ: found = (cmp == 0); break;
case PM_DEP_GE: found = (cmp >= 0); break;
case PM_DEP_LE: found = (cmp <= 0); break;
case PM_DEP_MOD_EQ: found = (cmp == 0); break;
case PM_DEP_MOD_GE: found = (cmp >= 0); break;
case PM_DEP_MOD_LE: found = (cmp <= 0); break;
}
FREE(ver);
}
@ -378,7 +378,7 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
FREELISTPTR(k);
continue;
}
if(depend.mod == PM_DEP_ANY) {
if(depend.mod == PM_DEP_MOD_ANY) {
/* accept any version */
found = 1;
} else {
@ -393,9 +393,9 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
}
cmp = rpmvercmp(ver, depend.version);
switch(depend.mod) {
case PM_DEP_EQ: found = (cmp == 0); break;
case PM_DEP_GE: found = (cmp >= 0); break;
case PM_DEP_LE: found = (cmp <= 0); break;
case PM_DEP_MOD_EQ: found = (cmp == 0); break;
case PM_DEP_MOD_GE: found = (cmp >= 0); break;
case PM_DEP_MOD_LE: found = (cmp <= 0); break;
}
FREE(ver);
}
@ -405,7 +405,7 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
/* else if still not found... */
if(!found) {
MALLOC(miss, sizeof(pmdepmissing_t));
miss->type = PM_DEP_DEPEND;
miss->type = PM_DEP_TYPE_DEPEND;
miss->depend.mod = depend.mod;
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
STRNCPY(miss->depend.name, depend.name, PKG_NAME_LEN);
@ -427,8 +427,8 @@ PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages)
for(j = tp->requiredby; j; j = j->next) {
if(!pm_list_is_strin((char *)j->data, packages)) {
MALLOC(miss, sizeof(pmdepmissing_t));
miss->type = PM_DEP_REQUIRED;
miss->depend.mod = PM_DEP_ANY;
miss->type = PM_DEP_TYPE_REQUIRED;
miss->depend.mod = PM_DEP_MOD_ANY;
miss->depend.version[0] = '\0';
STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
STRNCPY(miss->depend.name, (char *)j->data, PKG_NAME_LEN);
@ -459,16 +459,15 @@ int splitdep(char *depstr, pmdepend_t *depend)
str = strdup(depstr);
if((ptr = strstr(str, ">="))) {
depend->mod = PM_DEP_GE;
depend->mod = PM_DEP_MOD_GE;
} else if((ptr = strstr(str, "<="))) {
depend->mod = PM_DEP_LE;
depend->mod = PM_DEP_MOD_LE;
} else if((ptr = strstr(str, "="))) {
depend->mod = PM_DEP_EQ;
depend->mod = PM_DEP_MOD_EQ;
} else {
/* no version specified - accept any */
depend->mod = PM_DEP_ANY;
depend->mod = PM_DEP_MOD_ANY;
STRNCPY(depend->name, str, PKG_NAME_LEN);
STRNCPY(depend->version, "", PKG_VERSION_LEN);
}
if(ptr == NULL) {
@ -478,7 +477,7 @@ int splitdep(char *depstr, pmdepend_t *depend)
*ptr = '\0';
STRNCPY(depend->name, str, PKG_NAME_LEN);
ptr++;
if(depend->mod != PM_DEP_EQ) {
if(depend->mod != PM_DEP_MOD_EQ) {
ptr++;
}
STRNCPY(depend->version, ptr, PKG_VERSION_LEN);
@ -567,7 +566,7 @@ int resolvedeps(pmdb_t *local, PMList *databases, pmsync_t *sync, PMList *list,
return(1);
} else*/
if(miss->type == PM_DEP_DEPEND) {
if(miss->type == PM_DEP_TYPE_DEPEND) {
pmsync_t *sync = NULL;
/* find the package in one of the repositories */

View File

@ -24,8 +24,20 @@
#include "db.h"
#include "sync.h"
typedef struct __pmdepend_t {
unsigned char mod;
char name[PKG_NAME_LEN];
char version[PKG_VERSION_LEN];
} pmdepend_t;
typedef struct __pmdepmissing_t {
char target[PKG_NAME_LEN];
unsigned char type;
pmdepend_t depend;
} pmdepmissing_t;
PMList *sortbydeps(PMList *targets, int mode);
PMList *checkdeps(pmdb_t *db, unsigned short op, PMList *packages);
PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages);
int splitdep(char *depstr, pmdepend_t *depend);
PMList *removedeps(pmdb_t *db, PMList *targs);
int resolvedeps(pmdb_t *local, PMList *databases, pmsync_t *sync, PMList *list, PMList *trail, PMList **data);