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) { for(j = lp; j; j = j->next) {
pmdepmissing_t* miss = j->data; 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) { if(!errorout) {
errorout = 1; errorout = 1;
} }
if((miss = (pmdepmissing_t *)malloc(sizeof(pmdepmissing_t))) == NULL) { if((miss = (pmdepmissing_t *)malloc(sizeof(pmdepmissing_t))) == NULL) {
FREELIST(lp); FREELIST(lp);
/* ORE, needed or not ? FREELIST(*data);
FREELIST(*data);*/
RET_ERR(PM_ERR_MEMORY, -1); RET_ERR(PM_ERR_MEMORY, -1);
} }
*miss = *(pmdepmissing_t*)j->data; *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"); _alpm_log(PM_LOG_FLOW2, "looking for conflicts");
for(j = lp; j; j = j->next) { for(j = lp; j; j = j->next) {
pmdepmissing_t* miss = (pmdepmissing_t *)j->data; pmdepmissing_t* miss = (pmdepmissing_t *)j->data;
if(miss->type == PM_DEP_CONFLICT) { if(miss->type == PM_DEP_TYPE_CONFLICT) {
if(!errorout) { if(!errorout) {
errorout = 1; errorout = 1;
} }

View file

@ -564,6 +564,31 @@ int alpm_trans_release()
return(0); 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 * Log facilities
*/ */

View file

@ -38,9 +38,7 @@ typedef struct __pmpkg_t PM_PKG;
typedef struct __pmgrp_t PM_GRP; typedef struct __pmgrp_t PM_GRP;
typedef struct __pmsync_t PM_SYNC; typedef struct __pmsync_t PM_SYNC;
typedef struct __pmtrans_t PM_TRANS; typedef struct __pmtrans_t PM_TRANS;
/* ORE typedef struct __pmdepmissing_t PM_DEPMISS;
typedef struct __pmdepend_t PM_DEP;
typedef struct __pmdepmissing_t PM_DEPMISS; */
/* /*
* Library * Library
@ -226,33 +224,6 @@ enum {
PM_TRANS_TARGETS 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); void *alpm_trans_getinfo(unsigned char parm);
int alpm_trans_init(unsigned char type, unsigned char flags, alpm_trans_cb cb); int alpm_trans_init(unsigned char type, unsigned char flags, alpm_trans_cb cb);
int alpm_trans_addtarget(char *target); int alpm_trans_addtarget(char *target);
@ -260,6 +231,32 @@ int alpm_trans_prepare(PM_LIST **data);
int alpm_trans_commit(); int alpm_trans_commit();
int alpm_trans_release(); 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 * PM_LIST helpers
*/ */

View file

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

View file

@ -24,8 +24,20 @@
#include "db.h" #include "db.h"
#include "sync.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 *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); int splitdep(char *depstr, pmdepend_t *depend);
PMList *removedeps(pmdb_t *db, PMList *targs); PMList *removedeps(pmdb_t *db, PMList *targs);
int resolvedeps(pmdb_t *local, PMList *databases, pmsync_t *sync, PMList *list, PMList *trail, PMList **data); int resolvedeps(pmdb_t *local, PMList *databases, pmsync_t *sync, PMList *list, PMList *trail, PMList **data);