Sha256: 205e118e1bb1dfd2c2b6e159436ca81d9c0c1c55f676456e2ed35c835274f36b

Contents?: true

Size: 1.68 KB

Versions: 15

Compression:

Stored size: 1.68 KB

Contents

require "file_utils_ext"
require "cc/analyzer/path_minimizer"
require "cc/analyzer/path_filter"

module CC
  module Analyzer
    class IncludePathsBuilder
      IGNORE_PATHS = [".", "..", ".git"].freeze

      attr_reader :cc_include_paths

      def initialize(cc_exclude_paths, cc_include_paths = [])
        @cc_exclude_paths = cc_exclude_paths
        @cc_include_paths = cc_include_paths
      end

      def build
        PathMinimizer.new(paths_filter.paths).minimize.uniq
      end

      private

      def paths_filter
        @_paths =
          PathFilter.new(include_paths).
          reject_paths(ignored_files).
          reject_unreadable_paths.
          select_readable_files.
          reject_symlinks
      end

      def include_paths
        if @cc_include_paths.empty?
          all_paths
        else
          @cc_include_paths.flat_map do |path|
            PathEntries.new(path).entries
          end
        end
      end

      def all_paths
        Dir.glob("*", File::FNM_DOTMATCH).
          reject { |path| IncludePathsBuilder::IGNORE_PATHS.include?(path) }.
          flat_map { |path| PathEntries.new(path).entries }
      end

      def ignored_files
        return @_ignored_files if @_ignored_files

        Tempfile.open(".cc_gitignore") do |tmp|
          tmp.write(File.read(".gitignore")) if File.file?(".gitignore")
          tmp << @cc_exclude_paths.join("\n")
          tmp.close
          tracked_and_ignored = `git ls-files -zi -X #{tmp.path} 2>/dev/null`.split("\0")
          untracked_and_ignored = `git ls-files -zio -X #{tmp.path} 2>/dev/null`.split("\0")
          @_ignored_files = tracked_and_ignored + untracked_and_ignored
        end
      end
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
codeclimate-0.17.0 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.16.6 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.16.5 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.16.4 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.16.3 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.16.2 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.16.1 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.16.0 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.15.2 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.15.1 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.15.0 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.14.7 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.14.6 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.14.5 lib/cc/analyzer/include_paths_builder.rb
codeclimate-0.14.4 lib/cc/analyzer/include_paths_builder.rb