summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/gitlab_net.rb7
-rw-r--r--lib/gitlab_post_receive.rb30
-rw-r--r--spec/gitlab_post_receive_spec.rb124
3 files changed, 138 insertions, 23 deletions
diff --git a/lib/gitlab_net.rb b/lib/gitlab_net.rb
index e10a07a..c06ed1e 100644
--- a/lib/gitlab_net.rb
+++ b/lib/gitlab_net.rb
@@ -54,6 +54,13 @@ class GitlabNet
JSON.parse(resp.body) rescue {}
end
+ def merge_request_urls(repo_name, changes)
+ changes = changes.join("\n") unless changes.kind_of?(String)
+ changes = changes.encode('UTF-8', 'ASCII', invalid: :replace, replace: '')
+ resp = get("#{host}/merge_request_urls?project=#{URI.escape(repo_name)}&changes=#{URI.escape(changes)}")
+ JSON.parse(resp.body) rescue []
+ end
+
def check
get("#{host}/check", read_timeout: CHECK_TIMEOUT)
end
diff --git a/lib/gitlab_post_receive.rb b/lib/gitlab_post_receive.rb
index 7874c85..9ad74f5 100644
--- a/lib/gitlab_post_receive.rb
+++ b/lib/gitlab_post_receive.rb
@@ -6,11 +6,14 @@ require 'base64'
require 'securerandom'
class GitlabPostReceive
+ include NamesHelper
+
attr_reader :config, :repo_path, :changes, :jid
def initialize(repo_path, actor, changes)
@config = GitlabConfig.new
@repo_path, @actor = repo_path.strip, actor
+ @repo_name = extract_repo_name(@repo_path.dup)
@changes = changes
@jid = SecureRandom.hex(12)
end
@@ -19,12 +22,15 @@ class GitlabPostReceive
result = update_redis
begin
- broadcast_message = GitlabNet.new.broadcast_message
+ broadcast_message = api.broadcast_message
if broadcast_message.has_key?("message")
puts
print_broadcast_message(broadcast_message["message"])
end
+
+ merge_request_urls = api.merge_request_urls(@repo_name, @changes)
+ print_merge_request_links(merge_request_urls)
rescue GitlabNet::ApiUnreachableError
nil
end
@@ -34,6 +40,28 @@ class GitlabPostReceive
protected
+ def api
+ @api ||= GitlabNet.new
+ end
+
+ def print_merge_request_links(merge_request_urls)
+ return if merge_request_urls.empty?
+ puts
+ merge_request_urls.each { |mr| print_merge_request_link(mr) }
+ end
+
+ def print_merge_request_link(merge_request)
+ if merge_request["new_merge_request"]
+ message = "Create merge request for #{merge_request["branch_name"]}:"
+ else
+ message = "View merge request for #{merge_request["branch_name"]}:"
+ end
+
+ puts message
+ puts((" " * 2) + merge_request["url"])
+ puts
+ end
+
def print_broadcast_message(message)
# A standard terminal window is (at least) 80 characters wide.
total_width = 80
diff --git a/spec/gitlab_post_receive_spec.rb b/spec/gitlab_post_receive_spec.rb
index 6762d49..db1e776 100644
--- a/spec/gitlab_post_receive_spec.rb
+++ b/spec/gitlab_post_receive_spec.rb
@@ -17,12 +17,12 @@ describe GitlabPostReceive do
before do
GitlabConfig.any_instance.stub(repos_path: repository_path)
- GitlabNet.any_instance.stub(broadcast_message: { "message" => message })
+ GitlabNet.any_instance.stub(broadcast_message: { })
+ GitlabNet.any_instance.stub(:merge_request_urls).with(repo_name, wrongly_encoded_changes) { [] }
expect(Time).to receive(:now).and_return(enqueued_at)
end
describe "#exec" do
-
before do
allow_any_instance_of(GitlabNet).to receive(:redis_client).and_return(redis_client)
allow_any_instance_of(GitlabReferenceCounter).to receive(:redis_client).and_return(redis_client)
@@ -32,27 +32,107 @@ describe GitlabPostReceive do
allow(redis_client).to receive(:rpush).and_return(true)
end
- it "prints the broadcast message" do
- expect(redis_client).to receive(:rpush)
- expect(gitlab_post_receive).to receive(:puts).ordered
- expect(gitlab_post_receive).to receive(:puts).with(
- "========================================================================"
- ).ordered
- expect(gitlab_post_receive).to receive(:puts).ordered
-
- expect(gitlab_post_receive).to receive(:puts).with(
- " test test test test test test test test test test message message"
- ).ordered
- expect(gitlab_post_receive).to receive(:puts).with(
- " message message message message message message message message"
- ).ordered
-
- expect(gitlab_post_receive).to receive(:puts).ordered
- expect(gitlab_post_receive).to receive(:puts).with(
- "========================================================================"
- ).ordered
+ context 'Without broad cast message' do
+ context 'pushing new branch' do
+ before do
+ GitlabNet.any_instance.stub(:merge_request_urls).with(repo_name, wrongly_encoded_changes) do
+ [{
+ "branch_name" => "new_branch",
+ "url" => "http://localhost/dzaporozhets/gitlab-ci/merge_requests/new?merge_request%5Bsource_branch%5D=new_branch",
+ "new_merge_request" => true
+ }]
+ end
+ end
- gitlab_post_receive.exec
+ it "prints the new merge request url" do
+ expect(redis_client).to receive(:rpush)
+
+ expect(gitlab_post_receive).to receive(:puts).ordered
+ expect(gitlab_post_receive).to receive(:puts).with(
+ "Create merge request for new_branch:"
+ ).ordered
+ expect(gitlab_post_receive).to receive(:puts).with(
+ " http://localhost/dzaporozhets/gitlab-ci/merge_requests/new?merge_request%5Bsource_branch%5D=new_branch"
+ ).ordered
+ expect(gitlab_post_receive).to receive(:puts).ordered
+
+ gitlab_post_receive.exec
+ end
+ end
+
+ context 'pushing existing branch with merge request created' do
+ before do
+ GitlabNet.any_instance.stub(:merge_request_urls).with(repo_name, wrongly_encoded_changes) do
+ [{
+ "branch_name" => "feature_branch",
+ "url" => "http://localhost/dzaporozhets/gitlab-ci/merge_requests/1",
+ "new_merge_request" => false
+ }]
+ end
+ end
+
+ it "prints the view merge request url" do
+ expect(redis_client).to receive(:rpush)
+
+ expect(gitlab_post_receive).to receive(:puts).ordered
+ expect(gitlab_post_receive).to receive(:puts).with(
+ "View merge request for feature_branch:"
+ ).ordered
+ expect(gitlab_post_receive).to receive(:puts).with(
+ " http://localhost/dzaporozhets/gitlab-ci/merge_requests/1"
+ ).ordered
+ expect(gitlab_post_receive).to receive(:puts).ordered
+
+ gitlab_post_receive.exec
+ end
+ end
+ end
+
+ context 'show broadcast message and merge request link' do
+ before do
+ GitlabNet.any_instance.stub(:merge_request_urls).with(repo_name, wrongly_encoded_changes) do
+ [{
+ "branch_name" => "new_branch",
+ "url" => "http://localhost/dzaporozhets/gitlab-ci/merge_requests/new?merge_request%5Bsource_branch%5D=new_branch",
+ "new_merge_request" => true
+ }]
+ end
+ GitlabNet.any_instance.stub(broadcast_message: { "message" => message })
+ end
+
+ it 'prints the broadcast message and create new merge request link' do
+ expect(redis_client).to receive(:rpush)
+
+ expect(gitlab_post_receive).to receive(:puts).ordered
+ expect(gitlab_post_receive).to receive(:puts).with(
+ "========================================================================"
+ ).ordered
+ expect(gitlab_post_receive).to receive(:puts).ordered
+
+ expect(gitlab_post_receive).to receive(:puts).with(
+ " test test test test test test test test test test message message"
+ ).ordered
+ expect(gitlab_post_receive).to receive(:puts).with(
+ " message message message message message message message message"
+ ).ordered
+
+ expect(gitlab_post_receive).to receive(:puts).ordered
+ expect(gitlab_post_receive).to receive(:puts).with(
+ "========================================================================"
+ ).ordered
+
+ expect(gitlab_post_receive).to receive(:puts).ordered
+ expect(gitlab_post_receive).to receive(:puts).with(
+ "Create merge request for new_branch:"
+ ).ordered
+ expect(gitlab_post_receive).to receive(:puts).with(
+ " http://localhost/dzaporozhets/gitlab-ci/merge_requests/new?merge_request%5Bsource_branch%5D=new_branch"
+ ).ordered
+ expect(gitlab_post_receive).to receive(:puts).ordered
+
+
+ gitlab_post_receive.exec
+ end
end
it "pushes a Sidekiq job onto the queue" do