[pacman-dev] [PATCH] Improve changelog handling

Xavier shiningxc at gmail.com
Sat Dec 8 20:23:54 EST 2007


On Sun, Dec 09, 2007 at 12:43:37AM +0100, Xavier wrote:
> 
> I believe you should use handle->db_local here rather than
> alpm_db_register_local();
> 
<snip>
> 
> 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.

Well, here is an updated patch, with the above suggestions. I also made
several other minor cleanups, and a few fixes to get it to work correctly.
Note : this requires a slight edit of _alpm_unpack to work correctly (return
1 when the file to extract, the changelog here, is not found), but this
should come as another patch.


>From 4def7e552f22b9ad26dd6193bdab40547bd5d46f Mon Sep 17 00:00:00 2001
From: Allan McRae <mcrae_allan at hotmail.com>
Date: Sat, 8 Dec 2007 19:18:49 +0100
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 at hotmail.com>

[Xavier : reuse _alpm_unpack function, several minor fixes and cleanups]
Signed-off-by: Chantry Xavier <shiningxc at gmail.com>
---
 lib/libalpm/alpm.h    |    1 +
 lib/libalpm/package.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/pacman/package.c  |   28 ++++++++---------------
 src/pacman/package.h  |    2 +-
 src/pacman/query.c    |    9 +-------
 5 files changed, 69 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..3e5369d 100644
--- a/lib/libalpm/package.c
+++ b/lib/libalpm/package.c
@@ -491,6 +491,62 @@ 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));
+
+	alpm_list_t *cl = NULL;
+	char clfile[PATH_MAX];
+	char tmpdir[PATH_MAX];
+	char line[PATH_MAX];
+	FILE* fp = NULL;
+	int clean_tmpdir = 0;
+
+	if(pkg->origin == PKG_FROM_CACHE) {
+		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));
+	} else if(pkg->origin == PKG_FROM_FILE) {
+		const char *pkgfile = pkg->origin_data.file;
+
+		snprintf(tmpdir, PATH_MAX, "%stmp/alpm_XXXXXX", handle->root);
+		if(mkdtemp(tmpdir) == NULL) {
+			_alpm_log(PM_LOG_ERROR, _("could not create temp directory\n"));
+			return(NULL);
+		} else {
+			clean_tmpdir = 1;
+		}
+
+		snprintf(clfile, PATH_MAX, "%s/.CHANGELOG", tmpdir);
+		if(_alpm_unpack(pkgfile, tmpdir, ".CHANGELOG")) {
+			goto cleanup;
+		}
+	}
+
+	fp = fopen(clfile, "r");
+	if(fp == NULL){
+		return(NULL);
+	}
+
+	while(fgets(line, PATH_MAX, fp)) {
+		cl = alpm_list_add(cl, strdup(line));
+	}
+	fclose(fp);
+
+cleanup:
+	if(clean_tmpdir && _alpm_rmrf(tmpdir)) {
+		_alpm_log(PM_LOG_WARNING, _("could not remove tmpdir %s\n"), tmpdir);
+	}
+
+	return(cl);
+}
+
 unsigned short SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg)
 {
 	ALPM_LOG_FUNC;
diff --git a/src/pacman/package.c b/src/pacman/package.c
index ac3f820..295b9b3 100644
--- a/src/pacman/package.c
+++ b/src/pacman/package.c
@@ -232,28 +232,20 @@ void dump_pkg_files(pmpkg_t *pkg)
 	fflush(stdout);
 }
 
-/* Display the changelog of an installed package
+/* Display the changelog of a package
  */
-void dump_pkg_changelog(char *clfile, const char *pkgname)
+void dump_pkg_changelog(pmpkg_t *pkg)
 {
-	FILE* fp = NULL;
-	char line[PATH_MAX+1];
+	alpm_list_t *i;
+	alpm_list_t *changelog = alpm_pkg_get_changelog(pkg);
 
-	if((fp = fopen(clfile, "r")) == NULL)
-	{
-		fprintf(stderr, _("error: no changelog available for '%s'.\n"), pkgname);
-		return;
-	}
-	else
-	{
-		while(!feof(fp))
-		{
-			fgets(line, (int)PATH_MAX, fp);
-			printf("%s", line);
-			line[0] = '\0';
+	if(changelog == NULL) {
+		fprintf(stderr, _("error: no changelog available for '%s'.\n"), alpm_pkg_get_name(pkg));
+	} else {
+		for(i = changelog; i; i = alpm_list_next(i)) {
+			fprintf(stdout, "%s", (char *)alpm_list_getdata(i));
 		}
-		fclose(fp);
-		return;
+		FREELIST(changelog);
 	}
 }
 
diff --git a/src/pacman/package.h b/src/pacman/package.h
index 0e4bb0f..7dfc054 100644
--- a/src/pacman/package.h
+++ b/src/pacman/package.h
@@ -28,7 +28,7 @@ void dump_pkg_sync(pmpkg_t *pkg, const char *treename);
 
 void dump_pkg_backups(pmpkg_t *pkg);
 void dump_pkg_files(pmpkg_t *pkg);
-void dump_pkg_changelog(char *clfile, const char *pkgname);
+void dump_pkg_changelog(pmpkg_t *pkg);
 
 #endif /* _PM_PACKAGE_H */
 
diff --git a/src/pacman/query.c b/src/pacman/query.c
index 8a8765b..1307077 100644
--- a/src/pacman/query.c
+++ b/src/pacman/query.c
@@ -312,14 +312,7 @@ static void display(pmpkg_t *pkg)
 		dump_pkg_files(pkg);
 	}
 	if(config->op_q_changelog) {
-		char changelog[PATH_MAX];
-		/* TODO should be done in the backend- no raw DB stuff up front */
-		snprintf(changelog, PATH_MAX, "%s/%s/%s-%s/changelog",
-				alpm_option_get_dbpath(),
-				alpm_db_get_name(db_local),
-				alpm_pkg_get_name(pkg),
-				alpm_pkg_get_version(pkg));
-		dump_pkg_changelog(changelog, alpm_pkg_get_name(pkg));
+		dump_pkg_changelog(pkg);
 	}
 	if(!config->op_q_info && !config->op_q_list && !config->op_q_changelog) {
 		if (!config->quiet) {
-- 
1.5.3.7





More information about the pacman-dev mailing list