Remove "total download" callback in favor of generic event callback

Total download callback called right before packages start downloaded.
But we already have an event for such event (ALPM_EVENT_PKG_RETRIEVE_START)
and it is naturally to use the event to pass information about expected
download size.

Signed-off-by: Anatol Pomozov <anatol.pomozov@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Anatol Pomozov 2021-03-15 16:33:08 -07:00 committed by Allan McRae
parent 9bf3d6a760
commit 1e60a5f006
9 changed files with 25 additions and 65 deletions

1
README
View file

@ -52,7 +52,6 @@ library is initialized.
* logcb: The callback function for "log" operations. * logcb: The callback function for "log" operations.
* dlcb: The callback function for download progress of each package. * dlcb: The callback function for download progress of each package.
* fetchcb: Callback for custom download function. * fetchcb: Callback for custom download function.
* totaldlcb: The callback function for overall download progress.
* eventcb: Callback for transaction messages. * eventcb: Callback for transaction messages.
* questioncb: Callback for selecting amongst choices. * questioncb: Callback for selecting amongst choices.
* progresscb: Callback to handle display of transaction progress. * progresscb: Callback to handle display of transaction progress.

View file

@ -926,6 +926,16 @@ typedef struct _alpm_event_hook_run_t {
size_t total; size_t total;
} alpm_event_hook_run_t; } alpm_event_hook_run_t;
/** Packages downloading about to start. */
typedef struct _alpm_event_pkg_retrieve_t {
/** Type of event */
alpm_event_type_t type;
/** Number of packages to download */
size_t num;
/** Total size of packages to download */
off_t total_size;
} alpm_event_pkg_retrieve_t;
/** Events. /** Events.
* This is a union passed to the callback that allows the frontend to know * This is a union passed to the callback that allows the frontend to know
* which type of event was triggered (via type). It is then possible to * which type of event was triggered (via type). It is then possible to
@ -954,6 +964,8 @@ typedef union _alpm_event_t {
alpm_event_hook_t hook; alpm_event_hook_t hook;
/** A hook was ran */ /** A hook was ran */
alpm_event_hook_run_t hook_run; alpm_event_hook_run_t hook_run;
/** Download packages */
alpm_event_pkg_retrieve_t pkg_retrieve;
} alpm_event_t; } alpm_event_t;
/** Event callback. /** Event callback.
@ -1197,12 +1209,6 @@ typedef void (*alpm_cb_download)(const char *filename,
alpm_download_event_type_t event, void *data); alpm_download_event_type_t event, void *data);
/** Total Download callback.
* @param howmany the number of packages that will be downloaded during \link alpm_trans_commit \endlink.
* @param total amount that will be downloaded during \link alpm_trans_commit \endlink.
*/
typedef void (*alpm_cb_totaldl)(size_t howmany, off_t total);
/** A callback for downloading files /** A callback for downloading files
* @param url the URL of the file to be downloaded * @param url the URL of the file to be downloaded
* @param localpath the directory to which the file should be downloaded * @param localpath the directory to which the file should be downloaded
@ -1525,20 +1531,6 @@ alpm_cb_fetch alpm_option_get_fetchcb(alpm_handle_t *handle);
*/ */
int alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb); int alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb);
/** Returns the callback used to report total download size.
* @param handle the context handle
* @return the currently set total download callback
*/
alpm_cb_totaldl alpm_option_get_totaldlcb(alpm_handle_t *handle);
/** Sets the callback used to report total download size.
* @param handle the context handle
* @param cb the cb to use
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
int alpm_option_set_totaldlcb(alpm_handle_t *handle, alpm_cb_totaldl cb);
/** Returns the callback used for events. /** Returns the callback used for events.
* @param handle the context handle * @param handle the context handle
* @return the currently set event callback * @return the currently set event callback

View file

@ -851,7 +851,7 @@ int SYMEXPORT alpm_fetch_pkgurl(alpm_handle_t *handle, const alpm_list_t *urls,
const char *cachedir; const char *cachedir;
alpm_list_t *payloads = NULL; alpm_list_t *payloads = NULL;
const alpm_list_t *i; const alpm_list_t *i;
alpm_event_t event; alpm_event_t event = {0};
CHECK_HANDLE(handle, return -1); CHECK_HANDLE(handle, return -1);
ASSERT(*fetched == NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1)); ASSERT(*fetched == NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
@ -884,6 +884,7 @@ int SYMEXPORT alpm_fetch_pkgurl(alpm_handle_t *handle, const alpm_list_t *urls,
if(payloads) { if(payloads) {
event.type = ALPM_EVENT_PKG_RETRIEVE_START; event.type = ALPM_EVENT_PKG_RETRIEVE_START;
event.pkg_retrieve.num = alpm_list_count(payloads);
EVENT(handle, &event); EVENT(handle, &event);
if(_alpm_download(handle, payloads, cachedir) == -1) { if(_alpm_download(handle, payloads, cachedir) == -1) {
_alpm_log(handle, ALPM_LOG_WARNING, _("failed to retrieve some files\n")); _alpm_log(handle, ALPM_LOG_WARNING, _("failed to retrieve some files\n"));

View file

@ -174,12 +174,6 @@ alpm_cb_fetch SYMEXPORT alpm_option_get_fetchcb(alpm_handle_t *handle)
return handle->fetchcb; return handle->fetchcb;
} }
alpm_cb_totaldl SYMEXPORT alpm_option_get_totaldlcb(alpm_handle_t *handle)
{
CHECK_HANDLE(handle, return NULL);
return handle->totaldlcb;
}
alpm_cb_event SYMEXPORT alpm_option_get_eventcb(alpm_handle_t *handle) alpm_cb_event SYMEXPORT alpm_option_get_eventcb(alpm_handle_t *handle)
{ {
CHECK_HANDLE(handle, return NULL); CHECK_HANDLE(handle, return NULL);
@ -327,13 +321,6 @@ int SYMEXPORT alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb)
return 0; return 0;
} }
int SYMEXPORT alpm_option_set_totaldlcb(alpm_handle_t *handle, alpm_cb_totaldl cb)
{
CHECK_HANDLE(handle, return -1);
handle->totaldlcb = cb;
return 0;
}
int SYMEXPORT alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb) int SYMEXPORT alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb)
{ {
CHECK_HANDLE(handle, return -1); CHECK_HANDLE(handle, return -1);

View file

@ -72,7 +72,6 @@ struct __alpm_handle_t {
/* callback functions */ /* callback functions */
alpm_cb_log logcb; /* Log callback function */ alpm_cb_log logcb; /* Log callback function */
alpm_cb_download dlcb; /* Download callback function */ alpm_cb_download dlcb; /* Download callback function */
alpm_cb_totaldl totaldlcb; /* Total download callback function */
alpm_cb_fetch fetchcb; /* Download file callback function */ alpm_cb_fetch fetchcb; /* Download file callback function */
alpm_cb_event eventcb; alpm_cb_event eventcb;
alpm_cb_question questioncb; alpm_cb_question questioncb;

