class Gimp::Mover

Public Class Methods

new(options) click to toggle source
# File lib/gimp.rb, line 6
def initialize(options)
  @client = Octokit::Client.new(access_token: options.token)
  @options = options
  @source = options.source
  @destination = options.destination
  @known_labels = Set.new
end

Public Instance Methods

move_issue(id) click to toggle source
# File lib/gimp.rb, line 14
def move_issue(id)
  issue = @client.issue(@source, id)
  labels = new_labels(@client.labels_for_issue(@source, id))
  comments = @client.issue_comments(@source, id)

  labels.each { |label| ensure_label(label) }
  new_issue = @client.create_issue(@destination, issue.title, issue.body,
    assignee: new_assignee(issue),
    labels: labels.map(&:name).uniq)
  @client.add_comment(@destination, new_issue.number, "*Issue migrated from #{@source}##{issue.number}*")
  comments.each { |comment| @client.add_comment(@destination, new_issue.number, comment_text(comment)) }

  @client.close_issue(@source, id)
  new_issue.number
end

Private Instance Methods

comment_text(comment) click to toggle source
# File lib/gimp.rb, line 59
def comment_text(comment)
  "*@#{comment.user.login} commented at #{comment.created_at}*\n\n---\n\n#{comment.body}"
end
ensure_label(label) click to toggle source
# File lib/gimp.rb, line 45
def ensure_label(label)
  return if @known_labels.include?(label.name)
  @client.label(@destination, label.name)
  @known_labels << label.name
rescue Octokit::NotFound
  @client.add_label(@destination, label.name, label.color)
  @known_labels << label.name
end
new_assignee(issue) click to toggle source
# File lib/gimp.rb, line 54
def new_assignee(issue)
  return nil if @options.unassign? || issue.assignee.nil?
  issue.assignee.login if @client.collaborator?(@destination, issue.assignee.login)
end
new_labels(labels) click to toggle source
# File lib/gimp.rb, line 32
def new_labels(labels)
  opts = @options.labels
  return labels unless opts

  labels = case opts.exclude
           when nil then labels
           when true then []
           else labels.reject { |label| opts.exclude.include?(label.name) }
           end
  labels << opts.add.map { |name| Hashie::Mash.new(name: name, color: 'ffffff') } if opts.add?
  labels.flatten
end