[Buildroot] [PATCH 1/2] Support interrupted downloads

Arnout Vandecappelle (Essensium/Mind) arnout at mind.be
Sun Oct 2 00:28:13 UTC 2011


From: "Arnout Vandecappelle (Essensium/Mind)" <arnout at mind.be>

When a download was interrupted, the partially downloaded file would
still remain and the next download would skip that file.  Now, we
download to a temporary directory DL_TMPDIR and move the file to the
correct place (atomically) once the download has finished.

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout at mind.be>
---
I didn't test this for the bzr backend.
---
 Makefile                    |    6 +++---
 package/Makefile.package.in |   24 +++++++++++++++++-------
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/Makefile b/Makefile
index 8525b7d..c502df7 100644
--- a/Makefile
+++ b/Makefile
@@ -359,7 +359,7 @@ HOST_SOURCE += $(addsuffix -source,$(sort $(TARGETS_HOST_DEPS) $(HOST_DEPS)))
 $(TARGETS_ALL): __real_tgt_%: $(BASE_TARGETS) %
 
 dirs: $(DL_DIR) $(TOOLCHAIN_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) \
-	$(HOST_DIR) $(BR2_DEPENDS_DIR) $(BINARIES_DIR) $(STAMP_DIR)
+	$(HOST_DIR) $(BR2_DEPENDS_DIR) $(BINARIES_DIR) $(STAMP_DIR) $(DL_TMPDIR)
 
 $(BASE_TARGETS): dirs $(O)/toolchainfile.cmake
 
@@ -390,7 +390,7 @@ $(O)/toolchainfile.cmake:
 	$(BASE_TARGETS) $(TARGETS) $(TARGETS_ALL) \
 	$(TARGETS_CLEAN) $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) \
 	$(DL_DIR) $(TOOLCHAIN_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) \
-	$(HOST_DIR) $(BR2_DEPENDS_DIR) $(BINARIES_DIR) $(STAMP_DIR)
+	$(HOST_DIR) $(BR2_DEPENDS_DIR) $(BINARIES_DIR) $(STAMP_DIR) $(DL_TMPDIR)
 
 #############################################################
 #
@@ -398,7 +398,7 @@ $(O)/toolchainfile.cmake:
 # dependencies anywhere else
 #
 #############################################################
-$(DL_DIR) $(TOOLCHAIN_DIR) $(BUILD_DIR) $(HOST_DIR) $(BINARIES_DIR) $(STAMP_DIR):
+$(DL_DIR) $(TOOLCHAIN_DIR) $(BUILD_DIR) $(HOST_DIR) $(BINARIES_DIR) $(STAMP_DIR) $(DL_TMPDIR):
 	@mkdir -p $@
 
 $(STAGING_DIR):
diff --git a/package/Makefile.package.in b/package/Makefile.package.in
index 6f543cc..6f23989 100644
--- a/package/Makefile.package.in
+++ b/package/Makefile.package.in
@@ -103,6 +103,7 @@ DL_DIR=$(call qstrip,$(BR2_DL_DIR))
 ifeq ($(DL_DIR),)
 DL_DIR:=$(TOPDIR)/dl
 endif
+DL_TMPDIR=$(DL_DIR)/partial
 
 ################################################################################
 # The DOWNLOAD_{GIT,SVN,BZR,LOCALFILES} helpers are in charge of getting a
@@ -124,11 +125,13 @@ endif
 
 define DOWNLOAD_GIT
 	test -e $(DL_DIR)/$($(PKG)_SOURCE) || \
-	(pushd $(DL_DIR) > /dev/null && \
+	(pushd $(DL_TMPDIR) > /dev/null && \
+	rm -rf $($(PKG)_DL_DIR) && \
 	$(GIT) clone --bare $($(PKG)_SITE) $($(PKG)_BASE_NAME) && \
 	pushd $($(PKG)_BASE_NAME) > /dev/null && \
 	$(GIT) archive --format=tar --prefix=$($(PKG)_BASE_NAME)/ $($(PKG)_DL_VERSION) | \
-		gzip -c > $(DL_DIR)/$($(PKG)_SOURCE) && \
+		gzip -c > $(DL_TMPDIR)/$($(PKG)_SOURCE) && \
+	mv $(DL_TMPDIR)/$($(PKG)_SOURCE) $(DL_DIR)/$($(PKG)_SOURCE) && \
 	popd > /dev/null && \
 	rm -rf $($(PKG)_DL_DIR) && \
 	popd > /dev/null)
@@ -147,7 +150,8 @@ endef
 
 define DOWNLOAD_BZR
 	test -e $(DL_DIR)/$($(PKG)_SOURCE) || \
-	$(BZR) export $(DL_DIR)/$($(PKG)_SOURCE) $($(PKG)_SITE) -r $($(PKG)_DL_VERSION)
+	($(BZR) export $(DL_TMPDIR)/$($(PKG)_SOURCE) $($(PKG)_SITE) -r $($(PKG)_DL_VERSION) && \
+	mv $(DL_TMPDIR)/$($(PKG)_SOURCE) $(DL_DIR)/$($(PKG)_SOURCE)) 
 endef
 
 define SOURCE_CHECK_BZR
@@ -161,9 +165,11 @@ endef
 
 define DOWNLOAD_SVN
 	test -e $(DL_DIR)/$($(PKG)_SOURCE) || \
-	(pushd $(DL_DIR) > /dev/null && \
+	(pushd $(DL_TMPDIR) > /dev/null && \
+	rm -rf $($(PKG)_DL_DIR) && \
 	$(SVN) export -r $($(PKG)_DL_VERSION) $($(PKG)_SITE) $($(PKG)_DL_DIR) && \
 	$(TAR) czf $($(PKG)_SOURCE) $($(PKG)_BASE_NAME)/ && \
+	mv $(DL_TMPDIR)/$($(PKG)_SOURCE) $(DL_DIR)/$($(PKG)_SOURCE) && \
 	rm -rf $($(PKG)_DL_DIR) && \
 	popd > /dev/null)
 endef
@@ -179,7 +185,9 @@ endef
 
 define DOWNLOAD_WGET
 	test -e $(DL_DIR)/$(2) || \
-	$(WGET) -P $(DL_DIR) $(call qstrip,$(1))/$(2)
+	($(RM) $(DL_TMPDIR)/$($(PKG)_SOURCE); \
+	$(WGET) -P $(DL_TMPDIR) $(call qstrip,$(1))/$(2) && \
+	mv $(DL_TMPDIR)/$($(PKG)_SOURCE) $(DL_DIR)/$($(PKG)_SOURCE)) 
 endef
 
 define SOURCE_CHECK_WGET
@@ -192,7 +200,9 @@ endef
 
 define DOWNLOAD_LOCALFILES
 	test -e $(DL_DIR)/$($(PKG)_SOURCE) || \
-		$(LOCALFILES) $(call qstrip,$(subst file://,,$($(PKG)_SITE)))/$($(PKG)_SOURCE) $(DL_DIR)
+		($(RM) -r $(DL_TMPDIR)/$($(PKG)_SOURCE); \
+		$(LOCALFILES) $(call qstrip,$(subst file://,,$($(PKG)_SITE)))/$($(PKG)_SOURCE) $(DL_TMPDIR) && \
+		mv $(DL_TMPDIR)/$($(PKG)_SOURCE) $(DL_DIR)/$($(PKG)_SOURCE)) 
 endef
 
 define SOURCE_CHECK_LOCALFILES
@@ -433,7 +443,7 @@ else
 endif
 
 $(2)_BASE_NAME	=  $(1)-$$($(2)_VERSION)
-$(2)_DL_DIR	=  $$(DL_DIR)/$$($(2)_BASE_NAME)
+$(2)_DL_DIR	=  $$(DL_TMPDIR)/$$($(2)_BASE_NAME)
 $(2)_DIR	=  $$(BUILD_DIR)/$$($(2)_BASE_NAME)
 
 ifneq ($$($(2)_OVERRIDE_SRCDIR),)
-- 
1.7.6.3



More information about the buildroot mailing list