View file

@ -749,7 +749,7 @@ static int download_files(alpm_handle_t *handle)
const char *cachedir; const char *cachedir;
alpm_list_t *i, *files = NULL; alpm_list_t *i, *files = NULL;
int ret = 0; int ret = 0;
alpm_event_t event; alpm_event_t event = {0};
alpm_list_t *payloads = NULL; alpm_list_t *payloads = NULL;
cachedir = _alpm_filecache_setup(handle); cachedir = _alpm_filecache_setup(handle);
@ -760,21 +760,6 @@ static int download_files(alpm_handle_t *handle)
goto finish; goto finish;
} }
/* Total progress - figure out the total download size if required to
* pass to the callback. This function is called once, and it is up to the
* frontend to compute incremental progress. */
if(handle->totaldlcb) {
off_t total_size = (off_t)0;
size_t howmany = 0;
/* sum up the download size for each package and store total */
for(i = files; i; i = i->next) {
alpm_pkg_t *spkg = i->data;
total_size += spkg->download_size;
howmany++;
}
handle->totaldlcb(howmany, total_size);
}
if(files) { if(files) {
/* check for necessary disk space for download */ /* check for necessary disk space for download */
if(handle->checkspace) { if(handle->checkspace) {
@ -800,6 +785,14 @@ static int download_files(alpm_handle_t *handle)
} }
event.type = ALPM_EVENT_PKG_RETRIEVE_START; event.type = ALPM_EVENT_PKG_RETRIEVE_START;
/* sum up the number of packages to download and its total size */
for(i = files; i; i = i->next) {
alpm_pkg_t *spkg = i->data;
event.pkg_retrieve.total_size += spkg->download_size;
event.pkg_retrieve.num++;
}
EVENT(handle, &event); EVENT(handle, &event);
for(i = files; i; i = i->next) { for(i = files; i; i = i->next) {
alpm_pkg_t *pkg = i->data; alpm_pkg_t *pkg = i->data;

View file

@ -338,6 +338,8 @@ void cb_event(alpm_event_t *event)
case ALPM_EVENT_PKG_RETRIEVE_START: case ALPM_EVENT_PKG_RETRIEVE_START:
colon_printf(_("Retrieving packages...\n")); colon_printf(_("Retrieving packages...\n"));
on_progress = 1; on_progress = 1;
list_total_pkgs = event->pkg_retrieve.num;
list_total = event->pkg_retrieve.total_size;
total_enabled = config->totaldownload && list_total; total_enabled = config->totaldownload && list_total;
if(total_enabled) { if(total_enabled) {
init_total_progressbar(); init_total_progressbar();
@ -696,13 +698,6 @@ void cb_progress(alpm_progress_t event, const char *pkgname, int percent,
} }
} }
/* callback to handle receipt of total download value */
void cb_dl_total(size_t howmany, off_t total)
{
list_total_pkgs = howmany;
list_total = total;
}
static int dload_progressbar_enabled(void) static int dload_progressbar_enabled(void)
{ {
return !config->noprogressbar && (getcols() != 0); return !config->noprogressbar && (getcols() != 0);

View file

@ -35,8 +35,6 @@ void cb_question(alpm_question_t *question);
void cb_progress(alpm_progress_t event, const char *pkgname, int percent, void cb_progress(alpm_progress_t event, const char *pkgname, int percent,
size_t howmany, size_t remain); size_t howmany, size_t remain);
/* callback to handle receipt of total download value */
void cb_dl_total(size_t howmany, off_t total);
/* callback to handle display of download progress */ /* callback to handle display of download progress */
void cb_download(const char *filename, alpm_download_event_type_t event, void cb_download(const char *filename, alpm_download_event_type_t event,
void *data); void *data);

View file

@ -892,10 +892,6 @@ static int setup_libalpm(void)
pm_printf(ALPM_LOG_WARNING, _("no '%s' configured\n"), "XferCommand"); pm_printf(ALPM_LOG_WARNING, _("no '%s' configured\n"), "XferCommand");
} }
if(config->totaldownload) {
alpm_option_set_totaldlcb(handle, cb_dl_total);
}
alpm_option_set_arch(handle, config->arch); alpm_option_set_arch(handle, config->arch);
alpm_option_set_checkspace(handle, config->checkspace); alpm_option_set_checkspace(handle, config->checkspace);
alpm_option_set_usesyslog(handle, config->usesyslog); alpm_option_set_usesyslog(handle, config->usesyslog);