diff options
author | danielsdeleo <dan@chef.io> | 2016-02-09 16:18:00 -0800 |
---|---|---|
committer | danielsdeleo <dan@chef.io> | 2016-02-16 15:26:43 -0800 |
commit | ecc6b9a524544aa9385eb742b968632c7e11460a (patch) | |
tree | 98d80993232b733b54a9b115b1edd6188479e448 | |
parent | 9b64078d1012443a146080a5197303bb9cbb2baa (diff) | |
download | chef-ecc6b9a524544aa9385eb742b968632c7e11460a.tar.gz |
Adapt cookbooks dir to Repo::Directory usage
-rw-r--r-- | lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb | 54 | ||||
-rw-r--r-- | lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbooks_dir.rb | 117 |
2 files changed, 60 insertions, 111 deletions
diff --git a/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb b/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb index 4c600d8699..bdcb45f035 100644 --- a/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +++ b/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb @@ -27,7 +27,59 @@ class Chef module ChefFS module FileSystem module Repository + + # Represents ROOT/cookbooks/:cookbook class ChefRepositoryFileSystemCookbookDir < ChefRepositoryFileSystemCookbookEntry + + # API Required by Respository::Directory + + def fs_entry_valid? + return false unless File.directory?(file_path) && name_valid? + if can_upload? + true + else + Chef::Log.warn("Cookbook '#{name}' is empty or entirely chefignored at #{path_for_printing}") + false + end + end + + def name_valid? + !name.start_with?(".") + end + + def dir? + true + end + + def create(file_contents = nil) + if exists? + raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, self) + end + begin + Dir.mkdir(file_path) + rescue Errno::EEXIST + raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, self) + end + end + + def write(cookbook_path, cookbook_version_json, from_fs) + # Use the copy/diff algorithm to copy it down so we don't destroy + # chefignored data. This is terribly un-thread-safe. + Chef::ChefFS::FileSystem.copy_to(Chef::ChefFS::FilePattern.new("/#{cookbook_path}"), from_fs, self, nil, { :purge => true }) + + # Write out .uploaded-cookbook-version.json + # cookbook_file_path = File.join(file_path, cookbook_name) <- this should be the same as self.file_path + if !File.exists?(file_path) + FileUtils.mkdir_p(file_path) + end + uploaded_cookbook_version_path = File.join(file_path, Chef::Cookbook::CookbookVersionLoader::UPLOADED_COOKBOOK_VERSION_FILE) + File.open(uploaded_cookbook_version_path, "w") do |file| + file.write(cookbook_version_json) + end + end + + # Customizations of base class + def chef_object begin cb = cookbook_version @@ -86,7 +138,7 @@ class Chef def cookbook_version loader = Chef::Cookbook::CookbookVersionLoader.new(file_path, parent.chefignore) loader.load_cookbooks - cb = loader.cookbook_version + loader.cookbook_version end end end diff --git a/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbooks_dir.rb b/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbooks_dir.rb index 9ebda1a111..5e9c22741d 100644 --- a/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbooks_dir.rb +++ b/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbooks_dir.rb @@ -16,6 +16,7 @@ # limitations under the License. # +require "chef/chef_fs/file_system/repository/directory" require "chef/chef_fs/file_system/repository/chef_repository_file_system_entry" require "chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir" require "chef/cookbook/chefignore" @@ -25,121 +26,17 @@ class Chef module FileSystem module Repository - class ChefRepositoryFileSystemCookbooksDir + class ChefRepositoryFileSystemCookbooksDir < Repository::Directory - attr_reader :name - attr_reader :parent - attr_reader :path - attr_reader :chefignore - attr_reader :file_path - - def initialize(name, parent, file_path) - @parent = parent - @name = name - @path = Chef::ChefFS::PathUtils::join(parent.path, name) - @file_path = file_path || "#{parent.file_path}/#{name}" - #@data_handler = nil - begin - @chefignore = Chef::Cookbook::Chefignore.new(self.file_path) - rescue Errno::EISDIR - rescue Errno::EACCES - # Work around a bug in Chefignore when chefignore is a directory - end - end - - def children - begin - cookbooks = Dir.entries(file_path).sort. - map { |child_name| make_child_entry(child_name) }. - select { |child| child && can_have_child?(child.name, child.dir?) } - # empty cookbooks and cookbook directories are ignored - cookbooks.select do |entry| - if !entry.can_upload? - Chef::Log.warn("Cookbook '#{entry.name}' is empty or entirely chefignored at #{entry.path_for_printing}") - false - else - true - end - end - rescue Errno::ENOENT - raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!) - end - end - - def can_have_child?(name, is_dir) - is_dir && !name.start_with?(".") + def chefignore + @chefignore ||= Chef::Cookbook::Chefignore.new(self.file_path) + rescue Errno::EISDIR, Errno::EACCES + # Work around a bug in Chefignore when chefignore is a directory end def write_cookbook(cookbook_path, cookbook_version_json, from_fs) cookbook_name = File.basename(cookbook_path) - child = make_child_entry(cookbook_name) - - # Use the copy/diff algorithm to copy it down so we don't destroy - # chefignored data. This is terribly un-thread-safe. - Chef::ChefFS::FileSystem.copy_to(Chef::ChefFS::FilePattern.new("/#{cookbook_path}"), from_fs, child, nil, { :purge => true }) - - # Write out .uploaded-cookbook-version.json - cookbook_file_path = File.join(file_path, cookbook_name) - if !File.exists?(cookbook_file_path) - FileUtils.mkdir_p(cookbook_file_path) - end - uploaded_cookbook_version_path = File.join(cookbook_file_path, Chef::Cookbook::CookbookVersionLoader::UPLOADED_COOKBOOK_VERSION_FILE) - File.open(uploaded_cookbook_version_path, "w") do |file| - file.write(cookbook_version_json) - end - end - - # no data handler used here. - ## def data_handler - ## @data_handler || parent.data_handler - ## end - - def path_for_printing - file_path - end - - def create_child(child_name, file_contents = nil) - child = make_child_entry(child_name) - if child.exists? - raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, child) - end - begin - Dir.mkdir(child.file_path) - rescue Errno::EEXIST - raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, child) - end - child - end - - def delete(recurse) - if exists? - if !recurse - raise MustDeleteRecursivelyError.new(self, $!) - end - FileUtils.rm_r(file_path) - else - raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!) - end - end - - def exists? - File.exists?(file_path) # && (parent.nil? || parent.can_have_child?(name, dir?)) - end - - # An empty children array is an empty dir - def empty? - children.empty? - end - - def child(name) - if can_have_child?(name, true) || can_have_child?(name, false) - result = make_child_entry(name) - end - result || NonexistentFSObject.new(name, self) - end - - def root - parent.root + make_child_entry(cookbook_name).write(cookbook_path, cookbook_version_json, from_fs) end protected |