Check for package files before any exports or anything [GH-597]

This commit is contained in:
Mitchell Hashimoto 2011-12-26 18:48:38 -08:00
parent 6a1864011d
commit fbe984b32d
4 changed files with 67 additions and 27 deletions

View File

@ -52,6 +52,7 @@ module Vagrant
autoload :ProvisionerCleanup, 'vagrant/action/vm/provisioner_cleanup' autoload :ProvisionerCleanup, 'vagrant/action/vm/provisioner_cleanup'
autoload :Resume, 'vagrant/action/vm/resume' autoload :Resume, 'vagrant/action/vm/resume'
autoload :ShareFolders, 'vagrant/action/vm/share_folders' autoload :ShareFolders, 'vagrant/action/vm/share_folders'
autoload :SetupPackageFiles, 'vagrant/action/vm/setup_package_files'
autoload :Suspend, 'vagrant/action/vm/suspend' autoload :Suspend, 'vagrant/action/vm/suspend'
end end
end end

View File

@ -106,6 +106,7 @@ module Vagrant
registry.register(:package) do registry.register(:package) do
Builder.new do Builder.new do
use General::Validate use General::Validate
use VM::SetupPackageFiles
use VM::CheckAccessible use VM::CheckAccessible
use registry.get(:halt) use registry.get(:halt)
use VM::ClearForwardedPorts use VM::ClearForwardedPorts

View File

@ -19,19 +19,15 @@ module Vagrant
def initialize(app, env) def initialize(app, env)
@app = app @app = app
@env = env
@env["package.output"] ||= env["global_config"].package.name env["package.files"] ||= {}
@env["package.include"] ||= [] env["package.output"] ||= env["global_config"].package.name
@env["package.vagrantfile"] ||= nil
end end
def call(env) def call(env)
@env = env @env = env
raise Errors::PackageOutputExists if File.exist?(tar_path) raise Errors::PackageOutputExists if File.exist?(tar_path)
raise Errors::PackageRequiresDirectory if !@env["package.directory"] || !File.directory?(@env["package.directory"])
verify_files_to_copy
compress compress
@app.call(env) @app.call(env)
@ -46,30 +42,11 @@ module Vagrant
end end
end end
def files_to_copy
package_dir = Pathname.new(@env["package.directory"]).join("include")
files = @env["package.include"].inject({}) do |acc, file|
source = Pathname.new(file)
acc[file] = source.relative? ? package_dir.join(source) : package_dir.join(source.basename)
acc
end
files[@env["package.vagrantfile"]] = package_dir.join("_Vagrantfile") if @env["package.vagrantfile"]
files
end
def verify_files_to_copy
files_to_copy.each do |file, _|
raise Errors::PackageIncludeMissing, :file => file if !File.exist?(file)
end
end
# This method copies the include files (passed in via command line) # This method copies the include files (passed in via command line)
# to the temporary directory so they are included in a sub-folder within # to the temporary directory so they are included in a sub-folder within
# the actual box # the actual box
def copy_include_files def copy_include_files
files_to_copy.each do |from, to| env["package.files"].each do |from, to|
@env[:ui].info I18n.t("vagrant.actions.general.package.packaging", :file => from) @env[:ui].info I18n.t("vagrant.actions.general.package.packaging", :file => from)
FileUtils.mkdir_p(to.parent) FileUtils.mkdir_p(to.parent)

View File

@ -0,0 +1,61 @@
require 'pathname'
module Vagrant
module Action
module VM
# Sets up the mapping of files to copy into the package and verifies
# that the files can be properly copied.
class SetupPackageFiles
def initialize(app, env)
@app = app
env["package.include"] ||= []
env["package.vagrantfile"] ||= nil
end
def call(env)
raise Errors::PackageRequiresDirectory if !env["package.directory"] ||
!File.directory?(env["package.directory"])
# Create a pathname to the directory that will store the files
# we wish to include with the box.
include_directory = Pathname.new(env["package.directory"]).join("include")
files = {}
env["package.include"].each do |file|
source = Pathname.new(file)
dest = nil
# If the source is relative then we add the file as-is to the include
# directory. Otherwise, we copy only the file into the root of the
# include directory. Kind of strange, but seems to match what people
# expect based on history.
if source.relative?
dest = include_directory.join(source)
else
dest = include_directory.join(source.basename)
end
# Assign the mapping
files[file] = dest
end
if env["package.vagrantfile"]
# Vagrantfiles are treated special and mapped to a specific file
files[env["package.vagrantfile"]] = include_directory.join("_Vagrantfile")
end
# Verify the mapping
files.each do |from, _|
raise Errors::PackageIncludeMissing, :file => from if !File.exist?(from)
end
# Save the mapping
env["package.files"] = files
@app.call(env)
end
end
end
end
end