Patchwork pkg-download: handle interrupted wget downloads

login
register
mail settings
Submitter Arnout Vandecappelle
Date June 30, 2012, 9:43 p.m.
Message ID <1341092583-14212-1-git-send-email-arnout@mind.be>
Download mbox | patch
Permalink /patch/168334/
State Accepted
Headers show

Comments

Arnout Vandecappelle - June 30, 2012, 9:43 p.m.
When a wget download is interrupted, the downloaded file is still created.
It will therefore not be re-downloaded in the next build, and the
extraction will fail.

To avoid this, download to a temporary file first and rename when the
download is successful.

The existing mechanism doesn't work for interrupted downloads because the
whole sub-shell is interrupted, so the rm-part never gets executed.

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
Note that using wget's -c option (continue an interrupted download) is
not a good idea, because it refuses to do anything on servers that don't
support the Range header.

 package/pkg-download.mk |    9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
Peter Korsgaard - June 30, 2012, 10:26 p.m.
>>>>> "Arnout" == Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> writes:

 Arnout> When a wget download is interrupted, the downloaded file is
 Arnout> still created.  It will therefore not be re-downloaded in the
 Arnout> next build, and the extraction will fail.

 Arnout> To avoid this, download to a temporary file first and rename
 Arnout> when the download is successful.

 Arnout> The existing mechanism doesn't work for interrupted downloads
 Arnout> because the whole sub-shell is interrupted, so the rm-part
 Arnout> never gets executed.

Committed, thanks.

Patch

diff --git a/package/pkg-download.mk b/package/pkg-download.mk
index 7d1e543..7983706 100644
--- a/package/pkg-download.mk
+++ b/package/pkg-download.mk
@@ -158,11 +158,14 @@  endef
 # Download a file using wget. Only download the file if it doesn't
 # already exist in the download directory. If the download fails,
 # remove the file (because wget -O creates a 0-byte file even if the
-# download fails).
+# download fails).  To handle an interrupted download as well, download
+# to a temporary file first.  The temporary file will be overwritten
+# the next time the download is tried.
 define DOWNLOAD_WGET
 	test -e $(DL_DIR)/$(2) || \
-	$(WGET) -O $(DL_DIR)/$(2) '$(call qstrip,$(1))' || \
-	(rm -f $(DL_DIR)/$(2) ; exit 1)
+	($(WGET) -O $(DL_DIR)/$(2).tmp '$(call qstrip,$(1))' && \
+	 mv $(DL_DIR)/$(2).tmp $(DL_DIR)/$(2)) || \
+	(rm -f $(DL_DIR)/$(2).tmp ; exit 1)
 endef
 
 define SOURCE_CHECK_WGET