def status project, config, releases
releases ||= project.unreleased_releases + [:unassigned]
if releases.empty?
puts "No releases."
return
end
entries = releases.map do |r|
title, issues = (r == :unassigned ? r.to_s : r.name), project.issues_for_release(r)
middle = Issue::TYPES.map do |type|
type_issues = issues.select { |i| i.type == type }
num = type_issues.size
nc = type_issues.count_of { |i| i.closed? }
pc = 100.0 * (type_issues.empty? ? 1.0 : nc.to_f / num)
"%2d/%2d %s" % [nc, num, type.to_s.pluralize(num, false)]
end
bar = if r == :unassigned
""
elsif r.released?
"(released)"
elsif issues.empty?
"(no issues)"
elsif issues.all? { |i| i.closed? }
"(ready for release)"
else
status_bar_for(issues)
end
[title, middle, bar]
end
title_size = 0
middle_sizes = []
entries.each do |title, middle, bar|
title_size = [title_size, title.length].max
middle_sizes = middle.zip(middle_sizes).map do |e, s|
[s || 0, e.length].max
end
end
entries.each do |title, middle, bar|
printf "%-#{title_size}s ", title
middle.zip(middle_sizes).each_with_index do |(e, s), i|
sep = i < middle.size - 1 ? "," : ""
printf "%-#{s + sep.length}s ", e + sep
end
puts bar
end
end