Add devel to the DSL, + stable and bottle blocks
This commit adds a `devel` entry to the DSL, allowing formulae to specify an unstable branch. `devel` takes a block, which should contain standard `url` and `md5` fields (and `version`, if necessary). This must come after the standard DSL fields. This commit also migrates over all formulae currently using `devel` to the new syntax, as well as formulae which used `head` for non-VCS urls. The new syntax is also available for `stable` and `bottle`. `stable` is an option alongside the old syntax. `bottle` replaces the old syntax. Note that the @stable ivar in Formula has been renamed to @standard, and the @bottle ivar has been renamed to @bottle_url. Closes Homebrew/homebrew#9735. Signed-off-by: Misty De Meo <mistydemeo@gmail.com>
This commit is contained in:
parent
b3092ea3f7
commit
d121bcdada
@ -290,7 +290,7 @@ module Homebrew extend self
|
|||||||
ff.each do |f|
|
ff.each do |f|
|
||||||
problems = []
|
problems = []
|
||||||
|
|
||||||
if f.unstable and f.stable.nil?
|
if f.unstable and f.standard.nil?
|
||||||
problems += [' * head-only formula']
|
problems += [' * head-only formula']
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -314,6 +314,12 @@ module Homebrew extend self
|
|||||||
|
|
||||||
problems += [' * invalid or missing version'] if f.version.to_s.empty?
|
problems += [' * invalid or missing version'] if f.version.to_s.empty?
|
||||||
|
|
||||||
|
problems << " * 'devel' block found before stable 'url'" if text =~ /devel.+(url '.+').+(url '.+')/m
|
||||||
|
|
||||||
|
problems << " * 'devel' block found before 'head'" if text =~ /devel.+(head '.+')/m
|
||||||
|
|
||||||
|
problems << " * Empty 'devel' block found" if text =~ /devel do\s+end/
|
||||||
|
|
||||||
# Don't try remaining audits on text in __END__
|
# Don't try remaining audits on text in __END__
|
||||||
text_without_patch = (text.split("__END__")[0]).strip()
|
text_without_patch = (text.split("__END__")[0]).strip()
|
||||||
|
|
||||||
|
|||||||
@ -89,7 +89,7 @@ module Homebrew extend self
|
|||||||
next if f.installed? unless ARGV.force?
|
next if f.installed? unless ARGV.force?
|
||||||
|
|
||||||
# Building head-only without --HEAD is an error
|
# Building head-only without --HEAD is an error
|
||||||
if not ARGV.build_head? and f.stable.nil?
|
if not ARGV.build_head? and f.standard.nil?
|
||||||
raise "This is a head-only formula; install with `brew install --HEAD #{f.name}`"
|
raise "This is a head-only formula; install with `brew install --HEAD #{f.name}`"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -100,19 +100,19 @@ class Formula
|
|||||||
include FileUtils
|
include FileUtils
|
||||||
|
|
||||||
attr_reader :name, :path, :url, :version, :homepage, :specs, :downloader
|
attr_reader :name, :path, :url, :version, :homepage, :specs, :downloader
|
||||||
attr_reader :stable, :unstable
|
attr_reader :standard, :unstable
|
||||||
attr_reader :bottle, :bottle_sha1, :head
|
attr_reader :bottle_url, :bottle_sha1, :head
|
||||||
|
|
||||||
# Homebrew determines the name
|
# Homebrew determines the name
|
||||||
def initialize name='__UNKNOWN__', path=nil
|
def initialize name='__UNKNOWN__', path=nil
|
||||||
set_instance_variable 'homepage'
|
set_instance_variable 'homepage'
|
||||||
set_instance_variable 'url'
|
set_instance_variable 'url'
|
||||||
set_instance_variable 'bottle'
|
set_instance_variable 'bottle_url'
|
||||||
set_instance_variable 'bottle_sha1'
|
set_instance_variable 'bottle_sha1'
|
||||||
set_instance_variable 'head'
|
set_instance_variable 'head'
|
||||||
set_instance_variable 'specs'
|
set_instance_variable 'specs'
|
||||||
|
|
||||||
set_instance_variable 'stable'
|
set_instance_variable 'standard'
|
||||||
set_instance_variable 'unstable'
|
set_instance_variable 'unstable'
|
||||||
|
|
||||||
if @head and (not @url or ARGV.build_head?)
|
if @head and (not @url or ARGV.build_head?)
|
||||||
@ -120,10 +120,10 @@ class Formula
|
|||||||
@version = 'HEAD'
|
@version = 'HEAD'
|
||||||
@spec_to_use = @unstable
|
@spec_to_use = @unstable
|
||||||
else
|
else
|
||||||
if @stable.nil?
|
if @standard.nil?
|
||||||
@spec_to_use = SoftwareSpecification.new(@url, @specs)
|
@spec_to_use = SoftwareSpecification.new(@url, @specs)
|
||||||
else
|
else
|
||||||
@spec_to_use = @stable
|
@spec_to_use = @standard
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -583,7 +583,7 @@ private
|
|||||||
downloader = @downloader
|
downloader = @downloader
|
||||||
# Don't attempt mirrors if this install is not pointed at a "stable" URL.
|
# Don't attempt mirrors if this install is not pointed at a "stable" URL.
|
||||||
# This can happen when options like `--HEAD` are invoked.
|
# This can happen when options like `--HEAD` are invoked.
|
||||||
mirror_list = @spec_to_use == @stable ? mirrors : []
|
mirror_list = @spec_to_use == @standard ? mirrors : []
|
||||||
|
|
||||||
# Ensure the cache exists
|
# Ensure the cache exists
|
||||||
HOMEBREW_CACHE.mkpath
|
HOMEBREW_CACHE.mkpath
|
||||||
@ -731,7 +731,7 @@ EOF
|
|||||||
|
|
||||||
class << self
|
class << self
|
||||||
# The methods below define the formula DSL.
|
# The methods below define the formula DSL.
|
||||||
attr_reader :stable, :unstable
|
attr_reader :standard, :unstable
|
||||||
|
|
||||||
def self.attr_rw(*attrs)
|
def self.attr_rw(*attrs)
|
||||||
attrs.each do |attr|
|
attrs.each do |attr|
|
||||||
@ -745,7 +745,7 @@ EOF
|
|||||||
|
|
||||||
attr_rw :version, :homepage, :mirrors, :specs, :deps, :external_deps
|
attr_rw :version, :homepage, :mirrors, :specs, :deps, :external_deps
|
||||||
attr_rw :keg_only_reason, :fails_with_llvm_reason, :skip_clean_all
|
attr_rw :keg_only_reason, :fails_with_llvm_reason, :skip_clean_all
|
||||||
attr_rw :bottle, :bottle_sha1
|
attr_rw :bottle_url, :bottle_sha1
|
||||||
attr_rw(*CHECKSUM_TYPES)
|
attr_rw(*CHECKSUM_TYPES)
|
||||||
|
|
||||||
def head val=nil, specs=nil
|
def head val=nil, specs=nil
|
||||||
@ -757,11 +757,35 @@ EOF
|
|||||||
|
|
||||||
def url val=nil, specs=nil
|
def url val=nil, specs=nil
|
||||||
return @url if val.nil?
|
return @url if val.nil?
|
||||||
@stable = SoftwareSpecification.new(val, specs)
|
@standard = SoftwareSpecification.new(val, specs)
|
||||||
@url = val
|
@url = val
|
||||||
@specs = specs
|
@specs = specs
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def stable &block
|
||||||
|
raise "url and md5 must be specified in a block" unless block_given?
|
||||||
|
instance_eval &block unless ARGV.build_devel? or ARGV.build_head?
|
||||||
|
end
|
||||||
|
|
||||||
|
def devel &block
|
||||||
|
raise "url and md5 must be specified in a block" unless block_given?
|
||||||
|
instance_eval &block if ARGV.build_devel?
|
||||||
|
end
|
||||||
|
|
||||||
|
def bottle url=nil, &block
|
||||||
|
if block_given?
|
||||||
|
eval <<-EOCLASS
|
||||||
|
module BottleData
|
||||||
|
def self.url url; @url = url; end
|
||||||
|
def self.sha1 sha1; @sha1 = sha1; end
|
||||||
|
def self.return_data; [@url,@sha1]; end
|
||||||
|
end
|
||||||
|
EOCLASS
|
||||||
|
BottleData.instance_eval &block
|
||||||
|
@bottle_url, @bottle_sha1 = BottleData.return_data
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def mirror val, specs=nil
|
def mirror val, specs=nil
|
||||||
@mirrors ||= []
|
@mirrors ||= []
|
||||||
@mirrors << {:url => val, :specs => specs}
|
@mirrors << {:url => val, :specs => specs}
|
||||||
|
|||||||
@ -15,8 +15,8 @@ class FormulaInstaller
|
|||||||
@f = ff
|
@f = ff
|
||||||
@show_header = true
|
@show_header = true
|
||||||
@ignore_deps = ARGV.include? '--ignore-dependencies' || ARGV.interactive?
|
@ignore_deps = ARGV.include? '--ignore-dependencies' || ARGV.interactive?
|
||||||
@install_bottle = !ff.bottle.nil? && !ARGV.build_from_source? &&
|
@install_bottle = !ff.bottle_url.nil? && !ARGV.build_from_source? &&
|
||||||
Pathname.new(ff.bottle).version == ff.version
|
Pathname.new(ff.bottle_url).version == ff.version
|
||||||
end
|
end
|
||||||
|
|
||||||
def install
|
def install
|
||||||
@ -189,7 +189,7 @@ class FormulaInstaller
|
|||||||
|
|
||||||
def pour
|
def pour
|
||||||
HOMEBREW_CACHE.mkpath
|
HOMEBREW_CACHE.mkpath
|
||||||
downloader = CurlBottleDownloadStrategy.new f.bottle, f.name, f.version, nil
|
downloader = CurlBottleDownloadStrategy.new f.bottle_url, f.name, f.version, nil
|
||||||
downloader.fetch
|
downloader.fetch
|
||||||
f.verify_download_integrity downloader.tarball_path, f.bottle_sha1, "SHA1"
|
f.verify_download_integrity downloader.tarball_path, f.bottle_sha1, "SHA1"
|
||||||
HOMEBREW_CELLAR.cd do
|
HOMEBREW_CELLAR.cd do
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user