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
search(node, visited)
click to toggle source
# File lib/flash_flow/merge/release_graph.rb, line 120 def search(node, visited) return if visited[node.id] visited[node.id] = true all_neighbors(node).each do |neighbor| search(neighbor, visited) end 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