1
0
mirror of https://github.com/moparisthebest/pacman synced 2024-12-23 00:08:50 -05:00

Big commit this time:

* Moved entirely to alpm_pkg_get_* accessors, to read data on demand
* Mostly removed the INFRQ_ parameters from outside the be_files backend (making
  the backend more extensible in the long run)
* packages created from _alpm_db_scan now have the db and origin set (making
  accessors actually work for these packages)
* removed _alpm_db_ensure_pkgcache

* totally revamped the _alpm_checkconflicts function, making it cleaner and
  easier to read (and thus fix in the long run) - maintainable code ftw
  NOTE: feel free to rename the functions... I couldn't think of anything better

* removed an extra loop in sync.c:find_replacements - no sense in looping over
  an entire DB while strcmp'ing the name, when we have get_pkgfromcache

Other:
* package struct "license" -> "licenses"
* Created _alpm_sync_find (duplicate code in some places, find_pkginsync
* Minor const correctness changes along the way
* fixed a couple extra '/' pathing issues (non-issues really)
* removed a duplicate pkg_cmp function
This commit is contained in:
Aaron Griffin 2007-03-03 08:13:59 +00:00
parent a0dbade774
commit 7f5dada885
24 changed files with 657 additions and 578 deletions

View File

@ -260,7 +260,7 @@ int _alpm_add_prepare(pmtrans_t *trans, pmdb_t *db, alpm_list_t **data)
_alpm_log(PM_LOG_DEBUG, _("cleaning up")); _alpm_log(PM_LOG_DEBUG, _("cleaning up"));
for (lp=trans->packages; lp!=NULL; lp=lp->next) { for (lp=trans->packages; lp!=NULL; lp=lp->next) {
info=(pmpkg_t *)lp->data; info=(pmpkg_t *)lp->data;
for (rmlist=info->removes; rmlist!=NULL; rmlist=rmlist->next) { for (rmlist = alpm_pkg_get_removes(info); rmlist; rmlist = rmlist->next) {
snprintf(rm_fname, PATH_MAX, "%s%s", handle->root, (char *)rmlist->data); snprintf(rm_fname, PATH_MAX, "%s%s", handle->root, (char *)rmlist->data);
remove(rm_fname); remove(rm_fname);
} }
@ -354,7 +354,7 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
newpkg->reason = alpm_pkg_get_reason(local); newpkg->reason = alpm_pkg_get_reason(local);
/* pre_upgrade scriptlet */ /* pre_upgrade scriptlet */
if(newpkg->scriptlet && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) { if(alpm_pkg_has_scriptlet(newpkg) && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) {
_alpm_runscriptlet(handle->root, newpkg->data, "pre_upgrade", newpkg->version, oldpkg->version, trans); _alpm_runscriptlet(handle->root, newpkg->data, "pre_upgrade", newpkg->version, oldpkg->version, trans);
} }
} else { } else {
@ -364,7 +364,7 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
_alpm_log(PM_LOG_DEBUG, _("adding package %s-%s"), newpkg->name, newpkg->version); _alpm_log(PM_LOG_DEBUG, _("adding package %s-%s"), newpkg->name, newpkg->version);
/* pre_install scriptlet */ /* pre_install scriptlet */
if(newpkg->scriptlet && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) { if(alpm_pkg_has_scriptlet(newpkg) && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) {
_alpm_runscriptlet(handle->root, newpkg->data, "pre_install", newpkg->version, NULL, trans); _alpm_runscriptlet(handle->root, newpkg->data, "pre_install", newpkg->version, NULL, trans);
} }
} }
@ -400,9 +400,10 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
* old, we cover all bases, including backup=() locations changing hands. * old, we cover all bases, including backup=() locations changing hands.
* But is this viable? */ * But is this viable? */
alpm_list_t *old_noupgrade = alpm_list_strdup(handle->noupgrade); alpm_list_t *old_noupgrade = alpm_list_strdup(handle->noupgrade);
for(b = newpkg->backup; b; b = b->next) { for(b = alpm_pkg_get_backup(newpkg); b; b = b->next) {
_alpm_log(PM_LOG_DEBUG, _("adding %s to the NoUpgrade array temporarilly"), (char *)b->data); const char *backup = b->data;
handle->noupgrade = alpm_list_add(handle->noupgrade, strdup(b->data)); _alpm_log(PM_LOG_DEBUG, _("adding %s to the NoUpgrade array temporarilly"), backup);
handle->noupgrade = alpm_list_add(handle->noupgrade, strdup(backup));
} }
int ret = _alpm_remove_commit(tr, db); int ret = _alpm_remove_commit(tr, db);
@ -491,7 +492,7 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
/* if a file is in NoExtract then we never extract it */ /* if a file is in NoExtract then we never extract it */
if(alpm_list_find_str(handle->noextract, entryname)) { if(alpm_list_find_str(handle->noextract, entryname)) {
_alpm_log(PM_LOG_DEBUG, _("%s is in NoExtract, skipping extraction"), entryname); _alpm_log(PM_LOG_DEBUG, _("%s is in NoExtract, skipping extraction"), entryname);
alpm_logaction(_("notice: %s is in NoExtract -- skipping extraction"), entryname); alpm_logaction(_("%s is in NoExtract, skipping extraction"), entryname);
archive_read_data_skip(archive); archive_read_data_skip(archive);
continue; continue;
} }
@ -508,10 +509,10 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
/* it does, is it a backup=() file? /* it does, is it a backup=() file?
* always check the newpkg first, so when we do add a backup=() file, * always check the newpkg first, so when we do add a backup=() file,
* we don't have to wait a full upgrade cycle */ * we don't have to wait a full upgrade cycle */
needbackup = alpm_list_find_str(newpkg->backup, entryname); needbackup = alpm_list_find_str(alpm_pkg_get_backup(newpkg), entryname);
if(is_upgrade) { if(is_upgrade) {
hash_orig = _alpm_needbackup(entryname, oldpkg->backup); hash_orig = _alpm_needbackup(entryname, alpm_pkg_get_backup(oldpkg));
if(hash_orig) { if(hash_orig) {
needbackup = 1; needbackup = 1;
} }
@ -561,9 +562,9 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
hash_pkg = _alpm_SHAFile(tempfile); hash_pkg = _alpm_SHAFile(tempfile);
} }
/* append the new md5 or sha1 hash to it's respective entry in newpkg->backup /* append the new md5 or sha1 hash to it's respective entry in newpkg's backup
* (it will be the new orginal) */ * (it will be the new orginal) */
for(lp = newpkg->backup; lp; lp = lp->next) { for(lp = alpm_pkg_get_backup(newpkg); lp; lp = lp->next) {
if(!lp->data || strcmp(lp->data, entryname) != 0) { if(!lp->data || strcmp(lp->data, entryname) != 0) {
continue; continue;
} }
@ -699,8 +700,8 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
errors++; errors++;
} }
/* calculate an hash if this is in newpkg->backup */ /* calculate an hash if this is in newpkg's backup */
for(lp = newpkg->backup; lp; lp = lp->next) { for(lp = alpm_pkg_get_backup(newpkg); lp; lp = lp->next) {
char *backup = NULL, *hash = NULL; char *backup = NULL, *hash = NULL;
int backup_len = strlen(lp->data) + 2; /* tab char and null byte */ int backup_len = strlen(lp->data) + 2; /* tab char and null byte */
@ -760,7 +761,8 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
for(prov = provdiff; prov; prov = prov->next) { for(prov = provdiff; prov; prov = prov->next) {
const char *provname = prov->data; const char *provname = prov->data;
_alpm_log(PM_LOG_DEBUG, _("provision '%s' has been removed from package %s (%s => %s)"), _alpm_log(PM_LOG_DEBUG, _("provision '%s' has been removed from package %s (%s => %s)"),
provname, oldpkg->name, oldpkg->version, newpkg->version); provname, alpm_pkg_get_name(oldpkg),
alpm_pkg_get_version(oldpkg), alpm_pkg_get_version(newpkg));
alpm_list_t *p = _alpm_db_whatprovides(handle->db_local, provname); alpm_list_t *p = _alpm_db_whatprovides(handle->db_local, provname);
if(p) { if(p) {
@ -769,15 +771,18 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
* provision, we'll use the FIRST for now. * provision, we'll use the FIRST for now.
* TODO figure out a way to find a "correct" provision */ * TODO figure out a way to find a "correct" provision */
pmpkg_t *provpkg = p->data; pmpkg_t *provpkg = p->data;
_alpm_log(PM_LOG_DEBUG, _("updating '%s' due to provision change (%s)"), provpkg->name, provname); const char *pkgname = alpm_pkg_get_name(provpkg);
_alpm_log(PM_LOG_DEBUG, _("updating '%s' due to provision change (%s)"), pkgname, provname);
_alpm_pkg_update_requiredby(provpkg); _alpm_pkg_update_requiredby(provpkg);
if(_alpm_db_write(db, provpkg, INFRQ_DEPENDS)) { if(_alpm_db_write(db, provpkg, INFRQ_DEPENDS)) {
_alpm_log(PM_LOG_ERROR, _("could not update provision '%s' from '%s'"), provname, provpkg->name); _alpm_log(PM_LOG_ERROR, _("could not update provision '%s' from '%s'"), provname, pkgname);
alpm_logaction(_("could not update provision '%s' from '%s'"), provname, provpkg->name); alpm_logaction(_("could not update provision '%s' from '%s'"), provname, pkgname);
RET_ERR(PM_ERR_DB_WRITE, -1); RET_ERR(PM_ERR_DB_WRITE, -1);
} }
} }
} }
alpm_list_free(provdiff);
/* make an install date (in UTC) */ /* make an install date (in UTC) */
time_t t = time(NULL); time_t t = time(NULL);
@ -790,31 +795,36 @@ int _alpm_add_commit(pmtrans_t *trans, pmdb_t *db)
if(_alpm_db_write(db, newpkg, INFRQ_ALL)) { if(_alpm_db_write(db, newpkg, INFRQ_ALL)) {
_alpm_log(PM_LOG_ERROR, _("could not update database entry %s-%s"), _alpm_log(PM_LOG_ERROR, _("could not update database entry %s-%s"),
newpkg->name, newpkg->version); alpm_pkg_get_name(newpkg), alpm_pkg_get_version(newpkg));
alpm_logaction(_("could not update database entry %s-%s"), alpm_logaction(_("could not update database entry %s-%s"),
newpkg->name, newpkg->version); alpm_pkg_get_name(newpkg), alpm_pkg_get_version(newpkg));
RET_ERR(PM_ERR_DB_WRITE, -1); RET_ERR(PM_ERR_DB_WRITE, -1);
} }
if(_alpm_db_add_pkgincache(db, newpkg) == -1) { if(_alpm_db_add_pkgincache(db, newpkg) == -1) {
_alpm_log(PM_LOG_ERROR, _("could not add entry '%s' in cache"), newpkg->name); _alpm_log(PM_LOG_ERROR, _("could not add entry '%s' in cache"),
alpm_pkg_get_name(newpkg));
} }
/* update dependency packages' REQUIREDBY fields */ /* update dependency packages' REQUIREDBY fields */
_alpm_trans_update_depends(trans, newpkg); _alpm_trans_update_depends(trans, newpkg);
PROGRESS(trans, (is_upgrade ? PM_TRANS_PROGRESS_UPGRADE_START : PM_TRANS_PROGRESS_ADD_START), PROGRESS(trans, (is_upgrade ? PM_TRANS_PROGRESS_UPGRADE_START : PM_TRANS_PROGRESS_ADD_START),
newpkg->name, 100, pkg_count, (pkg_count - targ_count +1)); alpm_pkg_get_name(newpkg), 100, pkg_count, (pkg_count - targ_count +1));
EVENT(trans, PM_TRANS_EVT_EXTRACT_DONE, NULL, NULL); EVENT(trans, PM_TRANS_EVT_EXTRACT_DONE, NULL, NULL);
/* run the post-install script if it exists */ /* run the post-install script if it exists */
if(newpkg->scriptlet && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) { if(alpm_pkg_has_scriptlet(newpkg) && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) {
char pm_install[PATH_MAX]; char pm_install[PATH_MAX];
snprintf(pm_install, PATH_MAX, "%s%s/%s/%s-%s/install", handle->root, handle->dbpath, db->treename, newpkg->name, newpkg->version); snprintf(pm_install, PATH_MAX, "%s%s/%s/%s-%s/install", handle->root, handle->dbpath, db->treename,
alpm_pkg_get_name(newpkg), alpm_pkg_get_version(newpkg));
if(is_upgrade) { if(is_upgrade) {
_alpm_runscriptlet(handle->root, pm_install, "post_upgrade", newpkg->version, oldpkg ? oldpkg->version : NULL, trans); _alpm_runscriptlet(handle->root, pm_install, "post_upgrade",
alpm_pkg_get_version(newpkg), oldpkg ? alpm_pkg_get_version(oldpkg) : NULL,
trans);
} else { } else {
_alpm_runscriptlet(handle->root, pm_install, "post_install", newpkg->version, NULL, trans); _alpm_runscriptlet(handle->root, pm_install, "post_install",
alpm_pkg_get_version(newpkg), NULL, trans);
} }
} }

View File

@ -302,13 +302,12 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
snprintf(path, PATH_MAX, "%s%s/%s" PM_EXT_DB, handle->root, handle->dbpath, db->treename); snprintf(path, PATH_MAX, "%s%s/%s" PM_EXT_DB, handle->root, handle->dbpath, db->treename);
/* remove the old dir */ /* remove the old dir */
_alpm_log(PM_LOG_DEBUG, _("flushing database %s/%s"), handle->dbpath, db->treename); _alpm_log(PM_LOG_DEBUG, _("flushing database %s%s"), handle->dbpath, db->treename);
for(lp = _alpm_db_get_pkgcache(db, INFRQ_BASE); lp; lp = lp->next) { for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) {
if(_alpm_db_remove(db, lp->data) == -1) { pmpkg_t *pkg = lp->data;
if(lp->data) { if(pkg && _alpm_db_remove(db, pkg) == -1) {
_alpm_log(PM_LOG_ERROR, _("could not remove database entry %s/%s"), db->treename, _alpm_log(PM_LOG_ERROR, _("could not remove database entry %s%s"), db->treename,
((pmpkg_t *)lp->data)->name); alpm_pkg_get_name(pkg));
}
RET_ERR(PM_ERR_DB_REMOVE, -1); RET_ERR(PM_ERR_DB_REMOVE, -1);
} }
} }
@ -354,7 +353,7 @@ alpm_list_t SYMEXPORT *alpm_db_getpkgcache(pmdb_t *db)
ASSERT(handle != NULL, return(NULL)); ASSERT(handle != NULL, return(NULL));
ASSERT(db != NULL, return(NULL)); ASSERT(db != NULL, return(NULL));
return(_alpm_db_get_pkgcache(db, INFRQ_BASE)); return(_alpm_db_get_pkgcache(db));
} }
/** Get the list of packages that a package provides /** Get the list of packages that a package provides
@ -472,21 +471,21 @@ int alpm_pkg_checksha1sum(pmpkg_t *pkg)
snprintf(path, PATH_MAX, "%s%s/%s-%s" PM_EXT_PKG, snprintf(path, PATH_MAX, "%s%s/%s-%s" PM_EXT_PKG,
handle->root, handle->cachedir, handle->root, handle->cachedir,
pkg->name, pkg->version); alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
sha1sum = _alpm_SHAFile(path); sha1sum = _alpm_SHAFile(path);
if(sha1sum == NULL) { if(sha1sum == NULL) {
_alpm_log(PM_LOG_ERROR, _("could not get sha1sum for package %s-%s"), _alpm_log(PM_LOG_ERROR, _("could not get sha1sum for package %s-%s"),
pkg->name, pkg->version); alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
pm_errno = PM_ERR_NOT_A_FILE; pm_errno = PM_ERR_NOT_A_FILE;
retval = -1; retval = -1;
} else { } else {
if(strcmp(sha1sum, alpm_pkg_get_sha1sum(pkg)) == 0) { if(strcmp(sha1sum, alpm_pkg_get_sha1sum(pkg)) == 0) {
_alpm_log(PM_LOG_DEBUG, _("sha1sums for package %s-%s match"), _alpm_log(PM_LOG_DEBUG, _("sha1sums for package %s-%s match"),
pkg->name, pkg->version); alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
} else { } else {
_alpm_log(PM_LOG_ERROR, _("sha1sums do not match for package %s-%s"), _alpm_log(PM_LOG_ERROR, _("sha1sums do not match for package %s-%s"),
pkg->name, pkg->version); alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
pm_errno = PM_ERR_PKG_INVALID; pm_errno = PM_ERR_PKG_INVALID;
retval = -1; retval = -1;
} }
@ -516,21 +515,21 @@ int alpm_pkg_checkmd5sum(pmpkg_t *pkg)
snprintf(path, PATH_MAX, "%s%s/%s-%s" PM_EXT_PKG, snprintf(path, PATH_MAX, "%s%s/%s-%s" PM_EXT_PKG,
handle->root, handle->cachedir, handle->root, handle->cachedir,
pkg->name, pkg->version); alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
md5sum = _alpm_MDFile(path); md5sum = _alpm_MDFile(path);
if(md5sum == NULL) { if(md5sum == NULL) {
_alpm_log(PM_LOG_ERROR, _("could not get md5sum for package %s-%s"), _alpm_log(PM_LOG_ERROR, _("could not get md5sum for package %s-%s"),
pkg->name, pkg->version); alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
pm_errno = PM_ERR_NOT_A_FILE; pm_errno = PM_ERR_NOT_A_FILE;
retval = -1; retval = -1;
} else { } else {
if(strcmp(md5sum, alpm_pkg_get_md5sum(pkg)) == 0) { if(strcmp(md5sum, alpm_pkg_get_md5sum(pkg)) == 0) {
_alpm_log(PM_LOG_DEBUG, _("md5sums for package %s-%s match"), _alpm_log(PM_LOG_DEBUG, _("md5sums for package %s-%s match"),
pkg->name, pkg->version); alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
} else { } else {
_alpm_log(PM_LOG_ERROR, _("md5sums do not match for package %s-%s"), _alpm_log(PM_LOG_ERROR, _("md5sums do not match for package %s-%s"),
pkg->name, pkg->version); alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
pm_errno = PM_ERR_PKG_INVALID; pm_errno = PM_ERR_PKG_INVALID;
retval = -1; retval = -1;
} }
@ -1071,9 +1070,8 @@ int SYMEXPORT alpm_parse_config(char *file, alpm_cb_db_register callback, const
* solution made for -Qu operation */ * solution made for -Qu operation */
alpm_list_t *alpm_get_upgrades() alpm_list_t *alpm_get_upgrades()
{ {
int found = 0;
alpm_list_t *syncpkgs = NULL; alpm_list_t *syncpkgs = NULL;
alpm_list_t *i, *j, *k; alpm_list_t *i, *j, *k, *m;
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -1081,36 +1079,35 @@ alpm_list_t *alpm_get_upgrades()
/* check for "recommended" package replacements */ /* check for "recommended" package replacements */
_alpm_log(PM_LOG_DEBUG, _("checking for package replacements")); _alpm_log(PM_LOG_DEBUG, _("checking for package replacements"));
for(i = handle->dbs_sync; i; i = i->next) { for(i = handle->dbs_sync; i; i = i->next) {
for(j = _alpm_db_get_pkgcache(i->data, INFRQ_DESC); j; j = j->next) { for(j = _alpm_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) {
alpm_list_t *m; for(k = alpm_pkg_get_replaces(spkg); k; k = k->next) {
for(m = _alpm_db_get_pkgcache(handle->db_local, INFRQ_BASE); m; m = m->next) {
for(m = _alpm_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) == 0) {
_alpm_log(PM_LOG_DEBUG, _("checking replacement '%s' for package '%s'"), k->data, spkg->name); if(strcmp(k->data, alpm_pkg_get_name(lpkg)) == 0) {
if(alpm_list_find_str(handle->ignorepkg, lpkg->name)) { _alpm_log(PM_LOG_DEBUG, _("checking replacement '%s' for package '%s'"), k->data,
alpm_pkg_get_name(spkg));
if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(lpkg))) {
_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); alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg),
alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
} else { } else {
/* assume all replaces=() packages are accepted */ /* assume all replaces=() packages are accepted */
pmsyncpkg_t *sync = NULL; pmsyncpkg_t *sync = NULL;
pmpkg_t *dummy = _alpm_pkg_new(lpkg->name, NULL); pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(lpkg), NULL);
if(dummy == NULL) { if(dummy == NULL) {
pm_errno = PM_ERR_MEMORY; pm_errno = PM_ERR_MEMORY;
goto error; goto error;
} }
dummy->requiredby = alpm_list_strdup(lpkg->requiredby); dummy->requiredby = alpm_list_strdup(alpm_pkg_get_requiredby(lpkg));
/* check if spkg->name is already in the packages list. */
alpm_list_t *s;
for(s = syncpkgs; s && !found; s = s->next) {
sync = i->data;
if(sync && !strcmp(sync->pkg->name, spkg->name)) {
found = 1;
}
}
if(found) { pmsyncpkg_t *syncpkg;
syncpkg = _alpm_sync_find(syncpkgs, alpm_pkg_get_name(spkg));
if(syncpkg) {
/* found it -- just append to the replaces list */ /* found it -- just append to the replaces list */
sync->data = alpm_list_add(sync->data, dummy); sync->data = alpm_list_add(sync->data, dummy);
} else { } else {
@ -1125,7 +1122,8 @@ alpm_list_t *alpm_get_upgrades()
syncpkgs = alpm_list_add(syncpkgs, sync); syncpkgs = alpm_list_add(syncpkgs, sync);
} }
_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); alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg),
alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
} }
break; break;
} }
@ -1135,17 +1133,17 @@ alpm_list_t *alpm_get_upgrades()
} }
/* now do normal upgrades */ /* now do normal upgrades */
for(i = _alpm_db_get_pkgcache(handle->db_local, INFRQ_BASE); i; i = i->next) { for(i = _alpm_db_get_pkgcache(handle->db_local); i; i = i->next) {
int replace=0; int replace=0;
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 = handle->dbs_sync; !spkg && j; j = j->next) {
spkg = _alpm_db_get_pkgfromcache(j->data, local->name); spkg = _alpm_db_get_pkgfromcache(j->data, alpm_pkg_get_name(local));
} }
if(spkg == NULL) { if(spkg == NULL) {
_alpm_log(PM_LOG_DEBUG, _("'%s' not found in sync db -- skipping"), local->name); _alpm_log(PM_LOG_DEBUG, _("'%s' not found in sync db -- skipping"), alpm_pkg_get_name(local));
continue; continue;
} }
@ -1153,32 +1151,28 @@ alpm_list_t *alpm_get_upgrades()
for(j = syncpkgs; j && !replace; j=j->next) { for(j = syncpkgs; j && !replace; j=j->next) {
sync = j->data; sync = j->data;
if(sync->type == PM_SYNC_TYPE_REPLACE) { if(sync->type == PM_SYNC_TYPE_REPLACE) {
if(_alpm_pkg_find(spkg->name, sync->data)) { if(_alpm_pkg_find(alpm_pkg_get_name(spkg), sync->data)) {
replace=1; replace=1;
} }
} }
} }
if(replace) { if(replace) {
_alpm_log(PM_LOG_DEBUG, _("'%s' is already elected for removal -- skipping"), _alpm_log(PM_LOG_DEBUG, _("'%s' is already elected for removal -- skipping"),
local->name); alpm_pkg_get_name(local));
continue; continue;
} }
if(alpm_pkg_compare_versions(local, spkg)) { if(alpm_pkg_compare_versions(local, spkg)) {
_alpm_log(PM_LOG_DEBUG, _("%s-%s elected for upgrade (%s => %s)"), _alpm_log(PM_LOG_DEBUG, _("%s elected for upgrade (%s => %s)"),
local->name, local->version, local->version, spkg->version); alpm_pkg_get_name(local), alpm_pkg_get_version(local),
alpm_list_t *s; alpm_pkg_get_version(spkg));
pmsyncpkg_t *sync = NULL;
found = 0;
for(s = syncpkgs; s && !found; s = s->next) {
sync = s->data;
if(sync && strcmp(sync->pkg->name, local->name) == 0) {
found = 1;
}
}
if(!found) { pmsyncpkg_t *syncpkg;
pmpkg_t *dummy = _alpm_pkg_new(local->name, local->version); syncpkg = _alpm_sync_find(syncpkgs, alpm_pkg_get_name(local));
if(!syncpkg) {
pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(local),
alpm_pkg_get_version(local));
if(dummy == NULL) { if(dummy == NULL) {
goto error; goto error;
} }

View File

@ -343,7 +343,7 @@ typedef void (*alpm_trans_cb_conv)(pmtransconv_t, void *, void *,
void *, int *); void *, int *);
/* Transaction Progress callback */ /* Transaction Progress callback */
typedef void (*alpm_trans_cb_progress)(pmtransprog_t, char *, int, int, int); typedef void (*alpm_trans_cb_progress)(pmtransprog_t, const char *, int, int, int);
pmtranstype_t alpm_trans_get_type(); pmtranstype_t alpm_trans_get_type();
unsigned int alpm_trans_get_flags(); unsigned int alpm_trans_get_flags();

View File

@ -236,7 +236,7 @@ alpm_list_t* alpm_list_msort(alpm_list_t *list, int n, alpm_list_fn_cmp fn)
* @param data output parameter containing the data member of the item removed * @param data output parameter containing the data member of the item removed
* @return the resultant list, or NULL on failure * @return the resultant list, or NULL on failure
*/ */
alpm_list_t *alpm_list_remove(alpm_list_t *haystack, void *needle, alpm_list_fn_cmp fn, void **data) alpm_list_t *alpm_list_remove(alpm_list_t *haystack, const void *needle, alpm_list_fn_cmp fn, void **data)
{ /* TODO I modified this to remove ALL matching items. Do we need a remove_first? */ { /* TODO I modified this to remove ALL matching items. Do we need a remove_first? */
alpm_list_t *i = haystack, *tmp = NULL; alpm_list_t *i = haystack, *tmp = NULL;

View File

@ -48,7 +48,7 @@ alpm_list_t *alpm_list_add(alpm_list_t *list, void *data);
alpm_list_t *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_list_fn_cmp fn); alpm_list_t *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_list_fn_cmp fn);
alpm_list_t *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right, alpm_list_fn_cmp fn); alpm_list_t *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right, alpm_list_fn_cmp fn);
alpm_list_t *alpm_list_msort(alpm_list_t *list, int n, alpm_list_fn_cmp fn); alpm_list_t *alpm_list_msort(alpm_list_t *list, int n, alpm_list_fn_cmp fn);
alpm_list_t *alpm_list_remove(alpm_list_t *haystack, void *needle, alpm_list_fn_cmp fn, void **data); alpm_list_t *alpm_list_remove(alpm_list_t *haystack, const void *needle, alpm_list_fn_cmp fn, void **data);
alpm_list_t *alpm_list_remove_node(alpm_list_t *node); alpm_list_t *alpm_list_remove_node(alpm_list_t *node);
alpm_list_t *alpm_list_remove_dupes(alpm_list_t *list); alpm_list_t *alpm_list_remove_dupes(alpm_list_t *list);
alpm_list_t *alpm_list_strdup(alpm_list_t *list); alpm_list_t *alpm_list_strdup(alpm_list_t *list);

