class Buildkite::Builder::Manifest

Attributes

root[R]

Public Class Methods

[](name) click to toggle source
# File lib/buildkite/builder/manifest.rb, line 20
def [](name)
  manifests[name.to_s]
end
[]=(name, manifest) click to toggle source
# File lib/buildkite/builder/manifest.rb, line 24
def []=(name, manifest)
  name = name.to_s
  if manifests.key?(name)
    raise ArgumentError, "manifest #{name} already exists"
  end

  manifests[name] = manifest
end
manifests() click to toggle source
# File lib/buildkite/builder/manifest.rb, line 16
def manifests
  @manifests ||= {}
end
new(root, patterns) click to toggle source
# File lib/buildkite/builder/manifest.rb, line 36
def initialize(root, patterns)
  @root = Pathname.new(root)
  @root = Buildkite::Builder.root.join(@root) unless @root.absolute?
  @patterns = patterns.map(&:to_s)
end
resolve(root, patterns) click to toggle source
# File lib/buildkite/builder/manifest.rb, line 12
def resolve(root, patterns)
  new(root, Array(patterns)).modified?
end

Public Instance Methods

digest() click to toggle source
# File lib/buildkite/builder/manifest.rb, line 61
def digest
  @digest ||= begin
    digests = files.map { |file| Digest::MD5.file(Buildkite::Builder.root.join(file)).hexdigest }
    Digest::MD5.hexdigest(digests.join)
  end
end
files() click to toggle source
# File lib/buildkite/builder/manifest.rb, line 57
def files
  @files ||= (inclusion_rules.map(&:files).reduce(Set.new, :merge) - exclusion_rules.map(&:files).reduce(Set.new, :merge)).sort.to_set
end
modified?() click to toggle source
# File lib/buildkite/builder/manifest.rb, line 42
def modified?
  # DO NOT intersect FileResolver with manifest files. If the manifest is
  # large, the operation can be expensive. It's always cheaper to loop
  # through the changed files and compare them against the rules.
  unless defined?(@modified)
    @modified = FileResolver.resolve.modified_files.any? do |file|
      file = Buildkite::Builder.root.join(file)
      inclusion_rules.any? { |rule| rule.match?(file) } &&
        exclusion_rules.none? { |rule| rule.match?(file) }
    end
  end

  @modified
end

Private Instance Methods

exclusion_rules() click to toggle source
# File lib/buildkite/builder/manifest.rb, line 83
def exclusion_rules
  @exclusion_rules ||= rules.select(&:exclude)
end
inclusion_rules() click to toggle source
# File lib/buildkite/builder/manifest.rb, line 79
def inclusion_rules
  @inclusion_rules ||= rules.reject(&:exclude)
end
rules() click to toggle source
# File lib/buildkite/builder/manifest.rb, line 70
def rules
  @rules ||= @patterns.each_with_object([]) do |pattern, rules|
    pattern = pattern.strip
    unless pattern.match?(/\A(#|\z)/)
      rules << Rule.new(root, pattern)
    end
  end
end