class Gb::Merge
Public Class Methods
new(argv)
click to toggle source
Calls superclass method
# File lib/commands/merge.rb, line 28 def initialize(argv) @from_branch = argv.shift_argument @to_branch = argv.shift_argument @assignee = argv.option('assignee') @title = argv.option('title') @show_diff = argv.flag?('show-diff') super end
options()
click to toggle source
Calls superclass method
# File lib/commands/merge.rb, line 20 def self.options [ ["--assignee=[user name]", "指定review用户名称"], ["--title", "merge request标题"], ["--show-diff", "review前是否显示变更"], ].concat(super) end
Public Instance Methods
gitlab_get_team_members(project_id)
click to toggle source
# File lib/commands/merge.rb, line 234 def gitlab_get_team_members(project_id) users = Gitlab.project_usesrs(project_id).delete_if { |user| user.username == 'root' } if users.size > 0 info "Find user to assign." users.each_with_index do |user, index| puts "#{index + 1}、#{user.username}(#{user.name})".green end else raise Error.new("Can't find members in project '#{project_id}''.") end users end
gitlab_search_project(project_name)
click to toggle source
# File lib/commands/merge.rb, line 216 def gitlab_search_project(project_name) projects = Gitlab.project_search(project_name) if projects.size > 1 info "Find #{projects.size} project named #{project_name}. you means which one?" projects.each do |project| print project.name + ' ' end print "\n" raise Error.new("Find #{projects.size} project named #{project_name}") elsif projects.size == 1 project = projects[0]; else raise Error.new("Can't find project named '#{project_name}'.") end project end
gitlab_search_user(assignee)
click to toggle source
# File lib/commands/merge.rb, line 199 def gitlab_search_user(assignee) users = Gitlab.user_search(assignee) if users.size > 1 info "Find more than one user. you means which one?" users.each do |user| print user.name + ' ' end info "" raise Error.new("Find #{users.size} user named #{project.name}") elsif users.size == 1 user = users[0] else raise Error.new("Can't find user #{assignee}.") end user end
run_in_config()
click to toggle source
# File lib/commands/merge.rb, line 47 def run_in_config remote = "origin" # api: https://www.rubydoc.info/gems/gitlab/toplevel # document: https://narkoz.github.io/gitlab/cli Gitlab.configure do |config| # set an API endpoint # API endpoint URL, default: ENV['GITLAB_API_ENDPOINT'] config.endpoint = self.gb_config.gitlab.endpoint # set a user private token # user's private token or OAuth2 access token, default: ENV['GITLAB_API_PRIVATE_TOKEN'] config.private_token = self.gb_config.gitlab.private_token # user agent config.user_agent = "gb ruby gem[#{VERSION}" end user = nil if !@assignee.nil? user = gitlab_search_user(@assignee) end self.gb_config.projects.each_with_index do |project, index| gitlab_project = gitlab_search_project(project.name) info "Find project #{gitlab_project.name} on #{gitlab_project.web_url}." begin Gitlab.branch(gitlab_project.id, @from_branch) rescue Gitlab::Error::NotFound => error raise Error.new("Branch '#{@from_branch}' not exist in remote '#{remote}'.") rescue Gitlab::Error::Error => error raise(error) end begin Gitlab.branch(gitlab_project.id, @to_branch) rescue Gitlab::Error::NotFound => error raise Error.new("Branch '#{@to_branch}' not exist in remote '#{remote}'.") rescue Gitlab::Error::Error => error raise(error) end compare_response = Gitlab.compare(gitlab_project.id, @to_branch, @from_branch); if compare_response.commits.size >= 1 if @show_diff puts "\ncommits" compare_response.commits.each_with_index do |commit, index| unless index == 0 puts "" end puts " #{index} id:" + commit["id"] puts " author:" + commit["author_name"] puts " create at: " + commit["created_at"] puts " title: " + commit["title"] end puts "" end else info "Can't find new commit on #{@from_branch} to #{@to_branch} in project #{project.name}." puts next end if compare_response.diffs.size >= 1 if @show_diff puts "Diffs" compare_response.diffs.each do |diff| if diff["new_file"] puts " created " + diff["new_path"] elsif diff["renamed_file"] puts " renamed " + diff["old_path"] + "=>" + diff["new_path"] elsif diff["deleted_file"] puts " deleted" + diff["old_path"] else puts " edited " + diff["new_path"] end diff = diff["diff"]; lines = diff.split("\n") lines.each do |line| puts " " + line end end end else info "Can't find diff between #{@from_branch} and #{@to_branch} in project #{project.name}." puts next end if user.nil? users = gitlab_get_team_members(gitlab_project.id) begin info "\nSelect user name or index for review." input_user = STDIN.gets.chomp if input_user =~ /[[:digit:]]/ user = users[input_user.to_i - 1] else user = gitlab_search_user(input_user) end if user.nil? error "Can not found user '#{input_user}'." else info "Assign to #{user.username}(#{user.name})" end end until !user.nil? end if @title.nil? || @title.empty? begin info "\nInput merge request title for project '#{project.name}'" @title = STDIN.gets.chomp end until @title.length > 0 end # 总共 0 (差异 0),复用 0 (差异 0) # remote: # remote: To create a merge request for dev-v3.9.0-luobin, visit: # remote: http://git.tianxiao100.com/tianxiao-ios/tianxiao/tianxiao-base-iphone-sdk/merge_requests/new?merge_request%5Bfrom_branch%5D=dev-v3.9.0-luobin # remote: # To http://git.tianxiao100.com/tianxiao-ios/tianxiao/tianxiao-base-iphone-sdk.git # * [new branch] dev-v3.9.0-luobin -> dev-v3.9.0-luobin begin merge_request = Gitlab.create_merge_request(gitlab_project.id, @title, { source_branch: @from_branch, target_branch: @to_branch, assignee_id:user ? user.id : "" }) info "Create merge request for #{project.name} success. see detail url:#{merge_request.web_url}" if !Gem.win_platform? `open -a "/Applications/Google Chrome.app" '#{merge_request.web_url}/diffs'` exitstatus = $?.exitstatus if exitstatus != 0 raise Error.new("open chrome failed.") else # info "Please review diff, then input any to continue." # STDIN.gets.chomp end end rescue Gitlab::Error::Conflict => error # merge exists info "Merge request from '#{@from_branch}' to '#{@to_branch}' exist." rescue Gitlab::Error::Error => error raise(error) end puts end end
validate!()
click to toggle source
Calls superclass method
# File lib/commands/merge.rb, line 37 def validate! super if @from_branch.nil? help! 'from_branch is required.' end if @to_branch.nil? help! 'remote_branch is required.' end end