[pacman-dev] [PATCH] Introduce event types for start/end database list download
Anatol Pomozov
anatol.pomozov at gmail.com
Fri Apr 17 02:31:01 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 | 6 ++++++
lib/libalpm/be_sync.c | 7 +++++++
src/pacman/callback.c | 13 +++++++++++--
3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 2cf20343..aee5aa0d 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -403,6 +403,12 @@ typedef enum _alpm_event_type_t {
* arguments. */
ALPM_EVENT_SCRIPTLET_INFO,
/** Files will be downloaded from a repository. */
+ ALPM_EVENT_DB_RETRIEVE_START,
+ /** Files were downloaded from a repository. */
+ ALPM_EVENT_DB_RETRIEVE_DONE,
+ /** Not all files were successfully downloaded from a repository. */
+ ALPM_EVENT_DB_RETRIEVE_FAILED,
+ /** Files will be downloaded from a repository. */
ALPM_EVENT_RETRIEVE_START,
/** Files were downloaded from a repository. */
ALPM_EVENT_RETRIEVE_DONE,
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/src/pacman/callback.c b/src/pacman/callback.c
index 8fb89b39..585eae09 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_DB_RETRIEVE_START:
+ on_progress = 1;
+ break;
case ALPM_EVENT_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_RETRIEVE_DONE:
+ case ALPM_EVENT_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.1
More information about the pacman-dev
mailing list