From 3905ada993bacba31a1a9005fe4a0023890296d9 Mon Sep 17 00:00:00 2001
From: Dave Reisner <dreisner@archlinux.org>
Date: Wed, 7 Sep 2011 17:01:00 -0400
Subject: account for partial delta files in download size

Similar to an earlier commit which accounts for .part files for full
packages, calculate the download_size for deltas keeping mind the
possibility of a partial transfer.

Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
---
 lib/libalpm/delta.c | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

(limited to 'lib/libalpm')

diff --git a/lib/libalpm/delta.c b/lib/libalpm/delta.c
index 1ff4fde6..6315a851 100644
--- a/lib/libalpm/delta.c
+++ b/lib/libalpm/delta.c
@@ -89,12 +89,28 @@ static void graph_init_size(alpm_handle_t *handle, alpm_list_t *vertices)
 
 		/* determine whether the delta file already exists */
 		fpath = _alpm_filecache_find(handle, vdelta->delta);
-		md5sum = alpm_compute_md5sum(fpath);
-		if(fpath && md5sum && strcmp(md5sum, vdelta->delta_md5) == 0) {
-			vdelta->download_size = 0;
+		if(fpath) {
+			md5sum = alpm_compute_md5sum(fpath);
+			if(md5sum && strcmp(md5sum, vdelta->delta_md5) == 0) {
+				vdelta->download_size = 0;
+			}
+			FREE(md5sum);
+			FREE(fpath);
+		} else {
+			char *fnamepart;
+			CALLOC(fnamepart, strlen(vdelta->delta) + 6, sizeof(char), return);
+			sprintf(fnamepart, "%s.part", vdelta->delta);
+			fpath = _alpm_filecache_find(handle, fnamepart);
+			if(fpath) {
+				struct stat st;
+				if(stat(fpath, &st) == 0) {
+					vdelta->download_size = vdelta->delta_size - st.st_size;
+					vdelta->download_size = vdelta->download_size < 0 ? 0 : vdelta->download_size;
+				}
+				FREE(fpath);
+			}
+			FREE(fnamepart);
 		}
-		FREE(fpath);
-		FREE(md5sum);
 
 		/* determine whether a base 'from' file exists */
 		fpath = _alpm_filecache_find(handle, vdelta->from);
-- 
cgit v1.2.3-70-g09d2