[pacman-dev] [PATCH] get_filename : use the FILENAME field from the db.
Dan McGee
dpmcgee at gmail.com
Wed Feb 13 19:35:58 EST 2008
On Feb 13, 2008 5:06 PM, Chantry Xavier <shiningxc at gmail.com> wrote:
> This fixes FS#9547.
>
> The get_filename function tried to construct the filename from name, version
> and arch, instead of directly using the filename field from the database,
> and got it wrong in most cases (with both core/extra and community repo).
>
> Since this field was introduced in 3.0, it should be safe to use it now in
> 3.1.
>
> Added a quick fix to pactest to also generate the FILENAME field in its sync
> databases.
>
> Signed-off-by: Chantry Xavier <shiningxc at gmail.com>
> ---
> lib/libalpm/package.c | 20 +++++++-------------
> lib/libalpm/sync.c | 11 ++++++++++-
> pactest/pmdb.py | 2 ++
> 3 files changed, 19 insertions(+), 14 deletions(-)
>
>
> diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
> index 937ee3e..d3351a4 100644
> --- a/lib/libalpm/package.c
> +++ b/lib/libalpm/package.c
> @@ -107,6 +107,7 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg)
> char *fpath;
> char *md5sum = NULL;
> int retval = 0;
> + const char *filename;
Super small issue, but want to put all the char declarations are on
consecutive lines, followed by the int one? Keeps the logically
grouped a bit better.
> ALPM_LOG_FUNC;
>
> @@ -115,7 +116,10 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg)
> ASSERT(pkg->origin == PKG_FROM_CACHE, 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));
> + filename = alpm_pkg_get_filename(pkg);
> + ASSERT(filename[0] != '\0', RET_ERR(PM_ERR_PKG_INVALID_NAME, -1));
> +
> + fpath = _alpm_filecache_find(filename);
Good.
> md5sum = alpm_get_md5sum(fpath);
>
> if(md5sum == NULL) {
> @@ -162,18 +166,8 @@ const char SYMEXPORT *alpm_pkg_get_filename(pmpkg_t *pkg)
> ASSERT(handle != NULL, return(NULL));
> ASSERT(pkg != NULL, return(NULL));
>
> - if(!strlen(pkg->filename)) {
> - /* construct the file name, it's not in the desc file */
> - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) {
> - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC);
> - }
> - if(pkg->arch && strlen(pkg->arch) > 0) {
> - snprintf(pkg->filename, PKG_FILENAME_LEN, "%s-%s-%s" PKGEXT,
> - pkg->name, pkg->version, pkg->arch);
> - } else {
> - snprintf(pkg->filename, PKG_FILENAME_LEN, "%s-%s" PKGEXT,
> - pkg->name, pkg->version);
> - }
> + if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) {
> + _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC);
> }
Looks great.
> return pkg->filename;
> diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
> index ced20c5..e03a757 100644
> --- a/lib/libalpm/sync.c
> +++ b/lib/libalpm/sync.c
> @@ -689,6 +689,7 @@ static alpm_list_t *pkg_upgrade_delta_path(pmpkg_t *newpkg, pmdb_t *db_local)
>
> if(oldpkg) {
> const char *oldname = alpm_pkg_get_filename(oldpkg);
> + ASSERT(oldname[0] != '\0', RET_ERR(PM_ERR_PKG_INVALID_NAME, NULL));
Hmm. I wonder if we need some more testing here. Did this never return
the empty string in any pactests, or anything else? I also don't know
that a locally installed package will store what filename it was
installed from. I wonder if we just broke all of the delta
assumptions. Or what is 'oldpkg' here?
> char *oldpath = _alpm_filecache_find(oldname);
>
> if(oldpath) {
> @@ -726,7 +727,9 @@ static alpm_list_t *pkg_upgrade_delta_path(pmpkg_t *newpkg, pmdb_t *db_local)
> */
> unsigned long SYMEXPORT alpm_pkg_download_size(pmpkg_t *newpkg, pmdb_t *db_local)
> {
> - char *fpath = _alpm_filecache_find(alpm_pkg_get_filename(newpkg));
> + const char *fname = alpm_pkg_get_filename(newpkg);
> + ASSERT(fname[0] != '\0', RET_ERR(PM_ERR_PKG_INVALID_NAME, 0));
> + char *fpath = _alpm_filecache_find(fname);
> unsigned long size = 0;
Good.
>
> if(fpath) {
> @@ -950,6 +953,8 @@ static int test_pkg_md5sum(pmtrans_t *trans, pmpkg_t *pkg, alpm_list_t **data)
> int ret = 0;
>
> filename = alpm_pkg_get_filename(pkg);
> + ASSERT(filename[0] != '\0', RET_ERR(PM_ERR_PKG_INVALID_NAME, 1));
> +
> md5sum = alpm_pkg_get_md5sum(pkg);
>
> ret = test_md5sum(trans, filename, md5sum, data);
> @@ -995,6 +1000,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
> const char *fname = NULL;
>
> fname = alpm_pkg_get_filename(spkg);
> + ASSERT(fname[0] != '\0', RET_ERR(PM_ERR_PKG_INVALID_NAME, -1));
> if(trans->flags & PM_TRANS_FLAG_PRINTURIS) {
> EVENT(trans, PM_TRANS_EVT_PRINTURI, (char *)alpm_db_get_url(current),
> (char *)fname);
> @@ -1187,6 +1193,9 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
> char *fpath;
>
> fname = alpm_pkg_get_filename(spkg);
> + if(fname[0] == '\0') {
> + goto error;
> + }
> /* Loop through the cache dirs until we find a matching file */
> fpath = _alpm_filecache_find(fname);
>
> diff --git a/pactest/pmdb.py b/pactest/pmdb.py
> index af39200..d0a4f6d 100755
> --- a/pactest/pmdb.py
> +++ b/pactest/pmdb.py
> @@ -261,6 +261,8 @@ class pmdb:
> if pkg.reason:
> data.append(_mksection("REASON", pkg.reason))
> else:
> + if pkg.filename():
> + data.append(_mksection("FILENAME", pkg.filename()))
> if pkg.replaces:
> data.append(_mksection("REPLACES", pkg.replaces))
> if pkg.force:
>
> --
> 1.5.4
More information about the pacman-dev
mailing list