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 <[email protected]>
---
 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


Reply via email to