View File

@ -106,7 +106,7 @@ void _alpm_db_rewind(pmdb_t *db)
rewinddir(db->handle); rewinddir(db->handle);
} }
pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target, pmdbinfrq_t inforeq) pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target)
{ {
struct dirent *ent = NULL; struct dirent *ent = NULL;
struct stat sbuf; struct stat sbuf;
@ -183,9 +183,14 @@ pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target, pmdbinfrq_t inforeq)
_alpm_log(PM_LOG_ERROR, _("invalid name for dabatase entry '%s'"), ent->d_name); _alpm_log(PM_LOG_ERROR, _("invalid name for dabatase entry '%s'"), ent->d_name);
return(NULL); return(NULL);
} }
if(_alpm_db_read(db, pkg, inforeq) == -1) {
/* explicitly read with only 'BASE' data, accessors will handle the rest */
if(_alpm_db_read(db, pkg, INFRQ_BASE) == -1) {
/* TODO removed corrupt entry from the FS here */ /* TODO removed corrupt entry from the FS here */
FREEPKG(pkg); FREEPKG(pkg);
} else {
pkg->data = db;
pkg->origin = PKG_FROM_CACHE;
} }
} }
@ -298,7 +303,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
_alpm_strtrim(info->url); _alpm_strtrim(info->url);
} else if(!strcmp(line, "%LICENSE%")) { } else if(!strcmp(line, "%LICENSE%")) {
while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
info->license = alpm_list_add(info->license, strdup(line)); info->licenses = alpm_list_add(info->licenses, strdup(line));
} }
} else if(!strcmp(line, "%ARCH%")) { } else if(!strcmp(line, "%ARCH%")) {
if(fgets(info->arch, sizeof(info->arch), fp) == NULL) { if(fgets(info->arch, sizeof(info->arch), fp) == NULL) {
@ -527,9 +532,9 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
fprintf(fp, "%%URL%%\n" fprintf(fp, "%%URL%%\n"
"%s\n\n", info->url); "%s\n\n", info->url);
} }
if(info->license) { if(info->licenses) {
fputs("%LICENSE%\n", fp); fputs("%LICENSE%\n", fp);
for(lp = info->license; lp; lp = lp->next) { for(lp = info->licenses; lp; lp = lp->next) {
fprintf(fp, "%s\n", (char *)lp->data); fprintf(fp, "%s\n", (char *)lp->data);
} }
fprintf(fp, "\n"); fprintf(fp, "\n");
@ -687,7 +692,7 @@ int _alpm_db_remove(pmdb_t *db, pmpkg_t *info)
RET_ERR(PM_ERR_DB_NULL, -1); RET_ERR(PM_ERR_DB_NULL, -1);
} }
snprintf(path, PATH_MAX, "%s/%s-%s", db->path, info->name, info->version); snprintf(path, PATH_MAX, "%s%s-%s", db->path, info->name, info->version);
if(_alpm_rmrf(path) == -1) { if(_alpm_rmrf(path) == -1) {
return(-1); return(-1);
} }

View File

@ -41,12 +41,10 @@
/* Returns a new package cache from db. /* Returns a new package cache from db.
* It frees the cache if it already exists. * It frees the cache if it already exists.
*/ */
int _alpm_db_load_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel) int _alpm_db_load_pkgcache(pmdb_t *db)
{ {
pmpkg_t *info; pmpkg_t *info;
int count = 0; int count = 0;
/* The group cache needs INFRQ_DESC as well */
/* pmdbinfrq_t infolevel = INFRQ_DEPENDS | INFRQ_DESC;*/
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -56,12 +54,13 @@ int _alpm_db_load_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel)
_alpm_db_free_pkgcache(db); _alpm_db_free_pkgcache(db);
_alpm_log(PM_LOG_DEBUG, _("loading package cache (infolevel=%#x) for repository '%s'"), _alpm_log(PM_LOG_DEBUG, _("loading package cache for repository '%s'"),
infolevel, db->treename); db->treename);
_alpm_db_rewind(db); _alpm_db_rewind(db);
while((info = _alpm_db_scan(db, NULL, infolevel)) != NULL) { while((info = _alpm_db_scan(db, NULL)) != NULL) {
_alpm_log(PM_LOG_FUNCTION, _("adding '%s' to package cache for db '%s'"), info->name, db->treename); _alpm_log(PM_LOG_FUNCTION, _("adding '%s' to package cache for db '%s'"),
alpm_pkg_get_name(info), db->treename);
info->origin = PKG_FROM_CACHE; info->origin = PKG_FROM_CACHE;
info->data = db; info->data = db;
/* add to the collection */ /* add to the collection */
@ -91,7 +90,7 @@ void _alpm_db_free_pkgcache(pmdb_t *db)
} }
} }
alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel) alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db)
{ {
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -99,46 +98,18 @@ alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel)
return(NULL); return(NULL);
} }
if(db->pkgcache == NULL) { if(!db->pkgcache) {
_alpm_db_load_pkgcache(db, infolevel); _alpm_db_load_pkgcache(db);
} }
_alpm_db_ensure_pkgcache(db, infolevel); /* hmmm, still NULL ?*/
if(!db->pkgcache) { if(!db->pkgcache) {
_alpm_log(PM_LOG_DEBUG, _("error: pkgcache is NULL for db '%s'"), db->treename); _alpm_log(PM_LOG_DEBUG, _("error: pkgcache is NULL for db '%s'"), db->treename);
} }
return(db->pkgcache); return(db->pkgcache);
} }
int _alpm_db_ensure_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel)
{
int reloaded = 0;
/* for each pkg, check and reload if the requested
* info is not already cached
*/
ALPM_LOG_FUNC;
alpm_list_t *p;
for(p = db->pkgcache; p; p = p->next) {
pmpkg_t *pkg = (pmpkg_t *)p->data;
if(infolevel != INFRQ_BASE && !(pkg->infolevel & infolevel)) {
if(_alpm_db_read(db, pkg, infolevel) == -1) {
/* TODO should we actually remove from the filesystem here as well? */
_alpm_db_remove_pkgfromcache(db, pkg);
} else {
reloaded = 1;
}
}
}
if(reloaded) {
_alpm_log(PM_LOG_DEBUG, _("package cache reloaded (infolevel=%#x) for repository '%s'"),
infolevel, db->treename);
}
return(0);
}
int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg) int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
{ {
pmpkg_t *newpkg; pmpkg_t *newpkg;
@ -153,7 +124,8 @@ int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
if(newpkg == NULL) { if(newpkg == NULL) {
return(-1); return(-1);
} }
_alpm_log(PM_LOG_DEBUG, _("adding entry '%s' in '%s' cache"), newpkg->name, db->treename); _alpm_log(PM_LOG_DEBUG, _("adding entry '%s' in '%s' cache"),
alpm_pkg_get_name(newpkg), db->treename);
db->pkgcache = alpm_list_add_sorted(db->pkgcache, newpkg, _alpm_pkg_cmp); db->pkgcache = alpm_list_add_sorted(db->pkgcache, newpkg, _alpm_pkg_cmp);
_alpm_db_free_grpcache(db); _alpm_db_free_grpcache(db);
@ -172,14 +144,18 @@ int _alpm_db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg)
return(-1); return(-1);
} }
_alpm_log(PM_LOG_DEBUG, _("removing entry '%s' from '%s' cache"),
alpm_pkg_get_name(pkg), db->treename);
db->pkgcache = alpm_list_remove(db->pkgcache, pkg, _alpm_pkg_cmp, &vdata); db->pkgcache = alpm_list_remove(db->pkgcache, pkg, _alpm_pkg_cmp, &vdata);
data = vdata; data = vdata;
if(data == NULL) { if(data == NULL) {
/* package not found */ /* package not found */
_alpm_log(PM_LOG_DEBUG, _("cannot remove entry '%s' from '%s' cache: not found"),
alpm_pkg_get_name(pkg), db->treename);
return(-1); return(-1);
} }
_alpm_log(PM_LOG_DEBUG, _("removing entry '%s' from '%s' cache"), pkg->name, db->treename);
FREEPKG(data); FREEPKG(data);
_alpm_db_free_grpcache(db); _alpm_db_free_grpcache(db);
@ -195,7 +171,7 @@ pmpkg_t *_alpm_db_get_pkgfromcache(pmdb_t *db, const char *target)
return(NULL); return(NULL);
} }
alpm_list_t *pkgcache = _alpm_db_get_pkgcache(db, INFRQ_BASE); alpm_list_t *pkgcache = _alpm_db_get_pkgcache(db);
if(!pkgcache) { if(!pkgcache) {
_alpm_log(PM_LOG_DEBUG, _("error: failed to get '%s' from NULL pkgcache"), target); _alpm_log(PM_LOG_DEBUG, _("error: failed to get '%s' from NULL pkgcache"), target);
return(NULL); return(NULL);
@ -217,21 +193,26 @@ int _alpm_db_load_grpcache(pmdb_t *db)
} }
if(db->pkgcache == NULL) { if(db->pkgcache == NULL) {
_alpm_db_load_pkgcache(db, INFRQ_DESC); _alpm_db_load_pkgcache(db);
} }
_alpm_log(PM_LOG_DEBUG, _("loading group cache for repository '%s'"), db->treename); _alpm_log(PM_LOG_DEBUG, _("loading group cache for repository '%s'"), db->treename);
for(lp = _alpm_db_get_pkgcache(db, INFRQ_DESC); lp; lp = lp->next) { for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) {
alpm_list_t *i; alpm_list_t *i;
pmpkg_t *pkg = lp->data; pmpkg_t *pkg = lp->data;
for(i = pkg->groups; i; i = i->next) { for(i = alpm_pkg_get_groups(pkg); i; i = i->next) {
if(!alpm_list_find_str(db->grpcache, i->data)) { if(!alpm_list_find_str(db->grpcache, i->data)) {
pmgrp_t *grp = _alpm_grp_new(); pmgrp_t *grp = _alpm_grp_new();
STRNCPY(grp->name, (char *)i->data, GRP_NAME_LEN); strncpy(grp->name, i->data, GRP_NAME_LEN);
grp->packages = alpm_list_add_sorted(grp->packages, pkg->name, _alpm_grp_cmp); grp->name[GRP_NAME_LEN-1] = '\0';
grp->packages = alpm_list_add_sorted(grp->packages,
/* gross signature forces us to
* discard const */
(void *)alpm_pkg_get_name(pkg),
_alpm_grp_cmp);
db->grpcache = alpm_list_add_sorted(db->grpcache, grp, _alpm_grp_cmp); db->grpcache = alpm_list_add_sorted(db->grpcache, grp, _alpm_grp_cmp);
} else { } else {
alpm_list_t *j; alpm_list_t *j;
@ -240,8 +221,9 @@ int _alpm_db_load_grpcache(pmdb_t *db)
pmgrp_t *grp = j->data; pmgrp_t *grp = j->data;
if(strcmp(grp->name, i->data) == 0) { if(strcmp(grp->name, i->data) == 0) {
if(!alpm_list_find_str(grp->packages, pkg->name)) { const char *pkgname = alpm_pkg_get_name(pkg);
grp->packages = alpm_list_add_sorted(grp->packages, (char *)pkg->name, _alpm_grp_cmp); if(!alpm_list_find_str(grp->packages, pkgname)) {
grp->packages = alpm_list_add_sorted(grp->packages, (void *)pkgname, _alpm_grp_cmp);
} }
} }
} }

View File

@ -27,11 +27,11 @@
#include "package.h" #include "package.h"
/* packages */ /* packages */
int _alpm_db_load_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel); int _alpm_db_load_pkgcache(pmdb_t *db);
void _alpm_db_free_pkgcache(pmdb_t *db); void _alpm_db_free_pkgcache(pmdb_t *db);
int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg); int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg);
int _alpm_db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg); int _alpm_db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg);
alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel); alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db);
int _alpm_db_ensure_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel); int _alpm_db_ensure_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel);
pmpkg_t *_alpm_db_get_pkgfromcache(pmdb_t *db, const char *target); pmpkg_t *_alpm_db_get_pkgfromcache(pmdb_t *db, const char *target);
/* groups */ /* groups */

