class FlashFlow::Merge::Status

Attributes

collection[R]
issue_tracker[R]
releases[R]
stories[R]

Public Class Methods

new(issue_tracker_config, branches_config, branch_info_file, git_config, opts={}) click to toggle source
# File lib/flash_flow/merge/status.rb, line 8
def initialize(issue_tracker_config, branches_config, branch_info_file, git_config, opts={})
  @issue_tracker = IssueTracker::Base.new(issue_tracker_config)
  @collection = Data::Base.new(branches_config, branch_info_file, ShadowGit.new(git_config)).collection
end

Public Instance Methods

branches() click to toggle source
# File lib/flash_flow/merge/status.rb, line 45
def branches
  g = ReleaseGraph.build(collection.current_branches, issue_tracker)

  branch_hash = {}
  collection.current_branches.each_with_index do |branch, i|
    connected_branches = g.connected_branches(branch.ref)
    connected_stories = g.connected_stories(branch.ref)
    connected_releases = g.connected_releases(branch.ref)
    add_stories(connected_stories)
    add_releases(connected_releases)
    sub_g = ReleaseGraph.build(connected_branches, issue_tracker)
    graph_file = sub_g.output("/tmp/graph-#{i}.png")

    branch_hash[branch] =
        Hash.new.tap do |hash|
          hash[:name] = branch.ref
          hash[:branch_url] = collection.branch_link(branch)
          hash[:code_reviewed?] = collection.code_reviewed?(branch)
          hash[:can_ship?] = collection.can_ship?(branch)
          hash[:connected_branches] = connected_branches
          hash[:image] = graph_file
          hash[:my_stories] = branch.stories.to_a
          hash[:stories] = connected_stories
          hash[:releases] = connected_releases
        end
  end

  mark_as_shippable(branch_hash)
  branch_hash
end
status() click to toggle source
# File lib/flash_flow/merge/status.rb, line 13
def status
  filename = File.dirname(__FILE__) + '/merge_status.csv'
  checkmark = "\u2713".encode('utf-8')

  CSV.open(filename, 'w') do |f|
    f << ['Ready', 'Branch', 'Stories', 'Review', 'Can ship?']
    branches.each do |_, branch_hash|
      f << [
        branch_hash[:shippable?] ? checkmark : 'x',
        branch_hash[:name],
        unshippable_stories(branch_hash[:stories]).empty? ? checkmark : 'x',
        branch_hash[:code_reviewed?] ? checkmark : 'x',
        branch_hash[:can_ship?] ? checkmark : 'x'
      ]
    end
  end

  CSV.foreach(filename) { |row| puts '%-10s %-70s %-10s %-10s %-10s' % row }
end
status_html(filename=nil) click to toggle source
# File lib/flash_flow/merge/status.rb, line 33
def status_html(filename=nil)
  filename = File.dirname(__FILE__) + '/merge_status.html'
  @branches = branches

  template = ERB.new File.read(File.dirname(__FILE__) + '/merge_status.html.erb')
  html = template.result(binding)
  File.open(filename, 'w') do |f|
    f.puts html
  end
  `open #{filename}`
end

Private Instance Methods

add_releases(release_list) click to toggle source
# File lib/flash_flow/merge/status.rb, line 85
def add_releases(release_list)
  @releases ||= {}
  release_list.each do |release_key|
    @releases[release_key] ||= {stories: issue_tracker.stories_for_release(release_key).map(&:to_s)}
  end
end
add_stories(story_list) click to toggle source
# File lib/flash_flow/merge/status.rb, line 78
def add_stories(story_list)
  @stories ||= {}
  story_list.each do |story_id|
    @stories[story_id] ||= story_info_hash(story_id)
  end
end
mark_as_shippable(branches) click to toggle source
# File lib/flash_flow/merge/status.rb, line 92
def mark_as_shippable(branches)
  branches.each do |_, b|
    b[:shippable?] = b[:code_reviewed?] && b[:can_ship?] &&
        unshippable_stories(b[:stories]).empty? &&
        unshippable_releases(b[:releases]).empty?
  end

  branches.each do |_, b|
    b[:shippable?] &= b[:connected_branches].all? do |other_branch|
      branches[other_branch][:shippable?]
    end
  end
end
stories_accepted_branches() click to toggle source
# File lib/flash_flow/merge/status.rb, line 116
def stories_accepted_branches
  branches.select { |_, b| unshippable_stories(b[:stories]).empty? }
end
story_info_hash(story_id) click to toggle source
# File lib/flash_flow/merge/status.rb, line 120
def story_info_hash(story_id)
  {
      id: story_id,
      url: issue_tracker.story_link(story_id),
      title: issue_tracker.story_title(story_id),
      accepted?: issue_tracker.story_deployable?(story_id),
      release_keys: issue_tracker.release_keys(story_id)
  }
end
unshippable_releases(arr) click to toggle source
# File lib/flash_flow/merge/status.rb, line 106
def unshippable_releases(arr)
  arr.select do |release_key|
    !unshippable_stories(@releases[release_key][:stories]).empty?
  end
end
unshippable_stories(arr) click to toggle source
# File lib/flash_flow/merge/status.rb, line 112
def unshippable_stories(arr)
  arr.select { |story| !@stories[story][:accepted?] }
end