class ModuleSync::PR::GitHub

GitHub creates and manages pull requests on github.com or GitHub Enterprise installations.

Public Class Methods

new(token, endpoint) click to toggle source
# File lib/modulesync/pr/github.rb, line 9
def initialize(token, endpoint)
  Octokit.configure do |c|
    c.api_endpoint = endpoint
  end
  @api = Octokit::Client.new(:access_token => token)
end

Public Instance Methods

manage(namespace, module_name, options) click to toggle source
# File lib/modulesync/pr/github.rb, line 16
def manage(namespace, module_name, options)
  repo_path = File.join(namespace, module_name)
  branch = options[:remote_branch] || options[:branch]
  head = "#{namespace}:#{branch}"
  target_branch = options[:pr_target_branch] || 'master'

  if options[:noop]
    $stdout.puts \
      "Using no-op. Would submit PR '#{options[:pr_title]}' to #{repo_path} " \
      "- merges #{branch} into #{target_branch}"
    return
  end

  pull_requests = @api.pull_requests(repo_path,
                                     :state => 'open',
                                     :base => target_branch,
                                     :head => head)
  unless pull_requests.empty?
    # Skip creating the PR if it exists already.
    $stdout.puts "Skipped! #{pull_requests.length} PRs found for branch #{branch}"
    return
  end

  pr_labels = ModuleSync::Util.parse_list(options[:pr_labels])
  pr = @api.create_pull_request(repo_path,
                                target_branch,
                                branch,
                                options[:pr_title],
                                options[:message])
  $stdout.puts \
    "Submitted PR '#{options[:pr_title]}' to #{repo_path} " \
    "- merges #{branch} into #{target_branch}"

  # We only assign labels to the PR if we've discovered a list > 1. The labels MUST
  # already exist. We DO NOT create missing labels.
  return if pr_labels.empty?
  $stdout.puts "Attaching the following labels to PR #{pr['number']}: #{pr_labels.join(', ')}"
  @api.add_labels_to_an_issue(repo_path, pr['number'], pr_labels)
end