mirror of
https://github.com/moparisthebest/pacman
synced 2025-01-08 12:28:00 -05:00
replaced transaction 'packages' field by 2 queues: one for packages to be installed and the other for the ones to be removed
This commit is contained in:
parent
08b34b8aef
commit
04e054f3cb
@ -93,7 +93,7 @@ int add_loadtarget(pmdb_t *db, pmtrans_t *trans, char *name)
|
|||||||
* if so, replace it in the list */
|
* if so, replace it in the list */
|
||||||
/* ORE
|
/* ORE
|
||||||
we'd better do it before load_pkg. */
|
we'd better do it before load_pkg. */
|
||||||
for(j = trans->packages; j; j = j->next) {
|
for(j = trans->install_q; j; j = j->next) {
|
||||||
pmpkg_t *pkg = j->data;
|
pmpkg_t *pkg = j->data;
|
||||||
|
|
||||||
if(strcmp(pkg->name, info->name) == 0) {
|
if(strcmp(pkg->name, info->name) == 0) {
|
||||||
@ -107,7 +107,7 @@ int add_loadtarget(pmdb_t *db, pmtrans_t *trans, char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* add the package to the transaction */
|
/* add the package to the transaction */
|
||||||
trans->packages = pm_list_add(trans->packages, info);
|
trans->install_q = pm_list_add(trans->install_q, info);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ int add_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
|
|||||||
TRANS_CB(trans, PM_TRANS_EVT_CHECKDEPS_START, NULL, NULL);
|
TRANS_CB(trans, PM_TRANS_EVT_CHECKDEPS_START, NULL, NULL);
|
||||||
|
|
||||||
_alpm_log(PM_LOG_FLOW1, "looking for conflicts or unsatisfied dependencies");
|
_alpm_log(PM_LOG_FLOW1, "looking for conflicts or unsatisfied dependencies");
|
||||||
lp = checkdeps(db, trans->type, trans->packages);
|
lp = checkdeps(db, trans->type, trans->install_q);
|
||||||
if(lp != NULL) {
|
if(lp != NULL) {
|
||||||
int errorout = 0;
|
int errorout = 0;
|
||||||
|
|
||||||
@ -187,10 +187,10 @@ int add_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
|
|||||||
|
|
||||||
/* re-order w.r.t. dependencies */
|
/* re-order w.r.t. dependencies */
|
||||||
_alpm_log(PM_LOG_FLOW1, "sorting by dependencies");
|
_alpm_log(PM_LOG_FLOW1, "sorting by dependencies");
|
||||||
lp = sortbydeps(trans->packages, PM_TRANS_TYPE_ADD);
|
lp = sortbydeps(trans->install_q, PM_TRANS_TYPE_ADD);
|
||||||
/* free the old alltargs */
|
/* free the old alltargs */
|
||||||
FREELISTPTR(trans->packages);
|
FREELISTPTR(trans->install_q);
|
||||||
trans->packages = lp;
|
trans->install_q = lp;
|
||||||
|
|
||||||
TRANS_CB(trans, PM_TRANS_EVT_CHECKDEPS_DONE, NULL, NULL);
|
TRANS_CB(trans, PM_TRANS_EVT_CHECKDEPS_DONE, NULL, NULL);
|
||||||
}
|
}
|
||||||
@ -201,7 +201,7 @@ int add_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
|
|||||||
TRANS_CB(trans, PM_TRANS_EVT_FILECONFLICTS_START, NULL, NULL);
|
TRANS_CB(trans, PM_TRANS_EVT_FILECONFLICTS_START, NULL, NULL);
|
||||||
|
|
||||||
_alpm_log(PM_LOG_FLOW1, "looking for file conflicts");
|
_alpm_log(PM_LOG_FLOW1, "looking for file conflicts");
|
||||||
lp = db_find_conflicts(db, trans->packages, handle->root);
|
lp = db_find_conflicts(db, trans->install_q, handle->root);
|
||||||
if(lp != NULL) {
|
if(lp != NULL) {
|
||||||
*data = lp;
|
*data = lp;
|
||||||
RET_ERR(PM_ERR_FILE_CONFLICTS, -1);
|
RET_ERR(PM_ERR_FILE_CONFLICTS, -1);
|
||||||
@ -225,11 +225,11 @@ int add_commit(pmdb_t *db, pmtrans_t *trans)
|
|||||||
ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
|
ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
|
||||||
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
|
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
|
||||||
|
|
||||||
if(trans->packages == NULL) {
|
if(trans->install_q == NULL) {
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(targ = trans->packages; targ; targ = targ->next) {
|
for(targ = trans->install_q; targ; targ = targ->next) {
|
||||||
tartype_t gztype = {
|
tartype_t gztype = {
|
||||||
(openfunc_t)_alpm_gzopen_frontend,
|
(openfunc_t)_alpm_gzopen_frontend,
|
||||||
(closefunc_t)gzclose,
|
(closefunc_t)gzclose,
|
||||||
|
@ -53,11 +53,14 @@ int remove_loadtarget(pmdb_t *db, pmtrans_t *trans, char *name)
|
|||||||
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
|
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
|
||||||
ASSERT(name != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
ASSERT(name != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
||||||
|
|
||||||
|
/* ORE
|
||||||
|
we should better find the package in the cache, and then perform a
|
||||||
|
db_read(INFRQ_FILES) to add files information to it. */
|
||||||
if((info = db_scan(db, name, INFRQ_ALL)) == NULL) {
|
if((info = db_scan(db, name, INFRQ_ALL)) == NULL) {
|
||||||
_alpm_log(PM_LOG_ERROR, "could not find %s in database", name);
|
_alpm_log(PM_LOG_ERROR, "could not find %s in database", name);
|
||||||
RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
|
RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
|
||||||
}
|
}
|
||||||
trans->packages = pm_list_add(trans->packages, info);
|
trans->remove_q = pm_list_add(trans->remove_q, info);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@ -74,20 +77,20 @@ int remove_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
|
|||||||
if(!(trans->flags & (PM_TRANS_FLAG_NODEPS)) && (trans->type != PM_TRANS_TYPE_UPGRADE)) {
|
if(!(trans->flags & (PM_TRANS_FLAG_NODEPS)) && (trans->type != PM_TRANS_TYPE_UPGRADE)) {
|
||||||
TRANS_CB(trans, PM_TRANS_EVT_CHECKDEPS_START, NULL, NULL);
|
TRANS_CB(trans, PM_TRANS_EVT_CHECKDEPS_START, NULL, NULL);
|
||||||
|
|
||||||
_alpm_log(PM_LOG_FLOW1, "looking for conflicts or unsatisfied dependencies");
|
_alpm_log(PM_LOG_FLOW1, "looking for unsatisfied dependencies");
|
||||||
if((lp = checkdeps(db, trans->type, trans->packages)) != NULL) {
|
if((lp = checkdeps(db, trans->type, trans->remove_q)) != NULL) {
|
||||||
if(trans->flags & PM_TRANS_FLAG_CASCADE) {
|
if(trans->flags & PM_TRANS_FLAG_CASCADE) {
|
||||||
while(lp) {
|
while(lp) {
|
||||||
PMList *j;
|
PMList *j;
|
||||||
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;
|
||||||
info = db_scan(db, miss->depend.name, INFRQ_ALL);
|
info = db_scan(db, miss->depend.name, INFRQ_ALL);
|
||||||
if(!pkg_isin(info, trans->packages)) {
|
if(!pkg_isin(info, trans->remove_q)) {
|
||||||
trans->packages = pm_list_add(trans->packages, info);
|
trans->remove_q = pm_list_add(trans->remove_q, info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREELIST(lp);
|
FREELIST(lp);
|
||||||
lp = checkdeps(db, trans->type, trans->packages);
|
lp = checkdeps(db, trans->type, trans->remove_q);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*data = lp;
|
*data = lp;
|
||||||
@ -97,15 +100,15 @@ int remove_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
|
|||||||
|
|
||||||
if(trans->flags & PM_TRANS_FLAG_RECURSE) {
|
if(trans->flags & PM_TRANS_FLAG_RECURSE) {
|
||||||
_alpm_log(PM_LOG_FLOW1, "finding removable dependencies");
|
_alpm_log(PM_LOG_FLOW1, "finding removable dependencies");
|
||||||
trans->packages = removedeps(db, trans->packages);
|
trans->remove_q = removedeps(db, trans->remove_q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* re-order w.r.t. dependencies */
|
/* re-order w.r.t. dependencies */
|
||||||
_alpm_log(PM_LOG_FLOW1, "sorting by dependencies");
|
_alpm_log(PM_LOG_FLOW1, "sorting by dependencies");
|
||||||
lp = sortbydeps(trans->packages, PM_TRANS_TYPE_REMOVE);
|
lp = sortbydeps(trans->remove_q, PM_TRANS_TYPE_REMOVE);
|
||||||
/* free the old alltargs */
|
/* free the old alltargs */
|
||||||
FREELISTPTR(trans->packages);
|
FREELISTPTR(trans->remove_q);
|
||||||
trans->packages = lp;
|
trans->remove_q = lp;
|
||||||
|
|
||||||
TRANS_CB(trans, PM_TRANS_EVT_CHECKDEPS_DONE, NULL, NULL);
|
TRANS_CB(trans, PM_TRANS_EVT_CHECKDEPS_DONE, NULL, NULL);
|
||||||
}
|
}
|
||||||
@ -123,7 +126,7 @@ int remove_commit(pmdb_t *db, pmtrans_t *trans)
|
|||||||
ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
|
ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
|
||||||
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
|
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
|
||||||
|
|
||||||
for(targ = trans->packages; targ; targ = targ->next) {
|
for(targ = trans->remove_q; targ; targ = targ->next) {
|
||||||
char pm_install[PATH_MAX];
|
char pm_install[PATH_MAX];
|
||||||
info = (pmpkg_t*)targ->data;
|
info = (pmpkg_t*)targ->data;
|
||||||
|
|
||||||
|
@ -45,7 +45,8 @@ pmtrans_t *trans_new()
|
|||||||
}
|
}
|
||||||
|
|
||||||
trans->targets = NULL;
|
trans->targets = NULL;
|
||||||
trans->packages = NULL;
|
trans->install_q = NULL;
|
||||||
|
trans->remove_q = NULL;
|
||||||
trans->type = 0;
|
trans->type = 0;
|
||||||
trans->flags = 0;
|
trans->flags = 0;
|
||||||
trans->cb = NULL;
|
trans->cb = NULL;
|
||||||
@ -63,9 +64,17 @@ void trans_free(pmtrans_t *trans)
|
|||||||
FREELIST(trans->targets);
|
FREELIST(trans->targets);
|
||||||
/* ORE - ugly */
|
/* ORE - ugly */
|
||||||
if(trans->type == PM_TRANS_TYPE_SYNC) {
|
if(trans->type == PM_TRANS_TYPE_SYNC) {
|
||||||
FREELISTPTR(trans->packages);
|
PMList *i = trans->install_q;
|
||||||
|
while(i) {
|
||||||
|
PMList *j = i->next;
|
||||||
|
sync_free(i->data);
|
||||||
|
i->data = NULL;
|
||||||
|
pm_list_free(i);
|
||||||
|
i = j;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
FREELISTPKGS(trans->packages);
|
FREELISTPKGS(trans->install_q);
|
||||||
|
FREELISTPKGS(trans->remove_q);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(trans);
|
free(trans);
|
||||||
@ -133,7 +142,9 @@ int trans_prepare(pmtrans_t *trans, PMList **data)
|
|||||||
/* Sanity checks */
|
/* Sanity checks */
|
||||||
ASSERT(trans != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
ASSERT(trans != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
||||||
|
|
||||||
ASSERT(trans->packages != NULL, return(0));
|
if(trans->install_q == NULL && trans->remove_q == NULL) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
switch(trans->type) {
|
switch(trans->type) {
|
||||||
case PM_TRANS_TYPE_ADD:
|
case PM_TRANS_TYPE_ADD:
|
||||||
@ -168,7 +179,9 @@ int trans_commit(pmtrans_t *trans)
|
|||||||
ASSERT(trans != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
ASSERT(trans != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
||||||
|
|
||||||
/* If there's nothing to do, return without complaining */
|
/* If there's nothing to do, return without complaining */
|
||||||
ASSERT(trans->packages != NULL, return(0));
|
if(trans->install_q == NULL && trans->remove_q == NULL) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
switch(trans->type) {
|
switch(trans->type) {
|
||||||
case PM_TRANS_TYPE_ADD:
|
case PM_TRANS_TYPE_ADD:
|
||||||
|
@ -35,7 +35,8 @@ typedef struct __pmtrans_t {
|
|||||||
unsigned char flags;
|
unsigned char flags;
|
||||||
unsigned char state;
|
unsigned char state;
|
||||||
PMList *targets; /* PMList of (char *) */
|
PMList *targets; /* PMList of (char *) */
|
||||||
PMList *packages; /* PMList of (pmpkginfo_t *) */
|
PMList *install_q; /* PMList of (pmpkginfo_t *) */
|
||||||
|
PMList *remove_q; /* PMList of (pmpkginfo_t *) */
|
||||||
alpm_trans_cb cb;
|
alpm_trans_cb cb;
|
||||||
} pmtrans_t;
|
} pmtrans_t;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user