# class Chef::ChefFS::Config

Helpers to take Chef::Config and create #chef_fs and #local_fs from it

### Attributes

chef_config[R]
cookbook_version[R]
cwd[R]

### Public Class Methods

new(chef_config = Chef::Config, cwd = Dir.pwd, options = {}) click to toggle source

    # File lib/chef/chef_fs/config.rb, line 28
    def initialize(chef_config = Chef::Config, cwd = Dir.pwd, options = {})
      @chef_config = chef_config
      @cwd = cwd
      @cookbook_version = options[:cookbook_version]

      # Default to getting *everything* from the server.
      if !@chef_config[:repo_mode]
        if @chef_config[:chef_server_url] =~ /\/+organizations\/.+/
          @chef_config[:repo_mode] = 'hosted_everything'
        else
          @chef_config[:repo_mode] = 'everything'
        end
      end
    end

### Public Instance Methods

base_path() click to toggle source

The current directory, relative to server root

    # File lib/chef/chef_fs/config.rb, line 112
    def base_path
      @base_path ||= begin
        if @chef_config[:chef_repo_path]
          server_path(File.expand_path(@cwd))
        else
          nil
        end
      end
    end

chef_fs() click to toggle source

    # File lib/chef/chef_fs/config.rb, line 47
    def chef_fs
      @chef_fs ||= create_chef_fs
    end

create_chef_fs() click to toggle source

    # File lib/chef/chef_fs/config.rb, line 51
    def create_chef_fs
      require 'chef/chef_fs/file_system/chef_server_root_dir'
      Chef::ChefFS::FileSystem::ChefServerRootDir.new("remote", @chef_config, :cookbook_version => @cookbook_version)
    end

create_local_fs() click to toggle source

    # File lib/chef/chef_fs/config.rb, line 60
    def create_local_fs
      require 'chef/chef_fs/file_system/chef_repository_file_system_root_dir'
      Chef::ChefFS::FileSystem::ChefRepositoryFileSystemRootDir.new(object_paths)
    end

format_path(entry) click to toggle source

Print the given server path, relative to the current directory

    # File lib/chef/chef_fs/config.rb, line 123
    def format_path(entry)
      server_path = entry.path
      if base_path && server_path[0,base_path.length] == base_path
        if server_path == base_path
          return "."
        elsif server_path[base_path.length,1] == "/"
          return server_path[base_path.length + 1, server_path.length - base_path.length - 1]
        elsif base_path == "/" && server_path[0,1] == "/"
          return server_path[1, server_path.length - 1]
        end
      end
      server_path
    end

local_fs() click to toggle source

    # File lib/chef/chef_fs/config.rb, line 56
    def local_fs
      @local_fs ||= create_local_fs
    end

server_path(file_path) click to toggle source

Returns the given real path’s location relative to the server root.

If chef_repo is /home/jkeiser/chef_repo, and pwd is /home/jkeiser/chef_repo/cookbooks, #server_path(‘blah’) == ‘/cookbooks/blah’ #server_path(‘../roles/blah.json’) == ‘/roles/blah’ #server_path(‘../../readme.txt’) == nil #server_path(‘* ab*’) == ‘/cookbooks/ ab’ #server_path(‘/home/jkeiser/chef_repo/cookbooks/blah’) == ‘/cookbooks/blah’ #server_path(‘/home/*/chef_repo/cookbooks/blah’) == nil

If there are multiple paths (cookbooks, roles, data bags, etc. can all have separate paths), and cwd+the path reaches into one of them, we will return a path relative to that. Otherwise we will return a path to chef_repo.

Globs are allowed as well, but globs outside server paths are NOT (presently) supported. See above examples. TODO support that.

If the path does not reach into ANY specified directory, nil is returned.

    # File lib/chef/chef_fs/config.rb, line 85
    def server_path(file_path)
      pwd = File.expand_path(Dir.pwd)
      absolute_pwd = Chef::ChefFS::PathUtils.realest_path(File.expand_path(file_path, pwd))

      # Check all object paths (cookbooks_dir, data_bags_dir, etc.)
      object_paths.each_pair do |name, paths|
        paths.each do |path|
          realest_path = Chef::ChefFS::PathUtils.realest_path(path)
          if PathUtils.descendant_of?(absolute_pwd, realest_path)
            relative_path = Chef::ChefFS::PathUtils::relative_to(absolute_pwd, realest_path)
            return relative_path == '.' ? "/#{name}" : "/#{name}/#{relative_path}"
          end
        end
      end

      # Check chef_repo_path
      Array(@chef_config[:chef_repo_path]).flatten.each do |chef_repo_path|
        realest_chef_repo_path = Chef::ChefFS::PathUtils.realest_path(chef_repo_path)
        if absolute_pwd == realest_chef_repo_path
          return '/'
        end
      end

      nil
    end