diff options
Diffstat (limited to 'lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb')
-rw-r--r-- | lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb | 63 |
1 files changed, 35 insertions, 28 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 1b640bc076..0bb1ba1cac 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 @@ -1,6 +1,6 @@ # # Author:: John Keiser (<jkeiser@chef.io>) -# Copyright:: Copyright 2013-2016, Chef Software Inc. +# Copyright:: Copyright (c) Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,11 +16,12 @@ # limitations under the License. # -require "chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry" -require "chef/chef_fs/file_system/chef_server/cookbook_dir" -require "chef/chef_fs/file_system/chef_server/versioned_cookbook_dir" -require "chef/chef_fs/file_system/exceptions" -require "chef/cookbook/cookbook_version_loader" +require_relative "chef_repository_file_system_cookbook_entry" +require_relative "../chef_server/cookbook_dir" +require_relative "../chef_server/versioned_cookbook_dir" +require_relative "../exceptions" +require_relative "../../../cookbook/cookbook_version_loader" +require_relative "../../../cookbook/chefignore" class Chef module ChefFS @@ -30,10 +31,16 @@ class Chef # Represents ROOT/cookbooks/:cookbook class ChefRepositoryFileSystemCookbookDir < ChefRepositoryFileSystemCookbookEntry - # API Required by Respository::Directory + # API Required by Repository::Directory + def chefignore + @chefignore ||= Chef::Cookbook::Chefignore.new(file_path) + rescue Errno::EISDIR, Errno::EACCES + # Work around a bug in Chefignore when chefignore is a directory + end def fs_entry_valid? return false unless File.directory?(file_path) && name_valid? + if can_upload? true else @@ -54,6 +61,7 @@ class Chef if exists? raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, self) end + begin Dir.mkdir(file_path) rescue Errno::EEXIST @@ -64,11 +72,11 @@ class Chef 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 }) + 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) + unless File.exist?(file_path) FileUtils.mkdir_p(file_path) end uploaded_cookbook_version_path = File.join(file_path, Chef::Cookbook::CookbookVersionLoader::UPLOADED_COOKBOOK_VERSION_FILE) @@ -80,18 +88,16 @@ class Chef # Customizations of base class def chef_object - begin - cb = cookbook_version - if !cb - Chef::Log.error("Cookbook #{file_path} empty.") - raise "Cookbook #{file_path} empty." - end - cb - rescue => e - Chef::Log.error("Could not read #{path_for_printing} into a Chef object: #{e}") - Chef::Log.error(e.backtrace.join("\n")) - raise + cb = cookbook_version + unless cb + Chef::Log.error("Cookbook #{file_path} empty.") + raise "Cookbook #{file_path} empty." end + cb + rescue => e + Chef::Log.error("Could not read #{path_for_printing} into a Chef object: #{e}") + Chef::Log.error(e.backtrace.join("\n")) + raise end def children @@ -99,12 +105,13 @@ class Chef end def can_have_child?(name, is_dir) - if is_dir + if is_dir && !%w{ root_files .. . }.include?(name) # Only the given directories will be uploaded. - return Chef::ChefFS::FileSystem::ChefServer::CookbookDir::COOKBOOK_SEGMENT_INFO.keys.include?(name.to_sym) && name != "root_files" + return true elsif name == Chef::Cookbook::CookbookVersionLoader::UPLOADED_COOKBOOK_VERSION_FILE return false end + super(name, is_dir) end @@ -112,7 +119,8 @@ class Chef def self.canonical_cookbook_name(entry_name) name_match = Chef::ChefFS::FileSystem::ChefServer::VersionedCookbookDir::VALID_VERSIONED_COOKBOOK_NAME.match(entry_name) return nil if name_match.nil? - return name_match[1] + + name_match[1] end def canonical_cookbook_name(entry_name) @@ -124,19 +132,18 @@ class Chef end def can_upload? - File.exists?(uploaded_cookbook_version_path) || children.size > 0 + File.exist?(uploaded_cookbook_version_path) || children.size > 0 end protected def make_child_entry(child_name) - segment_info = Chef::ChefFS::FileSystem::ChefServer::CookbookDir::COOKBOOK_SEGMENT_INFO[child_name.to_sym] || {} - ChefRepositoryFileSystemCookbookEntry.new(child_name, self, nil, segment_info[:ruby_only], segment_info[:recursive]) + ChefRepositoryFileSystemCookbookEntry.new(child_name, self, nil, false, true) end def cookbook_version - loader = Chef::Cookbook::CookbookVersionLoader.new(file_path, parent.chefignore) - loader.load_cookbooks + loader = Chef::Cookbook::CookbookVersionLoader.new(file_path, chefignore) + loader.load! loader.cookbook_version end end |