@@ -54,6 +54,8 @@ def initialize(cask, command: SystemCommand, force: false, adopt: false,
5454 @quiet = quiet
5555 @download_queue = download_queue
5656 @defer_fetch = defer_fetch
57+ @source_download = T . let ( nil , T . nilable ( Homebrew ::API ::SourceDownload ) )
58+ @ran_prelude_fetch = T . let ( false , T ::Boolean )
5759 @ran_prelude = T . let ( false , T ::Boolean )
5860 @cask_and_formula_dependencies = T . let ( nil , T . nilable ( T ::Array [ T . any ( Formula , ::Cask ::Cask ) ] ) )
5961 end
@@ -901,13 +903,7 @@ def forbidden_cask_artifacts_check
901903 def prelude
902904 return if @ran_prelude
903905
904- check_deprecate_disable
905- check_conflicts
906- check_requirements
907- # Run the cask-self forbidden checks before loading the caskfile from the
908- # Source API so a forbidden cask never triggers a network fetch.
909- forbidden_tap_check ( cask_only : true )
910- forbidden_cask_and_formula_check ( cask_only : true )
906+ check_prelude_requirements unless @ran_prelude_fetch
911907 load_cask_from_source_api! if cask_from_source_api?
912908 forbidden_tap_check
913909 forbidden_cask_and_formula_check
@@ -916,26 +912,73 @@ def prelude
916912 @ran_prelude = true
917913 end
918914
915+ sig { returns ( T ::Boolean ) }
916+ def source_download_requires_pre_fetch?
917+ cask_from_source_api? && @cask . languages . any?
918+ end
919+
920+ sig { params ( download_queue : Homebrew ::DownloadQueue ) . void }
921+ def prelude_fetch ( download_queue : @download_queue )
922+ return unless ( download = prelude_fetch_download )
923+
924+ download_queue . enqueue ( download )
925+ end
926+
927+ sig { returns ( T . nilable ( Homebrew ::API ::SourceDownload ) ) }
928+ def prelude_fetch_download
929+ return if @ran_prelude_fetch
930+
931+ check_prelude_requirements
932+ @ran_prelude_fetch = true
933+ return unless source_download_requires_pre_fetch?
934+
935+ if source_download . downloaded?
936+ source_download . verify_download_integrity ( source_download . cached_download )
937+ source_download . downloader . create_symlink_to_cached_download ( source_download . cached_download )
938+ return
939+ end
940+
941+ source_download
942+ end
943+
919944 sig { void }
920945 def enqueue_downloads
921946 download_queue = @download_queue
922- check_requirements
947+ prelude_fetch ( download_queue : ) unless @ran_prelude_fetch
923948
924949 # FIXME: We need to load Cask source before enqueuing to support
925950 # language-specific URLs, but this will block the main process.
926- if cask_from_source_api?
927- if @cask . languages . any?
928- load_cask_from_source_api!
929- else
930- Homebrew ::API ::Cask . source_download ( @cask , download_queue :, enqueue : true )
931- end
951+ if source_download_requires_pre_fetch?
952+ load_cask_from_source_api!
953+ elsif cask_from_source_api?
954+ Homebrew ::API ::Cask . source_download ( @cask , download_queue :, enqueue : true )
932955 end
933956
957+ forbidden_tap_check
958+ forbidden_cask_and_formula_check
959+ forbidden_cask_artifacts_check
960+
934961 download_queue . enqueue ( downloader )
935962 end
936963
937964 private
938965
966+ sig { void }
967+ def check_prelude_requirements
968+ check_deprecate_disable
969+ check_conflicts
970+ check_requirements
971+ # Run the cask-self forbidden checks before loading the caskfile from the
972+ # Source API so a forbidden cask never triggers a network fetch.
973+ forbidden_tap_check ( cask_only : true )
974+ forbidden_cask_and_formula_check ( cask_only : true )
975+ end
976+
977+ sig { returns ( Homebrew ::API ::SourceDownload ) }
978+ def source_download
979+ @source_download ||= Homebrew ::API ::Cask . source_download_for ( @cask )
980+ end
981+
939982 # load the same cask file that was used for installation, if possible
940983 sig { void }
941984 def load_installed_caskfile!
0 commit comments