Check for the existance of a partial download of a package file before jumping to delta calculations. Currently, if there were 10MiB remaining in a 100MiB the values passed to the front end do not reflect this. The frontend accounts for this change in the verbose target display by using alpm_pkg_download_size() instead of alpm_pkg_get_size(). We also change the label in the final column from a vague "Size" to a more descriptive "Download Size" Refactored from an old patch originally by Dan. Signed-off-by: Dave Reisner <dreisner@archlinux.org> --- lib/libalpm/sync.c | 29 ++++++++++++++++++++++++----- src/pacman/util.c | 4 ++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index e2562c0..471bbe7 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -284,7 +284,8 @@ alpm_list_t SYMEXPORT *alpm_find_group_pkgs(alpm_list_t *dbs, */ static int compute_download_size(alpm_pkg_t *newpkg) { - char *fpath; + const char *fname; + char *fpath, *fnamepart = NULL; off_t size = 0; alpm_handle_t *handle = newpkg->handle; @@ -295,11 +296,26 @@ static int compute_download_size(alpm_pkg_t *newpkg) } ASSERT(newpkg->filename != NULL, RET_ERR(handle, ALPM_ERR_PKG_INVALID_NAME, -1)); - fpath = _alpm_filecache_find(handle, newpkg->filename); + fname = newpkg->filename; + fpath = _alpm_filecache_find(handle, fname); + /* downloaded file exists, so there's nothing to grab */ if(fpath) { - FREE(fpath); size = 0; + goto finish; + } + + CALLOC(fnamepart, strlen(fname) + 6, sizeof(char), return -1); + sprintf(fnamepart, "%s.part", fname); + fpath = _alpm_filecache_find(handle, fnamepart); + if(fpath) { + struct stat st; + if(stat(fpath, &st) == 0) { + /* subtract the size of the .part file */ + _alpm_log(handle, ALPM_LOG_DEBUG, "using (package - .part) size\n"); + size = newpkg->size - st.st_size; + size = size < 0 ? 0 : size; + } } else if(handle->usedelta) { off_t dltsize; @@ -315,15 +331,18 @@ static int compute_download_size(alpm_pkg_t *newpkg) alpm_list_free(newpkg->delta_path); newpkg->delta_path = NULL; } - } else { - size = newpkg->size; } +finish: _alpm_log(handle, ALPM_LOG_DEBUG, "setting download size %jd for pkg %s\n", (intmax_t)size, newpkg->name); newpkg->infolevel |= INFRQ_DSIZE; newpkg->download_size = size; + + FREE(fpath); + FREE(fnamepart); + return 0; } diff --git a/src/pacman/util.c b/src/pacman/util.c index 594186f..6963afb 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -748,7 +748,7 @@ static alpm_list_t *create_verbose_header(int install) pm_asprintf(&str, "%s", _("New Version")); res = alpm_list_add(res, str); } - pm_asprintf(&str, "%s", _("Size")); + pm_asprintf(&str, "%s", _("Download Size")); res = alpm_list_add(res, str); return res; @@ -779,7 +779,7 @@ static alpm_list_t *create_verbose_row(alpm_pkg_t *pkg, int install) ret = alpm_list_add(ret, str); /* and size */ - size = humanize_size(alpm_pkg_get_size(pkg), 'M', &label); + size = humanize_size(alpm_pkg_download_size(pkg), 'M', &label); pm_asprintf(&str, "%.2f %s", size, label); ret = alpm_list_add(ret, str); -- 1.7.6.1