[pacman-dev] [PATCH v3] Add events on pacnew/pacsave/pacorig file creation

Olivier Brunel jjk at jjacky.com
Wed Feb 12 10:32:30 EST 2014


ALPM still adds a warning to the log, but doesn't emit an event about
said warning, instead using a specific event to let the frontend what
happened/how to inform the user.

Note that there are 2 cases for installing a .pacnew file, to not
overwrite user changes and because file is in NoUpgrade. In the later case
the warning was a bit different: it happened before and said "extracting"
instead of "installed." Now both happen after and are phrased the same.

Signed-off-by: Olivier Brunel <jjk at jjacky.com>
---
 lib/libalpm/add.c     | 43 +++++++++++++++++++++++++++++++++++--------
 lib/libalpm/alpm.h    | 41 ++++++++++++++++++++++++++++++++++++++++-
 lib/libalpm/remove.c  |  7 ++++++-
 src/pacman/callback.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/pacman/util.c     | 13 +++++++++++++
 src/pacman/util.h     |  1 +
 6 files changed, 143 insertions(+), 10 deletions(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index 9bd0fd2..d626ef9 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -363,8 +363,14 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
 				if(try_rename(handle, checkfile, newpath)) {
 					errors++;
 				} else {
-					_alpm_log(handle, ALPM_LOG_WARNING, _("%s installed as %s\n"),
-							filename, newpath);
+					alpm_event_pacnew_created_t event = {
+						.type = ALPM_EVENT_PACNEW_CREATED,
+						.from_noupgrade = 0,
+						.oldpkg = oldpkg,
+						.newpkg = newpkg,
+						.file = filename
+					};
+					EVENT(handle, &event);
 					alpm_logaction(handle, ALPM_CALLER_PREFIX,
 							"warning: %s installed as %s\n", filename, newpath);
 				}
@@ -391,8 +397,12 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
 					if(try_rename(handle, checkfile, filename)) {
 						errors++;
 					} else {
-						_alpm_log(handle, ALPM_LOG_WARNING,
-								_("%s saved as %s\n"), filename, newpath);
+						alpm_event_pacorig_created_t event = {
+							.type = ALPM_EVENT_PACORIG_CREATED,
+							.newpkg = newpkg,
+							.file = filename
+						};
+						EVENT(handle, &event);
 						alpm_logaction(handle, ALPM_CALLER_PREFIX,
 								"warning: %s saved as %s\n", filename, newpath);
 					}
@@ -407,14 +417,14 @@ needbackup_cleanup:
 		free(hash_local);
 		free(hash_pkg);
 	} else {
+		size_t len;
 		/* we didn't need a backup */
 		if(notouch) {
 			/* change the path to a .pacnew extension */
 			_alpm_log(handle, ALPM_LOG_DEBUG, "%s is in NoUpgrade -- skipping\n", filename);
-			_alpm_log(handle, ALPM_LOG_WARNING, _("extracting %s as %s.pacnew\n"), filename, filename);
-			alpm_logaction(handle, ALPM_CALLER_PREFIX,
-					"warning: extracting %s as %s.pacnew\n", filename, filename);
-			strncat(filename, ".pacnew", PATH_MAX - strlen(filename));
+			/* remember len so we can get the old filename back for the event */
+			len = strlen(filename);
+			strncat(filename, ".pacnew", PATH_MAX - len);
 		} else {
 			_alpm_log(handle, ALPM_LOG_DEBUG, "extracting %s\n", filename);
 		}
@@ -433,6 +443,23 @@ needbackup_cleanup:
 			return errors;
 		}
 
+		if(notouch) {
+			alpm_event_pacnew_created_t event = {
+				.type = ALPM_EVENT_PACNEW_CREATED,
+				.from_noupgrade = 1,
+				.oldpkg = oldpkg,
+				.newpkg = newpkg,
+				.file = filename
+			};
+			/* "remove" the .pacnew suffix */
+			filename[len] = '\0';
+			EVENT(handle, &event);
+			alpm_logaction(handle, ALPM_CALLER_PREFIX,
+					"warning: %s installed as %s.pacnew\n", filename, filename);
+			/* restore */
+			filename[len] = '.';
+		}
+
 		/* calculate an hash if this is in newpkg's backup */
 		alpm_list_t *i;
 		for(i = alpm_pkg_get_backup(newpkg); i; i = i->next) {
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 5fc9c0d..b0adb95 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -350,7 +350,15 @@ typedef enum _alpm_event_type_t {
 	/** Key downloading is finished. */
 	ALPM_EVENT_KEY_DOWNLOAD_DONE,
 	/** A log message was emitted; See alpm_event_log_t for arguments. */
-	ALPM_EVENT_LOG
+	ALPM_EVENT_LOG,
+	/** A .pacnew file was created; See alpm_event_pacnew_created_t for arguments. */
+	ALPM_EVENT_PACNEW_CREATED,
+	/** A .pacsave file was created; See alpm_event_pacsave_created_t for
+	 * arguments */
+	ALPM_EVENT_PACSAVE_CREATED,
+	/** A .pacorig file was created; See alpm_event_pacorig_created_t for
+	 * arguments */
+	ALPM_EVENT_PACORIG_CREATED
 } alpm_event_type_t;
 
 /** Events.
@@ -442,6 +450,37 @@ typedef struct _alpm_event_pkgdownload_t {
 	const char *file;
 } alpm_event_pkgdownload_t;
 
+typedef struct _alpm_event_pacnew_created_t {
+	/** Type of event. */
+	alpm_event_type_t type;
+	/** Whether the creation was result of a NoUpgrade or not */
+	int from_noupgrade;
+	/** Old package. */
+	alpm_pkg_t *oldpkg;
+	/** New Package. */
+	alpm_pkg_t *newpkg;
+	/** Filename of the file without the .pacnew suffix */
+	const char *file;
+} alpm_event_pacnew_created_t;
+
+typedef struct _alpm_event_pacsave_created_t {
+	/** Type of event. */
+	alpm_event_type_t type;
+	/** Old package. */
+	alpm_pkg_t *oldpkg;
+	/** Filename of the file without the .pacsave suffix. */
+	const char *file;
+} alpm_event_pacsave_created_t;
+
+typedef struct _alpm_event_pacorig_created_t {
+	/** Type of event. */
+	alpm_event_type_t type;
+	/** New package. */
+	alpm_pkg_t *newpkg;
+	/** Filename of the file without the .pacorig suffix. */
+	const char *file;
+} alpm_event_pacorig_created_t;
+
 /** Event callback. */
 typedef void (*alpm_cb_event)(alpm_event_t *);
 
diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
index dce5578..aa11d9f 100644
--- a/lib/libalpm/remove.c
+++ b/lib/libalpm/remove.c
@@ -520,6 +520,11 @@ static int unlink_file(alpm_handle_t *handle, alpm_pkg_t *oldpkg,
 				int cmp = filehash ? strcmp(filehash, backup->hash) : 0;
 				FREE(filehash);
 				if(cmp != 0) {
+					alpm_event_pacsave_created_t event = {
+						.type = ALPM_EVENT_PACSAVE_CREATED,
+						.oldpkg = oldpkg,
+						.file = file
+					};
 					char *newpath;
 					size_t len = strlen(file) + 8 + 1;
 					MALLOC(newpath, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
@@ -534,7 +539,7 @@ static int unlink_file(alpm_handle_t *handle, alpm_pkg_t *oldpkg,
 						free(newpath);
 						return -1;
 					}
-					_alpm_log(handle, ALPM_LOG_WARNING, _("%s saved as %s\n"), file, newpath);
+					EVENT(handle, &event);
 					alpm_logaction(handle, ALPM_CALLER_PREFIX,
 							"warning: %s saved as %s\n", file, newpath);
 					free(newpath);
diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 2540b73..340a3a1 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -288,6 +288,54 @@ void cb_event(alpm_event_t *event)
 				}
 			}
 			break;
+		case ALPM_EVENT_PACNEW_CREATED:
+			{
+				alpm_event_pacnew_created_t *e = (alpm_event_pacnew_created_t *) event;
+				if(on_progress) {
+					char *string = NULL;
+					pm_sprintf(&string, ALPM_LOG_WARNING, _("%s installed as %s.pacnew\n"),
+							e->file, e->file);
+					if(string != NULL) {
+						output = alpm_list_add(output, string);
+					}
+				} else {
+					pm_printf(ALPM_LOG_WARNING, _("%s installed as %s.pacnew\n"),
+							e->file, e->file);
+				}
+			}
+			break;
+		case ALPM_EVENT_PACSAVE_CREATED:
+			{
+				alpm_event_pacsave_created_t *e = (alpm_event_pacsave_created_t *) event;
+				if(on_progress) {
+					char *string = NULL;
+					pm_sprintf(&string, ALPM_LOG_WARNING, _("%s saved as %s.pacsave\n"),
+							e->file, e->file);
+					if(string != NULL) {
+						output = alpm_list_add(output, string);
+					}
+				} else {
+					pm_printf(ALPM_LOG_WARNING, _("%s saved as %s.pacsave\n"),
+							e->file, e->file);
+				}
+			}
+			break;
+		case ALPM_EVENT_PACORIG_CREATED:
+			{
+				alpm_event_pacorig_created_t *e = (alpm_event_pacorig_created_t *) event;
+				if(on_progress) {
+					char *string = NULL;
+					pm_sprintf(&string, ALPM_LOG_WARNING, _("%s saved as %s.pacorig\n"),
+							e->file, e->file);
+					if(string != NULL) {
+						output = alpm_list_add(output, string);
+					}
+				} else {
+					pm_printf(ALPM_LOG_WARNING, _("%s saved as %s.pacorig\n"),
+							e->file, e->file);
+				}
+			}
+			break;
 		/* all the simple done events, with fallthrough for each */
 		case ALPM_EVENT_FILECONFLICTS_DONE:
 		case ALPM_EVENT_CHECKDEPS_DONE:
diff --git a/src/pacman/util.c b/src/pacman/util.c
index 91f8fb3..d42e27b 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -1579,6 +1579,19 @@ int pm_asprintf(char **string, const char *format, ...)
 	return ret;
 }
 
+int pm_sprintf(char **string, alpm_loglevel_t level, const char *format, ...)
+{
+	int ret = 0;
+	va_list args;
+
+	/* print the message using va_arg list */
+	va_start(args, format);
+	ret = pm_vasprintf(string, level, format, args);
+	va_end(args);
+
+	return ret;
+}
+
 int pm_vasprintf(char **string, alpm_loglevel_t level, const char *format, va_list args)
 {
 	int ret = 0;
diff --git a/src/pacman/util.h b/src/pacman/util.h
index 94a6dc8..4a31e89 100644
--- a/src/pacman/util.h
+++ b/src/pacman/util.h
@@ -78,6 +78,7 @@ int noyes(const char *format, ...) __attribute__((format(printf, 1, 2)));
 int pm_printf(alpm_loglevel_t level, const char *format, ...) __attribute__((format(printf,2,3)));
 int pm_asprintf(char **string, const char *format, ...) __attribute__((format(printf,2,3)));
 int pm_vfprintf(FILE *stream, alpm_loglevel_t level, const char *format, va_list args) __attribute__((format(printf,3,0)));
+int pm_sprintf(char **string, alpm_loglevel_t level, const char *format, ...) __attribute__((format(printf,3,4)));
 int pm_vasprintf(char **string, alpm_loglevel_t level, const char *format, va_list args) __attribute__((format(printf,3,0)));
 
 #endif /* _PM_UTIL_H */
-- 
1.8.5.4



More information about the pacman-dev mailing list