[pacman-dev] [PATCH] alpm: Add events for creation of pacnew/pacorig files

Olivier Brunel jjk at jjacky.com
Sat Nov 9 13:49:43 EST 2013


Signed-off-by: Olivier Brunel <jjk at jjacky.com>
---
Hey,

Some background regarding this: I've written a little tool (kalu, [1]) which is
an upgrade notifier, and also features a GUI/frontend for the sysupgrade (-Syu)
operation.

Whenever there was a pacnew installed, I would open a terminal and run vimdiff
on the files; I would also wonder if it wouldn't be nice to have a third file
featured, the "original" one (i.e. from the previous package). And so I started
wondering about kalu making a list of all pacnew files created during the
upgrade, as well as the name & version of the old package, so that I could use a
little script to extract the file and start the 3-way diff.

(kalu allows to execute one or more command lines after the sysupgrade
completed, so this list is just a variable parsed on said cmdlines.)

This all works well, but to make that list, kalu would have to e.g. use a regex
to extract the pacnew filenames from ALPM's warnings, and that's just not a very
good or reliable thing, especially when you know such warnings are translated.

Hence, why adding a couple events (there's pacorig as well) in ALPM makes
everything much better & simpler; And knowing about such events could be useful
to some frontends, even though pacman obviously has no use for it (atm).

So, I'm hoping you'd be willing to merge this.

Thanks,
-j

[1] http://jjacky.com/kalu


 lib/libalpm/add.c     |  3 +++
 lib/libalpm/alpm.h    | 10 +++++++++-
 src/pacman/callback.c |  3 +++
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index ac4e36a..e5eca97 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -363,10 +363,12 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
 				if(try_rename(handle, checkfile, newpath)) {
 					errors++;
 				} else {
+					alpm_pkg_t *arr[2] = { oldpkg, newpkg };
 					_alpm_log(handle, ALPM_LOG_WARNING, _("%s installed as %s\n"),
 							filename, newpath);
 					alpm_logaction(handle, ALPM_CALLER_PREFIX,
 							"warning: %s installed as %s\n", filename, newpath);
+					EVENT(handle, ALPM_EVENT_PACNEW, arr, newpath);
 				}
 
 				free(newpath);
@@ -395,6 +397,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
 								_("%s saved as %s\n"), filename, newpath);
 						alpm_logaction(handle, ALPM_CALLER_PREFIX,
 								"warning: %s saved as %s\n", filename, newpath);
+						EVENT(handle, ALPM_EVENT_PACORIG, newpkg, newpath);
 					}
 				}
 
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 2c8c1e6..c4f772d 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -387,7 +387,15 @@ typedef enum _alpm_event_t {
 	/** Downloading missing keys into keyring. */
 	ALPM_EVENT_KEY_DOWNLOAD_START,
 	/** Key downloading is finished. */
-	ALPM_EVENT_KEY_DOWNLOAD_DONE
+	ALPM_EVENT_KEY_DOWNLOAD_DONE,
+	/** A .pacnew file was installed
+	 * An array of packages (current/old one, and installed/new one) and the
+	 * name of the pacnew file are passed to the callback */
+	ALPM_EVENT_PACNEW,
+	/** A .pacorig file was created
+	 * The installed/new package and the name of the pacorig file are passed to
+	 * the callback */
+	ALPM_EVENT_PACORIG
 } alpm_event_t;
 
 /** Event callback */
diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 36531a2..0fc35f6 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -297,6 +297,9 @@ void cb_event(alpm_event_t event, void *data1, void *data2)
 		case ALPM_EVENT_DELTA_INTEGRITY_DONE:
 		case ALPM_EVENT_DELTA_PATCHES_DONE:
 		case ALPM_EVENT_DISKSPACE_DONE:
+		/* events of creation of .pacnew/.pacorig files */
+		case ALPM_EVENT_PACNEW:
+		case ALPM_EVENT_PACORIG:
 			/* nothing */
 			break;
 	}
-- 
1.8.4.2



More information about the pacman-dev mailing list