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