Browse Source

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.
Timothy Flynn 1 year ago
parent
commit
2f4e2436e8
1 changed files with 5 additions and 2 deletions
  1. 5 2
      Meta/CMake/utils.cmake

+ 5 - 2
Meta/CMake/utils.cmake

@@ -210,20 +210,23 @@ function(download_file_multisource urls path)
         if (NOT ENABLE_NETWORK_DOWNLOADS)
         if (NOT ENABLE_NETWORK_DOWNLOADS)
             message(FATAL_ERROR "${path} does not exist, and unable to download it")
             message(FATAL_ERROR "${path} does not exist, and unable to download it")
         endif()
         endif()
+
         get_filename_component(file "${path}" NAME)
         get_filename_component(file "${path}" NAME)
+        set(tmp_path "${path}.tmp")
 
 
         foreach(url ${urls})
         foreach(url ${urls})
             message(STATUS "Downloading file ${file} from ${url}")
             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 0 status_code)
             list(GET download_result 1 error_message)
             list(GET download_result 1 error_message)
 
 
             if (status_code EQUAL 0)
             if (status_code EQUAL 0)
+                file(RENAME "${tmp_path}" "${path}")
                 break()
                 break()
             endif()
             endif()
 
 
-            file(REMOVE "${path}")
+            file(REMOVE "${tmp_path}")
             message(WARNING "Failed to download ${url}: ${error_message}")
             message(WARNING "Failed to download ${url}: ${error_message}")
         endforeach()
         endforeach()