From 2f4e2436e8d708da9854f4cf902d3f9b6af74b4c Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 23 May 2024 12:08:24 -0400 Subject: [PATCH] Meta: Download files at configure time a bit more atomically Download files to a temporary location, then only move the downloaded file to the real location once the download is complete. This prevents CMake from being confused about partially-downloaded files, e.g. if someone presses ctrl+c in the middle of a download. Note the GN build already behaves this way. --- Meta/CMake/utils.cmake | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Meta/CMake/utils.cmake b/Meta/CMake/utils.cmake index 42647ffd7ee..cc224bd3681 100644 --- a/Meta/CMake/utils.cmake +++ b/Meta/CMake/utils.cmake @@ -210,20 +210,23 @@ function(download_file_multisource urls path) if (NOT ENABLE_NETWORK_DOWNLOADS) message(FATAL_ERROR "${path} does not exist, and unable to download it") endif() + get_filename_component(file "${path}" NAME) + set(tmp_path "${path}.tmp") foreach(url ${urls}) message(STATUS "Downloading file ${file} from ${url}") - file(DOWNLOAD "${url}" "${path}" INACTIVITY_TIMEOUT 10 STATUS download_result ${DOWNLOAD_SHA256}) + file(DOWNLOAD "${url}" "${tmp_path}" INACTIVITY_TIMEOUT 10 STATUS download_result ${DOWNLOAD_SHA256}) list(GET download_result 0 status_code) list(GET download_result 1 error_message) if (status_code EQUAL 0) + file(RENAME "${tmp_path}" "${path}") break() endif() - file(REMOVE "${path}") + file(REMOVE "${tmp_path}") message(WARNING "Failed to download ${url}: ${error_message}") endforeach()