# class Chef::Knife::List

### Attributes

exit_code[RW]

### Public Instance Methods

add_dir_result(result) click to toggle source

    # File lib/chef/knife/list.rb, line 101
    def add_dir_result(result)
      begin
        children = result.children.sort_by { |child| child.name }
      rescue Chef::ChefFS::FileSystem::NotFoundError => e
        ui.error "#{format_path(e.entry)}: No such file or directory"
        return []
      end

      result = [ [ result, children ] ]
      if config[:recursive]
        child_dirs = children.select { |child| child.dir? }
        result += parallelize(child_dirs, :flatten => true) { |child| add_dir_result(child) }.to_a
      end
      result
    end

maybe_add_slash(path, is_dir) click to toggle source

    # File lib/chef/knife/list.rb, line 145
    def maybe_add_slash(path, is_dir)
      if config[:trailing_slashes] && is_dir
        "#{path}/"
      else
        path
      end
    end

print_result_paths(results, indent = "") click to toggle source

    # File lib/chef/knife/list.rb, line 117
    def print_result_paths(results, indent = "")
      print_results(results.map { |result| maybe_add_slash(format_path(result), result.dir?) }, indent)
    end

print_results(results, indent) click to toggle source

    # File lib/chef/knife/list.rb, line 121
    def print_results(results, indent)
      return if results.length == 0

      print_space = results.map { |result| result.length }.max + 2
      if config[:one_column] || !stdout.isatty
        columns = 0
      else
        columns = HighLine::SystemExtensions.terminal_size[0]
      end
      current_line = ''
      results.each do |result|
        if current_line.length > 0 && current_line.length + print_space > columns
          output current_line.rstrip
          current_line = ''
        end
        if current_line.length == 0
          current_line << indent
        end
        current_line << result
        current_line << (' ' * (print_space - result.length))
      end
      output current_line.rstrip if current_line.length > 0
    end

run() click to toggle source

    # File lib/chef/knife/list.rb, line 43
    def run
      patterns = name_args.length == 0 ? [""] : name_args

      # Get the matches (recursively)
      all_results = parallelize(pattern_args_from(patterns), :flatten => true) do |pattern|
        pattern_results = Chef::ChefFS::FileSystem.list(config[:local] ? local_fs : chef_fs, pattern)
        if pattern_results.first && !pattern_results.first.exists? && pattern.exact_path
          ui.error "#{format_path(pattern_results.first)}: No such file or directory"
          self.exit_code = 1
        end
        pattern_results
      end

      # Process directories
      if !config[:bare_directories]
        dir_results = parallelize(all_results.select { |result| result.dir? }, :flatten => true) do |result|
          add_dir_result(result)
        end.to_a
      else
        dir_results = []
      end

      # Process all other results
      results = all_results.select { |result| result.exists? && (!result.dir? || config[:bare_directories]) }.to_a

      # Flatten out directory results if necessary
      if config[:flat]
        dir_results.each do |result, children|
          results += children
        end
        dir_results = []
      end

      # Sort by path for happy output
      results = results.sort_by { |result| result.path }
      dir_results = dir_results.sort_by { |result| result[0].path }

      # Print!
      if results.length == 0 && dir_results.length == 1
        results = dir_results[0][1]
        dir_results = []
      end

      print_result_paths results
      printed_something = results.length > 0
      dir_results.each do |result, children|
        if printed_something
          output ""
        else
          printed_something = true
        end
        output "#{format_path(result)}:"
        print_results(children.map { |result| maybe_add_slash(result.name, result.dir?) }.sort, "")
      end

      exit self.exit_code if self.exit_code
    end