1
0
mirror of https://github.com/moparisthebest/pacman synced 2024-12-22 15:58:50 -05:00

- reworked pmsyncpkg_t structure

- got ride of uneeded handle external references
This commit is contained in:
Aurelien Foret 2005-04-16 22:15:50 +00:00
parent 29a712e393
commit 36087bb392
2 changed files with 59 additions and 66 deletions

View File

@ -40,9 +40,13 @@
#include "rpmvercmp.h"
#include "handle.h"
/* ORE
set CACHEDIR as a library option? */
#define PM_CACHEDIR "var/cache/pacman/pkg"
extern pmhandle_t *handle;
pmsyncpkg_t *sync_new(int type, pmpkg_t *lpkg, pmpkg_t *spkg)
pmsyncpkg_t *sync_new(int type, pmpkg_t *spkg, void *data)
{
pmsyncpkg_t *sync;
@ -51,9 +55,13 @@ pmsyncpkg_t *sync_new(int type, pmpkg_t *lpkg, pmpkg_t *spkg)
}
sync->type = type;
sync->lpkg = lpkg;
sync->spkg = spkg;
sync->replaces = NULL;
sync->pkg = spkg;
if(sync->type == PM_SYNC_TYPE_REPLACE) {
sync->data = pm_list_add(NULL, data);
} else {
sync->data = data;
}
return(sync);
}
@ -61,7 +69,9 @@ pmsyncpkg_t *sync_new(int type, pmpkg_t *lpkg, pmpkg_t *spkg)
void sync_free(pmsyncpkg_t *sync)
{
if(sync) {
FREELISTPTR(sync->replaces);
if(sync->type == PM_SYNC_TYPE_REPLACE) {
FREELISTPTR(sync->data);
}
free(sync);
}
}
@ -77,7 +87,7 @@ static pmsyncpkg_t* find_pkginsync(char *needle, PMList *haystack)
for(i = haystack; i && !found; i = i->next) {
sync = i->data;
if(sync && !strcmp(sync->spkg->name, needle)) {
if(sync && !strcmp(sync->pkg->name, needle)) {
found = 1;
}
}
@ -91,7 +101,7 @@ static pmsyncpkg_t* find_pkginsync(char *needle, PMList *haystack)
/* It returns a PMList of packages extracted from the given archive
* (the archive must have been generated by gensync)
*/
PMList *sync_load_archive(char *archive)
PMList *sync_load_dbarchive(char *archive)
{
PMList *lp = NULL;
DIR *dir = NULL;
@ -125,39 +135,32 @@ error:
return(NULL);
}
int sync_sysupgrade(PMList **data)
int sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync)
{
PMList *i, *j, *k;
PMList *targets = NULL;
*data = NULL;
/* check for "recommended" package replacements */
for(i = handle->dbs_sync; i; i = i->next) {
for(i = dbs_sync; i; i = i->next) {
PMList *j;
for(j = db_get_pkgcache(i->data); j; j = j->next) {
pmpkg_t *spkg = j->data;
for(k = spkg->replaces; k; k = k->next) {
PMList *m;
for(m = db_get_pkgcache(handle->db_local); m; m = m->next) {
for(m = db_get_pkgcache(db_local); m; m = m->next) {
pmpkg_t *lpkg = m->data;
if(!strcmp(k->data, lpkg->name)) {
if(pm_list_is_strin(lpkg->name, handle->ignorepkg)) {
_alpm_log(PM_LOG_WARNING, "%s-%s: ignoring package upgrade (to be replaced by %s-%s)",
lpkg->name, lpkg->version, spkg->name, spkg->version);
} else {
pmsyncpkg_t *sync = sync_new(PM_SYNC_TYPE_REPLACE, lpkg, spkg);
pmsyncpkg_t *sync = sync_new(PM_SYNC_TYPE_REPLACE, spkg, lpkg);
if(sync == NULL) {
pm_errno = PM_ERR_MEMORY;
goto error;
}
_alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (to be replaced by %s-%s)",
lpkg->name, lpkg->version, spkg->name, spkg->version);
targets = pm_list_add(targets, sync);
trans->packages = pm_list_add(trans->packages, sync);
}
}
}
@ -166,14 +169,13 @@ int sync_sysupgrade(PMList **data)
}
/* match installed packages with the sync dbs and compare versions */
for(i = db_get_pkgcache(handle->db_local); i; i = i->next) {
for(i = db_get_pkgcache(db_local); i; i = i->next) {
int cmp;
pmpkg_t *local = i->data;
pmpkg_t *spkg = NULL;
pmsyncpkg_t *sync;
for(j = handle->dbs_sync; !spkg && j; j = j->next) {
for(j = dbs_sync; !spkg && j; j = j->next) {
for(k = db_get_pkgcache(j->data); !spkg && k; k = k->next) {
pmpkg_t *sp = k->data;
if(!strcmp(local->name, sp->name)) {
@ -199,27 +201,24 @@ int sync_sysupgrade(PMList **data)
_alpm_log(PM_LOG_FLOW1, "%s-%s: ignoring package upgrade (%s)",
local->name, local->version, spkg->version);
} else {
sync = sync_new(PM_SYNC_TYPE_UPGRADE, local, spkg);
sync = sync_new(PM_SYNC_TYPE_UPGRADE, spkg, local);
if(sync == NULL) {
pm_errno = PM_ERR_MEMORY;
goto error;
}
_alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (%s => %s)",
local->name, local->version, local->version, spkg->version);
targets = pm_list_add(targets, sync);
trans->packages = pm_list_add(trans->packages, sync);
}
}
*data = targets;
return(0);
error:
FREELIST(targets);
return(-1);
}
int sync_addtarget(pmdb_t *db, PMList *dbs_sync, pmtrans_t *trans, char *name)
int sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, char *name)
{
char targline[(PKG_NAME_LEN-1)+1+(DB_TREENAME_LEN-1)+1];
char *targ;
@ -229,14 +228,10 @@ int sync_addtarget(pmdb_t *db, PMList *dbs_sync, pmtrans_t *trans, char *name)
pmsyncpkg_t *sync;
int cmp;
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(name != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
if(trans->flags & PM_TRANS_FLAG_SYSUPG) {
RET_ERR(PM_ERR_XXX, -1);
}
strncpy(targline, name, (PKG_NAME_LEN-1)+1+(DB_TREENAME_LEN-1)+1);
targ = strchr(targline, '/');
if(targ) {
@ -262,7 +257,7 @@ int sync_addtarget(pmdb_t *db, PMList *dbs_sync, pmtrans_t *trans, char *name)
RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
}
local = db_get_pkgfromcache(db, name);
local = db_get_pkgfromcache(db_local, name);
if(local) {
cmp = alpm_pkg_vercmp(local->version, spkg->version);
if(cmp > 0) {
@ -284,7 +279,7 @@ int sync_addtarget(pmdb_t *db, PMList *dbs_sync, pmtrans_t *trans, char *name)
/* add the package to the transaction */
if(!find_pkginsync(spkg->name, trans->packages)) {
sync = sync_new(PM_SYNC_TYPE_UPGRADE, local, spkg);
sync = sync_new(PM_SYNC_TYPE_UPGRADE, spkg, local);
if(sync == NULL) {
RET_ERR(PM_ERR_MEMORY, -1);
}
@ -294,14 +289,14 @@ int sync_addtarget(pmdb_t *db, PMList *dbs_sync, pmtrans_t *trans, char *name)
return(0);
}
int sync_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **data)
{
PMList *deps = NULL;
PMList *list = NULL;
PMList *trail = NULL;
PMList *i;
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(data != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
@ -314,7 +309,7 @@ int sync_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
if(!(trans->flags & PM_TRANS_FLAG_NODEPS)) {
for(i = trans->packages; i; i = i->next) {
pmsyncpkg_t *sync = i->data;
list = pm_list_add(list, sync->spkg);
list = pm_list_add(list, sync->pkg);
}
trail = pm_list_new();
@ -323,9 +318,9 @@ int sync_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
_alpm_log(PM_LOG_FLOW1, "resolving targets dependencies");
for(i = trans->packages; i; i = i->next) {
pmsyncpkg_t *sync = i->data;
pmpkg_t *spkg = sync->spkg;
pmpkg_t *spkg = sync->pkg;
_alpm_log(PM_LOG_FLOW1, "resolving dependencies for package %s", spkg->name);
if(resolvedeps(handle->db_local, handle->dbs_sync, spkg, list, trail) == -1) {
if(resolvedeps(db_local, dbs_sync, spkg, list, trail) == -1) {
/* pm_errno is set by resolvedeps */
goto error;
}
@ -336,7 +331,7 @@ int sync_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
for(i = list; i; i = i->next) {
pmpkg_t *spkg = i->data;
if(!find_pkginsync(spkg->name, trans->packages)) {
pmsyncpkg_t *sync = sync_new(PM_SYNC_TYPE_DEPEND, NULL, spkg);
pmsyncpkg_t *sync = sync_new(PM_SYNC_TYPE_DEPEND, spkg, NULL);
trans->packages = pm_list_add(trans->packages, sync);
}
}
@ -345,7 +340,7 @@ int sync_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data)
/* ORE
check for inter-conflicts and whatnot */
TRANS_CB(trans, PM_TRANS_EVT_INTERCONFLICTS_START, NULL, NULL);
deps = checkdeps(db, PM_TRANS_TYPE_UPGRADE, list);
deps = checkdeps(db_local, PM_TRANS_TYPE_UPGRADE, list);
if(deps) {
int errorout = 0;
_alpm_log(PM_LOG_FLOW1, "looking for unresolvable dependencies");
@ -399,9 +394,9 @@ error:
return(-1);
}
int sync_commit(pmdb_t *db, pmtrans_t *trans)
int sync_commit(pmtrans_t *trans, pmdb_t *db)
{
PMList *i, *j = NULL;
PMList *i;
PMList *data;
pmtrans_t *tr;
char ldir[PATH_MAX];
@ -409,11 +404,7 @@ int sync_commit(pmdb_t *db, pmtrans_t *trans)
ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
/* ORE
set CACHEDIR as a library option? */
#define PM_CACHEDIR "var/cache/pacman/pkg"
snprintf(ldir, PATH_MAX, "%s" PM_CACHEDIR, handle->root);
#undef CACHEDIR
/* remove any conflicting packages (WITHOUT dep checks) */
/* ORE - alpm does not handle removal of conflicting pkgs for now */
@ -424,15 +415,17 @@ int sync_commit(pmdb_t *db, pmtrans_t *trans)
if(tr == NULL) {
goto error;
}
for(i = trans->packages; i; i = i->next) {
/*for(i = trans->packages; i; i = i->next) {
pmsyncpkg_t *sync = i->data;
for(j = sync->replaces; j; j = j->next) {
pmpkg_t *pkg = j->data;
if(sync->type == PM_SYNC_TYPE_REPLACE) {
pmpkg_t *pkg = sync->lpkg;
if(trans_addtarget(tr, pkg->name)) {
goto error;
}
}
}
trans_prepare(tr, &data);
trans_commit(tr);*/
trans_free(tr);
/* install targets */
@ -443,13 +436,15 @@ int sync_commit(pmdb_t *db, pmtrans_t *trans)
}
for(i = trans->packages; i; i = i->next) {
pmsyncpkg_t *sync = i->data;
pmpkg_t *spkg = sync->spkg;
if(sync->type != PM_SYNC_TYPE_REPLACE) {
pmpkg_t *spkg = sync->pkg;
char str[PATH_MAX];
snprintf(str, PATH_MAX, "%s/%s-%s" PM_EXT_PKG, ldir, spkg->name, spkg->version);
if(trans_addtarget(tr, str) == -1) {
goto error;
}
}
}
if(trans_prepare(tr, &data) == -1) {
goto error;
}
@ -462,6 +457,7 @@ int sync_commit(pmdb_t *db, pmtrans_t *trans)
for(i = trans->packages; i; i = i->next) {
/*syncpkg_t *sync = (syncpkg_t*)i->data;
if(sync->replaces) {
PMList *j;
pkginfo_t *new = db_scan(db, sync->pkg->name, INFRQ_DEPENDS);
for(j = sync->replaces; j; j = j->next) {
pkginfo_t *old = (pkginfo_t*)j->data;

View File

@ -24,25 +24,22 @@
#include "db.h"
#include "package.h"
#include "trans.h"
#include "alpm.h"
typedef struct __pmsyncpkg_t {
unsigned char type;
pmpkg_t *lpkg;
pmpkg_t *spkg;
PMList *replaces;
pmpkg_t *pkg;
void *data;
} pmsyncpkg_t;
pmsyncpkg_t *sync_new(int type, pmpkg_t *lpkg, pmpkg_t *spkg);
pmsyncpkg_t *sync_new(int type, pmpkg_t *spkg, void *data);
void sync_free(pmsyncpkg_t *sync);
PMList *sync_load_archive(char *archive);
int sync_sysupgrade(pmlist_t **data);
int sync_addtarget(pmdb_t *db, PMList *dbs_sync, pmtrans_t *trans, char *name);
int sync_prepare(pmdb_t *db, pmtrans_t *trans, PMList **data);
int sync_commit(pmdb_t *db, pmtrans_t *trans);
int sync_sysupgrade(pmtrans_t *trans, pmdb_t *db, PMList *dbs_sync);
int sync_addtarget(pmtrans_t *trans, pmdb_t *db, PMList *dbs_sync, char *name);
int sync_prepare(pmtrans_t *trans, pmdb_t *db, PMList *dbs_sync, PMList **data);
int sync_commit(pmtrans_t *trans, pmdb_t *db);
#endif /* _ALPM_SYNC_H */