Simplify construction of payloads in download_files
Currently, download_files() creates payloads for all packages then iterates over them, calling download_single_file. This can be simplified by looping over packages and constructing the payload as needed. Signed-off-by: Anatol Pomozov <anatol.pomozov@gmail.com> Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
parent
4246a4cc4f
commit
130db5cc9e
1 changed files with 13 additions and 21 deletions
|
@ -693,18 +693,6 @@ static int prompt_to_delete(alpm_handle_t *handle, const char *filepath,
|
||||||
return question.remove;
|
return question.remove;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dload_payload *build_payload(alpm_handle_t *handle,
|
|
||||||
const char *filename, size_t size, alpm_list_t *servers)
|
|
||||||
{
|
|
||||||
struct dload_payload *payload;
|
|
||||||
|
|
||||||
CALLOC(payload, 1, sizeof(*payload), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
|
||||||
STRDUP(payload->remote_name, filename, FREE(payload); RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
|
||||||
payload->max_size = size;
|
|
||||||
payload->servers = servers;
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int find_dl_candidates(alpm_handle_t *handle, alpm_list_t **files)
|
static int find_dl_candidates(alpm_handle_t *handle, alpm_list_t **files)
|
||||||
{
|
{
|
||||||
for(alpm_list_t *i = handle->trans->add; i; i = i->next) {
|
for(alpm_list_t *i = handle->trans->add; i; i = i->next) {
|
||||||
|
@ -729,10 +717,7 @@ static int find_dl_candidates(alpm_handle_t *handle, alpm_list_t **files)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(spkg->download_size != 0 || !fpath) {
|
if(spkg->download_size != 0 || !fpath) {
|
||||||
struct dload_payload *payload;
|
*files = alpm_list_add(*files, spkg);
|
||||||
payload = build_payload(handle, spkg->filename, spkg->size, repo->servers);
|
|
||||||
ASSERT(payload, return -1);
|
|
||||||
*files = alpm_list_add(*files, payload);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE(fpath);
|
FREE(fpath);
|
||||||
|
@ -815,8 +800,8 @@ static int download_files(alpm_handle_t *handle)
|
||||||
CALLOC(file_sizes, num_files, sizeof(off_t), goto finish);
|
CALLOC(file_sizes, num_files, sizeof(off_t), goto finish);
|
||||||
|
|
||||||
for(i = files, idx = 0; i; i = i->next, idx++) {
|
for(i = files, idx = 0; i; i = i->next, idx++) {
|
||||||
const struct dload_payload *payload = i->data;
|
const alpm_pkg_t *pkg = i->data;
|
||||||
file_sizes[idx] = payload->max_size;
|
file_sizes[idx] = pkg->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = _alpm_check_downloadspace(handle, cachedir, num_files, file_sizes);
|
ret = _alpm_check_downloadspace(handle, cachedir, num_files, file_sizes);
|
||||||
|
@ -832,19 +817,26 @@ static int download_files(alpm_handle_t *handle)
|
||||||
EVENT(handle, &event);
|
EVENT(handle, &event);
|
||||||
event.type = ALPM_EVENT_RETRIEVE_DONE;
|
event.type = ALPM_EVENT_RETRIEVE_DONE;
|
||||||
for(i = files; i; i = i->next) {
|
for(i = files; i; i = i->next) {
|
||||||
if(download_single_file(handle, i->data, cachedir) == -1) {
|
const alpm_pkg_t *pkg = i->data;
|
||||||
|
struct dload_payload payload = {0};
|
||||||
|
|
||||||
|
STRDUP(payload.remote_name, pkg->filename, handle->pm_errno = ALPM_ERR_MEMORY; goto finish);
|
||||||
|
payload.servers = pkg->origin_data.db->servers;
|
||||||
|
payload.max_size = pkg->size;
|
||||||
|
|
||||||
|
if(download_single_file(handle, &payload, cachedir) == -1) {
|
||||||
errors++;
|
errors++;
|
||||||
event.type = ALPM_EVENT_RETRIEVE_FAILED;
|
event.type = ALPM_EVENT_RETRIEVE_FAILED;
|
||||||
_alpm_log(handle, ALPM_LOG_WARNING, _("failed to retrieve some files\n"));
|
_alpm_log(handle, ALPM_LOG_WARNING, _("failed to retrieve some files\n"));
|
||||||
}
|
}
|
||||||
|
_alpm_dload_payload_reset(&payload);
|
||||||
}
|
}
|
||||||
EVENT(handle, &event);
|
EVENT(handle, &event);
|
||||||
}
|
}
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
if(files) {
|
if(files) {
|
||||||
alpm_list_free_inner(files, (alpm_list_fn_free)_alpm_dload_payload_reset);
|
alpm_list_free(files);
|
||||||
FREELIST(files);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = handle->trans->add; i; i = i->next) {
|
for(i = handle->trans->add; i; i = i->next) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue