Avoid multiple downloads of postgresql and openssl sources

This happened in rake gem:windows because the downloads are defined as a rake task for each platform.
So the download was appended to the download task for every platform.
Now the download block is processed only once.

The code is borrowed from here:
b3dcbf69f1/lib/ruby_installer/build/utils.rb (L104-L144)
This commit is contained in:
Lars Kanis 2022-02-22 21:27:49 +01:00
parent 82c67b8291
commit e8db449c80
2 changed files with 48 additions and 0 deletions

View File

@ -7,6 +7,7 @@ require 'rake/clean'
require 'rake/extensiontask'
require 'rake/extensioncompiler'
require 'ostruct'
require_relative 'rakelib/task_extension'
MISCDIR = BASEDIR + 'misc'
@ -20,6 +21,7 @@ end
class CrossLibrary < OpenStruct
include Rake::DSL
prepend TaskExtension
def initialize(for_platform, openssl_config, toolchain)
super()

46
rakelib/task_extension.rb Normal file
View File

@ -0,0 +1,46 @@
# This source code is borrowed from:
# https://github.com/oneclick/rubyinstaller2/blob/b3dcbf69f131e44c78ea3a1c5e0041c223f266ce/lib/ruby_installer/build/utils.rb#L104-L144
module TaskExtension
# Extend rake's file task to be defined only once and to check the expected file is indeed generated
#
# The same as #task, but for #file.
# In addition this file task raises an error, if the file that is expected to be generated is not present after the block was executed.
def file(name, *args, &block)
task_once(name, block) do
super(name, *args) do |ta|
block.call(ta).tap do
raise "file #{ta.name} is missing after task executed" unless File.exist?(ta.name)
end
end
end
end
# Extend rake's task definition to be defined only once, even if called several times
#
# This allows to define common tasks next to specific tasks.
# It is expected that any variation of the task's block is reflected in the task name or namespace.
# If the task name is identical, the task block is executed only once, even if the file task definition is executed twice.
def task(name, *args, &block)
task_once(name, block) do
super
end
end
private def task_once(name, block)
name = name.keys.first if name.is_a?(Hash)
if block &&
Rake::Task.task_defined?(name) &&
Rake::Task[name].instance_variable_get('@task_block_location') == block.source_location
# task is already defined for this target and the same block
# So skip double definition of the same action
Rake::Task[name]
elsif block
yield.tap do
Rake::Task[name].instance_variable_set('@task_block_location', block.source_location)
end
else
yield
end
end
end