class Gl::MergeRequests

Public Instance Methods

approve(iid = nil) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 44
def approve(iid = nil)
  iid ||= merge_request_dialogue
  begin
    Gitlab.approve_merge_request(Gl.current_project, iid)
  rescue Gitlab::Error::Unauthorized
    TTY::Prompt.new.error('Unable to approve merge request')
  end
end
label(label) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 59
def label(label)
  label_action(label)
end
list(project = nil) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 7
def list(project = nil)
  if options[:i]
    id = merge_request_dialogue(project)
    mr = merge_requests.select { |merge_request| merge_request.iid == id.to_i }.first
    box = TTY::Box.frame(
      width: TTY::Screen.width,
      height: mr.description.lines.count + 4,
      padding: 1,
      title: { top_center: mr.title[0..TTY::Screen.width - 3],
               bottom_left: "State: #{mr.state}",
               bottom_right: "by #{mr.author.name}" }
    ) do
      mr.description
    end
    puts box

    choice = TTY::Prompt.new(interrupt: :exit).select('What to do next?') do |menu|
      menu.choice :open
      menu.choice :merge
      menu.choice :approve
      menu.choice :exit
    end

    case choice.to_sym
    when :open then open_mr_in_browser(mr.iid)
    when :merge then merge(mr.iid)
    when :approve then approve(mr.iid)
    when :exit then exit
    end
  else
    table = TTY::Table.new(%w[IID Author Title],
                           merge_requests_list(project))
    puts table.render(:ascii, padding: [0, 1])
  end
end
merge(iid = nil) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 71
def merge(iid = nil)
  iid ||= merge_request_dialogue.split(' - ')[0]
  Gitlab.accept_merge_request(Gl.current_project,
                              iid,
                              squash: options['squash'],
                              should_remove_source_branch: options['delete-branch'])
rescue Gitlab::Error::MethodNotAllowed => e
  TTY::Prompt.new.error(
    case e.response_status
    when 405
      'Unable to accept merge request ' \
      '(ie: Work in Progress, Closed, Pipeline Pending Completion, ' \
      'or Failed while requiring Success)'
    else
      "Could not merge due to unknown error: #{e.response_status}"
    end
  )
end
open(iid = nil) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 54
def open(iid = nil)
  open_mr_in_browser(iid)
end
unlabel(label) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 64
def unlabel(label)
  label_action(label)
end

Private Instance Methods

label_action(label) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 96
def label_action(label)
  id = merge_request_dialogue
  action = caller_locations(1, 1)[0].label

  begin
    Gitlab.create_merge_request_note(Gl.current_project,
                                     id,
                                     "/#{action} ~\"#{label}\"")
  rescue Gitlab::Error::BadRequest
    true
  end
end
merge_request_dialogue(project = nil) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 109
def merge_request_dialogue(project = nil)
  prompt = TTY::Prompt.new(interrupt: :exit)
  prompt.select('Select a merge request', filter: true) do |menu|
    merge_requests_list(project).each do |merge_request|
      menu.choice merge_request.join(' - '), merge_request[0]
    end
  end
end
merge_requests(project = nil) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 126
def merge_requests(project = nil)
  @merge_requests ||= begin
    Gitlab.merge_requests(Gl.current_project(project),
                          state: :opened).auto_paginate
  end
end
merge_requests_list(project = nil) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 118
def merge_requests_list(project = nil)
  @merge_requests_list ||= begin
    merge_requests(project).map do |mr|
      [mr.iid, mr.author.name, mr.title]
    end
  end
end
open_mr_in_browser(iid) click to toggle source
# File lib/gl/cli/merge_requests.rb, line 92
def open_mr_in_browser(iid)
  Gl.open_in_browser("#{Gl.current_project}/merge_requests/#{iid}")
end