View File

@ -46,16 +46,191 @@
#include "deps.h" #include "deps.h"
#include "conflict.h" #include "conflict.h"
/** See if potential conflict 'name' matches package 'pkg'
* @param target the name of the parent package we're checking
* @param depname the name of the dependency we're checking
* @param pkg the package to check
* @param conflict the name of the possible conflict
* @return A depmissing struct indicating the conflict
* @note The first two paramters are here to simplify the addition
* of new 'depmiss' objects
*
* TODO WTF is a 'depmissing' doing indicating a conflict??
*/
static pmdepmissing_t *does_conflict(const char *target, const char *depname,
pmpkg_t *pkg, const char *conflict)
{
alpm_list_t *i;
/* check the actual package name, easy */
if(strcmp(alpm_pkg_get_name(pkg), conflict) == 0) {
_alpm_log(PM_LOG_DEBUG, _(" found conflict '%s' : package '%s'"), conflict, target);
return(_alpm_depmiss_new(target, PM_DEP_TYPE_CONFLICT,
PM_DEP_MOD_ANY, depname, NULL));
} else {
/* check what this package provides, harder */
for(i = alpm_pkg_get_provides(pkg); i; i = i->next) {
const char *provision = i->data;
if(strcmp(provision, conflict) == 0) {
_alpm_log(PM_LOG_DEBUG, _(" found conflict '%s' : package '%s' provides '%s'"),
conflict, target, provision);
return(_alpm_depmiss_new(target, PM_DEP_TYPE_CONFLICT,
PM_DEP_MOD_ANY, depname, NULL));
}
}
}
return(NULL); /* not a conflict */
}
static alpm_list_t *chk_pkg_vs_db(alpm_list_t *baddeps, pmpkg_t *pkg, pmdb_t *db)
{
pmdepmissing_t *miss = NULL;
const char *pkgname;
alpm_list_t *i, *j;
pkgname = alpm_pkg_get_name(pkg);
for(i = alpm_pkg_get_conflicts(pkg); i; i = i->next) {
const char *conflict = i->data;
if(strcmp(pkgname, conflict) == 0) {
/* a package cannot conflict with itself -- that's just not nice */
_alpm_log(PM_LOG_DEBUG, _("package '%s' conflicts with itself - packaging error"),
pkgname);
continue;
}
/* CHECK 1: check targets against database */
_alpm_log(PM_LOG_DEBUG, _("checkconflicts: target '%s' vs db"), pkgname);
for(j = _alpm_db_get_pkgcache(db); j; j = j->next) {
pmpkg_t *dbpkg = j->data;
if(strcmp(alpm_pkg_get_name(dbpkg), pkgname) == 0) {
/* skip the package we're currently processing */
continue;
}
miss = does_conflict(pkgname, alpm_pkg_get_name(dbpkg), dbpkg, conflict);
if(miss && !_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss);
} else {
FREE(miss);
}
}
}
return(baddeps);
}
static alpm_list_t *chk_pkg_vs_targets(alpm_list_t *baddeps,
pmpkg_t *pkg, pmdb_t *db,
alpm_list_t *targets)
{
pmdepmissing_t *miss = NULL;
const char *pkgname;
alpm_list_t *i, *j;
pkgname = alpm_pkg_get_name(pkg);
for(i = alpm_pkg_get_conflicts(pkg); i; i = i->next) {
const char *conflict = i->data;
if(strcmp(pkgname, conflict) == 0) {
/* a package cannot conflict with itself -- that's just not nice */
_alpm_log(PM_LOG_DEBUG, _("package '%s' conflicts with itself - packaging error"),
pkgname);
continue;
}
/* CHECK 2: check targets against targets */
_alpm_log(PM_LOG_DEBUG, _("checkconflicts: target '%s' vs all targets"), pkgname);
for(j = targets; j; j = j->next) {
const char *targetname;
pmpkg_t *target = j->data;
targetname = alpm_pkg_get_name(target);
if(strcmp(targetname, pkgname) == 0) {
/* skip the package we're currently processing */
continue;
}
miss = does_conflict(pkgname, targetname, target, conflict);
if(miss && !_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss);
} else {
FREE(miss);
}
}
}
return(baddeps);
}
static alpm_list_t *chk_db_vs_targets(alpm_list_t *baddeps, pmpkg_t *pkg,
pmdb_t *db, alpm_list_t *targets)
{
pmdepmissing_t *miss = NULL;
const char *pkgname;
alpm_list_t *i, *j;
pkgname = alpm_pkg_get_name(pkg);
_alpm_log(PM_LOG_DEBUG, _("checkconflicts: db vs target '%s'"), pkgname);
for(i = _alpm_db_get_pkgcache(db); i; i = i->next) {
alpm_list_t *conflicts = NULL;
const char *dbpkgname;
pmpkg_t *dbpkg = i->data;
dbpkgname = alpm_pkg_get_name(dbpkg);
if(strcmp(dbpkgname, pkgname) == 0) {
/* skip the package we're currently processing */
continue;
}
/* is this db package in the targets? if so use the
* new package's conflict list to pick up new changes */
int use_newconflicts = 0;
for(j = targets; j; j = j->next) {
pmpkg_t *targ = j->data;
if(strcmp(alpm_pkg_get_name(targ), dbpkgname) == 0) {
_alpm_log(PM_LOG_DEBUG, _("target '%s' is also in target list, using NEW conflicts"),
dbpkgname);
conflicts = alpm_pkg_get_conflicts(targ);
use_newconflicts = 1;
break;
}
}
/* if we didn't find newer conflicts, use the original list */
if(!use_newconflicts) {
conflicts = alpm_pkg_get_conflicts(dbpkg);
}
for(j = conflicts; j; j = j->next) {
const char *conflict = j->data;
miss = does_conflict(pkgname, dbpkgname, pkg, conflict);
if(miss && !_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss);
} else {
FREE(miss);
}
}
}
return(baddeps);
}
/* Returns a alpm_list_t* of pmdepmissing_t pointers. /* Returns a alpm_list_t* of pmdepmissing_t pointers.
* *
* conflicts are always name only * conflicts are always name only
*/ */
alpm_list_t *_alpm_checkconflicts(pmdb_t *db, alpm_list_t *packages) alpm_list_t *_alpm_checkconflicts(pmdb_t *db, alpm_list_t *packages)
{ {
pmpkg_t *info = NULL; alpm_list_t *i, *baddeps = NULL;
alpm_list_t *i, *j, *k;
alpm_list_t *baddeps = NULL;
pmdepmissing_t *miss = NULL;
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -64,150 +239,25 @@ alpm_list_t *_alpm_checkconflicts(pmdb_t *db, alpm_list_t *packages)
} }
for(i = packages; i; i = i->next) { for(i = packages; i; i = i->next) {
pmpkg_t *tp = i->data; pmpkg_t *pkg = i->data;
if(tp == NULL) { if(pkg == NULL) {
continue; continue;
} }
for(j = tp->conflicts; j; j = j->next) { baddeps = chk_pkg_vs_db(baddeps, pkg, db);
if(!strcmp(tp->name, j->data)) { baddeps = chk_pkg_vs_targets(baddeps, pkg, db, packages);
/* a package cannot conflict with itself -- that's just not nice */ baddeps = chk_db_vs_targets(baddeps, pkg, db, packages);
continue;
} }
/* CHECK 1: check targets against database */
_alpm_log(PM_LOG_DEBUG, _("checkconflicts: targ '%s' vs db"), tp->name);
for(k = _alpm_db_get_pkgcache(db, INFRQ_DEPENDS); k; k = k->next) {
pmpkg_t *dp = (pmpkg_t *)k->data;
if(!strcmp(dp->name, tp->name)) {
/* a package cannot conflict with itself -- that's just not nice */
continue;
}
if(!strcmp(j->data, dp->name)) {
/* conflict */
_alpm_log(PM_LOG_DEBUG, _("targs vs db: found %s as a conflict for %s"),
dp->name, tp->name);
miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, dp->name, NULL);
if(!_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss);
} else {
FREE(miss);
}
} else {
/* see if dp provides something in tp's conflict list */
alpm_list_t *m;
for(m = dp->provides; m; m = m->next) {
if(!strcmp(m->data, j->data)) {
/* confict */
_alpm_log(PM_LOG_DEBUG, _("targs vs db: found %s as a conflict for %s"),
dp->name, tp->name);
miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, dp->name, NULL);
if(!_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss);
} else {
FREE(miss);
}
}
}
}
}
/* CHECK 2: check targets against targets */
_alpm_log(PM_LOG_DEBUG, _("checkconflicts: targ '%s' vs targs"), tp->name);
for(k = packages; k; k = k->next) {
pmpkg_t *otp = (pmpkg_t *)k->data;
if(!strcmp(otp->name, tp->name)) {
/* a package cannot conflict with itself -- that's just not nice */
continue;
}
if(!strcmp(otp->name, (char *)j->data)) {
/* otp is listed in tp's conflict list */
_alpm_log(PM_LOG_DEBUG, _("targs vs targs: found %s as a conflict for %s"),
otp->name, tp->name);
miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, otp->name, NULL);
if(!_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss);
} else {
FREE(miss);
}
} else {
/* see if otp provides something in tp's conflict list */
alpm_list_t *m;
for(m = otp->provides; m; m = m->next) {
if(!strcmp(m->data, j->data)) {
_alpm_log(PM_LOG_DEBUG, _("targs vs targs: found %s as a conflict for %s"),
otp->name, tp->name);
miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, otp->name, NULL);
if(!_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss);
} else {
FREE(miss);
}
}
}
}
}
}
/* CHECK 3: check database against targets */
_alpm_log(PM_LOG_DEBUG, _("checkconflicts: db vs targ '%s'"), tp->name);
for(k = _alpm_db_get_pkgcache(db, INFRQ_DEPENDS); k; k = k->next) {
alpm_list_t *conflicts = NULL;
int usenewconflicts = 0;
info = k->data; for(i = baddeps; i; i = i->next) {
if(!strcmp(info->name, tp->name)) { pmdepmissing_t *miss = i->data;
/* a package cannot conflict with itself -- that's just not nice */ _alpm_log(PM_LOG_DEBUG, _("\tCONFLICTS:: %s conflicts with %s"), miss->target, miss->depend.name);
continue;
}
/* If this package (*info) is also in our packages alpm_list_t, use the
* conflicts list from the new package, not the old one (*info)
*/
for(j = packages; j; j = j->next) {
pmpkg_t *pkg = j->data;
if(!strcmp(pkg->name, info->name)) {
/* Use the new, to-be-installed package's conflicts */
conflicts = pkg->conflicts;
usenewconflicts = 1;
}
}
if(!usenewconflicts) {
/* Use the old package's conflicts, it's the only set we have */
conflicts = info->conflicts;
}
for(j = conflicts; j; j = j->next) {
if(!strcmp((char *)j->data, tp->name)) {
_alpm_log(PM_LOG_DEBUG, _("db vs targs: found %s as a conflict for %s"),
info->name, tp->name);
miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, info->name, NULL);
if(!_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss);
} else {
FREE(miss);
}
} else {
/* see if the db package conflicts with something we provide */
alpm_list_t *m;
for(m = conflicts; m; m = m->next) {
alpm_list_t *n;
for(n = tp->provides; n; n = n->next) {
if(!strcmp(m->data, n->data)) {
_alpm_log(PM_LOG_DEBUG, _("db vs targs: found %s as a conflict for %s"),
info->name, tp->name);
miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, info->name, NULL);
if(!_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss);
} else {
FREE(miss);
}
}
}
}
}
}
}
} }
return(baddeps); return(baddeps);
} }
/* Returns a alpm_list_t* of file conflicts. /* Returns a alpm_list_t* of file conflicts.
* Hooray for set-intersects! * Hooray for set-intersects!
* Pre-condition: both lists are sorted! * Pre-condition: both lists are sorted!
@ -288,8 +338,8 @@ static alpm_list_t *chk_filedifference(alpm_list_t *filesA, alpm_list_t *filesB)
* functionality that was done inline. * functionality that was done inline.
*/ */
static alpm_list_t *add_fileconflict(alpm_list_t *conflicts, static alpm_list_t *add_fileconflict(alpm_list_t *conflicts,
pmconflicttype_t type, char *filestr, char* name1, pmconflicttype_t type, const char *filestr,
char* name2) const char* name1, const char* name2)
{ {
pmconflict_t *conflict = malloc(sizeof(pmconflict_t)); pmconflict_t *conflict = malloc(sizeof(pmconflict_t));
if(conflict == NULL) { if(conflict == NULL) {
@ -349,15 +399,16 @@ alpm_list_t *_alpm_db_find_conflicts(pmdb_t *db, pmtrans_t *trans, char *root)
if(!p2) { if(!p2) {
continue; continue;
} }
_alpm_log(PM_LOG_DEBUG, "searching for file conflicts: %s and %s", p1->name, p2->name); _alpm_log(PM_LOG_DEBUG, "searching for file conflicts: %s and %s",
tmpfiles = chk_fileconflicts(p1->files, p2->files); alpm_pkg_get_name(p1), alpm_pkg_get_name(p2));
tmpfiles = chk_fileconflicts(alpm_pkg_get_files(p1), alpm_pkg_get_files(p2));
if(tmpfiles) { if(tmpfiles) {
char path[PATH_MAX]; char path[PATH_MAX];
for(k = tmpfiles; k; k = k->next) { for(k = tmpfiles; k; k = k->next) {
snprintf(path, PATH_MAX, "%s%s", root, (char *)k->data); snprintf(path, PATH_MAX, "%s%s", root, (char *)k->data);
conflicts = add_fileconflict(conflicts, PM_CONFLICT_TYPE_TARGET, conflicts = add_fileconflict(conflicts, PM_CONFLICT_TYPE_TARGET, path,
path, p1->name, p2->name); alpm_pkg_get_name(p1), alpm_pkg_get_name(p2));
} }
alpm_list_free_inner(tmpfiles, &free); alpm_list_free_inner(tmpfiles, &free);
alpm_list_free(tmpfiles); alpm_list_free(tmpfiles);
@ -373,10 +424,10 @@ alpm_list_t *_alpm_db_find_conflicts(pmdb_t *db, pmtrans_t *trans, char *root)
* is not currently installed, then simply stat the whole filelist */ * is not currently installed, then simply stat the whole filelist */
if(dbpkg) { if(dbpkg) {
/* older ver of package currently installed */ /* older ver of package currently installed */
tmpfiles = chk_filedifference(p1->files, alpm_pkg_get_files(dbpkg)); tmpfiles = chk_filedifference(alpm_pkg_get_files(p1), alpm_pkg_get_files(dbpkg));
} else { } else {
/* no version of package currently installed */ /* no version of package currently installed */
tmpfiles = alpm_list_strdup(p1->files); tmpfiles = alpm_list_strdup(alpm_pkg_get_files(p1));
} }
/* loop over each file to be installed */ /* loop over each file to be installed */

View File

@ -71,7 +71,7 @@ pmdb_t *_alpm_db_new(const char *root, const char *dbpath, const char *treename)
FREE(db); FREE(db);
RET_ERR(PM_ERR_MEMORY, NULL); RET_ERR(PM_ERR_MEMORY, NULL);
} }
sprintf(db->path, "%s%s%s", root, dbpath, treename); sprintf(db->path, "%s%s%s/", root, dbpath, treename);
STRNCPY(db->treename, treename, PATH_MAX); STRNCPY(db->treename, treename, PATH_MAX);
@ -115,23 +115,23 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, alpm_list_t *needles)
RET_ERR(PM_ERR_INVALID_REGEX, NULL); RET_ERR(PM_ERR_INVALID_REGEX, NULL);
} }
for(j = _alpm_db_get_pkgcache(db, INFRQ_DESC|INFRQ_DEPENDS); j; j = j->next) { for(j = _alpm_db_get_pkgcache(db); j; j = j->next) {
pmpkg_t *pkg = j->data; pmpkg_t *pkg = j->data;
char *matched = NULL; const char *matched = NULL;
/* check name */ /* check name */
if (regexec(&reg, pkg->name, 0, 0, 0) == 0) { if (regexec(&reg, alpm_pkg_get_name(pkg), 0, 0, 0) == 0) {
matched = pkg->name; matched = alpm_pkg_get_name(pkg);
} }
/* check desc */ /* check desc */
else if (regexec(&reg, pkg->desc, 0, 0, 0) == 0) { else if (regexec(&reg, alpm_pkg_get_desc(pkg), 0, 0, 0) == 0) {
matched = pkg->desc; matched = alpm_pkg_get_desc(pkg);
} }
/* check provides */ /* check provides */
/* TODO: should we be doing this, and should we print something /* TODO: should we be doing this, and should we print something
* differently when we do match it since it isn't currently printed? */ * differently when we do match it since it isn't currently printed? */
else { else {
for(k = pkg->provides; k; k = k->next) { for(k = alpm_pkg_get_provides(pkg); k; k = k->next) {
if (regexec(&reg, k->data, 0, 0, 0) == 0) { if (regexec(&reg, k->data, 0, 0, 0) == 0) {
matched = k->data; matched = k->data;
break; break;

View File

@ -58,7 +58,7 @@ int _alpm_db_install(pmdb_t *db, const char *dbfile);
int _alpm_db_open(pmdb_t *db); int _alpm_db_open(pmdb_t *db);
void _alpm_db_close(pmdb_t *db); void _alpm_db_close(pmdb_t *db);
void _alpm_db_rewind(pmdb_t *db); void _alpm_db_rewind(pmdb_t *db);
pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target, pmdbinfrq_t inforeq); pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target);
int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq); int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq);
int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq); int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq);
int _alpm_db_remove(pmdb_t *db, pmpkg_t *info); int _alpm_db_remove(pmdb_t *db, pmpkg_t *info);

View File

@ -136,8 +136,8 @@ alpm_list_t *_alpm_sortbydeps(alpm_list_t *targets, pmtranstype_t mode)
numscans++; numscans++;
/* run thru targets, moving up packages as necessary */ /* run thru targets, moving up packages as necessary */
for(i = newtargs; i; i = i->next) { for(i = newtargs; i; i = i->next) {
pmpkg_t *p = (pmpkg_t*)i->data; pmpkg_t *p = i->data;
_alpm_log(PM_LOG_DEBUG, "sorting %s", p->name); _alpm_log(PM_LOG_DEBUG, " sorting %s", alpm_pkg_get_name(p));
for(j = alpm_pkg_get_depends(p); j; j = j->next) { for(j = alpm_pkg_get_depends(p); j; j = j->next) {
pmdepend_t dep; pmdepend_t dep;
pmpkg_t *q = NULL; pmpkg_t *q = NULL;
@ -148,17 +148,19 @@ alpm_list_t *_alpm_sortbydeps(alpm_list_t *targets, pmtranstype_t mode)
* move it up above p * move it up above p
*/ */
for(k = i->next; k; k = k->next) { for(k = i->next; k; k = k->next) {
q = (pmpkg_t *)k->data; q = k->data;
if(!strcmp(dep.name, q->name)) { const char *qname = alpm_pkg_get_name(q);
if(!_alpm_pkg_find(q->name, tmptargs)) { if(!strcmp(dep.name, qname)) {
if(!_alpm_pkg_find(qname, tmptargs)) {
change = 1; change = 1;
tmptargs = alpm_list_add(tmptargs, q); tmptargs = alpm_list_add(tmptargs, q);
} }
break; break;
} }
for(l = q->provides; l; l = l->next) { for(l = alpm_pkg_get_provides(q); l; l = l->next) {
if(!strcmp(dep.name, (char*)l->data)) { const char *provname = l->data;
if(!_alpm_pkg_find((char*)l->data, tmptargs)) { if(!strcmp(dep.name, provname)) {
if(!_alpm_pkg_find(provname, tmptargs)) {
change = 1; change = 1;
tmptargs = alpm_list_add(tmptargs, q); tmptargs = alpm_list_add(tmptargs, q);
} }
@ -167,7 +169,7 @@ alpm_list_t *_alpm_sortbydeps(alpm_list_t *targets, pmtranstype_t mode)
} }
} }
} }
if(!_alpm_pkg_find(p->name, tmptargs)) { if(!_alpm_pkg_find(alpm_pkg_get_name(p), tmptargs)) {
tmptargs = alpm_list_add(tmptargs, p); tmptargs = alpm_list_add(tmptargs, p);
} }
} }
@ -221,8 +223,9 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
continue; continue;
} }
if((oldpkg = _alpm_db_get_pkgfromcache(db, newpkg->name)) == NULL) { if((oldpkg = _alpm_db_get_pkgfromcache(db, alpm_pkg_get_name(newpkg))) == NULL) {
_alpm_log(PM_LOG_DEBUG, _("cannot find package installed '%s'"), newpkg->name); _alpm_log(PM_LOG_DEBUG, _("cannot find package installed '%s'"),
alpm_pkg_get_name(newpkg));
continue; continue;
} }
for(j = alpm_pkg_get_requiredby(oldpkg); j; j = j->next) { for(j = alpm_pkg_get_requiredby(oldpkg); j; j = j->next) {
@ -232,7 +235,7 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
/* hmmm... package isn't installed.. */ /* hmmm... package isn't installed.. */
continue; continue;
} }
if(_alpm_pkg_find(p->name, packages)) { if(_alpm_pkg_find(alpm_pkg_get_name(p), packages)) {
/* this package also in the upgrade list, so don't worry about it */ /* this package also in the upgrade list, so don't worry about it */
continue; continue;
} }
@ -250,7 +253,7 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
if(_alpm_depcmp(pkg, &depend)) { if(_alpm_depcmp(pkg, &depend)) {
_alpm_log(PM_LOG_DEBUG, _("checkdeps: dependency '%s' has moved from '%s' to '%s'"), _alpm_log(PM_LOG_DEBUG, _("checkdeps: dependency '%s' has moved from '%s' to '%s'"),
depend.name, oldpkg->name, pkg->name); depend.name, alpm_pkg_get_name(oldpkg), alpm_pkg_get_name(pkg));
satisfied = 1; satisfied = 1;
break; break;
} }
@ -259,17 +262,17 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
if(!satisfied) { if(!satisfied) {
/* worst case... check installed packages to see if anything else /* worst case... check installed packages to see if anything else
* satisfies this... */ * satisfies this... */
for(l = _alpm_db_get_pkgcache(db, INFRQ_DEPENDS); l; l = l->next) { for(l = _alpm_db_get_pkgcache(db); l; l = l->next) {
pmpkg_t *pkg = l->data; pmpkg_t *pkg = l->data;
if(strcmp(pkg->name, oldpkg->name) == 0) { if(strcmp(alpm_pkg_get_name(pkg), alpm_pkg_get_name(oldpkg)) == 0) {
/* well, we know this one succeeds, but we're removing it... skip it */ /* well, we know this one succeeds, but we're removing it... skip it */
continue; continue;
} }
if(_alpm_depcmp(pkg, &depend)) { if(_alpm_depcmp(pkg, &depend)) {
_alpm_log(PM_LOG_DEBUG, _("checkdeps: dependency '%s' satisfied by installed package '%s'"), _alpm_log(PM_LOG_DEBUG, _("checkdeps: dependency '%s' satisfied by installed package '%s'"),
depend.name, pkg->name); depend.name, alpm_pkg_get_name(pkg));
satisfied = 1; satisfied = 1;
break; break;
} }
@ -278,7 +281,7 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
if(!satisfied) { if(!satisfied) {
_alpm_log(PM_LOG_DEBUG, _("checkdeps: updated '%s' won't satisfy a dependency of '%s'"), _alpm_log(PM_LOG_DEBUG, _("checkdeps: updated '%s' won't satisfy a dependency of '%s'"),
oldpkg->name, p->name); alpm_pkg_get_name(oldpkg), alpm_pkg_get_name(p));
miss = _alpm_depmiss_new(p->name, PM_DEP_TYPE_REQUIRED, depend.mod, miss = _alpm_depmiss_new(p->name, PM_DEP_TYPE_REQUIRED, depend.mod,
depend.name, depend.version); depend.name, depend.version);
if(!_alpm_depmiss_isin(miss, baddeps)) { if(!_alpm_depmiss_isin(miss, baddeps)) {
@ -301,28 +304,19 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
continue; continue;
} }
/* ensure package has depends data */ for(j = alpm_pkg_get_depends(tp); j; j = j->next) {
pmdb_t *pkgdb = tp->data;
_alpm_db_read(pkgdb, tp, INFRQ_DEPENDS);
if(!tp->depends) {
_alpm_log(PM_LOG_DEBUG, _("no dependencies for target '%s'"), tp->name);
}
for(j = tp->depends; j; j = j->next) {
/* split into name/version pairs */ /* split into name/version pairs */
_alpm_splitdep((char *)j->data, &depend); _alpm_splitdep((char *)j->data, &depend);
found = 0; found = 0;
/* check database for literal packages */ /* check database for literal packages */
for(k = _alpm_db_get_pkgcache(db, INFRQ_DESC|INFRQ_DEPENDS); for(k = _alpm_db_get_pkgcache(db); k && !found; k = k->next) {
k && !found; k = k->next) {
pmpkg_t *p = (pmpkg_t *)k->data; pmpkg_t *p = (pmpkg_t *)k->data;
found = _alpm_depcmp(p, &depend); found = _alpm_depcmp(p, &depend);
} }
/* check database for provides matches */ /* check database for provides matches */
if(!found) { if(!found) {
alpm_list_t *m; alpm_list_t *m;
k = _alpm_db_whatprovides(db, depend.name); for(m = _alpm_db_whatprovides(db, depend.name); m && !found; m = m->next) {
for(m = k; m && !found; m = m->next) {
/* look for a match that isn't one of the packages we're trying /* look for a match that isn't one of the packages we're trying
* to install. this way, if we match against a to-be-installed * to install. this way, if we match against a to-be-installed
* package, we'll defer to the NEW one, not the one already * package, we'll defer to the NEW one, not the one already
@ -332,7 +326,7 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
int skip = 0; int skip = 0;
for(n = packages; n && !skip; n = n->next) { for(n = packages; n && !skip; n = n->next) {
pmpkg_t *ptp = n->data; pmpkg_t *ptp = n->data;
if(!strcmp(ptp->name, p->name)) { if(strcmp(alpm_pkg_get_name(ptp), alpm_pkg_get_name(p)) == 0) {
skip = 1; skip = 1;
} }
} }
@ -346,14 +340,14 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
} }
/* check other targets */ /* check other targets */
for(k = packages; k && !found; k = k->next) { for(k = packages; k && !found; k = k->next) {
pmpkg_t *p = (pmpkg_t *)k->data; pmpkg_t *p = k->data;
found = _alpm_depcmp(p, &depend); found = _alpm_depcmp(p, &depend);
} }
/* else if still not found... */ /* else if still not found... */
if(!found) { if(!found) {
_alpm_log(PM_LOG_DEBUG, _("missing dependency '%s' for package '%s'"), _alpm_log(PM_LOG_DEBUG, _("missing dependency '%s' for package '%s'"),
depend.name, tp->name); depend.name, alpm_pkg_get_name(tp));
miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_DEPEND, depend.mod, miss = _alpm_depmiss_new(alpm_pkg_get_name(tp), PM_DEP_TYPE_DEPEND, depend.mod,
depend.name, depend.version); depend.name, depend.version);
if(!_alpm_depmiss_isin(miss, baddeps)) { if(!_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss); baddeps = alpm_list_add(baddeps, miss);
@ -372,13 +366,13 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
} }
found=0; found=0;
for(j = tp->requiredby; j; j = j->next) { for(j = alpm_pkg_get_requiredby(tp); j; j = j->next) {
/* Search for 'reqname' in packages for removal */ /* Search for 'reqname' in packages for removal */
char *reqname = j->data; char *reqname = j->data;
alpm_list_t *x = NULL; alpm_list_t *x = NULL;
for(x = packages; x; x = x->next) { for(x = packages; x; x = x->next) {
pmpkg_t *xp = x->data; pmpkg_t *xp = x->data;
if(strcmp(reqname, xp->name) == 0) { if(strcmp(reqname, alpm_pkg_get_name(xp)) == 0) {
found = 1; found = 1;
break; break;
} }
@ -394,15 +388,15 @@ alpm_list_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, pmtranstype_t op,
spkg = k->data; spkg = k->data;
} }
if(spkg) { if(spkg) {
if(alpm_list_find_str(spkg->provides, tp->name)) { if(alpm_list_find_str(alpm_pkg_get_provides(spkg), tp->name)) {
found = 1; found = 1;
} }
} }
} }
if(!found) { if(!found) {
_alpm_log(PM_LOG_DEBUG, _("checkdeps: found %s as required by %s"), _alpm_log(PM_LOG_DEBUG, _("checkdeps: found %s as required by %s"),
reqname, tp->name); reqname, alpm_pkg_get_name(tp));
miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_REQUIRED, miss = _alpm_depmiss_new(alpm_pkg_get_name(tp), PM_DEP_TYPE_REQUIRED,
PM_DEP_MOD_ANY, j->data, NULL); PM_DEP_MOD_ANY, j->data, NULL);
if(!_alpm_depmiss_isin(miss, baddeps)) { if(!_alpm_depmiss_isin(miss, baddeps)) {
baddeps = alpm_list_add(baddeps, miss); baddeps = alpm_list_add(baddeps, miss);
@ -468,20 +462,20 @@ static int can_remove_package(pmdb_t *db, pmpkg_t *pkg, alpm_list_t *targets)
{ {
alpm_list_t *i; alpm_list_t *i;
if(_alpm_pkg_find(pkg->name, targets)) { if(_alpm_pkg_find(alpm_pkg_get_name(pkg), targets)) {
return(0); return(0);
} }
/* see if it was explicitly installed */ /* see if it was explicitly installed */
if(alpm_pkg_get_reason(pkg) == PM_PKG_REASON_EXPLICIT) { if(alpm_pkg_get_reason(pkg) == PM_PKG_REASON_EXPLICIT) {
_alpm_log(PM_LOG_DEBUG, _("excluding %s -- explicitly installed"), pkg->name); _alpm_log(PM_LOG_DEBUG, _("excluding %s -- explicitly installed"), alpm_pkg_get_name(pkg));
return(0); return(0);
} }
/* see if other packages need it */ /* see if other packages need it */
for(i = alpm_pkg_get_requiredby(pkg); i; i = i->next) { for(i = alpm_pkg_get_requiredby(pkg); i; i = i->next) {
pmpkg_t *reqpkg = _alpm_db_get_pkgfromcache(db, i->data); pmpkg_t *reqpkg = _alpm_db_get_pkgfromcache(db, i->data);
if(reqpkg && !_alpm_pkg_find(reqpkg->name, targets)) { if(reqpkg && !_alpm_pkg_find(alpm_pkg_get_name(reqpkg), targets)) {
return(0); return(0);
} }
} }
@ -527,10 +521,9 @@ alpm_list_t *_alpm_removedeps(pmdb_t *db, alpm_list_t *targs)
for(k = provides; k; k = k->next) { for(k = provides; k; k = k->next) {
pmpkg_t *provpkg = k->data; pmpkg_t *provpkg = k->data;
if(can_remove_package(db, provpkg, newtargs)) { if(can_remove_package(db, provpkg, newtargs)) {
pmpkg_t *pkg = _alpm_pkg_new(provpkg->name, provpkg->version); pmpkg_t *pkg = _alpm_pkg_new(alpm_pkg_get_name(provpkg), alpm_pkg_get_version(provpkg));
_alpm_db_read(db, pkg, INFRQ_ALL);
_alpm_log(PM_LOG_DEBUG, _("adding '%s' to the targets"), pkg->name); _alpm_log(PM_LOG_DEBUG, _("adding '%s' to the targets"), alpm_pkg_get_name(pkg));
/* add it to the target list */ /* add it to the target list */
newtargs = alpm_list_add(newtargs, pkg); newtargs = alpm_list_add(newtargs, pkg);
@ -540,9 +533,8 @@ alpm_list_t *_alpm_removedeps(pmdb_t *db, alpm_list_t *targs)
FREELISTPTR(provides); FREELISTPTR(provides);
} else if(can_remove_package(db, dep, newtargs)) { } else if(can_remove_package(db, dep, newtargs)) {
pmpkg_t *pkg = _alpm_pkg_new(dep->name, dep->version); pmpkg_t *pkg = _alpm_pkg_new(dep->name, dep->version);
_alpm_db_read(db, pkg, INFRQ_ALL);
_alpm_log(PM_LOG_DEBUG, _("adding '%s' to the targets"), pkg->name); _alpm_log(PM_LOG_DEBUG, _("adding '%s' to the targets"), alpm_pkg_get_name(pkg));
/* add it to the target list */ /* add it to the target list */
newtargs = alpm_list_add(newtargs, pkg); newtargs = alpm_list_add(newtargs, pkg);
@ -589,10 +581,10 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,
/* check if one of the packages in *list already provides this dependency */ /* check if one of the packages in *list already provides this dependency */
for(j = list; j && !found; j = j->next) { for(j = list; j && !found; j = j->next) {
pmpkg_t *sp = (pmpkg_t *)j->data; pmpkg_t *sp = j->data;
if(alpm_list_find_str(sp->provides, miss->depend.name)) { if(alpm_list_find_str(alpm_pkg_get_provides(sp), miss->depend.name)) {
_alpm_log(PM_LOG_DEBUG, _("%s provides dependency %s -- skipping"), _alpm_log(PM_LOG_DEBUG, _("%s provides dependency %s -- skipping"),
sp->name, miss->depend.name); alpm_pkg_get_name(sp), miss->depend.name);
found = 1; found = 1;
} }
} }
@ -604,9 +596,11 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,
/* check literals */ /* check literals */
for(j = dbs_sync; !sync && j; j = j->next) { for(j = dbs_sync; !sync && j; j = j->next) {
sync = _alpm_db_get_pkgfromcache(j->data, miss->depend.name); sync = _alpm_db_get_pkgfromcache(j->data, miss->depend.name);
_alpm_db_read(j->data, sync, INFRQ_DEPENDS);
} }
/*TODO this autoresolves the first 'provides' package... we should fix this
* somehow */
/* check provides */ /* check provides */
if(!sync) {
for(j = dbs_sync; !sync && j; j = j->next) { for(j = dbs_sync; !sync && j; j = j->next) {
alpm_list_t *provides; alpm_list_t *provides;
provides = _alpm_db_whatprovides(j->data, miss->depend.name); provides = _alpm_db_whatprovides(j->data, miss->depend.name);
@ -615,7 +609,9 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,
} }
FREELISTPTR(provides); FREELISTPTR(provides);
} }
if(sync == NULL) { }
if(!sync) {
_alpm_log(PM_LOG_ERROR, _("cannot resolve dependencies for \"%s\" (\"%s\" is not in the package set)"), _alpm_log(PM_LOG_ERROR, _("cannot resolve dependencies for \"%s\" (\"%s\" is not in the package set)"),
miss->target, miss->depend.name); miss->target, miss->depend.name);
if(data) { if(data) {
@ -631,19 +627,19 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,
pm_errno = PM_ERR_UNSATISFIED_DEPS; pm_errno = PM_ERR_UNSATISFIED_DEPS;
goto error; goto error;
} }
if(_alpm_pkg_find(sync->name, list)) { if(_alpm_pkg_find(alpm_pkg_get_name(sync), list)) {
/* this dep is already in the target list */ /* this dep is already in the target list */
_alpm_log(PM_LOG_DEBUG, _("dependency %s is already in the target list -- skipping"), _alpm_log(PM_LOG_DEBUG, _("dependency %s is already in the target list -- skipping"),
sync->name); alpm_pkg_get_name(sync));
continue; continue;
} }
if(!_alpm_pkg_find(sync->name, trail)) { if(!_alpm_pkg_find(alpm_pkg_get_name(sync), trail)) {
/* check pmo_ignorepkg and pmo_s_ignore to make sure we haven't pulled in /* check pmo_ignorepkg and pmo_s_ignore to make sure we haven't pulled in
* something we're not supposed to. * something we're not supposed to.
*/ */
int usedep = 1; int usedep = 1;
if(alpm_list_find_str(handle->ignorepkg, sync->name)) { if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(sync))) {
pmpkg_t *dummypkg = _alpm_pkg_new(miss->target, NULL); pmpkg_t *dummypkg = _alpm_pkg_new(miss->target, NULL);
QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, dummypkg, sync, NULL, &usedep); QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, dummypkg, sync, NULL, &usedep);
FREEPKG(dummypkg); FREEPKG(dummypkg);
@ -654,7 +650,7 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,
goto error; goto error;
} }
_alpm_log(PM_LOG_DEBUG, _("pulling dependency %s (needed by %s)"), _alpm_log(PM_LOG_DEBUG, _("pulling dependency %s (needed by %s)"),
sync->name, syncpkg->name); alpm_pkg_get_name(sync), alpm_pkg_get_name(syncpkg));
list = alpm_list_add(list, sync); list = alpm_list_add(list, sync);
} else { } else {
_alpm_log(PM_LOG_ERROR, _("cannot resolve dependencies for \"%s\""), miss->target); _alpm_log(PM_LOG_ERROR, _("cannot resolve dependencies for \"%s\""), miss->target);

View File

@ -82,17 +82,17 @@ pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg)
} }
memcpy(newpkg, pkg, sizeof(pmpkg_t)); memcpy(newpkg, pkg, sizeof(pmpkg_t));
newpkg->license = alpm_list_strdup(pkg->license); newpkg->licenses = alpm_list_strdup(alpm_pkg_get_licenses(pkg));
/*newpkg->desc_localized = alpm_list_strdup(pkg->desc_localized);*/ /*newpkg->desc_localized = alpm_list_strdup(pkg->desc_localized);*/
newpkg->requiredby = alpm_list_strdup(pkg->requiredby); newpkg->requiredby = alpm_list_strdup(alpm_pkg_get_requiredby(pkg));
newpkg->conflicts = alpm_list_strdup(pkg->conflicts); newpkg->conflicts = alpm_list_strdup(alpm_pkg_get_conflicts(pkg));
newpkg->files = alpm_list_strdup(pkg->files); newpkg->files = alpm_list_strdup(alpm_pkg_get_files(pkg));
newpkg->backup = alpm_list_strdup(pkg->backup); newpkg->backup = alpm_list_strdup(alpm_pkg_get_backup(pkg));
newpkg->depends = alpm_list_strdup(pkg->depends); newpkg->depends = alpm_list_strdup(alpm_pkg_get_depends(pkg));
newpkg->removes = alpm_list_strdup(pkg->removes); newpkg->removes = alpm_list_strdup(alpm_pkg_get_removes(pkg));
newpkg->groups = alpm_list_strdup(pkg->groups); newpkg->groups = alpm_list_strdup(alpm_pkg_get_groups(pkg));
newpkg->provides = alpm_list_strdup(pkg->provides); newpkg->provides = alpm_list_strdup(alpm_pkg_get_provides(pkg));
newpkg->replaces = alpm_list_strdup(pkg->replaces); newpkg->replaces = alpm_list_strdup(alpm_pkg_get_replaces(pkg));
/* internal */ /* internal */
newpkg->data = (newpkg->origin == PKG_FROM_FILE) ? strdup(pkg->data) : pkg->data; newpkg->data = (newpkg->origin == PKG_FROM_FILE) ? strdup(pkg->data) : pkg->data;
@ -109,7 +109,7 @@ void _alpm_pkg_free(void *data)
return; return;
} }
FREELIST(pkg->license); FREELIST(pkg->licenses);
/*FREELIST(pkg->desc_localized);*/ /*FREELIST(pkg->desc_localized);*/
FREELIST(pkg->files); FREELIST(pkg->files);
FREELIST(pkg->backup); FREELIST(pkg->backup);
@ -141,28 +141,32 @@ int alpm_pkg_compare_versions(pmpkg_t *local_pkg, pmpkg_t *pkg)
} }
/* compare versions and see if we need to upgrade */ /* compare versions and see if we need to upgrade */
cmp = _alpm_versioncmp(pkg->version, local_pkg->version); cmp = _alpm_versioncmp(alpm_pkg_get_version(pkg), alpm_pkg_get_version(local_pkg));
if(cmp != 0 && pkg->force) { if(cmp != 0 && pkg->force) {
cmp = 1; cmp = 1;
_alpm_log(PM_LOG_WARNING, _("%s: forcing upgrade to version %s"), local_pkg->name, pkg->version); _alpm_log(PM_LOG_WARNING, _("%s: forcing upgrade to version %s"),
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
} else if(cmp < 0) { } else if(cmp < 0) {
/* local version is newer */ /* local version is newer */
pmdb_t *db = pkg->data; pmdb_t *db = pkg->data;
_alpm_log(PM_LOG_WARNING, _("%s: local (%s) is newer than %s (%s)"), _alpm_log(PM_LOG_WARNING, _("%s: local (%s) is newer than %s (%s)"),
local_pkg->name, local_pkg->version, db->treename, pkg->version); alpm_pkg_get_name(local_pkg), alpm_pkg_get_version(local_pkg),
alpm_db_get_name(db), alpm_pkg_get_version(pkg));
cmp = 0; cmp = 0;
} else if(cmp > 0) { } else if(cmp > 0) {
/* we have an upgrade, make sure we should actually do it */ /* we have an upgrade, make sure we should actually do it */
if(alpm_list_find_str(handle->ignorepkg, pkg->name)) { if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(pkg))) {
/* package should be ignored (IgnorePkg) */ /* package should be ignored (IgnorePkg) */
_alpm_log(PM_LOG_WARNING, _("%s-%s: ignoring package upgrade (%s)"), _alpm_log(PM_LOG_WARNING, _("%s-%s: ignoring package upgrade (%s)"),
local_pkg->name, local_pkg->version, pkg->version); alpm_pkg_get_name(local_pkg), alpm_pkg_get_version(local_pkg),
alpm_pkg_get_version(pkg));
cmp = 0; cmp = 0;
} else if(_alpm_pkg_istoonew(pkg)) { } else if(_alpm_pkg_istoonew(pkg)) {
/* package too new (UpgradeDelay) */ /* package too new (UpgradeDelay) */
_alpm_log(PM_LOG_WARNING, _("%s-%s: delaying upgrade of package (%s)"), _alpm_log(PM_LOG_WARNING, _("%s-%s: delaying upgrade of package (%s)"),
local_pkg->name, local_pkg->version, pkg->version); alpm_pkg_get_name(local_pkg), alpm_pkg_get_version(local_pkg),
alpm_pkg_get_version(pkg));
cmp = 0; cmp = 0;
} }
} }
@ -174,7 +178,10 @@ int alpm_pkg_compare_versions(pmpkg_t *local_pkg, pmpkg_t *pkg)
*/ */
int _alpm_pkg_cmp(const void *p1, const void *p2) int _alpm_pkg_cmp(const void *p1, const void *p2)
{ {
return(strcmp(((pmpkg_t *)p1)->name, ((pmpkg_t *)p2)->name)); pmpkg_t *pk1 = (pmpkg_t *)p1;
pmpkg_t *pk2 = (pmpkg_t *)p2;
return(strcmp(alpm_pkg_get_name(pk1), alpm_pkg_get_name(pk2)));
} }
/* Parses the package description file for the current package /* Parses the package description file for the current package
@ -240,7 +247,7 @@ static int parse_descfile(const char *descfile, pmpkg_t *info)
} else if(!strcmp(key, "URL")) { } else if(!strcmp(key, "URL")) {
STRNCPY(info->url, ptr, sizeof(info->url)); STRNCPY(info->url, ptr, sizeof(info->url));
} else if(!strcmp(key, "LICENSE")) { } else if(!strcmp(key, "LICENSE")) {
info->license = alpm_list_add(info->license, strdup(ptr)); info->licenses = alpm_list_add(info->licenses, strdup(ptr));
} else if(!strcmp(key, "BUILDDATE")) { } else if(!strcmp(key, "BUILDDATE")) {
STRNCPY(info->builddate, ptr, sizeof(info->builddate)); STRNCPY(info->builddate, ptr, sizeof(info->builddate));
} else if(!strcmp(key, "BUILDTYPE")) { } else if(!strcmp(key, "BUILDTYPE")) {
@ -467,7 +474,7 @@ pmpkg_t *_alpm_pkg_find(const char *needle, alpm_list_t *haystack)
for(lp = haystack; lp; lp = lp->next) { for(lp = haystack; lp; lp = lp->next) {
pmpkg_t *info = lp->data; pmpkg_t *info = lp->data;
if(info && strcmp(info->name, needle) == 0) { if(info && strcmp(alpm_pkg_get_name(info), needle) == 0) {
return(info); return(info);
} }
} }
@ -533,12 +540,12 @@ void _alpm_pkg_update_requiredby(pmpkg_t *pkg)
alpm_list_t *i, *j, *k; alpm_list_t *i, *j, *k;
pmdb_t *localdb = alpm_option_get_localdb(); pmdb_t *localdb = alpm_option_get_localdb();
for(i = _alpm_db_get_pkgcache(localdb, INFRQ_DEPENDS); i; i = i->next) { for(i = _alpm_db_get_pkgcache(localdb); i; i = i->next) {
if(!i->data) { if(!i->data) {
continue; continue;
} }
pmpkg_t *cachepkg = i->data; pmpkg_t *cachepkg = i->data;
for(j = cachepkg->depends; j; j = j->next) { for(j = alpm_pkg_get_depends(cachepkg); j; j = j->next) {
pmdepend_t dep; pmdepend_t dep;
if(!j->data) { if(!j->data) {
continue; continue;
@ -548,19 +555,23 @@ void _alpm_pkg_update_requiredby(pmpkg_t *pkg)
} }
/* check the actual package itself */ /* check the actual package itself */
if(strcmp(dep.name, pkg->name) == 0) { if(strcmp(dep.name, alpm_pkg_get_name(pkg)) == 0) {
_alpm_log(PM_LOG_DEBUG, _("adding '%s' in requiredby field for '%s'"), _alpm_log(PM_LOG_DEBUG, _("adding '%s' in requiredby field for '%s'"),
cachepkg->name, pkg->name); cachepkg->name, pkg->name);
pkg->requiredby = alpm_list_add(pkg->requiredby, strdup(cachepkg->name)); alpm_list_t *reqs = alpm_pkg_get_requiredby(pkg);
reqs = alpm_list_add(reqs, strdup(alpm_pkg_get_name(cachepkg)));
pkg->requiredby = reqs;
} }
/* check for provisions as well */ /* check for provisions as well */
for(k = pkg->provides; k; k = k->next) { for(k = alpm_pkg_get_provides(pkg); k; k = k->next) {
const char *provname = k->data; const char *provname = k->data;
if(strcmp(dep.name, provname) == 0) { if(strcmp(dep.name, provname) == 0) {
_alpm_log(PM_LOG_DEBUG, _("adding '%s' in requiredby field for '%s' (provides: %s)"), _alpm_log(PM_LOG_DEBUG, _("adding '%s' in requiredby field for '%s' (provides: %s)"),
cachepkg->name, pkg->name, provname); alpm_pkg_get_name(cachepkg), alpm_pkg_get_name(pkg), provname);
pkg->requiredby = alpm_list_add(pkg->requiredby, strdup(cachepkg->name)); alpm_list_t *reqs = alpm_pkg_get_requiredby(pkg);
reqs = alpm_list_add(reqs, strdup(alpm_pkg_get_name(cachepkg)));
pkg->requiredby = reqs;
} }
} }
} }
@ -799,7 +810,7 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_licenses(pmpkg_t *pkg)
if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) {
_alpm_db_read(pkg->data, pkg, INFRQ_DESC); _alpm_db_read(pkg->data, pkg, INFRQ_DESC);
} }
return pkg->license; return pkg->licenses;
} }
alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg) alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg)

View File

@ -71,7 +71,7 @@ struct __pmpkg_t {
time_t date; time_t date;
pmpkgreason_t reason; pmpkgreason_t reason;
/* alpm_list_t *desc_localized;*/ /* alpm_list_t *desc_localized;*/
alpm_list_t *license; alpm_list_t *licenses;
alpm_list_t *replaces; alpm_list_t *replaces;
alpm_list_t *groups; alpm_list_t *groups;
alpm_list_t *files; alpm_list_t *files;

View File

@ -42,7 +42,7 @@ alpm_list_t *_alpm_db_whatprovides(pmdb_t *db, const char *package)
return(NULL); return(NULL);
} }
for(lp = _alpm_db_get_pkgcache(db, INFRQ_DEPENDS); lp; lp = lp->next) { for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) {
pmpkg_t *info = lp->data; pmpkg_t *info = lp->data;
if(alpm_list_find_str(alpm_pkg_get_provides(info), package)) { if(alpm_list_find_str(alpm_pkg_get_provides(info), package)) {

View File

@ -73,7 +73,7 @@ int _alpm_remove_loadtarget(pmtrans_t *trans, pmdb_t *db, char *name)
RET_ERR(PM_ERR_TRANS_DUP_TARGET, -1); RET_ERR(PM_ERR_TRANS_DUP_TARGET, -1);
} }
if((info = _alpm_db_scan(db, name, INFRQ_ALL)) == NULL) { if((info = _alpm_db_scan(db, name)) == NULL) {
/* Unimportant - just ignore it if we can't find it */ /* Unimportant - just ignore it if we can't find it */
_alpm_log(PM_LOG_DEBUG, _("could not find %s in database"), name); _alpm_log(PM_LOG_DEBUG, _("could not find %s in database"), name);
RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
@ -115,9 +115,9 @@ int _alpm_remove_prepare(pmtrans_t *trans, pmdb_t *db, alpm_list_t **data)
alpm_list_t *i; alpm_list_t *i;
for(i = lp; i; i = i->next) { for(i = lp; i; i = i->next) {
pmdepmissing_t *miss = (pmdepmissing_t *)i->data; pmdepmissing_t *miss = (pmdepmissing_t *)i->data;
pmpkg_t *info = _alpm_db_scan(db, miss->depend.name, INFRQ_ALL); pmpkg_t *info = _alpm_db_scan(db, miss->depend.name);
if(info) { if(info) {
_alpm_log(PM_LOG_DEBUG, _("pulling %s in the targets list"), info->name); _alpm_log(PM_LOG_DEBUG, _("pulling %s in the targets list"), alpm_pkg_get_name(info));
trans->packages = alpm_list_add(trans->packages, info); trans->packages = alpm_list_add(trans->packages, info);
} else { } else {
_alpm_log(PM_LOG_ERROR, _("could not find %s in database -- skipping"), _alpm_log(PM_LOG_ERROR, _("could not find %s in database -- skipping"),
@ -200,7 +200,7 @@ static void unlink_file(pmpkg_t *info, alpm_list_t *lp, alpm_list_t *targ,
percent = (double)*position / filenum; percent = (double)*position / filenum;
} }
char *hash = _alpm_needbackup(lp->data, info->backup); char *hash = _alpm_needbackup(lp->data, alpm_pkg_get_backup(info));
if(hash) { if(hash) {
needbackup = 1; needbackup = 1;
FREE(hash); FREE(hash);
@ -275,6 +275,7 @@ int _alpm_remove_commit(pmtrans_t *trans, pmdb_t *db)
for(targ = trans->packages; targ; targ = targ->next) { for(targ = trans->packages; targ; targ = targ->next) {
int position = 0; int position = 0;
char pm_install[PATH_MAX]; char pm_install[PATH_MAX];
alpm_list_t *files;
info = (pmpkg_t*)targ->data; info = (pmpkg_t*)targ->data;
if(handle->trans->state == STATE_INTERRUPTED) { if(handle->trans->state == STATE_INTERRUPTED) {
@ -283,54 +284,63 @@ int _alpm_remove_commit(pmtrans_t *trans, pmdb_t *db)
if(trans->type != PM_TRANS_TYPE_UPGRADE) { if(trans->type != PM_TRANS_TYPE_UPGRADE) {
EVENT(trans, PM_TRANS_EVT_REMOVE_START, info, NULL); EVENT(trans, PM_TRANS_EVT_REMOVE_START, info, NULL);
_alpm_log(PM_LOG_DEBUG, _("removing package %s-%s"), info->name, info->version); _alpm_log(PM_LOG_DEBUG, _("removing package %s-%s"),
alpm_pkg_get_name(info), alpm_pkg_get_version(info));
/* run the pre-remove scriptlet if it exists */ /* run the pre-remove scriptlet if it exists */
if(info->scriptlet && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) { if(alpm_pkg_has_scriptlet(info) && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) {
snprintf(pm_install, PATH_MAX, "%s/%s-%s/install", db->path, info->name, info->version); snprintf(pm_install, PATH_MAX, "%s/%s-%s/install", db->path,
_alpm_runscriptlet(handle->root, pm_install, "pre_remove", info->version, NULL, trans); alpm_pkg_get_name(info), alpm_pkg_get_version(info));
_alpm_runscriptlet(handle->root, pm_install, "pre_remove",
alpm_pkg_get_version(info), NULL, trans);
} }
} }
files = alpm_pkg_get_files(info);
if(!(trans->flags & PM_TRANS_FLAG_DBONLY)) { if(!(trans->flags & PM_TRANS_FLAG_DBONLY)) {
for(lp = info->files; lp; lp = lp->next) { for(lp = files; lp; lp = lp->next) {
if(!can_remove_file(trans, lp->data)) { if(!can_remove_file(trans, lp->data)) {
_alpm_log(PM_LOG_DEBUG, _("not removing package '%s', can't remove all files"), info->name); _alpm_log(PM_LOG_DEBUG, _("not removing package '%s', can't remove all files"),
alpm_pkg_get_name(info));
RET_ERR(PM_ERR_PKG_CANT_REMOVE, -1); RET_ERR(PM_ERR_PKG_CANT_REMOVE, -1);
} }
} }
int filenum = alpm_list_count(info->files); int filenum = alpm_list_count(files);
_alpm_log(PM_LOG_DEBUG, _("removing files")); _alpm_log(PM_LOG_DEBUG, _("removing %d files"), filenum);
/* iterate through the list backwards, unlinking files */ /* iterate through the list backwards, unlinking files */
for(lp = alpm_list_last(info->files); lp; lp = lp->prev) { for(lp = alpm_list_last(files); lp; lp = lp->prev) {
unlink_file(info, lp, targ, trans, filenum, &position); unlink_file(info, lp, targ, trans, filenum, &position);
} }
} }
if(trans->type != PM_TRANS_TYPE_UPGRADE) { if(trans->type != PM_TRANS_TYPE_UPGRADE) {
/* run the post-remove script if it exists */ /* run the post-remove script if it exists */
if(info->scriptlet && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) { if(alpm_pkg_has_scriptlet(info) && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) {
snprintf(pm_install, PATH_MAX, "%s/%s-%s/install", db->path, info->name, info->version); snprintf(pm_install, PATH_MAX, "%s/%s-%s/install", db->path,
_alpm_runscriptlet(handle->root, pm_install, "post_remove", info->version, NULL, trans); alpm_pkg_get_name(info), alpm_pkg_get_version(info));
_alpm_runscriptlet(handle->root, pm_install, "post_remove",
alpm_pkg_get_version(info), NULL, trans);
} }
} }
/* remove the package from the database */ /* remove the package from the database */
_alpm_log(PM_LOG_DEBUG, _("updating database")); _alpm_log(PM_LOG_DEBUG, _("updating database"));
_alpm_log(PM_LOG_DEBUG, _("removing database entry '%s'"), info->name); _alpm_log(PM_LOG_DEBUG, _("removing database entry '%s'"), alpm_pkg_get_name(info));
if(_alpm_db_remove(db, info) == -1) { if(_alpm_db_remove(db, info) == -1) {
_alpm_log(PM_LOG_ERROR, _("could not remove database entry %s-%s"), info->name, info->version); _alpm_log(PM_LOG_ERROR, _("could not remove database entry %s-%s"),
alpm_pkg_get_name(info), alpm_pkg_get_version(info));
} }
if(_alpm_db_remove_pkgfromcache(db, info) == -1) { if(_alpm_db_remove_pkgfromcache(db, info) == -1) {
_alpm_log(PM_LOG_ERROR, _("could not remove entry '%s' from cache"), info->name); _alpm_log(PM_LOG_ERROR, _("could not remove entry '%s' from cache"), alpm_pkg_get_name(info));
} }
/* update dependency packages' REQUIREDBY fields */ /* update dependency packages' REQUIREDBY fields */
_alpm_trans_update_depends(trans, info); _alpm_trans_update_depends(trans, info);
PROGRESS(trans, PM_TRANS_PROGRESS_REMOVE_START, info->name, 100, alpm_list_count(trans->packages), (alpm_list_count(trans->packages) - alpm_list_count(targ) +1)); PROGRESS(trans, PM_TRANS_PROGRESS_REMOVE_START, alpm_pkg_get_name(info), 100, alpm_list_count(trans->packages), (alpm_list_count(trans->packages) - alpm_list_count(targ) +1));
if(trans->type != PM_TRANS_TYPE_UPGRADE) { if(trans->type != PM_TRANS_TYPE_UPGRADE) {
EVENT(trans, PM_TRANS_EVT_REMOVE_DONE, info, NULL); EVENT(trans, PM_TRANS_EVT_REMOVE_DONE, info, NULL);
} }

View File

@ -91,37 +91,13 @@ void _alpm_sync_free(void *data)
FREE(sync); FREE(sync);
} }
/* Test for existence of a package in a alpm_list_t* of pmsyncpkg_t*
* If found, return a pointer to the respective pmsyncpkg_t*
*/
static pmsyncpkg_t *find_pkginsync(char *needle, alpm_list_t *haystack)
{
alpm_list_t *i;
pmsyncpkg_t *sync = NULL;
int found = 0;
ALPM_LOG_FUNC;
for(i = haystack; i && !found; i = i->next) {
sync = i->data;
if(sync && !strcmp(sync->pkg->name, needle)) {
found = 1;
}
}
if(!found) {
sync = NULL;
}
return(sync);
}
/* Find recommended replacements for packages during a sync. /* Find recommended replacements for packages during a sync.
* (refactored from _alpm_sync_prepare) * (refactored from _alpm_sync_prepare)
*/ */
static int find_replacements(pmtrans_t *trans, pmdb_t *db_local, static int find_replacements(pmtrans_t *trans, pmdb_t *db_local,
alpm_list_t *dbs_sync) alpm_list_t *dbs_sync)
{ {
alpm_list_t *i, *j, *k, *m; /* wow */ alpm_list_t *i, *j, *k; /* wow */
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -131,20 +107,22 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local,
pmdb_t *db = i->data; pmdb_t *db = i->data;
/* for each db, check each package's REPLACES list */ /* for each db, check each package's REPLACES list */
for(j = _alpm_db_get_pkgcache(db, INFRQ_DESC); j; j = j->next) { for(j = _alpm_db_get_pkgcache(db); j; j = j->next) {
pmpkg_t *spkg = j->data; pmpkg_t *spkg = j->data;
for(k = alpm_pkg_get_replaces(spkg); k; k = k->next) { for(k = alpm_pkg_get_replaces(spkg); k; k = k->next) {
const char *replacement = k->data; const char *replacement = k->data;
/* compare to local DB */
for(m = _alpm_db_get_pkgcache(db_local, INFRQ_BASE); m; m = m->next) {
pmpkg_t *lpkg = m->data;
if(strcmp(replacement, lpkg->name) == 0) { pmpkg_t *lpkg = _alpm_db_get_pkgfromcache(db_local, replacement);
if(!lpkg) {
continue;
}
_alpm_log(PM_LOG_DEBUG, _("checking replacement '%s' for package '%s'"), replacement, spkg->name); _alpm_log(PM_LOG_DEBUG, _("checking replacement '%s' for package '%s'"), replacement, spkg->name);
if(alpm_list_find_str(handle->ignorepkg, lpkg->name)) { if(alpm_list_find_str(handle->ignorepkg, lpkg->name)) {
_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); alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg),
alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
} else { } else {
/* get confirmation for the replacement */ /* get confirmation for the replacement */
int doreplace = 0; int doreplace = 0;
@ -155,14 +133,14 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local,
* the package to replace. * the package to replace.
*/ */
pmsyncpkg_t *sync; pmsyncpkg_t *sync;
pmpkg_t *dummy = _alpm_pkg_new(lpkg->name, NULL); pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(lpkg), NULL);
if(dummy == NULL) { if(dummy == NULL) {
pm_errno = PM_ERR_MEMORY; pm_errno = PM_ERR_MEMORY;
goto error; goto error;
} }
dummy->requiredby = alpm_list_strdup(lpkg->requiredby); dummy->requiredby = alpm_list_strdup(alpm_pkg_get_requiredby(lpkg));
/* check if spkg->name is already in the packages list. */ /* check if spkg->name is already in the packages list. */
sync = find_pkginsync(spkg->name, trans->packages); sync = _alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg));
if(sync) { if(sync) {
/* found it -- just append to the replaces list */ /* found it -- just append to the replaces list */
sync->data = alpm_list_add(sync->data, dummy); sync->data = alpm_list_add(sync->data, dummy);
@ -178,10 +156,8 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local,
trans->packages = alpm_list_add(trans->packages, sync); trans->packages = alpm_list_add(trans->packages, sync);
} }
_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); alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg),
} alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
}
break;
} }
} }
} }
@ -203,17 +179,17 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_s
if(find_replacements(trans, db_local, dbs_sync) == 0) { if(find_replacements(trans, db_local, dbs_sync) == 0) {
/* match installed packages with the sync dbs and compare versions */ /* match installed packages with the sync dbs and compare versions */
_alpm_log(PM_LOG_DEBUG, _("checking for package upgrades")); _alpm_log(PM_LOG_DEBUG, _("checking for package upgrades"));
for(i = _alpm_db_get_pkgcache(db_local, INFRQ_BASE); i; i = i->next) { for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) {
int replace=0; int replace=0;
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 = dbs_sync; !spkg && j; j = j->next) { for(j = dbs_sync; !spkg && j; j = j->next) {
spkg = _alpm_db_get_pkgfromcache(j->data, local->name); spkg = _alpm_db_get_pkgfromcache(j->data, alpm_pkg_get_name(local));
} }
if(spkg == NULL) { if(spkg == NULL) {
_alpm_log(PM_LOG_DEBUG, _("'%s' not found in sync db -- skipping"), local->name); _alpm_log(PM_LOG_DEBUG, _("'%s' not found in sync db -- skipping"), alpm_pkg_get_name(local));
continue; continue;
} }
@ -221,23 +197,25 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_s
for(j = trans->packages; j && !replace; j=j->next) { for(j = trans->packages; j && !replace; j=j->next) {
sync = j->data; sync = j->data;
if(sync->type == PM_SYNC_TYPE_REPLACE) { if(sync->type == PM_SYNC_TYPE_REPLACE) {
if(_alpm_pkg_find(spkg->name, sync->data)) { if(_alpm_pkg_find(alpm_pkg_get_name(spkg), sync->data)) {
replace=1; replace=1;
} }
} }
} }
if(replace) { if(replace) {
_alpm_log(PM_LOG_DEBUG, _("'%s' is already elected for removal -- skipping"), _alpm_log(PM_LOG_DEBUG, _("'%s' is already elected for removal -- skipping"),
local->name); alpm_pkg_get_name(local));
continue; continue;
} }
/* compare versions and see if we need to upgrade */ /* compare versions and see if we need to upgrade */
if(alpm_pkg_compare_versions(local, spkg)) { if(alpm_pkg_compare_versions(local, spkg)) {
_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); alpm_pkg_get_name(local), alpm_pkg_get_version(local),
if(!find_pkginsync(spkg->name, trans->packages)) { alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
pmpkg_t *dummy = _alpm_pkg_new(local->name, local->version); if(!_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) {
pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(local),
alpm_pkg_get_version(local));
if(dummy == NULL) { if(dummy == NULL) {
goto error; goto error;
} }
@ -279,22 +257,21 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
if(targ) { if(targ) {
*targ = '\0'; *targ = '\0';
targ++; targ++;
_alpm_log(PM_LOG_DEBUG, _("searching for target in repo '%s'"), targline); _alpm_log(PM_LOG_DEBUG, _("searching for target in repo '%s'"), targ);
for(j = dbs_sync; j && !spkg; j = j->next) { for(j = dbs_sync; j && !spkg; j = j->next) {
pmdb_t *dbs = j->data; pmdb_t *db = j->data;
if(strcmp(dbs->treename, targline) == 0) { if(strcmp(db->treename, targline) == 0) {
repo_found = 1; repo_found = 1;
spkg = _alpm_db_get_pkgfromcache(dbs, targ); spkg = _alpm_db_get_pkgfromcache(db, targ);
if(spkg == NULL) { if(spkg == NULL) {
/* Search provides */ /* Search provides */
alpm_list_t *p;
_alpm_log(PM_LOG_DEBUG, _("target '%s' not found -- looking for provisions"), targ); _alpm_log(PM_LOG_DEBUG, _("target '%s' not found -- looking for provisions"), targ);
p = _alpm_db_whatprovides(dbs, targ); alpm_list_t *p = _alpm_db_whatprovides(db, targ);
if(p == NULL) { if(!p) {
RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
} }
_alpm_log(PM_LOG_DEBUG, _("found '%s' as a provision for '%s'"), p->data, targ); _alpm_log(PM_LOG_DEBUG, _("found '%s' as a provision for '%s'"), p->data, targ);
spkg = _alpm_db_get_pkgfromcache(dbs, p->data); spkg = _alpm_db_get_pkgfromcache(db, p->data);
FREELISTPTR(p); FREELISTPTR(p);
} }
} }
@ -306,33 +283,34 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
} else { } else {
targ = targline; targ = targline;
for(j = dbs_sync; j && !spkg; j = j->next) { for(j = dbs_sync; j && !spkg; j = j->next) {
pmdb_t *dbs = j->data; pmdb_t *db = j->data;
spkg = _alpm_db_get_pkgfromcache(dbs, targ); spkg = _alpm_db_get_pkgfromcache(db, targ);
} }
if(spkg == NULL) { if(spkg == NULL) {
/* Search provides */ /* Search provides */
_alpm_log(PM_LOG_DEBUG, _("target '%s' not found -- looking for provisions"), targ); _alpm_log(PM_LOG_DEBUG, _("target '%s' not found -- looking for provisions"), targ);
for(j = dbs_sync; j && !spkg; j = j->next) { for(j = dbs_sync; j && !spkg; j = j->next) {
pmdb_t *dbs = j->data; pmdb_t *db = j->data;
alpm_list_t *p = _alpm_db_whatprovides(dbs, targ); alpm_list_t *p = _alpm_db_whatprovides(db, targ);
if(p) { if(p) {
_alpm_log(PM_LOG_DEBUG, _("found '%s' as a provision for '%s'"), p->data, targ); _alpm_log(PM_LOG_DEBUG, _("found '%s' as a provision for '%s'"), p->data, targ);
spkg = _alpm_db_get_pkgfromcache(dbs, p->data); spkg = _alpm_db_get_pkgfromcache(db, p->data);
FREELISTPTR(p); FREELISTPTR(p);
} }
} }
} }
} }
if(spkg == NULL) { if(spkg == NULL) {
RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
} }
local = _alpm_db_get_pkgfromcache(db_local, spkg->name); local = _alpm_db_get_pkgfromcache(db_local, alpm_pkg_get_name(spkg));
if(local) { if(local) {
if(alpm_pkg_compare_versions(local, spkg) == 0) { if(alpm_pkg_compare_versions(local, spkg) == 0) {
/* spkg is NOT an upgrade, get confirmation before adding */ /* spkg is NOT an upgrade, get confirmation before adding */
int resp = 0; int resp = 0;
if(alpm_list_find_str(handle->ignorepkg, local->name)) { if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(local))) {
QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, local, NULL, NULL, &resp); QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, local, NULL, NULL, &resp);
if(!resp) { if(!resp) {
return(0); return(0);
@ -340,7 +318,8 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
} else { } else {
QUESTION(trans, PM_TRANS_CONV_LOCAL_UPTODATE, local, NULL, NULL, &resp); QUESTION(trans, PM_TRANS_CONV_LOCAL_UPTODATE, local, NULL, NULL, &resp);
if(!resp) { if(!resp) {
_alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- skipping"), local->name, local->version); _alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- skipping"),
alpm_pkg_get_name(local), alpm_pkg_get_version(local));
return(0); return(0);
} }
} }
@ -348,10 +327,11 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
} }
/* add the package to the transaction */ /* add the package to the transaction */
if(!find_pkginsync(spkg->name, trans->packages)) { if(!_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) {
pmpkg_t *dummy = NULL; pmpkg_t *dummy = NULL;
if(local) { if(local) {
dummy = _alpm_pkg_new(local->name, local->version); dummy = _alpm_pkg_new(alpm_pkg_get_name(local),
alpm_pkg_get_version(local));
if(dummy == NULL) { if(dummy == NULL) {
RET_ERR(PM_ERR_MEMORY, -1); RET_ERR(PM_ERR_MEMORY, -1);
} }
@ -361,7 +341,8 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
FREEPKG(dummy); FREEPKG(dummy);
RET_ERR(PM_ERR_MEMORY, -1); RET_ERR(PM_ERR_MEMORY, -1);
} }
_alpm_log(PM_LOG_DEBUG, _("adding target '%s' to the transaction set"), spkg->name); _alpm_log(PM_LOG_DEBUG, _("adding target '%s' to the transaction set"),
alpm_pkg_get_name(spkg));
trans->packages = alpm_list_add(trans->packages, sync); trans->packages = alpm_list_add(trans->packages, sync);
} }
@ -372,12 +353,14 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
*/ */
static int syncpkg_cmp(const void *s1, const void *s2) static int syncpkg_cmp(const void *s1, const void *s2)
{ {
return(strcmp(((pmsyncpkg_t *)s1)->pkg->name, ((pmsyncpkg_t *)s2)->pkg->name)); pmsyncpkg_t *sp1 = (pmsyncpkg_t *)s1;
} pmsyncpkg_t *sp2 = (pmsyncpkg_t *)s2;
pmpkg_t *p1, *p2;
static int pkg_cmp(const void *p1, const void *p2) p1 = alpm_sync_get_pkg(sp1);
{ p2 = alpm_sync_get_pkg(sp2);
return(strcmp(((pmpkg_t *)p1)->name, ((pmsyncpkg_t *)p2)->pkg->name));
return(strcmp(alpm_pkg_get_name(p1), alpm_pkg_get_name(p2)));
} }
int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **data) int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **data)
@ -419,7 +402,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
for(i = list; i; i = i->next) { for(i = list; i; i = i->next) {
/* add the dependencies found by resolvedeps to the transaction set */ /* add the dependencies found by resolvedeps to the transaction set */
pmpkg_t *spkg = i->data; pmpkg_t *spkg = i->data;
if(!find_pkginsync(spkg->name, trans->packages)) { if(!_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) {
pmsyncpkg_t *sync = _alpm_sync_new(PM_SYNC_TYPE_DEPEND, spkg, NULL); pmsyncpkg_t *sync = _alpm_sync_new(PM_SYNC_TYPE_DEPEND, spkg, NULL);
if(sync == NULL) { if(sync == NULL) {
ret = -1; ret = -1;
@ -427,13 +410,13 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
} }
trans->packages = alpm_list_add(trans->packages, sync); trans->packages = alpm_list_add(trans->packages, sync);
_alpm_log(PM_LOG_DEBUG, _("adding package %s-%s to the transaction targets"), _alpm_log(PM_LOG_DEBUG, _("adding package %s-%s to the transaction targets"),
spkg->name, spkg->version); alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg));
} else { } else {
/* remove the original targets from the list if requested */ /* remove the original targets from the list if requested */
if((trans->flags & PM_TRANS_FLAG_DEPENDSONLY)) { if((trans->flags & PM_TRANS_FLAG_DEPENDSONLY)) {
void *vp; void *vp;
pmpkg_t *p; pmpkg_t *p;
trans->packages = alpm_list_remove(trans->packages, spkg, pkg_cmp, &vp); trans->packages = alpm_list_remove(trans->packages, spkg, _alpm_pkg_cmp, &vp);
p = vp; p = vp;
FREEPKG(p); FREEPKG(p);
} }
@ -492,7 +475,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
pmsyncpkg_t *sync; pmsyncpkg_t *sync;
pmpkg_t *local; pmpkg_t *local;
_alpm_log(PM_LOG_DEBUG, _("package '%s' is conflicting with '%s'"), _alpm_log(PM_LOG_DEBUG, _("package '%s' conflicts with '%s'"),
miss->target, miss->depend.name); miss->target, miss->depend.name);
/* check if the conflicting package is one that's about to be removed/replaced. /* check if the conflicting package is one that's about to be removed/replaced.
@ -512,7 +495,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
continue; continue;
} }
sync = find_pkginsync(miss->target, trans->packages); sync = _alpm_sync_find(trans->packages, miss->target);
if(sync == NULL) { if(sync == NULL) {
_alpm_log(PM_LOG_DEBUG, _("'%s' not found in transaction set -- skipping"), _alpm_log(PM_LOG_DEBUG, _("'%s' not found in transaction set -- skipping"),
miss->target); miss->target);
@ -521,7 +504,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
local = _alpm_db_get_pkgfromcache(db_local, miss->depend.name); local = _alpm_db_get_pkgfromcache(db_local, miss->depend.name);
/* check if this package also "provides" the package it's conflicting with /* check if this package also "provides" the package it's conflicting with
*/ */
if(alpm_list_find_str(sync->pkg->provides, miss->depend.name)) { if(alpm_list_find_str(alpm_pkg_get_provides(sync->pkg), miss->depend.name)) {
/* so just treat it like a "replaces" item so the REQUIREDBY /* so just treat it like a "replaces" item so the REQUIREDBY
* fields are inherited properly. * fields are inherited properly.
*/ */
@ -563,7 +546,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
rmpkg = miss->depend.name; rmpkg = miss->depend.name;
} }
if(rmpkg) { if(rmpkg) {
pmsyncpkg_t *rsync = find_pkginsync(rmpkg, trans->packages); pmsyncpkg_t *rsync = _alpm_sync_find(trans->packages, rmpkg);
void *vpkg; void *vpkg;
_alpm_log(PM_LOG_DEBUG, _("removing '%s' from target list"), rsync->pkg->name); _alpm_log(PM_LOG_DEBUG, _("removing '%s' from target list"), rsync->pkg->name);
trans->packages = alpm_list_remove(trans->packages, rsync, syncpkg_cmp, &vpkg); trans->packages = alpm_list_remove(trans->packages, rsync, syncpkg_cmp, &vpkg);
@ -581,7 +564,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
QUESTION(trans, PM_TRANS_CONV_CONFLICT_PKG, miss->target, miss->depend.name, NULL, &doremove); QUESTION(trans, PM_TRANS_CONV_CONFLICT_PKG, miss->target, miss->depend.name, NULL, &doremove);
asked = alpm_list_add(asked, strdup(miss->depend.name)); asked = alpm_list_add(asked, strdup(miss->depend.name));
if(doremove) { if(doremove) {
pmsyncpkg_t *rsync = find_pkginsync(miss->depend.name, trans->packages); pmsyncpkg_t *rsync = _alpm_sync_find(trans->packages, miss->depend.name);
pmpkg_t *q = _alpm_pkg_new(miss->depend.name, NULL); pmpkg_t *q = _alpm_pkg_new(miss->depend.name, NULL);
if(q == NULL) { if(q == NULL) {
if(data) { if(data) {
@ -590,7 +573,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
ret = -1; ret = -1;
goto cleanup; goto cleanup;
} }
q->requiredby = alpm_list_strdup(local->requiredby); q->requiredby = alpm_list_strdup(alpm_pkg_get_requiredby(local));
if(sync->type != PM_SYNC_TYPE_REPLACE) { if(sync->type != PM_SYNC_TYPE_REPLACE) {
/* switch this sync type to REPLACE */ /* switch this sync type to REPLACE */
sync->type = PM_SYNC_TYPE_REPLACE; sync->type = PM_SYNC_TYPE_REPLACE;
@ -682,7 +665,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
int errorout = 0; int errorout = 0;
for(i = deps; i; i = i->next) { for(i = deps; i; i = i->next) {
pmdepmissing_t *miss = i->data; pmdepmissing_t *miss = i->data;
if(!find_pkginsync(miss->depend.name, trans->packages)) { if(!_alpm_sync_find(trans->packages, miss->depend.name)) {
int pfound = 0; int pfound = 0;
alpm_list_t *k; alpm_list_t *k;
/* If miss->depend.name depends on something that miss->target and a /* If miss->depend.name depends on something that miss->target and a
@ -696,9 +679,9 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
} }
/* Look through the upset package's dependencies and try to match one up /* Look through the upset package's dependencies and try to match one up
* to a provisio from the package we want to remove */ * to a provisio from the package we want to remove */
for(k = conflictp->depends; k && !pfound; k = k->next) { for(k = alpm_pkg_get_depends(conflictp); k && !pfound; k = k->next) {
alpm_list_t *m; alpm_list_t *m;
for(m = leavingp->provides; m && !pfound; m = m->next) { for(m = alpm_pkg_get_provides(leavingp); m && !pfound; m = m->next) {
if(!strcmp(k->data, m->data)) { if(!strcmp(k->data, m->data)) {
/* Found a match -- now look through final for a package that /* Found a match -- now look through final for a package that
* provides the same thing. If none are found, then it truly * provides the same thing. If none are found, then it truly
@ -706,11 +689,12 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
alpm_list_t *n, *o; alpm_list_t *n, *o;
for(n = trans->packages; n && !pfound; n = n->next) { for(n = trans->packages; n && !pfound; n = n->next) {
pmsyncpkg_t *sp = n->data; pmsyncpkg_t *sp = n->data;
for(o = sp->pkg->provides; o && !pfound; o = o->next) { pmpkg_t *sppkg = sp->pkg;
for(o = alpm_pkg_get_provides(sppkg); o && !pfound; o = o->next) {
if(!strcmp(m->data, o->data)) { if(!strcmp(m->data, o->data)) {
/* found matching provisio -- we're good to go */ /* found matching provisio -- we're good to go */
_alpm_log(PM_LOG_DEBUG, _("found '%s' as a provision for '%s' -- conflict aborted"), _alpm_log(PM_LOG_DEBUG, _("found '%s' as a provision for '%s' -- conflict aborted"),
sp->pkg->name, (char *)o->data); alpm_pkg_get_name(sppkg), (char *)o->data);
pfound = 1; pfound = 1;
} }
} }
@ -1002,13 +986,13 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
pmsyncpkg_t *sync = i->data; pmsyncpkg_t *sync = i->data;
if(sync->type == PM_SYNC_TYPE_REPLACE) { if(sync->type == PM_SYNC_TYPE_REPLACE) {
alpm_list_t *j; alpm_list_t *j;
pmpkg_t *new = _alpm_db_get_pkgfromcache(db_local, sync->pkg->name); pmpkg_t *new = _alpm_db_get_pkgfromcache(db_local, alpm_pkg_get_name(sync->pkg));
for(j = sync->data; j; j = j->next) { for(j = sync->data; j; j = j->next) {
alpm_list_t *k; alpm_list_t *k;
pmpkg_t *old = j->data; pmpkg_t *old = j->data;
/* merge lists */ /* merge lists */
for(k = old->requiredby; k; k = k->next) { for(k = alpm_pkg_get_requiredby(old); k; k = k->next) {
if(!alpm_list_find_str(new->requiredby, k->data)) { if(!alpm_list_find_str(alpm_pkg_get_requiredby(new), k->data)) {
/* 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 */
alpm_list_t *m; alpm_list_t *m;
pmpkg_t *depender = _alpm_db_get_pkgfromcache(db_local, k->data); pmpkg_t *depender = _alpm_db_get_pkgfromcache(db_local, k->data);
@ -1019,24 +1003,24 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
* here. */ * here. */
continue; continue;
} }
for(m = depender->depends; m; m = m->next) { for(m = alpm_pkg_get_depends(depender); m; m = m->next) {
if(!strcmp(m->data, old->name)) { if(!strcmp(m->data, alpm_pkg_get_name(old))) {
FREE(m->data); FREE(m->data);
m->data = strdup(new->name); m->data = strdup(alpm_pkg_get_name(new));
} }
} }
if(_alpm_db_write(db_local, depender, INFRQ_DEPENDS) == -1) { if(_alpm_db_write(db_local, depender, INFRQ_DEPENDS) == -1) {
_alpm_log(PM_LOG_ERROR, _("could not update requiredby for database entry %s-%s"), _alpm_log(PM_LOG_ERROR, _("could not update requiredby for database entry %s-%s"),
new->name, new->version); alpm_pkg_get_name(new), alpm_pkg_get_version(new));
} }
/* add the new requiredby */ /* add the new requiredby */
new->requiredby = alpm_list_add(new->requiredby, strdup(k->data)); new->requiredby = alpm_list_add(alpm_pkg_get_requiredby(new), strdup(k->data));
} }
} }
} }
if(_alpm_db_write(db_local, new, INFRQ_DEPENDS) == -1) { if(_alpm_db_write(db_local, new, INFRQ_DEPENDS) == -1) {
_alpm_log(PM_LOG_ERROR, _("could not update new database entry %s-%s"), _alpm_log(PM_LOG_ERROR, _("could not update new database entry %s-%s"),
new->name, new->version); alpm_pkg_get_name(new), alpm_pkg_get_version(new));
} }
} }
} }
@ -1064,6 +1048,27 @@ error:
return(-1); return(-1);
} }
pmsyncpkg_t *_alpm_sync_find(alpm_list_t *syncpkgs, const char* pkgname)
{
alpm_list_t *i;
for(i = syncpkgs; i; i = i->next) {
pmsyncpkg_t *syncpkg = i->data;
if(!syncpkg) {
continue;
}
pmpkg_t *pkg = alpm_sync_get_pkg(syncpkg);
if(strcmp(alpm_pkg_get_name(pkg), pkgname) == 0) {
_alpm_log(PM_LOG_DEBUG, _("found package '%s-%s' in sync"),
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
return(syncpkg);
}
}
_alpm_log(PM_LOG_DEBUG, _("package '%s not found in sync"), pkgname);
return(NULL); /* not found */
}
pmsynctype_t SYMEXPORT alpm_sync_get_type(pmsyncpkg_t *sync) pmsynctype_t SYMEXPORT alpm_sync_get_type(pmsyncpkg_t *sync)
{ {
/* Sanity checks */ /* Sanity checks */

View File

@ -42,6 +42,9 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy
int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **data); int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **data);
int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data); int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data);
/* typically trans->packages */
pmsyncpkg_t *_alpm_sync_find(alpm_list_t *syncpkgs, const char* pkgname);
#endif /* _ALPM_SYNC_H */ #endif /* _ALPM_SYNC_H */
/* vim: set ts=2 sw=2 noet: */ /* vim: set ts=2 sw=2 noet: */

View File

@ -250,6 +250,7 @@ int _alpm_trans_commit(pmtrans_t *trans, alpm_list_t **data)
int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg)
{ {
alpm_list_t *i, *j; alpm_list_t *i, *j;
alpm_list_t *depends = NULL;
pmdb_t *localdb; pmdb_t *localdb;
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -258,7 +259,8 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg)
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1)); ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
ASSERT(pkg != NULL, RET_ERR(PM_ERR_PKG_INVALID, -1)); ASSERT(pkg != NULL, RET_ERR(PM_ERR_PKG_INVALID, -1));
if(pkg->depends) { depends = alpm_pkg_get_depends(pkg);
if(depends) {
_alpm_log(PM_LOG_DEBUG, _("updating dependency packages 'requiredby' fields for %s-%s"), _alpm_log(PM_LOG_DEBUG, _("updating dependency packages 'requiredby' fields for %s-%s"),
pkg->name, pkg->version); pkg->name, pkg->version);
} else { } else {
@ -266,7 +268,7 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg)
} }
localdb = alpm_option_get_localdb(); localdb = alpm_option_get_localdb();
for(i = pkg->depends; i; i = i->next) { for(i = depends; i; i = i->next) {
pmdepend_t dep; pmdepend_t dep;
if(_alpm_splitdep(i->data, &dep) != 0) { if(_alpm_splitdep(i->data, &dep) != 0) {
continue; continue;
@ -288,7 +290,7 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg)
continue; continue;
} }
pmpkg_t *provpkg = j->data; pmpkg_t *provpkg = j->data;
deppkg = _alpm_db_get_pkgfromcache(localdb, provpkg->name); deppkg = _alpm_db_get_pkgfromcache(localdb, alpm_pkg_get_name(provpkg));
if(!deppkg) { if(!deppkg) {
continue; continue;
@ -296,20 +298,22 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg)
found_provides = 1; found_provides = 1;
/* Ensure package has the right newpkg */ /* this is cheating... we call this function to populate the package */
_alpm_db_read(localdb, deppkg, INFRQ_DEPENDS); alpm_pkg_get_requiredby(deppkg);
_alpm_log(PM_LOG_DEBUG, _("updating 'requiredby' field for package '%s'"), deppkg->name); _alpm_log(PM_LOG_DEBUG, _("updating 'requiredby' field for package '%s'"), alpm_pkg_get_name(deppkg));
if(trans->type == PM_TRANS_TYPE_REMOVE) { if(trans->type == PM_TRANS_TYPE_REMOVE) {
void *data = NULL; void *data = NULL;
deppkg->requiredby = alpm_list_remove(deppkg->requiredby, pkg->name, _alpm_str_cmp, &data); deppkg->requiredby = alpm_list_remove(deppkg->requiredby,
alpm_pkg_get_name(pkg), _alpm_str_cmp, &data);
FREE(data); FREE(data);
} else { } else {
deppkg->requiredby = alpm_list_add(deppkg->requiredby, strdup(pkg->name)); deppkg->requiredby = alpm_list_add(deppkg->requiredby, strdup(alpm_pkg_get_name(pkg)));
} }
if(_alpm_db_write(localdb, deppkg, INFRQ_DEPENDS)) { if(_alpm_db_write(localdb, deppkg, INFRQ_DEPENDS)) {
_alpm_log(PM_LOG_ERROR, _("could not update 'requiredby' database entry %s-%s"), deppkg->name, deppkg->version); _alpm_log(PM_LOG_ERROR, _("could not update 'requiredby' database entry %s-%s"),
alpm_pkg_get_name(deppkg), alpm_pkg_get_version(deppkg));
} }
} }
FREELISTPTR(provides); FREELISTPTR(provides);
@ -320,20 +324,22 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg)
} }
} }
/* Ensure package has the right newpkg */ /* this is cheating... we call this function to populate the package */
_alpm_db_read(localdb, deppkg, INFRQ_DEPENDS); alpm_pkg_get_requiredby(deppkg);
_alpm_log(PM_LOG_DEBUG, _("updating 'requiredby' field for package '%s'"), deppkg->name); _alpm_log(PM_LOG_DEBUG, _("updating 'requiredby' field for package '%s'"), deppkg->name);
if(trans->type == PM_TRANS_TYPE_REMOVE) { if(trans->type == PM_TRANS_TYPE_REMOVE) {
void *data = NULL; void *data = NULL;
deppkg->requiredby = alpm_list_remove(deppkg->requiredby, pkg->name, _alpm_str_cmp, &data); deppkg->requiredby = alpm_list_remove(deppkg->requiredby,
alpm_pkg_get_name(pkg), _alpm_str_cmp, &data);
FREE(data); FREE(data);
} else { } else {
deppkg->requiredby = alpm_list_add(deppkg->requiredby, strdup(pkg->name)); deppkg->requiredby = alpm_list_add(deppkg->requiredby, strdup(alpm_pkg_get_name(pkg)));
} }
if(_alpm_db_write(localdb, deppkg, INFRQ_DEPENDS)) { if(_alpm_db_write(localdb, deppkg, INFRQ_DEPENDS)) {
_alpm_log(PM_LOG_ERROR, _("could not update 'requiredby' database entry %s-%s"), deppkg->name, deppkg->version); _alpm_log(PM_LOG_ERROR, _("could not update 'requiredby' database entry %s-%s"),
alpm_pkg_get_name(deppkg), alpm_pkg_get_version(deppkg));
} }
} }
return(0); return(0);

View File

@ -119,7 +119,7 @@ char * mkdtemp(char *template)
#endif #endif
/* does the same thing as 'mkdir -p' */ /* does the same thing as 'mkdir -p' */
int _alpm_makepath(char *path) int _alpm_makepath(const char *path)
{ {
char *orig, *str, *ptr; char *orig, *str, *ptr;
char full[PATH_MAX] = ""; char full[PATH_MAX] = "";
@ -149,7 +149,7 @@ int _alpm_makepath(char *path)
return(0); return(0);
} }
int _alpm_copyfile(char *src, char *dest) int _alpm_copyfile(const char *src, const char *dest)
{ {
FILE *in, *out; FILE *in, *out;
size_t len; size_t len;
@ -184,7 +184,7 @@ char *_alpm_strtoupper(char *str)
(*ptr) = toupper(*ptr); (*ptr) = toupper(*ptr);
ptr++; ptr++;
} }
return str; return(str);
} }
/* Trim whitespace and newlines from a string /* Trim whitespace and newlines from a string
@ -221,7 +221,7 @@ char *_alpm_strtrim(char *str)
/* Create a lock file /* Create a lock file
*/ */
int _alpm_lckmk(char *file) int _alpm_lckmk(const char *file)
{ {
int fd, count = 0; int fd, count = 0;
char *dir, *ptr; char *dir, *ptr;
@ -249,7 +249,7 @@ int _alpm_lckmk(char *file)
/* Remove a lock file /* Remove a lock file
*/ */
int _alpm_lckrm(char *file) int _alpm_lckrm(const char *file)
{ {
if(unlink(file) == -1 && errno != ENOENT) { if(unlink(file) == -1 && errno != ENOENT) {
return(-1); return(-1);
@ -302,7 +302,7 @@ int _alpm_unpack(const char *archive, const char *prefix, const char *fn)
} }
/* does the same thing as 'rm -rf' */ /* does the same thing as 'rm -rf' */
int _alpm_rmrf(char *path) int _alpm_rmrf(const char *path)
{ {
int errflag = 0; int errflag = 0;
struct dirent *dp; struct dirent *dp;
@ -370,15 +370,15 @@ int _alpm_logaction(unsigned short usesyslog, FILE *f, const char *str)
return(0); return(0);
} }
int _alpm_ldconfig(char *root) int _alpm_ldconfig(const char *root)
{ {
char line[PATH_MAX]; char line[PATH_MAX];
struct stat buf; struct stat buf;
snprintf(line, PATH_MAX, "%setc/ld.so.conf", root); snprintf(line, PATH_MAX, "%setc/ld.so.conf", root);
if(!stat(line, &buf)) { if(stat(line, &buf) == 0) {
snprintf(line, PATH_MAX, "%ssbin/ldconfig", root); snprintf(line, PATH_MAX, "%ssbin/ldconfig", root);
if(!stat(line, &buf)) { if(stat(line, &buf) == 0) {
char cmd[PATH_MAX]; char cmd[PATH_MAX];
snprintf(cmd, PATH_MAX, "%s -r %s", line, root); snprintf(cmd, PATH_MAX, "%s -r %s", line, root);
system(cmd); system(cmd);
@ -413,7 +413,9 @@ static int grep(const char *fn, const char *needle)
return(0); return(0);
} }
int _alpm_runscriptlet(char *root, char *installfn, char *script, char *ver, char *oldver, pmtrans_t *trans) int _alpm_runscriptlet(const char *root, const char *installfn,
const char *script, const char *ver,
const char *oldver, pmtrans_t *trans)
{ {
char scriptfn[PATH_MAX]; char scriptfn[PATH_MAX];
char cmdline[PATH_MAX]; char cmdline[PATH_MAX];
@ -589,13 +591,13 @@ int _alpm_check_freespace(pmtrans_t *trans, alpm_list_t **data)
pmsyncpkg_t *sync = i->data; pmsyncpkg_t *sync = i->data;
if(sync->type != PM_SYNC_TYPE_REPLACE) { if(sync->type != PM_SYNC_TYPE_REPLACE) {
pmpkg_t *pkg = sync->pkg; pmpkg_t *pkg = sync->pkg;
pkgsize += pkg->isize; pkgsize += alpm_pkg_get_isize(pkg);
} }
} }
else else
{ {
pmpkg_t *pkg = i->data; pmpkg_t *pkg = i->data;
pkgsize += pkg->size; pkgsize += alpm_pkg_get_size(pkg);
} }
} }
freespace = get_freespace(); freespace = get_freespace();

View File

@ -55,18 +55,20 @@
#define SCRIPTLET_START "START " #define SCRIPTLET_START "START "
#define SCRIPTLET_DONE "DONE " #define SCRIPTLET_DONE "DONE "
int _alpm_makepath(char *path); int _alpm_makepath(const char *path);
int _alpm_copyfile(char *src, char *dest); int _alpm_copyfile(const char *src, const char *dest);
char *_alpm_strtoupper(char *str); char *_alpm_strtoupper(char *str);
char *_alpm_strtrim(char *str); char *_alpm_strtrim(char *str);
int _alpm_lckmk(char *file); int _alpm_lckmk(const char *file);
int _alpm_lckrm(char *file); int _alpm_lckrm(const char *file);
int _alpm_unpack(const char *archive, const char *prefix, const char *fn); int _alpm_unpack(const char *archive, const char *prefix, const char *fn);
int _alpm_rmrf(char *path); int _alpm_rmrf(const char *path);
int _alpm_logaction(unsigned short usesyslog, FILE *f, const char *str); int _alpm_logaction(unsigned short usesyslog, FILE *f, const char *str);
int _alpm_ldconfig(char *root); int _alpm_ldconfig(const char *root);
#ifdef _ALPM_TRANS_H #ifdef _ALPM_TRANS_H
int _alpm_runscriptlet(char *util, char *installfn, char *script, char *ver, char *oldver, pmtrans_t *trans); int _alpm_runscriptlet(const char *root, const char *installfn,
const char *script, const char *ver,
const char *oldver, pmtrans_t *trans);
#ifndef __sun__ #ifndef __sun__
int _alpm_check_freespace(pmtrans_t *trans, alpm_list_t **data); int _alpm_check_freespace(pmtrans_t *trans, alpm_list_t **data);
#endif #endif

View File

@ -256,7 +256,7 @@ int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)
if(dep->mod == PM_DEP_MOD_ANY) { if(dep->mod == PM_DEP_MOD_ANY) {
equal = 1; equal = 1;
} else { } else {
int cmp = _alpm_versioncmp(pkg->version, dep->version); int cmp = _alpm_versioncmp(alpm_pkg_get_version(pkg), dep->version);
switch(dep->mod) { switch(dep->mod) {
case PM_DEP_MOD_EQ: equal = (cmp == 0); break; case PM_DEP_MOD_EQ: equal = (cmp == 0); break;
case PM_DEP_MOD_GE: equal = (cmp >= 0); break; case PM_DEP_MOD_GE: equal = (cmp >= 0); break;
@ -275,11 +275,13 @@ int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)
if(strlen(dep->version) > 0) { if(strlen(dep->version) > 0) {
_alpm_log(PM_LOG_DEBUG, _("depcmp: %s-%s %s %s-%s => %s"), _alpm_log(PM_LOG_DEBUG, _("depcmp: %s-%s %s %s-%s => %s"),
pkg->name, pkg->version, mod, dep->name, dep->version, alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg),
mod, dep->name, dep->version,
(equal ? "match" : "no match")); (equal ? "match" : "no match"));
} else { } else {
_alpm_log(PM_LOG_DEBUG, _("depcmp: %s-%s %s %s => %s"), _alpm_log(PM_LOG_DEBUG, _("depcmp: %s-%s %s %s => %s"),
pkg->name, pkg->version, mod, dep->name, alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg),
mod, dep->name,
(equal ? "match" : "no match")); (equal ? "match" : "no match"));
} }
} }

View File

@ -277,8 +277,8 @@ void cb_trans_conv(pmtransconv_t event, void *data1, void *data2,
} }
} }
void cb_trans_progress(pmtransprog_t event, char *pkgname, const int percent, void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent,
const int howmany, const int remain) int howmany, int remain)
{ {
float timediff; float timediff;

View File

@ -29,8 +29,8 @@ void cb_trans_conv(pmtransconv_t event, void *data1, void *data2,
void *data3, int *response); void *data3, int *response);
/* callback to handle display of the progress bar for transactions */ /* callback to handle display of the progress bar for transactions */
void cb_trans_progress(pmtransprog_t event, char *pkgname, const int percent, void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent,
const int howmany, const int remain); int howmany, int remain);
#endif /* _PM_TRANS_H */ #endif /* _PM_TRANS_H */