1
0
mirror of https://github.com/moparisthebest/pacman synced 2024-08-13 17:03:46 -04:00

more work for sync_commit()

This commit is contained in:
Aurelien Foret 2005-04-17 20:09:06 +00:00
parent 5a035d0b40
commit a215d1ebe0
2 changed files with 51 additions and 17 deletions

View File

@ -363,9 +363,22 @@ int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **
FREELIST(deps); FREELIST(deps);
RET_ERR(PM_ERR_UNSATISFIED_DEPS, -1); RET_ERR(PM_ERR_UNSATISFIED_DEPS, -1);
} }
/* ORE /* no unresolvable deps, so look for conflicts */
no unresolvable deps, so look for conflicts */
_alpm_log(PM_LOG_FLOW1, "looking for conflicts"); _alpm_log(PM_LOG_FLOW1, "looking for conflicts");
errorout = 0;
/* ORE
* check if the conflicting package is one that's about to be removed/replaced.
* if so, then just ignore it
*/
/* ORE
if we didn't find it in any sync->replaces lists, then it's a conflict */
if(errorout) {
FREELIST(deps);
RET_ERR(PM_ERR_CONFLICTING_DEPS, -1);
}
} }
TRANS_CB(trans, PM_TRANS_EVT_INTERCONFLICTS_DONE, NULL, NULL); TRANS_CB(trans, PM_TRANS_EVT_INTERCONFLICTS_DONE, NULL, NULL);
@ -378,6 +391,14 @@ int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **
rather than ripping out nodes from final, we just copy over rather than ripping out nodes from final, we just copy over
our "good" nodes to a new list and reassign. */ our "good" nodes to a new list and reassign. */
/* XXX: this fails for cases where a requested package wants
* a dependency that conflicts with an older version of
* the package. It will be removed from final, and the user
* has to re-request it to get it installed properly.
*
* Not gonna happen very often, but should be dealt with...
*/
/* ORE /* ORE
Check dependencies of packages in rmtargs and make sure Check dependencies of packages in rmtargs and make sure
we won't be breaking anything by removing them. we won't be breaking anything by removing them.
@ -394,14 +415,14 @@ error:
return(-1); return(-1);
} }
int sync_commit(pmtrans_t *trans, pmdb_t *db) int sync_commit(pmtrans_t *trans, pmdb_t *db_local)
{ {
PMList *i; PMList *i;
PMList *data; PMList *data;
pmtrans_t *tr; pmtrans_t *tr;
char ldir[PATH_MAX]; char ldir[PATH_MAX];
ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1)); ASSERT(db_local != 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));
snprintf(ldir, PATH_MAX, "%s" PM_CACHEDIR, handle->root); snprintf(ldir, PATH_MAX, "%s" PM_CACHEDIR, handle->root);
@ -410,6 +431,7 @@ int sync_commit(pmtrans_t *trans, pmdb_t *db)
/* ORE - alpm does not handle removal of conflicting pkgs for now */ /* ORE - alpm does not handle removal of conflicting pkgs for now */
/* remove to-be-replaced packages */ /* remove to-be-replaced packages */
_alpm_log(PM_LOG_FLOW1, "removing to-be-replaced packages");
tr = trans_new(PM_TRANS_TYPE_REMOVE, PM_TRANS_FLAG_NODEPS); tr = trans_new(PM_TRANS_TYPE_REMOVE, PM_TRANS_FLAG_NODEPS);
/* ORE */ /* ORE */
if(tr == NULL) { if(tr == NULL) {
@ -429,9 +451,16 @@ int sync_commit(pmtrans_t *trans, pmdb_t *db)
trans_free(tr); trans_free(tr);
/* install targets */ /* install targets */
/* ORE - need for a flag specifying that deps have already been checked */ _alpm_log(PM_LOG_FLOW1, "installing packages");
tr = trans_new(PM_TRANS_TYPE_UPGRADE, PM_TRANS_FLAG_NODEPS); tr = trans_new();
if(tr == NULL) { if(tr == NULL) {
_alpm_log(PM_LOG_ERROR, "could not create transaction");
pm_errno = PM_ERR_XXX;
goto error;
}
if(trans_init(tr, PM_TRANS_TYPE_UPGRADE, trans->flags | PM_TRANS_FLAG_NODEPS, NULL) == -1) {
_alpm_log(PM_LOG_ERROR, "could not initialize transaction");
pm_errno = PM_ERR_XXX;
goto error; goto error;
} }
for(i = trans->packages; i; i = i->next) { for(i = trans->packages; i; i = i->next) {
@ -446,27 +475,32 @@ int sync_commit(pmtrans_t *trans, pmdb_t *db)
} }
} }
if(trans_prepare(tr, &data) == -1) { if(trans_prepare(tr, &data) == -1) {
_alpm_log(PM_LOG_ERROR, "could not prepare transaction");
pm_errno = PM_ERR_XXX;
goto error; goto error;
} }
if(trans_commit(tr) == -1) { if(trans_commit(tr) == -1) {
_alpm_log(PM_LOG_ERROR, "could not commit transaction");
pm_errno = PM_ERR_XXX;
goto error; goto error;
} }
trans_free(tr); trans_free(tr);
/* propagate replaced packages' requiredby fields to their new owners */ /* propagate replaced packages' requiredby fields to their new owners */
_alpm_log(PM_LOG_FLOW1, "updating database for replaced packages dependencies");
for(i = trans->packages; i; i = i->next) { for(i = trans->packages; i; i = i->next) {
/*syncpkg_t *sync = (syncpkg_t*)i->data; /*pmsyncpkg_t *sync = i->data;
if(sync->replaces) { if(sync->replaces) {
PMList *j; PMList *j;
pkginfo_t *new = db_scan(db, sync->pkg->name, INFRQ_DEPENDS); pkginfo_t *new = db_get_pkgfromcache(db_local, sync->pkg->name);
for(j = sync->replaces; j; j = j->next) { for(j = sync->replaces; j; j = j->next) {
pkginfo_t *old = (pkginfo_t*)j->data; pkginfo_t *old = j->data;
// merge lists // merge lists
for(k = old->requiredby; k; k = k->next) { for(k = old->requiredby; k; k = k->next) {
if(!is_in(k->data, new->requiredby)) { if(!list_is_strin(k->data, new->requiredby)) {
// replace old's name with new's name in the requiredby's dependency list // replace old's name with new's name in the requiredby's dependency list
PMList *m; PMList *m;
pkginfo_t *depender = db_scan(db, k->data, INFRQ_DEPENDS); pkginfo_t *depender = db_get_pkgfromcache(db_local, k->data);
for(m = depender->depends; m; m = m->next) { for(m = depender->depends; m; m = m->next) {
if(!strcmp(m->data, old->name)) { if(!strcmp(m->data, old->name)) {
FREE(m->data); FREE(m->data);
@ -486,7 +520,7 @@ int sync_commit(pmtrans_t *trans, pmdb_t *db)
} }
/* cache needs to be rebuilt */ /* cache needs to be rebuilt */
db_free_pkgcache(db); db_free_pkgcache(db_local);
return(0); return(0);

View File

@ -34,12 +34,12 @@ typedef struct __pmsyncpkg_t {
pmsyncpkg_t *sync_new(int type, pmpkg_t *spkg, void *data); pmsyncpkg_t *sync_new(int type, pmpkg_t *spkg, void *data);
void sync_free(pmsyncpkg_t *sync); void sync_free(pmsyncpkg_t *sync);
PMList *sync_load_archive(char *archive); PMList *sync_load_dbarchive(char *archive);
int sync_sysupgrade(pmtrans_t *trans, pmdb_t *db, PMList *dbs_sync); int sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync);
int sync_addtarget(pmtrans_t *trans, pmdb_t *db, PMList *dbs_sync, char *name); int sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, char *name);
int sync_prepare(pmtrans_t *trans, pmdb_t *db, PMList *dbs_sync, PMList **data); int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **data);
int sync_commit(pmtrans_t *trans, pmdb_t *db); int sync_commit(pmtrans_t *trans, pmdb_t *db_local);
#endif /* _ALPM_SYNC_H */ #endif /* _ALPM_SYNC_H */