Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
6297446d
Commit
6297446d
authored
Mar 01, 2018
by
Oswaldo Ferreira
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move wip handling to MergeRequest::BaseService
parent
7b31095e
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
25 additions
and
1044 deletions
+25
-1044
app/services/issuable_base_service.rb
app/services/issuable_base_service.rb
+5
-16
app/services/merge_requests/base_service.rb
app/services/merge_requests/base_service.rb
+11
-0
app/services/merge_requests/create_service.rb
app/services/merge_requests/create_service.rb
+6
-0
app/services/quick_actions/interpret_service.rb
app/services/quick_actions/interpret_service.rb
+3
-3
app/services/slash_commands/interpret_service.rb
app/services/slash_commands/interpret_service.rb
+0
-336
spec/services/slash_commands/interpret_service_spec.rb
spec/services/slash_commands/interpret_service_spec.rb
+0
-689
No files found.
app/services/issuable_base_service.rb
View file @
6297446d
...
...
@@ -109,6 +109,10 @@ class IssuableBaseService < BaseService
@available_labels
||=
LabelsFinder
.
new
(
current_user
,
project_id:
@project
.
id
).
execute
end
def
handle_quick_actions
(
issuable
)
merge_quick_actions_into_params!
(
issuable
)
end
def
merge_quick_actions_into_params!
(
issuable
)
original_description
=
params
.
fetch
(
:description
,
issuable
.
description
)
...
...
@@ -131,8 +135,7 @@ class IssuableBaseService < BaseService
end
def
create
(
issuable
)
merge_quick_actions_into_params!
(
issuable
)
handle_wip_event
(
issuable
)
handle_quick_actions
(
issuable
)
filter_params
(
issuable
)
params
.
delete
(
:state_event
)
...
...
@@ -312,18 +315,4 @@ class IssuableBaseService < BaseService
def
parent
project
end
def
handle_wip_event
(
issuable
)
if
wip_event
=
params
.
delete
(
:wip_event
)
case
issuable
when
MergeRequest
# We update the title that is provided in the params or we use the mr title
title
=
params
[
:title
]
||
issuable
.
title
params
[
:title
]
=
case
wip_event
when
:wip
then
MergeRequest
.
wip_title
(
title
)
when
:unwip
then
MergeRequest
.
wipless_title
(
title
)
end
end
end
end
end
app/services/merge_requests/base_service.rb
View file @
6297446d
...
...
@@ -24,6 +24,17 @@ module MergeRequests
private
def
handle_wip_event
(
merge_request
)
if
wip_event
=
params
.
delete
(
:wip_event
)
# We update the title that is provided in the params or we use the mr title
title
=
params
[
:title
]
||
merge_request
.
title
params
[
:title
]
=
case
wip_event
when
'wip'
then
MergeRequest
.
wip_title
(
title
)
when
'unwip'
then
MergeRequest
.
wipless_title
(
title
)
end
end
end
def
merge_request_metrics_service
(
merge_request
)
MergeRequestMetricsService
.
new
(
merge_request
.
metrics
)
end
...
...
app/services/merge_requests/create_service.rb
View file @
6297446d
...
...
@@ -34,6 +34,12 @@ module MergeRequests
super
end
# Override from IssuableBaseService
def
handle_quick_actions
(
merge_request
)
super
handle_wip_event
(
merge_request
)
end
private
def
update_merge_requests_head_pipeline
(
merge_request
)
...
...
app/services/quick_actions/interpret_service.rb
View file @
6297446d
...
...
@@ -347,9 +347,9 @@ module QuickActions
"
#{
verb
}
this
#{
noun
}
as Work In Progress."
end
condition
do
issuable
.
persisted?
&&
issuable
.
respond_to?
(
:work_in_progress?
)
&&
current_user
.
can?
(
:"update_
#{
issuable
.
to_ability_name
}
"
,
issuable
)
issuable
.
respond_to?
(
:work_in_progress?
)
&&
# Allow it to mark as WIP on MR creation page _or_ through MR notes.
(
issuable
.
new_record?
||
current_user
.
can?
(
:"update_
#{
issuable
.
to_ability_name
}
"
,
issuable
)
)
end
command
:wip
do
@updates
[
:wip_event
]
=
issuable
.
work_in_progress?
?
'unwip'
:
'wip'
...
...
app/services/slash_commands/interpret_service.rb
deleted
100644 → 0
View file @
7b31095e
module
SlashCommands
class
InterpretService
<
BaseService
include
Gitlab
::
SlashCommands
::
Dsl
attr_reader
:issuable
,
:options
# Takes a text and interprets the commands that are extracted from it.
# Returns the content without commands, and hash of changes to be applied to a record.
def
execute
(
content
,
issuable
)
@issuable
=
issuable
@updates
=
{}
opts
=
{
issuable:
issuable
,
current_user:
current_user
,
project:
project
,
params:
params
}
content
,
commands
=
extractor
.
extract_commands
(
content
,
opts
)
commands
.
each
do
|
name
,
arg
|
definition
=
self
.
class
.
command_definitions_by_name
[
name
.
to_sym
]
next
unless
definition
definition
.
execute
(
self
,
opts
,
arg
)
end
[
content
,
@updates
]
end
private
def
extractor
Gitlab
::
SlashCommands
::
Extractor
.
new
(
self
.
class
.
command_definitions
)
end
desc
do
"Close this
#{
issuable
.
to_ability_name
.
humanize
(
capitalize:
false
)
}
"
end
condition
do
issuable
.
persisted?
&&
issuable
.
open?
&&
current_user
.
can?
(
:"update_
#{
issuable
.
to_ability_name
}
"
,
issuable
)
end
command
:close
do
@updates
[
:state_event
]
=
'close'
end
desc
do
"Reopen this
#{
issuable
.
to_ability_name
.
humanize
(
capitalize:
false
)
}
"
end
condition
do
issuable
.
persisted?
&&
issuable
.
closed?
&&
current_user
.
can?
(
:"update_
#{
issuable
.
to_ability_name
}
"
,
issuable
)
end
command
:reopen
do
@updates
[
:state_event
]
=
'reopen'
end
desc
'Merge (when build succeeds)'
condition
do
last_diff_sha
=
params
&&
params
[
:merge_request_diff_head_sha
]
issuable
.
is_a?
(
MergeRequest
)
&&
issuable
.
persisted?
&&
issuable
.
mergeable_with_slash_command?
(
current_user
,
autocomplete_precheck:
!
last_diff_sha
,
last_diff_sha:
last_diff_sha
)
end
command
:merge
do
@updates
[
:merge
]
=
params
[
:merge_request_diff_head_sha
]
end
desc
'Change title'
params
'<New title>'
condition
do
issuable
.
persisted?
&&
current_user
.
can?
(
:"update_
#{
issuable
.
to_ability_name
}
"
,
issuable
)
end
command
:title
do
|
title_param
|
@updates
[
:title
]
=
title_param
end
desc
'Assign'
params
'@user'
condition
do
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:assign
do
|
assignee_param
|
user
=
extract_references
(
assignee_param
,
:user
).
first
user
||=
User
.
find_by
(
username:
assignee_param
)
@updates
[
:assignee_id
]
=
user
.
id
if
user
end
desc
'Remove assignee'
condition
do
issuable
.
persisted?
&&
issuable
.
assignee_id?
&&
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:unassign
do
@updates
[
:assignee_id
]
=
nil
end
desc
'Set milestone'
params
'%"milestone"'
condition
do
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
&&
project
.
milestones
.
active
.
any?
end
command
:milestone
do
|
milestone_param
|
milestone
=
extract_references
(
milestone_param
,
:milestone
).
first
milestone
||=
project
.
milestones
.
find_by
(
title:
milestone_param
.
strip
)
@updates
[
:milestone_id
]
=
milestone
.
id
if
milestone
end
desc
'Remove milestone'
condition
do
issuable
.
persisted?
&&
issuable
.
milestone_id?
&&
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:remove_milestone
do
@updates
[
:milestone_id
]
=
nil
end
desc
'Add label(s)'
params
'~label1 ~"label 2"'
condition
do
available_labels
=
LabelsFinder
.
new
(
current_user
,
project_id:
project
.
id
).
execute
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
&&
available_labels
.
any?
end
command
:label
do
|
labels_param
|
label_ids
=
find_label_ids
(
labels_param
)
if
label_ids
.
any?
@updates
[
:add_label_ids
]
||=
[]
@updates
[
:add_label_ids
]
+=
label_ids
@updates
[
:add_label_ids
].
uniq!
end
end
desc
'Remove all or specific label(s)'
params
'~label1 ~"label 2"'
condition
do
issuable
.
persisted?
&&
issuable
.
labels
.
any?
&&
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:unlabel
do
|
labels_param
=
nil
|
if
labels_param
.
present?
label_ids
=
find_label_ids
(
labels_param
)
if
label_ids
.
any?
@updates
[
:remove_label_ids
]
||=
[]
@updates
[
:remove_label_ids
]
+=
label_ids
@updates
[
:remove_label_ids
].
uniq!
end
else
@updates
[
:label_ids
]
=
[]
end
end
desc
'Replace all label(s)'
params
'~label1 ~"label 2"'
condition
do
issuable
.
persisted?
&&
issuable
.
labels
.
any?
&&
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:relabel
do
|
labels_param
|
label_ids
=
find_label_ids
(
labels_param
)
if
label_ids
.
any?
@updates
[
:label_ids
]
||=
[]
@updates
[
:label_ids
]
+=
label_ids
@updates
[
:label_ids
].
uniq!
end
end
desc
'Add a todo'
condition
do
issuable
.
persisted?
&&
!
TodoService
.
new
.
todo_exist?
(
issuable
,
current_user
)
end
command
:todo
do
@updates
[
:todo_event
]
=
'add'
end
desc
'Mark todo as done'
condition
do
issuable
.
persisted?
&&
TodoService
.
new
.
todo_exist?
(
issuable
,
current_user
)
end
command
:done
do
@updates
[
:todo_event
]
=
'done'
end
desc
'Subscribe'
condition
do
issuable
.
persisted?
&&
!
issuable
.
subscribed?
(
current_user
,
project
)
end
command
:subscribe
do
@updates
[
:subscription_event
]
=
'subscribe'
end
desc
'Unsubscribe'
condition
do
issuable
.
persisted?
&&
issuable
.
subscribed?
(
current_user
,
project
)
end
command
:unsubscribe
do
@updates
[
:subscription_event
]
=
'unsubscribe'
end
desc
'Set due date'
params
'<in 2 days | this Friday | December 31st>'
condition
do
issuable
.
respond_to?
(
:due_date
)
&&
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:due
do
|
due_date_param
|
due_date
=
Chronic
.
parse
(
due_date_param
).
try
(
:to_date
)
@updates
[
:due_date
]
=
due_date
if
due_date
end
desc
'Remove due date'
condition
do
issuable
.
persisted?
&&
issuable
.
respond_to?
(
:due_date
)
&&
issuable
.
due_date?
&&
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:remove_due_date
do
@updates
[
:due_date
]
=
nil
end
desc
do
"Toggle the Work In Progress status"
end
condition
do
issuable
.
respond_to?
(
:work_in_progress?
)
&&
(
# /wip on comment text on MR page
(
issuable
.
persisted?
&&
current_user
.
can?
(
:"update_
#{
issuable
.
to_ability_name
}
"
,
issuable
))
||
# /wip on create MR page
issuable
.
new_record?
)
end
command
:wip
do
@updates
[
:wip_event
]
=
issuable
.
work_in_progress?
?
:unwip
:
:wip
end
desc
'Set time estimate'
params
'<1w 3d 2h 14m>'
condition
do
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:estimate
do
|
raw_duration
|
time_estimate
=
Gitlab
::
TimeTrackingFormatter
.
parse
(
raw_duration
)
if
time_estimate
@updates
[
:time_estimate
]
=
time_estimate
end
end
desc
'Add or substract spent time'
params
'<1h 30m | -1h 30m>'
condition
do
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
issuable
)
end
command
:spend
do
|
raw_duration
|
time_spent
=
Gitlab
::
TimeTrackingFormatter
.
parse
(
raw_duration
)
if
time_spent
@updates
[
:spend_time
]
=
{
duration:
time_spent
,
user:
current_user
}
end
end
desc
'Remove time estimate'
condition
do
issuable
.
persisted?
&&
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:remove_estimate
do
@updates
[
:time_estimate
]
=
0
end
desc
'Remove spent time'
condition
do
issuable
.
persisted?
&&
current_user
.
can?
(
:"admin_
#{
issuable
.
to_ability_name
}
"
,
project
)
end
command
:remove_time_spent
do
@updates
[
:spend_time
]
=
{
duration: :reset
,
user:
current_user
}
end
# This is a dummy command, so that it appears in the autocomplete commands
desc
'CC'
params
'@user'
command
:cc
desc
'Defines target branch for MR'
params
'<Local branch name>'
condition
do
issuable
.
respond_to?
(
:target_branch
)
&&
(
current_user
.
can?
(
:"update_
#{
issuable
.
to_ability_name
}
"
,
issuable
)
||
issuable
.
new_record?
)
end
command
:target_branch
do
|
target_branch_param
|
branch_name
=
target_branch_param
.
strip
@updates
[
:target_branch
]
=
branch_name
if
project
.
repository
.
branch_names
.
include?
(
branch_name
)
end
def
find_label_ids
(
labels_param
)
label_ids_by_reference
=
extract_references
(
labels_param
,
:label
).
map
(
&
:id
)
labels_ids_by_name
=
LabelsFinder
.
new
(
current_user
,
project_id:
project
.
id
,
name:
labels_param
.
split
).
execute
.
select
(
:id
)
label_ids_by_reference
|
labels_ids_by_name
end
def
extract_references
(
arg
,
type
)
ext
=
Gitlab
::
ReferenceExtractor
.
new
(
project
,
current_user
)
ext
.
analyze
(
arg
,
author:
current_user
)
ext
.
references
(
type
)
end
end
end
spec/services/slash_commands/interpret_service_spec.rb
deleted
100644 → 0
View file @
7b31095e
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment