summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanielsdeleo <dan@chef.io>2016-02-09 16:18:00 -0800
committerdanielsdeleo <dan@chef.io>2016-02-16 15:26:43 -0800
commitecc6b9a524544aa9385eb742b968632c7e11460a (patch)
tree98d80993232b733b54a9b115b1edd6188479e448
parent9b64078d1012443a146080a5197303bb9cbb2baa (diff)
downloadchef-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.rb54
-rw-r--r--lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbooks_dir.rb117
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