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

View File

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