On Sat, Dec 08, 2007 at 02:47:23AM +1000, Allan McRae wrote:
From 47affca982ec2d449bd6d96846172052dbdd3da6 Mon Sep 17 00:00:00 2001 From: Allan McRae <mcrae_allan@hotmail.com> Date: Sat, 8 Dec 2007 02:35:00 +1000 Subject: [PATCH] Improve changelog handling
Allows dumping of changelog for both installed packages and from package files (See FS#7321). Moves querying of changelog file in alpm backend.
Signed-off-by: Allan McRae <mcrae_allan@hotmail.com> --- lib/libalpm/alpm.h | 1 + lib/libalpm/package.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ src/pacman/package.c | 33 ++++++++++------------ src/pacman/package.h | 2 +- src/pacman/query.c | 9 +----- 5 files changed, 89 insertions(+), 27 deletions(-)
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 1e18ad9..7f6c9eb 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -216,6 +216,7 @@ alpm_list_t *alpm_pkg_get_deltas(pmpkg_t *pkg); alpm_list_t *alpm_pkg_get_replaces(pmpkg_t *pkg); alpm_list_t *alpm_pkg_get_files(pmpkg_t *pkg); alpm_list_t *alpm_pkg_get_backup(pmpkg_t *pkg); +alpm_list_t *alpm_pkg_get_changelog(pmpkg_t *pkg); unsigned short alpm_pkg_has_scriptlet(pmpkg_t *pkg);
unsigned long alpm_pkg_download_size(pmpkg_t *newpkg, pmdb_t *db_local); diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 172456d..bbdb95d 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -491,6 +491,77 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_backup(pmpkg_t *pkg) return pkg->backup; }
+alpm_list_t SYMEXPORT *alpm_pkg_get_changelog(pmpkg_t *pkg) +{ + ALPM_LOG_FUNC; + + /* Sanity checks */ + ASSERT(handle != NULL, return(NULL)); + ASSERT(pkg != NULL, return(NULL)); + + int ret = ARCHIVE_OK; + alpm_list_t *cl = NULL; + char clfile[PATH_MAX]; + char *tmpfile = NULL; + struct archive *archive; + struct archive_entry *entry; + int fd = -1; + char line[PATH_MAX]; + + if(pkg->origin == PKG_FROM_CACHE) { + snprintf(clfile, PATH_MAX, "%s/%s/%s-%s/changelog", + alpm_option_get_dbpath(), + alpm_db_get_name(alpm_db_register_local()),
I believe you should use handle->db_local here rather than alpm_db_register_local();
+ alpm_pkg_get_name(pkg), + alpm_pkg_get_version(pkg)); + } else if(pkg->origin == PKG_FROM_FILE) { + const char *pkgfile = pkg->origin_data.file; + + if((archive = archive_read_new()) == NULL) { + RET_ERR(PM_ERR_LIBARCHIVE_ERROR, NULL); + } + + archive_read_support_compression_all(archive); + archive_read_support_format_all(archive); + + if (archive_read_open_filename(archive, pkgfile, + ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) { + RET_ERR(PM_ERR_PKG_OPEN, NULL); + } + + while((ret = archive_read_next_header(archive, &entry)) == ARCHIVE_OK) { + const char *entry_name = archive_entry_pathname(entry); + + if(strcmp(entry_name, ".CHANGELOG") == 0) { + tmpfile = strdup("/tmp/alpm_XXXXXX"); + fd = mkstemp(tmpfile); + archive_read_data_into_fd(archive, fd); + break; + } + } + snprintf(clfile, PATH_MAX, "%s", tmpfile); + } +
You probably got this part from _alpm_pkg_load, I guess it's alright (except you probably want to add an archive_read_finish(archive); there). But you could also use _alpm_unpack, like in _alpm_runscriptlet. Btw, I couldn't get your patch to apply cleanly, because of many line breaks. So I started rewriting it from the start, but in the same time, I wanted to experiment reading directly from the archive, which resulted in the patch I submitted somewhere else in this thread. I don't know if it's better or not, but if it is, all the credits still go to you, for looking at the problem in the first place, and providing a good patch to work with. So thanks again.