class XcodeArchiveCache::BuildGraph::Builder

Constants

ALL_NODES

Attributes

build_settings_loader[RW]

@return [XcodeArchiveCache::BuildSettings::Loader]

native_target_finder[RW]

@return [XcodeArchive::BuildGraph::NativeTargetFinder]

sha_calculator[RW]

@return [XcodeArchiveCache::BuildGraph::NodeShaCalculator]

Public Class Methods

new(native_target_finder, build_settings_loader) click to toggle source

@param [XcodeArchiveCache::Xcodebuild::Executor] xcodebuild_executor

# File lib/build_graph/builder.rb, line 9
def initialize(native_target_finder, build_settings_loader)
  @build_settings_loader = build_settings_loader
  @native_target_finder = native_target_finder
  @sha_calculator = NodeShaCalculator.new
end

Public Instance Methods

build_graph(dependent_target, dependency_target) click to toggle source

@param [Xcodeproj::Project::Object::PBXNativeTarget] dependency_target

@return [Graph]

# File lib/build_graph/builder.rb, line 19
def build_graph(dependent_target, dependency_target)
  native_target_finder.set_platform_name_filter(dependency_target.platform_name)

  graph = Graph.new(dependency_target.project)
  add_to_graph(dependency_target, graph, true)
  load_settings(graph, dependent_target)
  calculate_shas(graph)

  graph
end

Private Instance Methods

add_to_graph(target, graph, is_root, target_stack = []) click to toggle source

@param [Xcodeproj::Project::Object::PBXNativeTarget] target @param [Graph] graph @param [Boolean] is_root @param [Array<String>] target_stack

Stack of native target display names at this level of traverse

@return [Node] new or existing node

# File lib/build_graph/builder.rb, line 54
def add_to_graph(target, graph, is_root, target_stack = [])
  debug("traversing #{target.display_name}")

  unless target
    raise ArgumentError.new, "Target is required"
  end

  display_name = target.display_name
  if target_stack.include?(display_name)
    target_stack.push(display_name)
    raise XcodeArchiveCache::Informative, "Circular dependency detected: #{target_stack.join(" -> ")}"
  end

  node = ALL_NODES.select {|node| node.native_target.uuid == target.uuid && node.native_target.project == target.project}.first
  if node
    debug("already traversed this one")
    unless graph.nodes.include?(node)
      nodes_to_add = node.subgraph.select {|subgraph_node| !graph.nodes.include?(subgraph_node)}
      graph.add_multiple_nodes(nodes_to_add)
    end

    return node
  else
    debug("adding new node")
    node = Node.new(display_name, target, is_root)
    graph.nodes.push(node)
    ALL_NODES.push(node)
  end

  dependencies = []
  target_stack.push(display_name)

  deduplicated_targets = native_target_finder.find_native_dependencies(target)
  debug("dependency targets: #{deduplicated_targets.map(&:display_name)}")

  deduplicated_targets.each do |dependency_target|
    dependency_node = add_to_graph(dependency_target, graph, false, target_stack)

    unless dependency_node.dependent.include?(node)
      debug("adding #{node.name} as dependent to #{dependency_node.name}")
      dependency_node.dependent.push(node)
    end

    unless dependencies.include?(dependency_node)
      debug("adding #{dependency_node.name} as dependency to #{node.name}")
      dependencies.push(dependency_node)
    end
  end

  target_stack.pop
  node.dependencies.push(*dependencies)

  debug("done with #{target.display_name}")
  node
end
calculate_shas(graph) click to toggle source

@param [XcodeArchiveCache::BuildGraph::Graph] graph

# File lib/build_graph/builder.rb, line 112
def calculate_shas(graph)
  graph.nodes.each do |node|
    debug("calculating sha for #{node.name}")
    sha_calculator.calculate(node)
    debug("sha calculated for #{node.name}: #{node.sha}")
  end
end
get_settings(target) click to toggle source

@param [Xcodeproj::Project::Object::PBXNativeTarget] target

# File lib/build_graph/builder.rb, line 140
def get_settings(target)
  info("getting settings for #{target.display_name}")
  build_settings = build_settings_loader.get_settings(target.project.path, target.display_name)
  unless build_settings
    raise XcodeArchiveCache::Informative, "No build settings loaded for #{target.display_name}"
  end

  build_settings
end
load_settings(graph, dependent_target) click to toggle source

@param [XcodeArchiveCache::BuildGraph::Graph] graph @param [Xcodeproj::Project::Object::PBXNativeTarget] dependent_target

# File lib/build_graph/builder.rb, line 123
def load_settings(graph, dependent_target)
  project_paths = graph.nodes
                      .map {|node| node.native_target}
                      .push(dependent_target)
                      .map {|target| target.project.path}
                      .sort
                      .uniq
  info("loading settings for #{project_paths.length} projects")
  build_settings_loader.load_settings(project_paths)

  graph.dependent_build_settings = get_settings(dependent_target)
  graph.nodes.each {|node| node.build_settings = get_settings(node.native_target)}
end