[pacman-dev] [PATCH v2] Introduce event types for start/end database list download

Anatol Pomozov anatol.pomozov at gmail.com
Wed May 6 01:28:49 UTC 2020


Multiplexed database/files downloads will use multiple progress bars.
The UI logic is quite complicated and printing error messages while
handling multiple progress bars is going to be challenging.

Instead we are going to save all ALPM error messages to a list and flush
it at the end of the download process. Use on_progress variable that
blocks error messages printing.

Signed-off-by: Anatol Pomozov <anatol.pomozov at gmail.com>
---
 lib/libalpm/alpm.h    | 18 ++++++++++++------
 lib/libalpm/be_sync.c |  7 +++++++
 lib/libalpm/sync.c    |  6 +++---
 src/pacman/callback.c | 15 ++++++++++++---
 4 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 2cf20343..a31f7a8a 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -402,12 +402,18 @@ typedef enum _alpm_event_type_t {
 	/** Scriptlet has printed information; See alpm_event_scriptlet_info_t for
 	 * arguments. */
 	ALPM_EVENT_SCRIPTLET_INFO,
-	/** Files will be downloaded from a repository. */
-	ALPM_EVENT_RETRIEVE_START,
-	/** Files were downloaded from a repository. */
-	ALPM_EVENT_RETRIEVE_DONE,
-	/** Not all files were successfully downloaded from a repository. */
-	ALPM_EVENT_RETRIEVE_FAILED,
+	/** Database files will be downloaded from a repository. */
+	ALPM_EVENT_DB_RETRIEVE_START,
+	/** Database files were downloaded from a repository. */
+	ALPM_EVENT_DB_RETRIEVE_DONE,
+	/** Not all database files were successfully downloaded from a repository. */
+	ALPM_EVENT_DB_RETRIEVE_FAILED,
+	/** Package files will be downloaded from a repository. */
+	ALPM_EVENT_PKG_RETRIEVE_START,
+	/** Package files were downloaded from a repository. */
+	ALPM_EVENT_PKG_RETRIEVE_DONE,
+	/** Not all package files were successfully downloaded from a repository. */
+	ALPM_EVENT_PKG_RETRIEVE_FAILED,
 	/** A file will be downloaded from a repository; See alpm_event_pkgdownload_t
 	 * for arguments */
 	ALPM_EVENT_PKGDOWNLOAD_START,
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index 1be40650..826c11e6 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -308,6 +308,7 @@ int SYMEXPORT alpm_dbs_update(alpm_handle_t *handle, alpm_list_t *dbs, int force
 	int ret = -1;
 	mode_t oldmask;
 	alpm_list_t *payloads = NULL;
+	alpm_event_t event;
 
 	/* Sanity checks */
 	CHECK_HANDLE(handle, return -1);
@@ -382,10 +383,16 @@ int SYMEXPORT alpm_dbs_update(alpm_handle_t *handle, alpm_list_t *dbs, int force
 		}
 	}
 
+	event.type = ALPM_EVENT_DB_RETRIEVE_START;
+	EVENT(handle, &event);
 	ret = _alpm_multi_download(handle, payloads, syncpath);
 	if(ret < 0) {
+		event.type = ALPM_EVENT_DB_RETRIEVE_FAILED;
+		EVENT(handle, &event);
 		goto cleanup;
 	}
+	event.type = ALPM_EVENT_DB_RETRIEVE_DONE;
+	EVENT(handle, &event);
 
 	for(i = dbs; i; i = i->next) {
 		alpm_db_t *db = i->data;
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index 8a9dcae8..855ca69c 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -812,9 +812,9 @@ static int download_files(alpm_handle_t *handle)
 			}
 		}
 
-		event.type = ALPM_EVENT_RETRIEVE_START;
+		event.type = ALPM_EVENT_PKG_RETRIEVE_START;
 		EVENT(handle, &event);
-		event.type = ALPM_EVENT_RETRIEVE_DONE;
+		event.type = ALPM_EVENT_PKG_RETRIEVE_DONE;
 		for(i = files; i; i = i->next) {
 			const alpm_pkg_t *pkg = i->data;
 			struct dload_payload payload = {0};
@@ -825,7 +825,7 @@ static int download_files(alpm_handle_t *handle)
 
 			if(download_single_file(handle, &payload, cachedir) == -1) {
 				errors++;
-				event.type = ALPM_EVENT_RETRIEVE_FAILED;
+				event.type = ALPM_EVENT_PKG_RETRIEVE_FAILED;
 				_alpm_log(handle, ALPM_LOG_WARNING, _("failed to retrieve some files\n"));
 			}
 			_alpm_dload_payload_reset(&payload);
diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 8fb89b39..a129758b 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -280,8 +280,12 @@ void cb_event(alpm_event_t *event)
 		case ALPM_EVENT_SCRIPTLET_INFO:
 			fputs(event->scriptlet_info.line, stdout);
 			break;
-		case ALPM_EVENT_RETRIEVE_START:
+		case ALPM_EVENT_DB_RETRIEVE_START:
+			on_progress = 1;
+			break;
+		case ALPM_EVENT_PKG_RETRIEVE_START:
 			colon_printf(_("Retrieving packages...\n"));
+			on_progress = 1;
 			break;
 		case ALPM_EVENT_DISKSPACE_START:
 			if(config->noprogressbar) {
@@ -338,6 +342,13 @@ void cb_event(alpm_event_t *event)
 				}
 			}
 			break;
+		case ALPM_EVENT_DB_RETRIEVE_DONE:
+		case ALPM_EVENT_DB_RETRIEVE_FAILED:
+		case ALPM_EVENT_PKG_RETRIEVE_DONE:
+		case ALPM_EVENT_PKG_RETRIEVE_FAILED:
+			flush_output_list();
+			on_progress = 0;
+			break;
 		/* all the simple done events, with fallthrough for each */
 		case ALPM_EVENT_FILECONFLICTS_DONE:
 		case ALPM_EVENT_CHECKDEPS_DONE:
@@ -349,8 +360,6 @@ void cb_event(alpm_event_t *event)
 		case ALPM_EVENT_KEY_DOWNLOAD_DONE:
 		case ALPM_EVENT_LOAD_DONE:
 		case ALPM_EVENT_DISKSPACE_DONE:
-		case ALPM_EVENT_RETRIEVE_DONE:
-		case ALPM_EVENT_RETRIEVE_FAILED:
 		case ALPM_EVENT_HOOK_DONE:
 		case ALPM_EVENT_HOOK_RUN_DONE:
 		/* we can safely ignore those as well */
-- 
2.26.2


More information about the pacman-dev mailing list