Allow local and sync db to be treated separately
Implement this seemingly simple change in package.h: typedef enum _pmpkgfrom_t { - PKG_FROM_CACHE = 1, - PKG_FROM_FILE + PKG_FROM_FILE = 1, + PKG_FROM_LOCALDB, + PKG_FROM_SYNCDB } pmpkgfrom_t; which requires flushing out several assumptions from around the codebase with regards to usage of the PKG_FROM_CACHE value. Make some changes where required to allow the switch, and now the correct value should be set (via a crude hack) depending on whether a package was loaded as an entry in a local db or a sync db. This patch underwent some big rebasing from Allan and Dan. Signed-off-by: Dan McGee <dan@archlinux.org> Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
parent
49176461a6
commit
d1126db128
5 changed files with 37 additions and 34 deletions
|
@ -415,7 +415,11 @@ int _alpm_db_populate(pmdb_t *db)
|
||||||
_alpm_pkg_free(pkg);
|
_alpm_pkg_free(pkg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pkg->origin = PKG_FROM_CACHE;
|
if(db == handle->db_local) {
|
||||||
|
pkg->origin = PKG_FROM_LOCALDB;
|
||||||
|
} else {
|
||||||
|
pkg->origin = PKG_FROM_SYNCDB;
|
||||||
|
}
|
||||||
pkg->origin_data.db = db;
|
pkg->origin_data.db = db;
|
||||||
/* add to the collection */
|
/* add to the collection */
|
||||||
_alpm_log(PM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n",
|
_alpm_log(PM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n",
|
||||||
|
|
|
@ -120,9 +120,6 @@ int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
|
||||||
_alpm_pkg_free(newpkg);
|
_alpm_pkg_free(newpkg);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
newpkg->origin = PKG_FROM_CACHE;
|
|
||||||
newpkg->origin_data.db = db;
|
|
||||||
newpkg->infolevel = INFRQ_BASE;
|
|
||||||
|
|
||||||
_alpm_log(PM_LOG_DEBUG, "adding entry '%s' in '%s' cache\n",
|
_alpm_log(PM_LOG_DEBUG, "adding entry '%s' in '%s' cache\n",
|
||||||
alpm_pkg_get_name(newpkg), db->treename);
|
alpm_pkg_get_name(newpkg), db->treename);
|
||||||
|
|
|
@ -63,7 +63,7 @@ int SYMEXPORT alpm_pkg_free(pmpkg_t *pkg)
|
||||||
ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
||||||
|
|
||||||
/* Only free packages loaded in user space */
|
/* Only free packages loaded in user space */
|
||||||
if(pkg->origin != PKG_FROM_CACHE) {
|
if(pkg->origin == PKG_FROM_FILE) {
|
||||||
_alpm_pkg_free(pkg);
|
_alpm_pkg_free(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,8 +83,7 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg)
|
||||||
|
|
||||||
ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
|
||||||
/* We only inspect packages from sync repositories */
|
/* We only inspect packages from sync repositories */
|
||||||
ASSERT(pkg->origin == PKG_FROM_CACHE, RET_ERR(PM_ERR_PKG_INVALID, -1));
|
ASSERT(pkg->origin == PKG_FROM_SYNCDB, RET_ERR(PM_ERR_PKG_INVALID, -1));
|
||||||
ASSERT(pkg->origin_data.db != handle->db_local, RET_ERR(PM_ERR_PKG_INVALID, -1));
|
|
||||||
|
|
||||||
fpath = _alpm_filecache_find(alpm_pkg_get_filename(pkg));
|
fpath = _alpm_filecache_find(alpm_pkg_get_filename(pkg));
|
||||||
|
|
||||||
|
@ -105,7 +104,7 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg)
|
||||||
ALPM_LOG_FUNC; \
|
ALPM_LOG_FUNC; \
|
||||||
ASSERT(handle != NULL, return(errret)); \
|
ASSERT(handle != NULL, return(errret)); \
|
||||||
ASSERT(pkg != NULL, return(errret)); \
|
ASSERT(pkg != NULL, return(errret)); \
|
||||||
if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & info)) { \
|
if(pkg->origin != PKG_FROM_FILE && !(pkg->infolevel & info)) { \
|
||||||
_alpm_db_read(pkg->origin_data.db, pkg, info); \
|
_alpm_db_read(pkg->origin_data.db, pkg, info); \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
@ -250,7 +249,7 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_files(pmpkg_t *pkg)
|
||||||
ASSERT(handle != NULL, return(NULL));
|
ASSERT(handle != NULL, return(NULL));
|
||||||
ASSERT(pkg != NULL, return(NULL));
|
ASSERT(pkg != NULL, return(NULL));
|
||||||
|
|
||||||
if(pkg->origin == PKG_FROM_CACHE && pkg->origin_data.db == handle->db_local
|
if(pkg->origin == PKG_FROM_LOCALDB
|
||||||
&& !(pkg->infolevel & INFRQ_FILES)) {
|
&& !(pkg->infolevel & INFRQ_FILES)) {
|
||||||
_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_FILES);
|
_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_FILES);
|
||||||
}
|
}
|
||||||
|
@ -265,7 +264,7 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_backup(pmpkg_t *pkg)
|
||||||
ASSERT(handle != NULL, return(NULL));
|
ASSERT(handle != NULL, return(NULL));
|
||||||
ASSERT(pkg != NULL, return(NULL));
|
ASSERT(pkg != NULL, return(NULL));
|
||||||
|
|
||||||
if(pkg->origin == PKG_FROM_CACHE && pkg->origin_data.db == handle->db_local
|
if(pkg->origin == PKG_FROM_LOCALDB
|
||||||
&& !(pkg->infolevel & INFRQ_FILES)) {
|
&& !(pkg->infolevel & INFRQ_FILES)) {
|
||||||
_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_FILES);
|
_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_FILES);
|
||||||
}
|
}
|
||||||
|
@ -276,7 +275,7 @@ pmdb_t SYMEXPORT *alpm_pkg_get_db(pmpkg_t *pkg)
|
||||||
{
|
{
|
||||||
/* Sanity checks */
|
/* Sanity checks */
|
||||||
ASSERT(pkg != NULL, return(NULL));
|
ASSERT(pkg != NULL, return(NULL));
|
||||||
ASSERT(pkg->origin == PKG_FROM_CACHE, return(NULL));
|
ASSERT(pkg->origin != PKG_FROM_FILE, return(NULL));
|
||||||
|
|
||||||
return(pkg->origin_data.db);
|
return(pkg->origin_data.db);
|
||||||
}
|
}
|
||||||
|
@ -296,15 +295,7 @@ void SYMEXPORT *alpm_pkg_changelog_open(pmpkg_t *pkg)
|
||||||
ASSERT(handle != NULL, return(NULL));
|
ASSERT(handle != NULL, return(NULL));
|
||||||
ASSERT(pkg != NULL, return(NULL));
|
ASSERT(pkg != NULL, return(NULL));
|
||||||
|
|
||||||
if(pkg->origin == PKG_FROM_CACHE) {
|
if(pkg->origin == PKG_FROM_FILE) {
|
||||||
char clfile[PATH_MAX];
|
|
||||||
snprintf(clfile, PATH_MAX, "%s/%s/%s-%s/changelog",
|
|
||||||
alpm_option_get_dbpath(),
|
|
||||||
alpm_db_get_name(handle->db_local),
|
|
||||||
alpm_pkg_get_name(pkg),
|
|
||||||
alpm_pkg_get_version(pkg));
|
|
||||||
return fopen(clfile, "r");
|
|
||||||
} else if(pkg->origin == PKG_FROM_FILE) {
|
|
||||||
struct archive *archive = NULL;
|
struct archive *archive = NULL;
|
||||||
struct archive_entry *entry;
|
struct archive_entry *entry;
|
||||||
const char *pkgfile = pkg->origin_data.file;
|
const char *pkgfile = pkg->origin_data.file;
|
||||||
|
@ -331,7 +322,16 @@ void SYMEXPORT *alpm_pkg_changelog_open(pmpkg_t *pkg)
|
||||||
/* we didn't find a changelog */
|
/* we didn't find a changelog */
|
||||||
archive_read_finish(archive);
|
archive_read_finish(archive);
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
|
} else {
|
||||||
|
char clfile[PATH_MAX];
|
||||||
|
snprintf(clfile, PATH_MAX, "%s/%s/%s-%s/changelog",
|
||||||
|
alpm_option_get_dbpath(),
|
||||||
|
alpm_db_get_name(handle->db_local),
|
||||||
|
alpm_pkg_get_name(pkg),
|
||||||
|
alpm_pkg_get_version(pkg));
|
||||||
|
return fopen(clfile, "r");
|
||||||
}
|
}
|
||||||
|
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,9 +351,8 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size,
|
||||||
const pmpkg_t *pkg, const void *fp)
|
const pmpkg_t *pkg, const void *fp)
|
||||||
{
|
{
|
||||||
size_t ret = 0;
|
size_t ret = 0;
|
||||||
if(pkg->origin == PKG_FROM_CACHE) {
|
|
||||||
ret = fread(ptr, 1, size, (FILE*)fp);
|
if(pkg->origin == PKG_FROM_FILE) {
|
||||||
} else if(pkg->origin == PKG_FROM_FILE) {
|
|
||||||
ssize_t sret = archive_read_data((struct archive*)fp, ptr, size);
|
ssize_t sret = archive_read_data((struct archive*)fp, ptr, size);
|
||||||
/* Report error (negative values) */
|
/* Report error (negative values) */
|
||||||
if(sret < 0) {
|
if(sret < 0) {
|
||||||
|
@ -362,6 +361,8 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size,
|
||||||
} else {
|
} else {
|
||||||
ret = (size_t)sret;
|
ret = (size_t)sret;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
ret = fread(ptr, 1, size, (FILE*)fp);
|
||||||
}
|
}
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
@ -370,11 +371,11 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size,
|
||||||
int SYMEXPORT alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp)
|
int SYMEXPORT alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
if(pkg->origin == PKG_FROM_CACHE) {
|
if(pkg->origin == PKG_FROM_FILE) {
|
||||||
ret = feof((FILE*)fp);
|
|
||||||
} else if(pkg->origin == PKG_FROM_FILE) {
|
|
||||||
// note: this doesn't quite work, no feof in libarchive
|
// note: this doesn't quite work, no feof in libarchive
|
||||||
ret = archive_read_data((struct archive*)fp, NULL, 0);
|
ret = archive_read_data((struct archive*)fp, NULL, 0);
|
||||||
|
} else {
|
||||||
|
ret = feof((FILE*)fp);
|
||||||
}
|
}
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
@ -391,10 +392,10 @@ int SYMEXPORT alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp)
|
||||||
int SYMEXPORT alpm_pkg_changelog_close(const pmpkg_t *pkg, void *fp)
|
int SYMEXPORT alpm_pkg_changelog_close(const pmpkg_t *pkg, void *fp)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
if(pkg->origin == PKG_FROM_CACHE) {
|
if(pkg->origin == PKG_FROM_FILE) {
|
||||||
ret = fclose((FILE*)fp);
|
|
||||||
} else if(pkg->origin == PKG_FROM_FILE) {
|
|
||||||
ret = archive_read_finish((struct archive *)fp);
|
ret = archive_read_finish((struct archive *)fp);
|
||||||
|
} else {
|
||||||
|
ret = fclose((FILE*)fp);
|
||||||
}
|
}
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
@ -407,7 +408,7 @@ int SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg)
|
||||||
ASSERT(handle != NULL, return(-1));
|
ASSERT(handle != NULL, return(-1));
|
||||||
ASSERT(pkg != NULL, return(-1));
|
ASSERT(pkg != NULL, return(-1));
|
||||||
|
|
||||||
if(pkg->origin == PKG_FROM_CACHE && pkg->origin_data.db == handle->db_local
|
if(pkg->origin == PKG_FROM_LOCALDB
|
||||||
&& !(pkg->infolevel & INFRQ_SCRIPTLET)) {
|
&& !(pkg->infolevel & INFRQ_SCRIPTLET)) {
|
||||||
_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_SCRIPTLET);
|
_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_SCRIPTLET);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,8 +31,9 @@
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
|
||||||
typedef enum _pmpkgfrom_t {
|
typedef enum _pmpkgfrom_t {
|
||||||
PKG_FROM_CACHE = 1,
|
PKG_FROM_FILE = 1,
|
||||||
PKG_FROM_FILE
|
PKG_FROM_LOCALDB,
|
||||||
|
PKG_FROM_SYNCDB
|
||||||
} pmpkgfrom_t;
|
} pmpkgfrom_t;
|
||||||
|
|
||||||
struct __pmpkg_t {
|
struct __pmpkg_t {
|
||||||
|
@ -67,8 +68,8 @@ struct __pmpkg_t {
|
||||||
/* internal */
|
/* internal */
|
||||||
pmpkgfrom_t origin;
|
pmpkgfrom_t origin;
|
||||||
/* Replaced 'void *data' with this union as follows:
|
/* Replaced 'void *data' with this union as follows:
|
||||||
origin == PKG_FROM_CACHE, use pkg->origin_data.db
|
|
||||||
origin == PKG_FROM_FILE, use pkg->origin_data.file
|
origin == PKG_FROM_FILE, use pkg->origin_data.file
|
||||||
|
origin == PKG_FROM_*DB, use pkg->origin_data.db
|
||||||
*/
|
*/
|
||||||
union {
|
union {
|
||||||
pmdb_t *db;
|
pmdb_t *db;
|
||||||
|
|
|
@ -832,7 +832,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
for(j = trans->add; j; j = j->next) {
|
for(j = trans->add; j; j = j->next) {
|
||||||
pmpkg_t *spkg = j->data;
|
pmpkg_t *spkg = j->data;
|
||||||
|
|
||||||
if(spkg->origin == PKG_FROM_CACHE && current == spkg->origin_data.db) {
|
if(spkg->origin != PKG_FROM_FILE && current == spkg->origin_data.db) {
|
||||||
const char *fname = NULL;
|
const char *fname = NULL;
|
||||||
|
|
||||||
fname = alpm_pkg_get_filename(spkg);
|
fname = alpm_pkg_get_filename(spkg);
|
||||||
|
|
Loading…
Add table
Reference in a new issue