Skip to content

Instantly share code, notes, and snippets.

@rkallensee
Forked from tkarpinski/github_issues_to_csv.rb
Last active April 30, 2024 11:48
Show Gist options
  • Save rkallensee/519bbcb01da2fee77b1f to your computer and use it in GitHub Desktop.
Save rkallensee/519bbcb01da2fee77b1f to your computer and use it in GitHub Desktop.
Export Github issues to CSV grouped by Milestone
# original source: https://gist.github.com/tkarpinski/2369729
require 'octokit'
require 'csv'
require 'date'
# Github access token to access the project
# Create one at https://github.com/settings/tokens
ACCESS_TOKEN="GITHUB_ACCESS_TOKEN"
# Project you want to export issues from
USER="USER_NAME"
PROJECT="PROJECT_NAME"
# Your local timezone offset to convert times
TIMEZONE_OFFSET="+2"
client = Octokit::Client.new(:access_token => ACCESS_TOKEN)
csv = CSV.new(File.open(File.dirname(__FILE__) + "/issues.csv", 'w'), col_sep: ';')
puts "Initialising CSV file..."
# CSV Headers
header = [
"Github issue number",
"Summary",
# "Description",
"Date created",
# "Date modified",
"Issue type",
"Milestone",
"Priority",
"Status",
"Reporter"
]
# We need to add a column for each comment, so this dictates how many comments for each issue you want to support
#20.times { header << "Comments" }
csv << header
puts "Getting issues from Github..."
# Fetch issues grouped by milestone, TODO: visual grouping
client.list_milestones("#{USER}/#{PROJECT}").map {|m| {number: m.number, title: m.title} }.each do |milestone|
temp_issues = []
issues = []
page = 0
begin
page = page +1
temp_issues = client.list_issues("#{USER}/#{PROJECT}", milestone: milestone[:number], :state => "closed", :page => page)
issues = issues + temp_issues;
end while not temp_issues.empty?
temp_issues = []
page = 0
begin
page = page +1
temp_issues = client.list_issues("#{USER}/#{PROJECT}", milestone: milestone[:number], :state => "open", :page => page)
issues = issues + temp_issues;
end while not temp_issues.empty?
puts "Processing #{issues.size} issues for milestone #{milestone[:title]}..."
issues.each do |issue|
puts "Processing issue #{issue['number']}..."
# Work out the type based on our existing labels
case
when issue['labels'].to_s =~ /Bug/i
type = "Bug"
when issue['labels'].to_s =~ /Feature/i
type = "New feature"
when issue['labels'].to_s =~ /Task/i
type = "Task"
end
# Work out the priority based on our existing labels
case
when issue['labels'].to_s =~ /HIGH/i
priority = "Critical"
when issue['labels'].to_s =~ /MEDIUM/i
priority = "Major"
when issue['labels'].to_s =~ /LOW/i
priority = "Minor"
end
milestone = issue['milestone'] || "None"
if (milestone != "None")
milestone = milestone['title']
end
# Needs to match the header order above, date format are based on Jira default
row = [
issue['number'],
issue['title'],
# issue['body'],
issue['created_at'].to_s,
# issue['updated_at'].to_s,
type,
milestone,
priority,
issue['state'],
issue['user']['login']
]
csv << row
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment