Date: Wednesday, February 21, 2007 @ 01:44:15 Author: aaron Path: /home/cvs-pacman/pacman-lib/lib/libalpm Modified: alpm.h (1.76 -> 1.77) be_files.c (1.27 -> 1.28) cache.c (1.30 -> 1.31) conflict.c (1.39 -> 1.40) db.c (1.59 -> 1.60) handle.c (1.32 -> 1.33) handle.h (1.15 -> 1.16) remove.c (1.68 -> 1.69) sync.c (1.101 -> 1.102) * Re-added a compare function for syncpkg's - it was removed without thinking properly * Error when re-reading the DB for replacements, wrong info level * Removed an duplicate debug message "checking for package replacements" * Check ignorepkg for REAL upgrades... * Properly check the NOSAVE flag * some unlink_file (remove.c) cleanup * fix indent level on handle.c * Force libalpm paths to end with a '/' char * Fixed 'target' looping in conflict.c (pmsyncpkg_t, not pmpkg_t) * Added some debug output to cache and db scanning ** All pactest tests succeed again, yay ** ------------+ alpm.h | 4 +- be_files.c | 6 ++-- cache.c | 4 ++ conflict.c | 10 ++++++- db.c | 2 - handle.c | 79 +++++++++++++++++++++++++++++++++++++++++------------------ handle.h | 2 - remove.c | 26 +++++++++++-------- sync.c | 43 +++++++++++++++++--------------- 9 files changed, 114 insertions(+), 62 deletions(-) Index: pacman-lib/lib/libalpm/alpm.h diff -u pacman-lib/lib/libalpm/alpm.h:1.76 pacman-lib/lib/libalpm/alpm.h:1.77 --- pacman-lib/lib/libalpm/alpm.h:1.76 Sun Feb 11 23:45:22 2007 +++ pacman-lib/lib/libalpm/alpm.h Wed Feb 21 01:44:14 2007 @@ -35,8 +35,8 @@ */ #define PM_ROOT "/" -#define PM_DBPATH "var/lib/pacman" -#define PM_CACHEDIR "var/cache/pacman/pkg" +#define PM_DBPATH "var/lib/pacman/" +#define PM_CACHEDIR "var/cache/pacman/pkg/" #define PM_LOCK "tmp/pacman.lck" Index: pacman-lib/lib/libalpm/be_files.c diff -u pacman-lib/lib/libalpm/be_files.c:1.27 pacman-lib/lib/libalpm/be_files.c:1.28 --- pacman-lib/lib/libalpm/be_files.c:1.27 Mon Feb 12 20:46:33 2007 +++ pacman-lib/lib/libalpm/be_files.c Wed Feb 21 01:44:14 2007 @@ -72,6 +72,7 @@ RET_ERR(PM_ERR_DB_NULL, -1); } + _alpm_log(PM_LOG_DEBUG, _("opening database from path '%s'"), db->path); db->handle = opendir(db->path); if(db->handle == NULL) { RET_ERR(PM_ERR_DB_OPEN, -1); @@ -154,8 +155,7 @@ if(!found) { return(NULL); } - } else { - /* normal iteration */ + } else { /* target == NULL, full scan */ int isdir = 0; while(!isdir) { ent = readdir(db->handle); @@ -176,6 +176,7 @@ pkg = _alpm_pkg_new(NULL, NULL); if(pkg == NULL) { + _alpm_log(PM_LOG_DEBUG, _("db scan could not find package: %s"), target); return(NULL); } if(_alpm_pkg_splitname(ent->d_name, pkg->name, pkg->version, 0) == -1) { @@ -188,6 +189,7 @@ } } + _alpm_log(PM_LOG_DEBUG, _("db scan found package: %s"), pkg->name); return(pkg); } Index: pacman-lib/lib/libalpm/cache.c diff -u pacman-lib/lib/libalpm/cache.c:1.30 pacman-lib/lib/libalpm/cache.c:1.31 --- pacman-lib/lib/libalpm/cache.c:1.30 Wed Jan 31 01:48:06 2007 +++ pacman-lib/lib/libalpm/cache.c Wed Feb 21 01:44:14 2007 @@ -61,6 +61,7 @@ _alpm_db_rewind(db); while((info = _alpm_db_scan(db, NULL, infolevel)) != NULL) { + _alpm_log(PM_LOG_DEBUG, _("adding '%s' to package cache for db '%s'"), info->name, db->treename); info->origin = PKG_FROM_CACHE; info->data = db; /* add to the collection */ @@ -104,6 +105,9 @@ _alpm_db_ensure_pkgcache(db, infolevel); + if(!db->pkgcache) { + _alpm_log(PM_LOG_DEBUG, _("error: pkgcache is NULL for db %s"), db->treename); + } return(db->pkgcache); } Index: pacman-lib/lib/libalpm/conflict.c diff -u pacman-lib/lib/libalpm/conflict.c:1.39 pacman-lib/lib/libalpm/conflict.c:1.40 --- pacman-lib/lib/libalpm/conflict.c:1.39 Mon Feb 19 21:14:27 2007 +++ pacman-lib/lib/libalpm/conflict.c Wed Feb 21 01:44:14 2007 @@ -379,9 +379,16 @@ /* stat the file - if it exists and is not a dir, do some checks */ if(lstat(path, &buf) == 0 && !S_ISDIR(buf.st_mode)) { + /* Look at all the targets to see if file has changed hands */ for(k = targets; k; k = k->next) { - p2 = (pmpkg_t *)k->data; + pmsyncpkg_t *sync = k->data; + if(!sync) { + continue; + } + + p2 = sync->pkg; + /* Ensure we aren't looking at current package */ if(p2 == p1) { continue; @@ -404,6 +411,7 @@ _alpm_log(PM_LOG_DEBUG, "file changed packages, adding to remove skiplist: %s", filestr); } } else { + _alpm_log(PM_LOG_DEBUG, "file found in conflict: %s", filestr); conflicts = add_fileconflict(conflicts, PM_CONFLICT_TYPE_FILE, filestr, p1->name, NULL); break; Index: pacman-lib/lib/libalpm/db.c diff -u pacman-lib/lib/libalpm/db.c:1.59 pacman-lib/lib/libalpm/db.c:1.60 --- pacman-lib/lib/libalpm/db.c:1.59 Wed Jan 31 01:10:21 2007 +++ pacman-lib/lib/libalpm/db.c Wed Feb 21 01:44:14 2007 @@ -71,7 +71,7 @@ FREE(db); 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); Index: pacman-lib/lib/libalpm/handle.c diff -u pacman-lib/lib/libalpm/handle.c:1.32 pacman-lib/lib/libalpm/handle.c:1.33 --- pacman-lib/lib/libalpm/handle.c:1.32 Sun Feb 11 23:45:22 2007 +++ pacman-lib/lib/libalpm/handle.c Wed Feb 21 01:44:15 2007 @@ -66,28 +66,29 @@ /* see if we're root or not (fakeroot does not count) */ #ifndef FAKEROOT if(handle->uid == 0 && !getenv("FAKEROOTKEY")) { + /* } make vim indent work - stupid ifdef's */ #else - if(handle->uid == 0) { + if(handle->uid == 0) { #endif - handle->access = PM_ACCESS_RW; - } else { - handle->access = PM_ACCESS_RO; - } + handle->access = PM_ACCESS_RW; + } else { + handle->access = PM_ACCESS_RO; + } #else handle->access = PM_ACCESS_RW; #endif - handle->root = strdup(PM_ROOT); + handle->root = strdup(PM_ROOT); handle->dbpath = strdup(PM_DBPATH); handle->cachedir = strdup(PM_CACHEDIR); - handle->logmask = PM_LOG_ERROR | PM_LOG_WARNING; + handle->logmask = PM_LOG_ERROR | PM_LOG_WARNING; return(handle); } int _alpm_handle_free(pmhandle_t *handle) { - ALPM_LOG_FUNC; + ALPM_LOG_FUNC; ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1)); @@ -139,7 +140,7 @@ pmdb_t *alpm_option_get_localdb() { return handle->db_local; } alpm_list_t SYMEXPORT *alpm_option_get_syncdbs() { - return handle->dbs_sync; + return handle->dbs_sync; } void SYMEXPORT alpm_option_set_logcb(alpm_cb_log cb) { handle->logcb = cb; } @@ -151,24 +152,54 @@ void alpm_option_set_root(const char *root) { if(handle->root) FREE(handle->root); - if(root) handle->root = strdup(root); + if(root) { + /* verify root ends in a '/' */ + int rootlen = strlen(root); + if(root[rootlen-1] != '/') { + rootlen += 1; + } + handle->root = calloc(rootlen+1, sizeof(char)); + strncpy(handle->root, root, rootlen); + handle->root[rootlen-1] = '/'; + _alpm_log(PM_LOG_DEBUG, _("option 'root' = %s"), handle->root); + } } void SYMEXPORT alpm_option_set_dbpath(const char *dbpath) { - if(handle->dbpath) FREE(handle->dbpath); - if(dbpath) handle->dbpath = strdup(dbpath); + if(handle->dbpath) FREE(handle->dbpath); + if(dbpath) { + /* verify dbpath ends in a '/' */ + int dbpathlen = strlen(dbpath); + if(dbpath[dbpathlen-1] != '/') { + dbpathlen += 1; + } + handle->dbpath = calloc(dbpathlen+1, sizeof(char)); + strncpy(handle->dbpath, dbpath, dbpathlen); + handle->dbpath[dbpathlen-1] = '/'; + _alpm_log(PM_LOG_DEBUG, _("option 'dbpath' = %s"), handle->dbpath); + } } void alpm_option_set_cachedir(const char *cachedir) { - if(handle->cachedir) FREE(handle->cachedir); - if(cachedir) handle->cachedir = strdup(cachedir); + if(handle->cachedir) FREE(handle->cachedir); + if(cachedir) { + /* verify cachedir ends in a '/' */ + int cachedirlen = strlen(cachedir); + if(cachedir[cachedirlen-1] != '/') { + cachedirlen += 1; + } + handle->cachedir = calloc(cachedirlen+1, sizeof(char)); + strncpy(handle->cachedir, cachedir, cachedirlen); + handle->cachedir[cachedirlen-1] = '/'; + _alpm_log(PM_LOG_DEBUG, _("option 'cachedir' = %s"), handle->cachedir); + } } void alpm_option_set_logfile(const char *logfile) { - ALPM_LOG_FUNC; + ALPM_LOG_FUNC; if(handle->logfile) { FREE(handle->logfile); @@ -185,12 +216,12 @@ void alpm_option_set_usesyslog(unsigned short usesyslog) { - handle->usesyslog = usesyslog; + handle->usesyslog = usesyslog; } void alpm_option_add_noupgrade(char *pkg) { - handle->noupgrade = alpm_list_add(handle->noupgrade, strdup(pkg)); + handle->noupgrade = alpm_list_add(handle->noupgrade, strdup(pkg)); } void alpm_option_set_noupgrades(alpm_list_t *noupgrade) @@ -201,7 +232,7 @@ void alpm_option_add_noextract(char *pkg) { - handle->noextract = alpm_list_add(handle->noextract, strdup(pkg)); + handle->noextract = alpm_list_add(handle->noextract, strdup(pkg)); } void alpm_option_set_noextracts(alpm_list_t *noextract) { @@ -211,7 +242,7 @@ void SYMEXPORT alpm_option_add_ignorepkg(char *pkg) { - handle->ignorepkg = alpm_list_add(handle->ignorepkg, strdup(pkg)); + handle->ignorepkg = alpm_list_add(handle->ignorepkg, strdup(pkg)); } void alpm_option_set_ignorepkgs(alpm_list_t *ignorepkgs) { @@ -221,7 +252,7 @@ void alpm_option_add_holdpkg(char *pkg) { - handle->holdpkg = alpm_list_add(handle->holdpkg, strdup(pkg)); + handle->holdpkg = alpm_list_add(handle->holdpkg, strdup(pkg)); } void alpm_option_set_holdpkgs(alpm_list_t *holdpkgs) { @@ -231,7 +262,7 @@ void alpm_option_set_upgradedelay(time_t delay) { - handle->upgradedelay = delay; + handle->upgradedelay = delay; } void alpm_option_set_xfercommand(const char *cmd) @@ -242,14 +273,14 @@ void alpm_option_set_nopassiveftp(unsigned short nopasv) { - handle->nopassiveftp = nopasv; + handle->nopassiveftp = nopasv; } void alpm_option_set_chomp(unsigned short chomp) { handle->chomp = chomp; } void alpm_option_set_usecolor(unsigned short usecolor) { - handle->use_color = usecolor; + handle->use_color = usecolor; } -/* vim: set ts=2 sw=2 et: */ +/* vim: set ts=2 sw=2 noet: */ Index: pacman-lib/lib/libalpm/handle.h diff -u pacman-lib/lib/libalpm/handle.h:1.15 pacman-lib/lib/libalpm/handle.h:1.16 --- pacman-lib/lib/libalpm/handle.h:1.15 Sun Feb 11 23:45:22 2007 +++ pacman-lib/lib/libalpm/handle.h Wed Feb 21 01:44:15 2007 @@ -69,7 +69,7 @@ #define FREEHANDLE(p) do { if (p) { _alpm_handle_free(p); p = NULL; } } while (0) -pmhandle_t *_alpm_handle_new(void); +pmhandle_t *_alpm_handle_new(); int _alpm_handle_free(pmhandle_t *handle); #endif /* _ALPM_HANDLE_H */ Index: pacman-lib/lib/libalpm/remove.c diff -u pacman-lib/lib/libalpm/remove.c:1.68 pacman-lib/lib/libalpm/remove.c:1.69 --- pacman-lib/lib/libalpm/remove.c:1.68 Mon Feb 19 21:14:27 2007 +++ pacman-lib/lib/libalpm/remove.c Wed Feb 21 01:44:15 2007 @@ -206,10 +206,11 @@ FREE(hash); } - if(!needbackup && trans->type == PM_TRANS_TYPE_UPGRADE) { + if(trans->type == PM_TRANS_TYPE_UPGRADE) { /* check noupgrade */ if(alpm_list_find_str(handle->noupgrade, lp->data)) { - needbackup = 1; + _alpm_log(PM_LOG_DEBUG, _("Skipping removal of '%s' due to NoUpgrade"), file); + return; } } @@ -232,28 +233,31 @@ * explanation. */ if(alpm_list_find_str(trans->skip_remove, file)) { _alpm_log(PM_LOG_DEBUG, _("%s is in trans->skip_remove, skipping removal"), file); + return; } else if(needbackup) { /* if the file is flagged, back it up to .pacsave */ if(!(trans->type == PM_TRANS_TYPE_UPGRADE)) { /* if it was an upgrade, the file would be left alone because * pacman_add() would handle it */ - if(!(trans->type & PM_TRANS_FLAG_NOSAVE)) { + if(!(trans->flags & PM_TRANS_FLAG_NOSAVE)) { char newpath[PATH_MAX]; snprintf(newpath, PATH_MAX, "%s.pacsave", file); rename(file, newpath); _alpm_log(PM_LOG_WARNING, _("%s saved as %s"), file, newpath); + return; + } else { + _alpm_log(PM_LOG_DEBUG, _("transaction is set to NOSAVE, not backing up '%s'"), file); } } - } else { - _alpm_log(PM_LOG_DEBUG, _("unlinking %s"), file); - int list_count = alpm_list_count(trans->packages); /* this way we don't have to call alpm_list_count twice during PROGRESS */ + } + _alpm_log(PM_LOG_DEBUG, _("unlinking %s"), file); + int list_count = alpm_list_count(trans->packages); /* this way we don't have to call alpm_list_count twice during PROGRESS */ - PROGRESS(trans, PM_TRANS_PROGRESS_REMOVE_START, info->name, (double)(percent * 100), list_count, (list_count - alpm_list_count(targ) + 1)); - ++(*position); + PROGRESS(trans, PM_TRANS_PROGRESS_REMOVE_START, info->name, (double)(percent * 100), list_count, (list_count - alpm_list_count(targ) + 1)); + ++(*position); - if(unlink(file) == -1) { - _alpm_log(PM_LOG_ERROR, _("cannot remove file %s: %s"), lp->data, strerror(errno)); - } + if(unlink(file) == -1) { + _alpm_log(PM_LOG_ERROR, _("cannot remove file %s: %s"), lp->data, strerror(errno)); } } } Index: pacman-lib/lib/libalpm/sync.c diff -u pacman-lib/lib/libalpm/sync.c:1.101 pacman-lib/lib/libalpm/sync.c:1.102 --- pacman-lib/lib/libalpm/sync.c:1.101 Tue Feb 13 03:15:38 2007 +++ pacman-lib/lib/libalpm/sync.c Wed Feb 21 01:44:15 2007 @@ -128,7 +128,7 @@ /* check for "recommended" package replacements */ _alpm_log(PM_LOG_DEBUG, _("checking for package replacements")); for(i = 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, INFRQ_DEPENDS); j; j = j->next) { pmpkg_t *spkg = j->data; for(k = spkg->replaces; k; k = k->next) { alpm_list_t *m; @@ -194,7 +194,6 @@ ALPM_LOG_FUNC; /* check for "recommended" package replacements */ - _alpm_log(PM_LOG_DEBUG, _("checking for package replacements")); if( find_replacements(trans, db_local, dbs_sync) == 0 ) { /* match installed packages with the sync dbs and compare versions */ _alpm_log(PM_LOG_DEBUG, _("checking for package upgrades")); @@ -229,19 +228,24 @@ /* compare versions and see if we need to upgrade */ if(alpm_pkg_compare_versions(local, spkg)) { - _alpm_log(PM_LOG_DEBUG, _("%s-%s elected for upgrade (%s => %s)"), - local->name, local->version, local->version, spkg->version); - if(!find_pkginsync(spkg->name, trans->packages)) { - pmpkg_t *dummy = _alpm_pkg_new(local->name, local->version); - if(dummy == NULL) { - goto error; - } - sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, dummy); - if(sync == NULL) { - FREEPKG(dummy); - goto error; + if(alpm_list_find_str(handle->ignorepkg, local->name)) { + _alpm_log(PM_LOG_WARNING, _("%s-%s: ignoring package upgrade (%s => %s)"), + local->name, local->version, local->version, spkg->version); + } else { + _alpm_log(PM_LOG_DEBUG, _("%s-%s elected for upgrade (%s => %s)"), + local->name, local->version, local->version, spkg->version); + if(!find_pkginsync(spkg->name, trans->packages)) { + pmpkg_t *dummy = _alpm_pkg_new(local->name, local->version); + if(dummy == NULL) { + goto error; + } + sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, dummy); + if(sync == NULL) { + FREEPKG(dummy); + goto error; + } + trans->packages = alpm_list_add(trans->packages, sync); } - trans->packages = alpm_list_add(trans->packages, sync); } } } @@ -358,11 +362,10 @@ /* Helper functions for alpm_list_remove */ -/* removed - use pkg_cmp all of the time -static int ptr_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)); -}*/ +} static int pkg_cmp(const void *p1, const void *p2) { @@ -554,8 +557,8 @@ if(rmpkg) { pmsyncpkg_t *rsync = find_pkginsync(rmpkg, trans->packages); void *vpkg; - _alpm_log(PM_LOG_DEBUG, _("removing '%s' from target list"), rmpkg); - trans->packages = alpm_list_remove(trans->packages, rsync, pkg_cmp, &vpkg); + _alpm_log(PM_LOG_DEBUG, _("removing '%s' from target list"), rsync->pkg->name); + trans->packages = alpm_list_remove(trans->packages, rsync, syncpkg_cmp, &vpkg); FREESYNC(vpkg); continue; } @@ -592,7 +595,7 @@ /* remove it from the target list */ void *vpkg; _alpm_log(PM_LOG_DEBUG, _("removing '%s' from target list"), miss->depend.name); - trans->packages = alpm_list_remove(trans->packages, rsync, pkg_cmp, &vpkg); + trans->packages = alpm_list_remove(trans->packages, rsync, syncpkg_cmp, &vpkg); FREESYNC(vpkg); } } else {