index : pacman | |
Archlinux32 fork of pacman | gitolite user |
summaryrefslogtreecommitdiff |
-rw-r--r-- | lib/libalpm/sync.c | 300 |
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index d50d6cfa..f21f7d35 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -45,11 +45,8 @@ #include "provide.h" #include "trans.h" #include "util.h" -#include "versioncmp.h" #include "handle.h" #include "alpm.h" -#include "md5.h" -#include "sha1.h" #include "server.h" pmsyncpkg_t *_alpm_sync_new(int type, pmpkg_t *spkg, void *data) @@ -59,7 +56,7 @@ pmsyncpkg_t *_alpm_sync_new(int type, pmpkg_t *spkg, void *data) ALPM_LOG_FUNC; if((sync = malloc(sizeof(pmsyncpkg_t))) == NULL) { - _alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %d bytes"), sizeof(pmsyncpkg_t)); + _alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %d bytes\n"), sizeof(pmsyncpkg_t)); return(NULL); } @@ -104,7 +101,7 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local, ALPM_LOG_FUNC; /* check for "recommended" package replacements */ - _alpm_log(PM_LOG_DEBUG, _("checking for package replacements")); + _alpm_log(PM_LOG_DEBUG, "checking for package replacements\n"); for(i = dbs_sync; i; i = i->next) { pmdb_t *db = i->data; @@ -120,11 +117,12 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local, 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'\n", + replacement, spkg->name); /* ignore if EITHER the local or replacement package are to be ignored */ if(alpm_list_find_str(handle->ignorepkg, spkg->name) || 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)\n"), alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg), alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); } else { @@ -159,7 +157,7 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local, sync->data = alpm_list_add(NULL, dummy); 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)\n", alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg), alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); } @@ -182,7 +180,7 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_s /* check for "recommended" 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")); + _alpm_log(PM_LOG_DEBUG, "checking for package upgrades\n"); for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) { int replace=0; pmpkg_t *local = i->data; @@ -193,7 +191,8 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_s spkg = _alpm_db_get_pkgfromcache(j->data, alpm_pkg_get_name(local)); } if(spkg == NULL) { - _alpm_log(PM_LOG_DEBUG, _("'%s' not found in sync db -- skipping"), alpm_pkg_get_name(local)); + _alpm_log(PM_LOG_DEBUG, "'%s' not found in sync db -- skipping\n", + alpm_pkg_get_name(local)); continue; } @@ -207,14 +206,14 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_s } } 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\n", alpm_pkg_get_name(local)); continue; } /* 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)"), + _alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (%s => %s)\n", alpm_pkg_get_name(local), alpm_pkg_get_version(local), alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); if(!_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) { @@ -269,7 +268,7 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy if(targ) { *targ = '\0'; targ++; - _alpm_log(PM_LOG_DEBUG, _("searching for target in repo '%s'"), targ); + _alpm_log(PM_LOG_DEBUG, "searching for target in repo '%s'\n", targ); for(j = dbs_sync; j && !spkg; j = j->next) { pmdb_t *db = j->data; if(strcmp(db->treename, targline) == 0) { @@ -277,19 +276,19 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy spkg = _alpm_db_get_pkgfromcache(db, targ); if(spkg == NULL) { /* 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\n", targ); alpm_list_t *p = _alpm_db_whatprovides(db, targ); if(!p) { 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'\n", p->data, targ); spkg = _alpm_db_get_pkgfromcache(db, p->data); alpm_list_free(p); } } } if(!repo_found) { - _alpm_log(PM_LOG_ERROR, _("repository '%s' not found"), targline); + _alpm_log(PM_LOG_ERROR, _("repository '%s' not found\n"), targline); RET_ERR(PM_ERR_PKG_REPO_NOT_FOUND, -1); } } else { @@ -300,12 +299,12 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy } if(spkg == NULL) { /* 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\n", targ); for(j = dbs_sync; j && !spkg; j = j->next) { pmdb_t *db = j->data; alpm_list_t *p = _alpm_db_whatprovides(db, targ); 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'\n", p->data, targ); spkg = _alpm_db_get_pkgfromcache(db, p->data); alpm_list_free(p); } @@ -330,7 +329,7 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy } else if(!(trans->flags & PM_TRANS_FLAG_PRINTURIS)) { QUESTION(trans, PM_TRANS_CONV_LOCAL_UPTODATE, local, NULL, NULL, &resp); if(!resp) { - _alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- skipping"), + _alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- skipping\n"), alpm_pkg_get_name(local), alpm_pkg_get_version(local)); return(0); } @@ -353,7 +352,7 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy _alpm_pkg_free(dummy); RET_ERR(PM_ERR_MEMORY, -1); } - _alpm_log(PM_LOG_DEBUG, _("adding target '%s' to the transaction set"), + _alpm_log(PM_LOG_DEBUG, "adding target '%s' to the transaction set\n", alpm_pkg_get_name(spkg)); trans->packages = alpm_list_add(trans->packages, sync); } @@ -379,7 +378,6 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync { alpm_list_t *deps = NULL; alpm_list_t *list = NULL; /* allow checkdeps usage with trans->packages */ - alpm_list_t *trail = NULL; /* breadcrumb list to avoid running in circles */ alpm_list_t *i, *j; int ret = 0; @@ -392,25 +390,31 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync *data = NULL; } - for(i = trans->packages; i; i = i->next) { - pmsyncpkg_t *sync = i->data; - list = alpm_list_add(list, sync->pkg); + if(!(trans->flags & PM_TRANS_FLAG_DEPENDSONLY)) { + for(i = trans->packages; i; i = i->next) { + pmsyncpkg_t *sync = i->data; + list = alpm_list_add(list, sync->pkg); + } } if(!(trans->flags & PM_TRANS_FLAG_NODEPS)) { /* Resolve targets dependencies */ EVENT(trans, PM_TRANS_EVT_RESOLVEDEPS_START, NULL, NULL); - _alpm_log(PM_LOG_DEBUG, _("resolving target's dependencies")); + _alpm_log(PM_LOG_DEBUG, "resolving target's dependencies\n"); for(i = trans->packages; i; i = i->next) { pmpkg_t *spkg = ((pmsyncpkg_t *)i->data)->pkg; - if(_alpm_resolvedeps(db_local, dbs_sync, spkg, list, - trail, trans, data) == -1) { + if(_alpm_resolvedeps(db_local, dbs_sync, spkg, &list, + trans, data) == -1) { /* pm_errno is set by resolvedeps */ ret = -1; goto cleanup; } } + if((trans->flags & PM_TRANS_FLAG_DEPENDSONLY)) { + FREELIST(trans->packages); + } + for(i = list; i; i = i->next) { /* add the dependencies found by resolvedeps to the transaction set */ pmpkg_t *spkg = i->data; @@ -421,32 +425,14 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync goto cleanup; } 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\n", alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); - } else { - /* remove the original targets from the list if requested */ - if((trans->flags & PM_TRANS_FLAG_DEPENDSONLY)) { - void *vpkg; - pmsyncpkg_t *sync; - - _alpm_log(PM_LOG_DEBUG, "removing package %s-%s from the transaction targets", - alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); - - sync = _alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg)); - trans->packages = alpm_list_remove(trans->packages, sync, syncpkg_cmp, &vpkg); - _alpm_sync_free(vpkg); - } } } /* re-order w.r.t. dependencies */ - alpm_list_t *sortlist = NULL; + alpm_list_t *sortlist = _alpm_sortbydeps(list, PM_TRANS_TYPE_ADD); alpm_list_t *newpkgs = NULL; - for(i = trans->packages; i; i = i->next) { - pmsyncpkg_t *s = i->data; - sortlist = alpm_list_add(sortlist, s->pkg); - } - sortlist = _alpm_sortbydeps(sortlist, PM_TRANS_TYPE_ADD); for(i = sortlist; i; i = i->next) { for(j = trans->packages; j; j = j->next) { pmsyncpkg_t *s = j->data; @@ -461,19 +447,18 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync EVENT(trans, PM_TRANS_EVT_RESOLVEDEPS_DONE, NULL, NULL); - _alpm_log(PM_LOG_DEBUG, _("looking for unresolvable dependencies")); + _alpm_log(PM_LOG_DEBUG, "looking for unresolvable dependencies\n"); deps = _alpm_checkdeps(db_local, PM_TRANS_TYPE_UPGRADE, list); if(deps) { if(data) { *data = deps; - deps = NULL; + } else { + FREELIST(deps); } pm_errno = PM_ERR_UNSATISFIED_DEPS; ret = -1; goto cleanup; } - - alpm_list_free(trail); } /* We don't care about conflicts if we're just printing uris */ @@ -481,7 +466,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync /* check for inter-conflicts and whatnot */ EVENT(trans, PM_TRANS_EVT_INTERCONFLICTS_START, NULL, NULL); - _alpm_log(PM_LOG_DEBUG, _("looking for conflicts")); + _alpm_log(PM_LOG_DEBUG, "looking for conflicts\n"); deps = _alpm_checkconflicts(db_local, list); if(deps) { int errorout = 0; @@ -492,7 +477,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync pmsyncpkg_t *sync; pmpkg_t *found = NULL; - _alpm_log(PM_LOG_DEBUG, _("package '%s' conflicts with '%s'"), + _alpm_log(PM_LOG_DEBUG, "package '%s' conflicts with '%s'\n", miss->target, miss->depend.name); /* check if the conflicting package is about to be removed/replaced. * if so, then just ignore it. */ @@ -503,14 +488,14 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync } } if(found) { - _alpm_log(PM_LOG_DEBUG, _("'%s' is already elected for removal -- skipping"), + _alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping\n", alpm_pkg_get_name(found)); continue; } sync = _alpm_sync_find(trans->packages, miss->target); 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\n", miss->target); continue; } @@ -520,7 +505,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync miss->depend.name)) { /* treat like a replaces item so requiredby fields are * inherited properly. */ - _alpm_log(PM_LOG_DEBUG, _("package '%s' provides its own conflict"), + _alpm_log(PM_LOG_DEBUG, "package '%s' provides its own conflict\n", miss->target); if(!local) { char *rmpkg = NULL; @@ -541,12 +526,12 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync target = alpm_list_find_str(trans->targets, miss->target); depend = alpm_list_find_str(trans->targets, miss->depend.name); if(depend && !target) { - _alpm_log(PM_LOG_DEBUG, _("'%s' is in the target list -- keeping it"), + _alpm_log(PM_LOG_DEBUG, "'%s' is in the target list -- keeping it\n", miss->depend.name); /* remove miss->target */ rmpkg = miss->target; } else if(target && !depend) { - _alpm_log(PM_LOG_DEBUG, _("'%s' is in the target list -- keeping it"), + _alpm_log(PM_LOG_DEBUG, "'%s' is in the target list -- keeping it\n", miss->target); /* remove miss->depend.name */ rmpkg = miss->depend.name; @@ -558,7 +543,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync if(rmpkg) { pmsyncpkg_t *rsync = _alpm_sync_find(trans->packages, rmpkg); void *vpkg; - _alpm_log(PM_LOG_DEBUG, _("removing '%s' from target list"), + _alpm_log(PM_LOG_DEBUG, "removing '%s' from target list\n", rsync->pkg->name); trans->packages = alpm_list_remove(trans->packages, rsync, syncpkg_cmp, &vpkg); @@ -568,7 +553,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync } } /* It's a conflict -- see if they want to remove it */ - _alpm_log(PM_LOG_DEBUG, _("resolving package '%s' conflict"), + _alpm_log(PM_LOG_DEBUG, "resolving package '%s' conflict\n", miss->target); if(local) { int doremove = 0; @@ -586,7 +571,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync sync->data = NULL; } /* append to the replaces list */ - _alpm_log(PM_LOG_DEBUG, _("electing '%s' for removal"), + _alpm_log(PM_LOG_DEBUG, "electing '%s' for removal\n", miss->depend.name); sync->data = alpm_list_add(sync->data, q); /* see if the package is in the current target list */ @@ -595,7 +580,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync if(rsync) { /* remove it from the target list */ void *vpkg; - _alpm_log(PM_LOG_DEBUG, _("removing '%s' from target list"), + _alpm_log(PM_LOG_DEBUG, "removing '%s' from target list\n", miss->depend.name); trans->packages = alpm_list_remove(trans->packages, rsync, syncpkg_cmp, &vpkg); @@ -603,11 +588,11 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync } } else { /* abort */ - _alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected")); + _alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected\n")); errorout = 1; if(data) { if((miss = malloc(sizeof(pmdepmissing_t))) == NULL) { - _alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %d bytes"), sizeof(pmdepmissing_t)); + _alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %d bytes\n"), sizeof(pmdepmissing_t)); FREELIST(*data); pm_errno = PM_ERR_MEMORY; ret = -1; @@ -619,11 +604,11 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync } } } else { - _alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected")); + _alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected\n")); errorout = 1; if(data) { if((miss = malloc(sizeof(pmdepmissing_t))) == NULL) { - _alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %d bytes"), sizeof(pmdepmissing_t)); + _alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %d bytes\n"), sizeof(pmdepmissing_t)); FREELIST(*data); pm_errno = PM_ERR_MEMORY; ret = -1; @@ -672,7 +657,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync } } if(list) { - _alpm_log(PM_LOG_DEBUG, _("checking dependencies of packages designated for removal")); + _alpm_log(PM_LOG_DEBUG, "checking dependencies of packages designated for removal\n"); deps = _alpm_checkdeps(db_local, PM_TRANS_TYPE_REMOVE, list); if(deps) { /* Check if broken dependencies are fixed by packages we are installing */ @@ -686,7 +671,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync pmsyncpkg_t *sp = l->data; pmpkg_t *sppkg = sp->pkg; if(alpm_depcmp(sppkg, &(miss->depend))) { - _alpm_log(PM_LOG_DEBUG, _("sync: dependency '%s' satisfied by package '%s'"), + _alpm_log(PM_LOG_DEBUG, "sync: dependency '%s' satisfied by package '%s'\n", miss->depend.name, alpm_pkg_get_name(sppkg)); satisfied = 1; } @@ -709,7 +694,6 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync cleanup: alpm_list_free(list); - alpm_list_free(trail); return(ret); } @@ -719,14 +703,14 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) alpm_list_t *i, *j, *files = NULL; pmtrans_t *tr = NULL; int replaces = 0, retval = 0; - int validcache = 0; - const char *maincachedir = NULL; + const char *cachedir = NULL; ALPM_LOG_FUNC; ASSERT(db_local != NULL, RET_ERR(PM_ERR_DB_NULL, -1)); ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1)); + cachedir = _alpm_filecache_setup(); trans->state = STATE_DOWNLOADING; /* group sync records by repository and download */ for(i = handle->dbs_sync; i; i = i->next) { @@ -735,75 +719,31 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) for(j = trans->packages; j; j = j->next) { pmsyncpkg_t *sync = j->data; pmpkg_t *spkg = sync->pkg; - pmdb_t *dbs = spkg->data; + pmdb_t *dbs = spkg->origin_data.db; if(current == dbs) { const char *fname = NULL; - char path[PATH_MAX]; fname = alpm_pkg_get_filename(spkg); if(trans->flags & PM_TRANS_FLAG_PRINTURIS) { - EVENT(trans, PM_TRANS_EVT_PRINTURI, (char *)alpm_db_get_url(current), (char *)fname); + EVENT(trans, PM_TRANS_EVT_PRINTURI, (char *)alpm_db_get_url(current), + (char *)fname); } else { - struct stat buf; - int found = 0; - /* Loop through the cache dirs until we find a matching file */ - for(i = alpm_option_get_cachedirs(); i; i = alpm_list_next(i)) { - snprintf(path, PATH_MAX, "%s%s", (char*)alpm_list_getdata(i), - fname); - if(stat(path, &buf) == 0) { - found = 1; - _alpm_log(PM_LOG_DEBUG, _("found cached pkg: %s"), path); - break; - } - } - if(!found) { + char *fpath = _alpm_filecache_find(fname); + if(!fpath) { /* file is not in the cache dir, so add it to the list */ files = alpm_list_add(files, strdup(fname)); } + FREE(fpath); } } } if(files) { - struct stat buf; - char *cachedir; EVENT(trans, PM_TRANS_EVT_RETRIEVE_START, current->treename, NULL); - for(i = alpm_option_get_cachedirs(); i; i = alpm_list_next(i)) { - cachedir = alpm_list_getdata(i); - if(stat(cachedir, &buf) != 0) { - /* cache directory does not exist.... try creating it */ - _alpm_log(PM_LOG_WARNING, _("no %s cache exists, creating...\n"), - cachedir); - alpm_logaction("warning: no %s cache exists, creating...", - cachedir); - if(_alpm_makepath(cachedir) == 0) { - _alpm_log(PM_LOG_DEBUG, _("setting main cachedir: %s"), cachedir); - maincachedir = cachedir; - validcache = 1; - break; - } - } else if(S_ISDIR(buf.st_mode) && (buf.st_mode & S_IWUSR)) { - _alpm_log(PM_LOG_DEBUG, _("setting main cachedir: %s"), cachedir); - maincachedir = cachedir; - validcache = 1; - break; - } - } - if(!validcache) { - /* we had no valid cache directories, so fall back to /tmp and - * unlink the packages afterwards. */ - alpm_list_t *oldcachedirs = alpm_option_get_cachedirs(); - alpm_list_t *cachetmp = alpm_list_add(NULL, strdup("/tmp/")); - FREELIST(oldcachedirs); - alpm_option_set_cachedirs(cachetmp); - _alpm_log(PM_LOG_DEBUG, _("setting main cachedir: %s"), "/tmp/"); - maincachedir = alpm_list_getdata(cachetmp); - _alpm_log(PM_LOG_WARNING, _("couldn't create package cache, using /tmp instead")); - alpm_logaction("warning: couldn't create package cache, using /tmp instead"); - } - if(_alpm_downloadfiles(current->servers, maincachedir, files)) { - _alpm_log(PM_LOG_WARNING, _("failed to retrieve some files from %s\n"), current->treename); + if(_alpm_downloadfiles(current->servers, cachedir, files)) { + _alpm_log(PM_LOG_WARNING, _("failed to retrieve some files from %s\n"), + current->treename); RET_ERR(PM_ERR_RETRIEVE, -1); } FREELIST(files); @@ -819,69 +759,54 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) for(i = trans->packages; i; i = i->next) { pmsyncpkg_t *sync = i->data; pmpkg_t *spkg = sync->pkg; - char str[PATH_MAX]; - struct stat buf; - const char *pkgname; - char *md5sum1, *md5sum2, *sha1sum1, *sha1sum2; + const char *filename; + char *filepath; + char *md5sum1, *md5sum2; char *ptr=NULL; - pkgname = alpm_pkg_get_filename(spkg); + filename = alpm_pkg_get_filename(spkg); md5sum1 = spkg->md5sum; - sha1sum1 = spkg->sha1sum; - if((md5sum1 == NULL) && (sha1sum1 == NULL)) { + if(md5sum1 == NULL) { /* TODO wtf is this? malloc'd strings for error messages? */ if((ptr = calloc(512, sizeof(char))) == NULL) { RET_ERR(PM_ERR_MEMORY, -1); } - snprintf(ptr, 512, _("can't get md5 or sha1 checksum for package %s\n"), pkgname); + snprintf(ptr, 512, _("can't get md5 checksum for package %s\n"), filename); *data = alpm_list_add(*data, ptr); retval = 1; continue; } - /* Loop through the cache dirs until we find a matching file */ - for(j = alpm_option_get_cachedirs(); j; j = alpm_list_next(j)) { - snprintf(str, PATH_MAX, "%s%s", (char*)alpm_list_getdata(j), pkgname); - if(stat(str, &buf) == 0) { - _alpm_log(PM_LOG_DEBUG, _("package found for integrity check: %s"), - str); - break; - } - } + filepath = _alpm_filecache_find(filename); - md5sum2 = alpm_get_md5sum(str); - sha1sum2 = alpm_get_sha1sum(str); - if(md5sum2 == NULL && sha1sum2 == NULL) { + md5sum2 = alpm_get_md5sum(filepath); + if(md5sum2 == NULL) { if((ptr = calloc(512, sizeof(char))) == NULL) { RET_ERR(PM_ERR_MEMORY, -1); } - snprintf(ptr, 512, _("can't get md5 or sha1 checksum for package %s\n"), pkgname); + snprintf(ptr, 512, _("can't get md5 checksum for package %s\n"), filename); *data = alpm_list_add(*data, ptr); retval = 1; continue; } - if((strcmp(md5sum1, md5sum2) != 0) && (strcmp(sha1sum1, sha1sum2) != 0)) { + if(strcmp(md5sum1, md5sum2) != 0) { int doremove=0; if((ptr = calloc(512, sizeof(char))) == NULL) { RET_ERR(PM_ERR_MEMORY, -1); } - if(trans->flags & PM_TRANS_FLAG_ALLDEPS) { - doremove=1; - } else { - QUESTION(trans, PM_TRANS_CONV_CORRUPTED_PKG, (char *)pkgname, NULL, NULL, &doremove); - } + QUESTION(trans, PM_TRANS_CONV_CORRUPTED_PKG, (char *)filename, + NULL, NULL, &doremove); if(doremove) { - unlink(str); - snprintf(ptr, 512, _("archive %s was corrupted (bad MD5 or SHA1 checksum)\n"), pkgname); - } else { - snprintf(ptr, 512, _("archive %s is corrupted (bad MD5 or SHA1 checksum)\n"), pkgname); + unlink(filepath); } + snprintf(ptr, 512, _("archive %s was corrupted (bad MD5 checksum)\n"), + filename); *data = alpm_list_add(*data, ptr); retval = 1; } + FREE(filepath); FREE(md5sum2); - FREE(sha1sum2); } if(retval) { pm_errno = PM_ERR_PKG_CORRUPTED; @@ -896,13 +821,13 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) trans->state = STATE_COMMITING; tr = _alpm_trans_new(); if(tr == NULL) { - _alpm_log(PM_LOG_ERROR, _("could not create removal transaction")); + _alpm_log(PM_LOG_ERROR, _("could not create removal transaction\n")); pm_errno = PM_ERR_MEMORY; goto error; } if(_alpm_trans_init(tr, PM_TRANS_TYPE_REMOVE, PM_TRANS_FLAG_NODEPS, NULL, NULL, NULL) == -1) { - _alpm_log(PM_LOG_ERROR, _("could not initialize the removal transaction")); + _alpm_log(PM_LOG_ERROR, _("could not initialize the removal transaction\n")); goto error; } @@ -922,15 +847,15 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) } } if(replaces) { - _alpm_log(PM_LOG_DEBUG, _("removing conflicting and to-be-replaced packages")); + _alpm_log(PM_LOG_DEBUG, "removing conflicting and to-be-replaced packages\n"); if(_alpm_trans_prepare(tr, data) == -1) { - _alpm_log(PM_LOG_ERROR, _("could not prepare removal transaction")); + _alpm_log(PM_LOG_ERROR, _("could not prepare removal transaction\n")); goto error; } /* we want the frontend to be aware of commit details */ tr->cb_event = trans->cb_event; if(_alpm_trans_commit(tr, NULL) == -1) { - _alpm_log(PM_LOG_ERROR, _("could not commit removal transaction")); + _alpm_log(PM_LOG_ERROR, _("could not commit removal transaction\n")); goto error; } } @@ -938,35 +863,33 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) tr = NULL; /* install targets */ - _alpm_log(PM_LOG_DEBUG, _("installing packages")); + _alpm_log(PM_LOG_DEBUG, "installing packages\n"); tr = _alpm_trans_new(); if(tr == NULL) { - _alpm_log(PM_LOG_ERROR, _("could not create transaction")); + _alpm_log(PM_LOG_ERROR, _("could not create transaction\n")); pm_errno = PM_ERR_MEMORY; goto error; } if(_alpm_trans_init(tr, PM_TRANS_TYPE_UPGRADE, trans->flags | PM_TRANS_FLAG_NODEPS, trans->cb_event, trans->cb_conv, trans->cb_progress) == -1) { - _alpm_log(PM_LOG_ERROR, _("could not initialize transaction")); + _alpm_log(PM_LOG_ERROR, _("could not initialize transaction\n")); goto error; } for(i = trans->packages; i; i = i->next) { pmsyncpkg_t *sync = i->data; pmpkg_t *spkg = sync->pkg; - struct stat buf; - const char *fname = NULL; - char str[PATH_MAX]; + const char *fname; + char *fpath; fname = alpm_pkg_get_filename(spkg); /* Loop through the cache dirs until we find a matching file */ - for(j = alpm_option_get_cachedirs(); j; j = alpm_list_next(j)) { - snprintf(str, PATH_MAX, "%s%s", (char*)alpm_list_getdata(j), fname); - if(stat(str, &buf) == 0) { - break; - } - } - if(_alpm_trans_addtarget(tr, str) == -1) { + fpath = _alpm_filecache_find(fname); + + if(_alpm_trans_addtarget(tr, fpath) == -1) { + FREE(fpath); goto error; } + FREE(fpath); + /* using alpm_list_last() is ok because addtarget() adds the new target at the * end of the tr->packages list */ spkg = alpm_list_last(tr->packages)->data; @@ -975,12 +898,12 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) } } if(_alpm_trans_prepare(tr, data) == -1) { - _alpm_log(PM_LOG_ERROR, _("could not prepare transaction")); + _alpm_log(PM_LOG_ERROR, _("could not prepare transaction\n")); /* pm_errno is set by trans_prepare */ goto error; } if(_alpm_trans_commit(tr, NULL) == -1) { - _alpm_log(PM_LOG_ERROR, _("could not commit transaction")); + _alpm_log(PM_LOG_ERROR, _("could not commit transaction\n")); goto error; } _alpm_trans_free(tr); @@ -988,7 +911,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) /* propagate replaced packages' requiredby fields to their new owners */ if(replaces) { - _alpm_log(PM_LOG_DEBUG, _("updating database for replaced packages' dependencies")); + _alpm_log(PM_LOG_DEBUG, "updating database for replaced packages' dependencies\n"); for(i = trans->packages; i; i = i->next) { pmsyncpkg_t *sync = i->data; if(sync->type == PM_SYNC_TYPE_REPLACE) { @@ -1017,7 +940,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) } } 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\n"), alpm_pkg_get_name(new), alpm_pkg_get_version(new)); } /* add the new requiredby */ @@ -1026,33 +949,18 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) } } 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\n"), alpm_pkg_get_name(new), alpm_pkg_get_version(new)); } } } } - if(!validcache && !(trans->flags & PM_TRANS_FLAG_DOWNLOADONLY)) { - /* delete packages */ - for(i = files; i; i = i->next) { - unlink(i->data); - } - } - - /* run ldconfig if it exists */ - if(handle->trans->state != STATE_INTERRUPTED) { - _alpm_log(PM_LOG_DEBUG, _("running \"ldconfig -r %s\""), handle->root); - _alpm_ldconfig(handle->root); - } - return(0); error: _alpm_trans_free(tr); tr = NULL; - /* commiting failed, so this is still just a prepared transaction */ - trans->state = STATE_PREPARED; return(-1); } @@ -1067,13 +975,13 @@ pmsyncpkg_t *_alpm_sync_find(alpm_list_t *syncpkgs, const char* pkgname) 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_log(PM_LOG_DEBUG, "found package '%s-%s' in sync\n", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg)); return(syncpkg); } } - _alpm_log(PM_LOG_DEBUG, _("package '%s' not found in sync"), pkgname); + _alpm_log(PM_LOG_DEBUG, "package '%s' not found in sync\n", pkgname); return(NULL); /* not found */ } |