module Thegarage::Gitx::Github

Constants

CLIENT_URL
GLOBAL_CONFIG_FILE
REVIEW_CONTEXT

Public Instance Methods

ask_without_echo(message) click to toggle source
# File lib/thegarage/gitx/github.rb, line 173
def ask_without_echo(message)
  value = ask(message, echo: false)
  say ''
  value
end
authorization_token() click to toggle source

authorization token used for github API calls the token is cached on the filesystem for future use @return [String] auth token stored in git (current repo, user config or installed global settings) @see developer.github.com/v3/oauth/#scopes @see developer.github.com/v3/#user-agent-required

# File lib/thegarage/gitx/github.rb, line 93
def authorization_token
  auth_token = global_config['token']
  auth_token ||= begin
    new_token = create_authorization
    save_global_config('token' => new_token)
    new_token
  end
  auth_token
end
branch_status(branch) click to toggle source

Get the current commit status of a branch @see developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref

# File lib/thegarage/gitx/github.rb, line 49
def branch_status(branch)
  response = github_client.status(github_slug, branch)
  response.state
end
create_authorization() click to toggle source
# File lib/thegarage/gitx/github.rb, line 103
def create_authorization
  password = ask_without_echo("Github password for #{username}: ")
  client = Octokit::Client.new(login: username, password: password)
  options = {
    :scopes => ['repo'],
    :note => github_client_name,
    :note_url => CLIENT_URL
  }
  two_factor_auth_token = ask_without_echo("Github two factor authorization token (if enabled): ")
  options[:headers] = {'X-GitHub-OTP' => two_factor_auth_token} if two_factor_auth_token
  response = client.create_authorization(options)
  response.token
rescue Octokit::ClientError => e
  say "Error creating authorization: #{e.message}", :red
  retry
end
create_pull_request(branch) click to toggle source

@see developer.github.com/v3/pulls/

# File lib/thegarage/gitx/github.rb, line 61
def create_pull_request(branch)
  say "Creating pull request for "
  say "#{branch} ", :green
  say "against "
  say "#{Thegarage::Gitx::BASE_BRANCH} ", :green
  say "in "
  say github_slug, :green

  title = branch
  body = pull_request_body(branch)
  github_client.create_pull_request(github_slug, Thegarage::Gitx::BASE_BRANCH, branch, title, body)
end
find_or_create_pull_request(branch) click to toggle source
# File lib/thegarage/gitx/github.rb, line 21
def find_or_create_pull_request(branch)
  pull_request = find_pull_request(branch)
  pull_request ||= begin
    checkout_branch(branch)
    execute_command(Thegarage::Gitx::Cli::UpdateCommand, :update)
    pull_request = create_pull_request(branch)
    say 'Created pull request: '
    say pull_request.html_url, :green

    pull_request
  end
  pull_request
end
find_pull_request(branch) click to toggle source

@return [Sawyer::Resource] data structure of pull request info if found @return nil if no pull request found

# File lib/thegarage/gitx/github.rb, line 37
def find_pull_request(branch)
  head_reference = "#{github_organization}:#{branch}"
  params = {
    head: head_reference,
    state: 'open'
  }
  pull_requests = github_client.pull_requests(github_slug, params)
  pull_requests.first
end
github_client() click to toggle source
# File lib/thegarage/gitx/github.rb, line 125
def github_client
  @client ||= Octokit::Client.new(:access_token => authorization_token)
end
github_client_name() click to toggle source
# File lib/thegarage/gitx/github.rb, line 120
def github_client_name
  timestamp = Time.now.utc.strftime('%FT%R:%S%z')
  client_name = "The Garage Git eXtensions #{timestamp}"
end
github_organization() click to toggle source
# File lib/thegarage/gitx/github.rb, line 147
def github_organization
  github_slug.split('/').first
end
github_slug() click to toggle source

@return the github slug for the current repository's remote origin url. @example

git@github.com:socialcast/thegarage/gitx.git #=> thegarage/gitx

@example

https://github.com/socialcast/thegarage/gitx.git #=> thegarage/gitx
# File lib/thegarage/gitx/github.rb, line 142
def github_slug
  remote = repo.config['remote.origin.url']
  remote.to_s.gsub(/\.git$/,'').split(/[:\/]/).last(2).join('/')
end
global_config() click to toggle source
# File lib/thegarage/gitx/github.rb, line 155
def global_config
  @config ||= begin
    File.exists?(global_config_file) ? YAML.load_file(global_config_file) : {}
  end
end
global_config_file() click to toggle source
# File lib/thegarage/gitx/github.rb, line 151
def global_config_file
  File.expand_path(GLOBAL_CONFIG_FILE)
end
pull_request_body(branch) click to toggle source
# File lib/thegarage/gitx/github.rb, line 74
def pull_request_body(branch)
  changelog = run_cmd("git log #{Thegarage::Gitx::BASE_BRANCH}...#{branch} --reverse --no-merges --pretty=format:'* %s%n%b'")
  description = options[:description]

  description_template = []
  description_template << "#{description}\n" if description
  description_template << '### Changelog'
  description_template << changelog
  description_template << PULL_REQUEST_FOOTER

  body = ask_editor(description_template.join("\n"), repo.config['core.editor'])
  body.gsub(PULL_REQUEST_FOOTER, '').chomp.strip
end
save_global_config(options) click to toggle source
# File lib/thegarage/gitx/github.rb, line 161
def save_global_config(options)
  config_dir = File.dirname(global_config_file)
  ::FileUtils.mkdir_p(config_dir, mode: 0700) unless File.exists?(config_dir)

  @config = global_config.merge(options)
  File.open(global_config_file, "a+") do |file|
    file.truncate(0)
    file.write(@config.to_yaml)
  end
  File.chmod(0600, global_config_file)
end
update_review_status(pull_request, state, description) click to toggle source

Update build status with peer review status

# File lib/thegarage/gitx/github.rb, line 55
def update_review_status(pull_request, state, description)
  commit_sha = pull_request.head.sha
  github_client.create_status(github_slug, commit_sha, state, context: REVIEW_CONTEXT, description: description)
end
username() click to toggle source

@return [String] github username (ex: 'wireframe') of the current github.user @raise error if github.user is not configured

# File lib/thegarage/gitx/github.rb, line 131
def username
  username = repo.config['github.user']
  fail "Github user not configured.  Run: `git config --global github.user 'me@email.com'`" unless username
  username
end