kernel/v2: support the preserve_order option (documented)
This commit is contained in:
parent
8603aeb2b9
commit
2cc56119b7
|
@ -109,20 +109,25 @@ module VagrantPlugins
|
||||||
# Merge provisioners. First we deal with overrides and making
|
# Merge provisioners. First we deal with overrides and making
|
||||||
# sure the ordering is good there. Then we merge them.
|
# sure the ordering is good there. Then we merge them.
|
||||||
new_provs = []
|
new_provs = []
|
||||||
|
other_provs = other.provisioners.dup
|
||||||
@provisioners.each do |p|
|
@provisioners.each do |p|
|
||||||
if p.id
|
if p.id
|
||||||
other_p = other.provisioners.find { |o| p.id == o.id }
|
other_p = other_provs.find { |o| p.id == o.id }
|
||||||
if other_p
|
if other_p
|
||||||
# There is an override. Take it.
|
# There is an override. Take it.
|
||||||
other_p.config = p.config.merge(other_p.config)
|
other_p.config = p.config.merge(other_p.config)
|
||||||
next
|
next if !other_p.preserve_order
|
||||||
|
|
||||||
|
# We're preserving order, delete from other
|
||||||
|
p = other_p
|
||||||
|
other_provs.delete(other_p)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# There is an override, merge it into the
|
# There is an override, merge it into the
|
||||||
new_provs << p.dup
|
new_provs << p.dup
|
||||||
end
|
end
|
||||||
other.provisioners.each do |p|
|
other_provs.each do |p|
|
||||||
new_provs << p.dup
|
new_provs << p.dup
|
||||||
end
|
end
|
||||||
result.instance_variable_set(:@provisioners, new_provs)
|
result.instance_variable_set(:@provisioners, new_provs)
|
||||||
|
@ -254,6 +259,7 @@ module VagrantPlugins
|
||||||
@provisioners << prov
|
@provisioners << prov
|
||||||
end
|
end
|
||||||
|
|
||||||
|
prov.preserve_order = !!options[:preserve_order]
|
||||||
prov.add_config(options, &block)
|
prov.add_config(options, &block)
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -20,6 +20,12 @@ module VagrantPlugins
|
||||||
# @return [Object]
|
# @return [Object]
|
||||||
attr_accessor :config
|
attr_accessor :config
|
||||||
|
|
||||||
|
# Whether or not to preserve the order when merging this with a
|
||||||
|
# parent scope.
|
||||||
|
#
|
||||||
|
# @return [Boolean]
|
||||||
|
attr_accessor :preserve_order
|
||||||
|
|
||||||
def initialize(id, name)
|
def initialize(id, name)
|
||||||
@logger = Log4r::Logger.new("vagrant::config::vm::provisioner")
|
@logger = Log4r::Logger.new("vagrant::config::vm::provisioner")
|
||||||
@logger.debug("Provisioner defined: #{name}")
|
@logger.debug("Provisioner defined: #{name}")
|
||||||
|
@ -28,6 +34,7 @@ module VagrantPlugins
|
||||||
@id = id
|
@id = id
|
||||||
@invalid = false
|
@invalid = false
|
||||||
@name = name
|
@name = name
|
||||||
|
@preserve_order = false
|
||||||
|
|
||||||
# Attempt to find the provisioner...
|
# Attempt to find the provisioner...
|
||||||
if !Vagrant.plugin("2").manager.provisioners[name]
|
if !Vagrant.plugin("2").manager.provisioners[name]
|
||||||
|
|
|
@ -74,6 +74,28 @@ describe VagrantPlugins::Kernel_V2::VMConfig do
|
||||||
expect(merged_provs[2].config.inline).
|
expect(merged_provs[2].config.inline).
|
||||||
to eq("foo-overload")
|
to eq("foo-overload")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "can preserve order for overrides" do
|
||||||
|
subject.provision("shell", inline: "foo", id: "original")
|
||||||
|
subject.provision("shell", inline: "other", id: "other")
|
||||||
|
|
||||||
|
other = described_class.new
|
||||||
|
other.provision("shell", inline: "bar")
|
||||||
|
other.provision(
|
||||||
|
"shell", inline: "foo-overload", id: "original",
|
||||||
|
preserve_order: true)
|
||||||
|
|
||||||
|
merged = subject.merge(other)
|
||||||
|
merged_provs = merged.provisioners
|
||||||
|
|
||||||
|
expect(merged_provs.length).to eql(3)
|
||||||
|
expect(merged_provs[0].config.inline).
|
||||||
|
to eq("foo-overload")
|
||||||
|
expect(merged_provs[1].config.inline).
|
||||||
|
to eq("other")
|
||||||
|
expect(merged_provs[2].config.inline).
|
||||||
|
to eq("bar")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue