class FlashFlow::Merge::ReleaseGraph

Attributes

branches[RW]
issue_tracker[RW]

Public Class Methods

build(branches, issue_tracker) click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 8
def self.build(branches, issue_tracker)
  instance = new(branches, issue_tracker)
  instance.build
  instance
end
new(branches, issue_tracker) click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 14
def initialize(branches, issue_tracker)
  @issue_tracker = issue_tracker
  @branches = branches
end

Public Instance Methods

build() click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 30
def build
  queue = []

  branches.each do |branch|
    seen_branches[branch] = true
    queue.unshift([branch, graph.add_node(branch.ref)]) #, color: branch[:shippable?] ? 'green' : 'red', shape: 'record', label: "<f0>#{branch[:name]}")
  end

  while !queue.empty?
    element, node = queue.pop

    case
      when seen_branches.has_key?(element)
        element.stories.to_a.map(&:to_s).each do |story_id|
          story_id = story_id.to_s
          seen_stories[story_id] = true
          find_or_add_node(node, queue, story_id)
        end

      when seen_stories.has_key?(element)
        issue_tracker.release_keys(element).each do |release_key|
          seen_releases[release_key] = true
          find_or_add_node(node, queue, release_key)
        end

      when seen_releases.has_key?(element)
        issue_tracker.stories_for_release(element).map(&:to_s).each do |story_id|
          story_id = story_id.to_s
          seen_stories[story_id] = true
          find_or_add_node(node, queue, story_id)
        end
    end
  end
end
connected_branches(node_id) click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 65
def connected_branches(node_id)
  visited = connected(node_id)

  seen_branches.keys.select { |k| visited[k.ref] }
end
connected_releases(node_id) click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 77
def connected_releases(node_id)
  visited = connected(node_id)

  seen_releases.keys.select { |k| visited[k] }
end
connected_stories(node_id) click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 71
def connected_stories(node_id)
  visited = connected(node_id)

  seen_stories.keys.select { |k| visited[k] }
end
output(png_file) click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 19
def output(png_file)
  graph.output(png: png_file)
  png_file
rescue StandardError => e
  if e.message =~ /GraphViz/i
    nil
  else
    raise e
  end
end

Private Instance Methods

all_neighbors(node) click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 116
def all_neighbors(node)
  (node.neighbors | node.incidents)
end
connected(node_id) click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 108
def connected(node_id)
  node = graph.find_node(node_id)
  visited = {}
  search(node, visited) if node

  visited
end
find_or_add_node(node, queue, identifier) click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 85
def find_or_add_node(node, queue, identifier)
  other_node = graph.find_node(identifier)
  unless other_node
    other_node = graph.add_node(identifier)
    queue.unshift([identifier, other_node])
  end

  graph.add_edge(node, other_node) unless all_neighbors(node).include?(other_node)
end
graph() click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 130
def graph
  @graph ||= GraphViz.new(:G, :type => :graph)
end
seen_branches() click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 95
def seen_branches
  @seen_branches ||= {}
end
seen_releases() click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 99
def seen_releases
  @seen_releases ||= {}
end
seen_stories() click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 103
def seen_stories
  @seen_stories ||= {}
end