lib/atlassian/stash/pullrequest.rb in atlassian-stash-0.1.6 vs lib/atlassian/stash/pullrequest.rb in atlassian-stash-0.1.8

- old
+ new

@@ -1,10 +1,13 @@ require 'json' require 'net/https' require 'uri' require 'git' +require 'launchy' +include Atlassian::Util::TextUtil + module Atlassian module Stash class CreatePullRequestResource attr_accessor :resource @@ -23,15 +26,16 @@ 'id' => target, 'repository' => repository } @resource = { 'title' => title, + 'description' => description, 'fromRef' => fromRef, 'toRef' => toRef } - @resource["reviewers"] = reviewers.collect { |r| + @resource["reviewers"] = reviewers.collect { |r| { 'user' => { 'name' => r } } @@ -46,48 +50,45 @@ def initialize(config) @config = config end def extract_repository_info (url = get_remote_url) - if m = url.match(/\/([a-zA-Z][a-zA-Z0-9_]*)\/([[:alnum:]][\w\-\.]*).git$/) + if m = url.match(/\/([a-zA-Z~][a-zA-Z0-9_]*)\/([[:alnum:]][\w\-\.]*).git$/) return RepoInfo.new(m[1], m[2]) end raise "Repository does not seem to be hosted in Stash" end - def generate_pull_request_title(source, target) - output = %x(git log --reverse --format=%s #{target}..#{source}).split(/\n/).first - output || 'Merge \'%s\' into \'%s\'' % [source, target] - end - - - def create_pull_request(source, target, reviewers) + def create_pull_request(source, target, reviewers, options) Process.exit if not target or not source + @source = source + @target = target + repoInfo = extract_repository_info - title = generate_pull_request_title source, target - description = '' - resource = CreatePullRequestResource.new(repoInfo.projectKey, repoInfo.slug, title, description, reviewers, source, target).resource + resource = CreatePullRequestResource.new(repoInfo.projectKey, repoInfo.slug, title, description, reviewers, @source, @target).resource username = @config["username"] password = @config["password"] + proxy_addr, proxy_port = parse_proxy(@config["proxy"]) username = ask("Username: ") unless @config["username"] password = ask("Password: ") { |q| q.echo = '*' } unless @config["password"] - uri = URI.parse(@config["stash_url"].downcase) + uri = URI.parse(@config["stash_url"]) prPath = uri.path + '/projects/' + repoInfo.projectKey + '/repos/' + repoInfo.slug + '/pull-requests' + prPath = uri.query.nil? ? "#{prPath}" : "#{prPath}?#{uri.query}" - req = Net::HTTP::Post.new(prPath, initheader = {'Content-Type' => 'application/json', 'Accept' => 'application/json'}) + req = Net::HTTP::Post.new(prPath, {'Content-Type' => 'application/json', 'Accept' => 'application/json'}) req.basic_auth username, password req.body = resource.to_json - http = Net::HTTP.new(uri.host, uri.port) + http = Net::HTTP.new(uri.host, uri.port, proxy_addr, proxy_port) http.verify_mode = OpenSSL::SSL::VERIFY_NONE http.use_ssl = uri.scheme.eql?("https") - response = http.start {|http| http.request(req) } + response = http.start {|conn| conn.request(req) } if not response.is_a? Net::HTTPCreated responseBody = JSON.parse(response.body) if responseBody['errors'] responseBody['errors'].collect { |error| @@ -108,11 +109,40 @@ else responseBody = JSON.parse(response.body) prUri = uri.clone prUri.path = prPath + '/' + responseBody['id'].to_s puts prUri.to_s + + if @config["open"] || options.open + Launchy.open prUri.to_s + end end + end + private + + def title + convert_branch_name_to_sentence(@source) || "Merge '#{@source}' into '#{@target}'" + end + + def description + git_commit_messages + end + + def git_commit_messages + @commit_messages ||= `git log --reverse --format=%s #{@target}..#{@source}` + end + + def parse_proxy(conf) + return nil, nil unless conf + + addr, port = conf.split(":") + if port =~ /\d+/ + port = port.to_i + else + port = nil + end + [addr, port] end end end end