Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve Backup to include issues and wiki #25

Open
Iristyle opened this issue Jun 4, 2013 · 2 comments
Open

Improve Backup to include issues and wiki #25

Iristyle opened this issue Jun 4, 2013 · 2 comments

Comments

@Iristyle
Copy link
Owner

Iristyle commented Jun 4, 2013

Some ideas are here
https://github.com/joeyh/github-backup

But most ideas can be found in

https://gist.github.com/kevinpschaaf/2962886

@Iristyle
Copy link
Owner Author

github_issues_to_csv

require 'octokit'
require 'csv'
require 'date'
# Github credentials to access your private project
USERNAME="USER_NAME"
PASSWORD="SEKRIT"

# Project you want to export issues from
USER="REPO_OWNER"
PROJECT="REPO_NAME"

# Your local timezone offset to convert times
TIMEZONE_OFFSET="-4"

client = Octokit::Client.new(:login => USERNAME, :password => PASSWORD)

csv = CSV.new(File.open(File.dirname(__FILE__) + "/issues3.csv", 'w'))

puts "Initialising CSV file..."
#CSV Headers
header = [
  "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..."
temp_issues = []
issues = []
page = 0
begin
  page = page +1
  temp_issues = client.list_issues("#{USER}/#{PROJECT}", :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}", :state => "open", :page => page)
  issues = issues + temp_issues;
end while not temp_issues.empty?


puts "Processing #{issues.size} issues..."
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['title'],
    issue['body'],
    DateTime.parse(issue['created_at']).new_offset(TIMEZONE_OFFSET).strftime("%d/%b/%y %l:%M %p"),
    DateTime.parse(issue['updated_at']).new_offset(TIMEZONE_OFFSET).strftime("%d/%b/%y %l:%M %p"),
    type,
    milestone,
    priority,
    issue['state'],
    issue['user']['login']
  ]
  csv << row
  end

@Iristyle
Copy link
Owner Author

github_issues_to_csv_v3

require 'octokit'
require 'csv'
require 'date'

# Description:
# Exports Github issues from one or more repos into CSV file formatted for import into JIRA
# Note: By default, all Github comments will be assigned to the JIRA admin, appended with
# a note indicating the Github user who added the comment (since you may not have JIRA users
# created for all your Github users, especially if it is a public/open-source project:
#
#  Administrator added a comment - 13/Jun/12 5:13 PM
#  Imported from Github issue xyz-123, originally reported by ubercoder42
#
#  Administrator added a comment - 12/Jun/12 10:00 AM
#  Github comment from ubercoder42: [Text from first comment here...]

# Usage:
# > ruby github_issues_to_csv_v3.rb <JIRA admin username> <Github username> <Github password> <Github project/user> <repo 1> .. <repo n>

# Your local timezone offset to convert times -- CHANGE THESE TO MATCH YOUR SETTINGS
TIMEZONE_OFFSET="-8"
COMMENT_DATE_FORMAT="%m/%d/%Y %T"

OTHER_DATE_FORMAT="%-m/%-d/%y %H:%M"  # Don't change this; Comments must be in this format
COMMENT_NOW = DateTime.now.new_offset(TIMEZONE_OFFSET).strftime(COMMENT_DATE_FORMAT)
# Grab command line args
JIRA_ADMIN=ARGV.shift
USERNAME=ARGV.shift
PASSWORD=ARGV.shift
USER=ARGV.shift


client = Octokit::Client.new(:login => USERNAME, :password => PASSWORD)

csv = CSV.new(File.open(File.dirname(__FILE__) + "/issues_#{USER}.csv", 'w'), :force_quotes=>true)

puts "Initialising CSV file..."
#CSV Headers
header = [
  "Summary",
  "Description",
  "Date created",
  "Date modified",
  "Issue type",
  "Milestone",
  "Priority",
  "Status",
  "Reporter",
  "Github repo",
  "Github number"
]
# 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

ARGV.each do |project|
  puts "Getting issues from #{project}..."
  temp_issues = []
  issues = []
  page = 0
  begin
    page = page +1
    temp_issues = client.list_issues("#{USER}/#{project}", :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}", :state => "open", :page => page)
    issues = issues + temp_issues;
  end while not temp_issues.empty?


  puts "Processing #{issues.size} issues..."
  issues.each do |issue|
    puts "Processing issue #{project}-#{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
    row = [
    issue['title'],
    issue['body'],
    DateTime.parse(issue['created_at']).new_offset(TIMEZONE_OFFSET).strftime(OTHER_DATE_FORMAT),
    DateTime.parse(issue['updated_at']).new_offset(TIMEZONE_OFFSET).strftime(OTHER_DATE_FORMAT),
    type,
    milestone,
    priority,
    issue['state'],
    issue['user']['login'],
    project,
    "#{project}-#{issue['number']}"
    ]
    row << "#{COMMENT_NOW}; #{JIRA_ADMIN}; Imported from Github issue #{project}-#{issue['number']}, originally reported by #{issue['user']['login']}"
    if issue['comments'] > 0
    puts "Getting #{issue['comments']} comments for issue #{project}-#{issue['number']} from Github..."
    # Get the comments
    comments = client.issue_comments("#{USER}/#{project}", issue['number'])

    comments.each do |c|
      # Date format needs to match hard coded format in the Jira importer
      comment_time = DateTime.parse(c['created_at']).new_offset(TIMEZONE_OFFSET).strftime(COMMENT_DATE_FORMAT)

      # Map usernames for the comments importer. As is, this will assign all comments to
      # JIRA admin user -- use the commented version if you want to use the Github username...
      comment_user = JIRA_ADMIN  # c['user']['login']

      # Put the comment in a format Jira can parse
      comment = "#{comment_time}; #{comment_user}; Github comment from #{c['user']['login']}: #{c['body']}"

      row << comment
    end
    end
    csv << row
  end
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant