Merge branch 'mikew1/gitlab-ce-better-asana-refs' into 'master'
Better support for referencing and closing issues in asana_service.rb (by @mikew1) See merge request !2302
This commit is contained in:
commit
8de1f7159c
2 changed files with 109 additions and 46 deletions
|
@ -40,8 +40,8 @@ get the commit comment added to it.
|
|||
|
||||
You can also close a task with a message containing: `fix #123456`.
|
||||
|
||||
You can find your Api Keys here:
|
||||
http://developer.asana.com/documentation/#api_keys'
|
||||
You can create a Personal Access Token here:
|
||||
http://app.asana.com/-/account_api'
|
||||
end
|
||||
|
||||
def to_param
|
||||
|
@ -53,14 +53,12 @@ http://developer.asana.com/documentation/#api_keys'
|
|||
{
|
||||
type: 'text',
|
||||
name: 'api_key',
|
||||
placeholder: 'User API token. User must have access to task,
|
||||
all comments will be attributed to this user.'
|
||||
placeholder: 'User Personal Access Token. User must have access to task, all comments will be attributed to this user.'
|
||||
},
|
||||
{
|
||||
type: 'text',
|
||||
name: 'restrict_to_branch',
|
||||
placeholder: 'Comma-separated list of branches which will be
|
||||
automatically inspected. Leave blank to include all branches.'
|
||||
placeholder: 'Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches.'
|
||||
}
|
||||
]
|
||||
end
|
||||
|
@ -69,58 +67,58 @@ automatically inspected. Leave blank to include all branches.'
|
|||
%w(push)
|
||||
end
|
||||
|
||||
def client
|
||||
@_client ||= begin
|
||||
Asana::Client.new do |c|
|
||||
c.authentication :access_token, api_key
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def execute(data)
|
||||
return unless supported_events.include?(data[:object_kind])
|
||||
|
||||
Asana.configure do |client|
|
||||
client.api_key = api_key
|
||||
end
|
||||
|
||||
user = data[:user_name]
|
||||
branch = Gitlab::Git.ref_name(data[:ref])
|
||||
|
||||
branch_restriction = restrict_to_branch.to_s
|
||||
|
||||
# check the branch restriction is poplulated and branch is not included
|
||||
branch = Gitlab::Git.ref_name(data[:ref])
|
||||
branch_restriction = restrict_to_branch.to_s
|
||||
if branch_restriction.length > 0 && branch_restriction.index(branch).nil?
|
||||
return
|
||||
end
|
||||
|
||||
user = data[:user_name]
|
||||
project_name = project.name_with_namespace
|
||||
push_msg = user + ' pushed to branch ' + branch + ' of ' + project_name
|
||||
|
||||
data[:commits].each do |commit|
|
||||
check_commit(' ( ' + commit[:url] + ' ): ' + commit[:message], push_msg)
|
||||
push_msg = "#{user} pushed to branch #{branch} of #{project_name} ( #{commit[:url]} ):"
|
||||
check_commit(commit[:message], push_msg)
|
||||
end
|
||||
end
|
||||
|
||||
def check_commit(message, push_msg)
|
||||
task_list = []
|
||||
close_list = []
|
||||
# matches either:
|
||||
# - #1234
|
||||
# - https://app.asana.com/0/0/1234
|
||||
# optionally preceded with:
|
||||
# - fix/ed/es/ing
|
||||
# - close/s/d
|
||||
# - closing
|
||||
issue_finder = /(fix\w*|clos[ei]\w*+)?\W*(?:https:\/\/app\.asana\.com\/\d+\/\d+\/(\d+)|#(\d+))/i
|
||||
|
||||
message.split("\n").each do |line|
|
||||
# look for a task ID or a full Asana url
|
||||
task_list.concat(line.scan(/#(\d+)/))
|
||||
task_list.concat(line.scan(/https:\/\/app\.asana\.com\/\d+\/\d+\/(\d+)/))
|
||||
# look for a word starting with 'fix' followed by a task ID
|
||||
close_list.concat(line.scan(/(fix\w*)\W*#(\d+)/i))
|
||||
end
|
||||
message.scan(issue_finder).each do |tuple|
|
||||
# tuple will be
|
||||
# [ 'fix', 'id_from_url', 'id_from_pound' ]
|
||||
taskid = tuple[2] || tuple[1]
|
||||
|
||||
# post commit to every taskid found
|
||||
task_list.each do |taskid|
|
||||
task = Asana::Task.find(taskid[0])
|
||||
begin
|
||||
task = Asana::Task.find_by_id(client, taskid)
|
||||
task.add_comment(text: "#{push_msg} #{message}")
|
||||
|
||||
if task
|
||||
task.create_story(text: push_msg + ' ' + message)
|
||||
end
|
||||
end
|
||||
|
||||
# close all tasks that had 'fix(ed/es/ing) #:id' in them
|
||||
close_list.each do |taskid|
|
||||
task = Asana::Task.find(taskid.last)
|
||||
|
||||
if task
|
||||
task.modify(completed: true)
|
||||
if tuple[0]
|
||||
task.update(completed: true)
|
||||
end
|
||||
rescue => e
|
||||
Rails.logger.error(e.message)
|
||||
next
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -40,6 +40,20 @@ describe AsanaService, models: true do
|
|||
let(:user) { create(:user) }
|
||||
let(:project) { create(:project) }
|
||||
|
||||
def create_data_for_commits(*messages)
|
||||
{
|
||||
object_kind: 'push',
|
||||
ref: 'master',
|
||||
user_name: user.name,
|
||||
commits: messages.map do |m|
|
||||
{
|
||||
message: m,
|
||||
url: 'https://gitlab.com/',
|
||||
}
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
before do
|
||||
@asana = AsanaService.new
|
||||
allow(@asana).to receive_messages(
|
||||
|
@ -51,16 +65,67 @@ describe AsanaService, models: true do
|
|||
)
|
||||
end
|
||||
|
||||
it 'should call Asana service to created a story' do
|
||||
expect(Asana::Task).to receive(:find).with('123456').once
|
||||
it 'should call Asana service to create a story' do
|
||||
data = create_data_for_commits('Message from commit. related to #123456')
|
||||
expected_message = "#{data[:user_name]} pushed to branch #{data[:ref]} of #{project.name_with_namespace} ( #{data[:commits][0][:url]} ): #{data[:commits][0][:message]}"
|
||||
|
||||
@asana.check_commit('related to #123456', 'pushed')
|
||||
d1 = double('Asana::Task')
|
||||
expect(d1).to receive(:add_comment).with(text: expected_message)
|
||||
expect(Asana::Task).to receive(:find_by_id).with(anything, '123456').once.and_return(d1)
|
||||
|
||||
@asana.execute(data)
|
||||
end
|
||||
|
||||
it 'should call Asana service to created a story and close a task' do
|
||||
expect(Asana::Task).to receive(:find).with('456789').twice
|
||||
it 'should call Asana service to create a story and close a task' do
|
||||
data = create_data_for_commits('fix #456789')
|
||||
d1 = double('Asana::Task')
|
||||
expect(d1).to receive(:add_comment)
|
||||
expect(d1).to receive(:update).with(completed: true)
|
||||
expect(Asana::Task).to receive(:find_by_id).with(anything, '456789').once.and_return(d1)
|
||||
|
||||
@asana.check_commit('fix #456789', 'pushed')
|
||||
@asana.execute(data)
|
||||
end
|
||||
|
||||
it 'should be able to close via url' do
|
||||
data = create_data_for_commits('closes https://app.asana.com/19292/956299/42')
|
||||
d1 = double('Asana::Task')
|
||||
expect(d1).to receive(:add_comment)
|
||||
expect(d1).to receive(:update).with(completed: true)
|
||||
expect(Asana::Task).to receive(:find_by_id).with(anything, '42').once.and_return(d1)
|
||||
|
||||
@asana.execute(data)
|
||||
end
|
||||
|
||||
it 'should allow multiple matches per line' do
|
||||
message = <<-EOF
|
||||
minor bigfix, refactoring, fixed #123 and Closes #456 work on #789
|
||||
ref https://app.asana.com/19292/956299/42 and closing https://app.asana.com/19292/956299/12
|
||||
EOF
|
||||
data = create_data_for_commits(message)
|
||||
d1 = double('Asana::Task')
|
||||
expect(d1).to receive(:add_comment)
|
||||
expect(d1).to receive(:update).with(completed: true)
|
||||
expect(Asana::Task).to receive(:find_by_id).with(anything, '123').once.and_return(d1)
|
||||
|
||||
d2 = double('Asana::Task')
|
||||
expect(d2).to receive(:add_comment)
|
||||
expect(d2).to receive(:update).with(completed: true)
|
||||
expect(Asana::Task).to receive(:find_by_id).with(anything, '456').once.and_return(d2)
|
||||
|
||||
d3 = double('Asana::Task')
|
||||
expect(d3).to receive(:add_comment)
|
||||
expect(Asana::Task).to receive(:find_by_id).with(anything, '789').once.and_return(d3)
|
||||
|
||||
d4 = double('Asana::Task')
|
||||
expect(d4).to receive(:add_comment)
|
||||
expect(Asana::Task).to receive(:find_by_id).with(anything, '42').once.and_return(d4)
|
||||
|
||||
d5 = double('Asana::Task')
|
||||
expect(d5).to receive(:add_comment)
|
||||
expect(d5).to receive(:update).with(completed: true)
|
||||
expect(Asana::Task).to receive(:find_by_id).with(anything, '12').once.and_return(d5)
|
||||
|
||||
@asana.execute(data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue