class Pullrequest::Bitbucket

Attributes

context[R]

Public Class Methods

new(context) click to toggle source
# File lib/pullrequest/bitbucket.rb, line 10
def initialize(context)
  @context = context
end

Public Instance Methods

command() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 14
def command
  @command ||= generate_command
end
review() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 18
def review
  @data = nil
  @command = nil
end

Private Instance Methods

ask(question, options = {}) click to toggle source
# File lib/pullrequest/bitbucket.rb, line 25
def ask(question, options = {})
  cache_key = question.dup
  if cached_answers[cache_key]
    options.merge! default: cached_answers[cache_key]
  end
  context.ask(question, options).tap do |answer|
    cached_answers[cache_key] = answer
  end
end
cached_answers() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 35
def cached_answers
  @cached_answers ||= {}
end
current_branch() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 39
def current_branch
  `git rev-parse --abbrev-ref HEAD`.chomp
end
current_repo() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 43
def current_repo
  `git remote -v`[/bitbucket.org\:([^\.]+)\.git/, 1]
end
data() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 47
def data
  @data ||= {
    title: title,
    description: description,
    source: {
      repository: {full_name: source_repo},
      branch: {name: source_branch},
    },
    destination: {
      repository: {full_name: dest_repo},
      branch: {name: dest_branch},
    },
    reviewers: reviewer_usernames.map { |username| {username: username} },
    close_source_branch: true,
  }
end
description() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 64
def description
  ask("Description of pull request")
end
dest_branch() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 68
def dest_branch
  ask("Destination branch", default: 'master', required: true)
end
dest_repo() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 72
def dest_repo
  ask("Destination Bitbucket repo (account_name/report_name)", default: current_repo, required: true)
end
generate_command() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 76
def generate_command
  data # ask these questions first
  [
    "curl",
    "-X POST",
    "-H 'Content-Type: application/json'",
    "-u #{username}:#{password}",
    "https://bitbucket.org/api/2.0/repositories/#{dest_repo}/pullrequests",
    "-d '#{data.to_json}'",
  ].join(' ')
end
password() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 88
def password
  return stored_credentials[:password] if stored_credentials?
  ask("Your Bitbucket password", echo: false, required: true).tap do |password|
    $stdout.puts # force newline
    if yes? "Store credentials for next time? (in #{stored_credentials_path})"
      @password = password
      write_credentials
    end
  end
end
reviewer_usernames() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 124
def reviewer_usernames
  ask("Reviewers (enter comma-separated usernames)", default: "<none>").split(',').map(&:strip).reject { |u| u == '' }
end
source_branch() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 99
def source_branch
  ask("Source branch (your local branch)", default: current_branch, required: true)
end
source_repo() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 103
def source_repo
  current_repo
end
stored_credentials() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 107
def stored_credentials
  return {} unless File.exists?(stored_credentials_path)
  @stored_credentials ||= YAML.load(File.read(stored_credentials_path))
end
stored_credentials?() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 112
def stored_credentials?
  stored_credentials.key?(:username) && stored_credentials.key?(:password)
end
stored_credentials_path() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 116
def stored_credentials_path
  File.join(Dir.home, '.config/pullrequest/bitbucket.yml')
end
title() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 120
def title
  ask("Title of pull request", required: true)
end
username() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 128
def username
  return stored_credentials[:username] if stored_credentials?
  @username = ask("Your Bitbucket username", required: true)
end
write_credentials() click to toggle source
# File lib/pullrequest/bitbucket.rb, line 133
def write_credentials
  FileUtils.mkdir_p(File.dirname(stored_credentials_path))
  File.open(stored_credentials_path, 'w', 0600) do |f|
    f.write({username: @username, password: @password}.to_yaml)
  end
end
yes?(*args) click to toggle source
# File lib/pullrequest/bitbucket.rb, line 140
def yes?(*args)
  context.yes? *args
end