Skip to content

Commit

Permalink
Meta: Download files at configure time a bit more atomically
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
trflynn89 committed May 24, 2024
1 parent ec63f44 commit 2f4e243
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions Meta/CMake/utils.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down

0 comments on commit 2f4e243

Please sign in to comment.