Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
heptapod
heptapod
Commits
03ed096d57f9
Commit
03ed096d
authored
Nov 16, 2016
by
Adam Niedzielski
Browse files
Defer saving project services to the database if there are no user changes
parent
3b1a31287bdf
Changes
11
Hide whitespace changes
Inline
Side-by-side
app/controllers/projects/services_controller.rb
View file @
03ed096d
...
...
@@ -10,8 +10,7 @@
layout
"project_settings"
def
index
@project
.
build_missing_services
@services
=
@project
.
services
.
visible
.
reload
@services
=
@project
.
find_or_initialize_services
end
def
edit
...
...
@@ -46,6 +45,6 @@
private
def
service
@service
||=
@project
.
services
.
find
{
|
service
|
service
.
to_param
==
params
[
:id
]
}
@service
||=
@project
.
find_or_initialize_service
(
params
[
:id
]
)
end
end
app/models/project.rb
View file @
03ed096d
...
...
@@ -76,7 +76,6 @@
has_many
:boards
,
before_add: :validate_board_limit
,
dependent: :destroy
# Project services
has_many
:services
has_one
:campfire_service
,
dependent: :destroy
has_one
:drone_ci_service
,
dependent: :destroy
has_one
:emails_on_push_service
,
dependent: :destroy
...
...
@@ -748,6 +747,6 @@
update_column
(
:has_external_wiki
,
services
.
external_wikis
.
any?
)
end
def
build_missing
_services
def
find_or_initialize
_services
services_templates
=
Service
.
where
(
template:
true
)
...
...
@@ -752,5 +751,5 @@
services_templates
=
Service
.
where
(
template:
true
)
Service
.
available_services_names
.
each
do
|
service_name
|
Service
.
available_services_names
.
map
do
|
service_name
|
service
=
find_service
(
services
,
service_name
)
...
...
@@ -755,8 +754,9 @@
service
=
find_service
(
services
,
service_name
)
# If service is available but missing in db
if
service
.
nil?
if
service
service
else
# We should check if template for the service exists
template
=
find_service
(
services_templates
,
service_name
)
if
template
.
nil?
...
...
@@ -759,7 +759,7 @@
# We should check if template for the service exists
template
=
find_service
(
services_templates
,
service_name
)
if
template
.
nil?
# If no template, we should create an instance. Ex `
create
_gitlab_ci_service`
public_send
(
"
create
_
#{
service_name
}
_service"
)
# If no template, we should create an instance. Ex `
build
_gitlab_ci_service`
public_send
(
"
build
_
#{
service_name
}
_service"
)
else
...
...
@@ -765,7 +765,7 @@
else
Service
.
create
_from_template
(
self
.
id
,
template
)
Service
.
build
_from_template
(
id
,
template
)
end
end
end
end
...
...
@@ -767,8 +767,12 @@
end
end
end
end
def
find_or_initialize_service
(
name
)
find_or_initialize_services
.
find
{
|
service
|
service
.
to_param
==
name
}
end
def
create_labels
Label
.
templates
.
each
do
|
label
|
params
=
label
.
attributes
.
except
(
'id'
,
'template'
,
'created_at'
,
'updated_at'
)
...
...
app/models/service.rb
View file @
03ed096d
...
...
@@ -222,7 +222,7 @@
]
end
def
self
.
create
_from_template
(
project_id
,
template
)
def
self
.
build
_from_template
(
project_id
,
template
)
service
=
template
.
dup
service
.
template
=
false
service
.
project_id
=
project_id
...
...
@@ -226,7 +226,7 @@
service
=
template
.
dup
service
.
template
=
false
service
.
project_id
=
project_id
service
if
service
.
save
service
end
private
...
...
app/services/projects/create_service.rb
View file @
03ed096d
...
...
@@ -95,7 +95,7 @@
unless
@project
.
gitlab_project_import?
@project
.
create_wiki
unless
skip_wiki?
@project
.
build_missing_services
create_services_from_active_templates
(
@project
)
@project
.
create_labels
end
...
...
@@ -135,5 +135,12 @@
@project
end
def
create_services_from_active_templates
(
project
)
Service
.
where
(
template:
true
,
active:
true
).
each
do
|
template
|
service
=
Service
.
build_from_template
(
project
.
id
,
template
)
service
.
save!
end
end
end
end
app/views/projects/services/index.html.haml
View file @
03ed096d
...
...
@@ -28,5 +28,6 @@
%td
.hidden-xs
=
service
.
description
%td
.light
=
time_ago_in_words
service
.
updated_at
ago
-
if
service
.
updated_at
.
present?
=
time_ago_in_words
service
.
updated_at
ago
changelogs/unreleased/adam-build-missing-services-when-necessary.yml
0 → 100644
View file @
03ed096d
---
title
:
Defer saving project services to the database if there are no user changes
merge_request
:
6958
author
:
lib/api/helpers.rb
View file @
03ed096d
...
...
@@ -81,18 +81,7 @@
end
def
project_service
@project_service
||=
begin
underscored_service
=
params
[
:service_slug
].
underscore
if
Service
.
available_services_names
.
include?
(
underscored_service
)
user_project
.
build_missing_services
service_method
=
"
#{
underscored_service
}
_service"
send_service
(
service_method
)
end
end
@project_service
||=
user_project
.
find_or_initialize_service
(
params
[
:service_slug
].
underscore
)
@project_service
||
not_found!
(
"Service"
)
end
...
...
@@ -96,10 +85,6 @@
@project_service
||
not_found!
(
"Service"
)
end
def
send_service
(
service_method
)
user_project
.
send
(
service_method
)
end
def
service_attributes
@service_attributes
||=
project_service
.
fields
.
inject
([])
do
|
arr
,
hash
|
arr
<<
hash
[
:name
].
to_sym
...
...
spec/models/project_spec.rb
View file @
03ed096d
...
...
@@ -496,9 +496,6 @@
end
it
'returns nil and does not query services when there is no external issue tracker'
do
project
.
build_missing_services
project
.
reload
expect
(
project
).
not_to
receive
(
:services
)
expect
(
project
.
external_issue_tracker
).
to
eq
(
nil
)
...
...
@@ -506,9 +503,6 @@
it
'retrieves external_issue_tracker querying services and cache it when there is external issue tracker'
do
ext_project
.
reload
# Factory returns a project with changed attributes
ext_project
.
build_missing_services
ext_project
.
reload
expect
(
ext_project
).
to
receive
(
:services
).
once
.
and_call_original
2
.
times
{
expect
(
ext_project
.
external_issue_tracker
).
to
be_a_kind_of
(
RedmineService
)
}
...
...
spec/models/service_spec.rb
View file @
03ed096d
...
...
@@ -53,7 +53,7 @@
describe
"Template"
do
describe
"for pushover service"
do
let
(
:service_template
)
do
let
!
(
:service_template
)
do
PushoverService
.
create
(
template:
true
,
properties:
{
...
...
@@ -66,8 +66,6 @@
let
(
:project
)
{
create
(
:project
)
}
describe
'is prefilled for projects pushover service'
do
before
do
service_template
project
.
build_missing_services
end
it
"has all fields prefilled"
do
service
=
project
.
find_or_initialize_service
(
'pushover'
)
...
...
@@ -73,6 +71,4 @@
it
"has all fields prefilled"
do
service
=
project
.
pushover_service
expect
(
service
.
template
).
to
eq
(
false
)
expect
(
service
.
device
).
to
eq
(
'MyDevice'
)
expect
(
service
.
sound
).
to
eq
(
'mic'
)
...
...
spec/requests/api/services_spec.rb
View file @
03ed096d
...
...
@@ -56,8 +56,7 @@
# inject some properties into the service
before
do
project
.
build_missing_services
service_object
=
project
.
send
(
service_method
)
service_object
=
project
.
find_or_initialize_service
(
service
)
service_object
.
properties
=
service_attrs
service_object
.
save
end
...
...
spec/services/projects/create_service_spec.rb
View file @
03ed096d
...
...
@@ -10,13 +10,6 @@
}
end
it
'creates services on Project creation'
do
project
=
create_project
(
@user
,
@opts
)
project
.
reload
expect
(
project
.
services
).
not_to
be_empty
end
it
'creates labels on Project creation if there are templates'
do
Label
.
create
(
title:
"bug"
,
template:
true
)
project
=
create_project
(
@user
,
@opts
)
...
...
@@ -137,6 +130,19 @@
expect
(
project
.
namespace
).
to
eq
(
@user
.
namespace
)
end
end
context
'when there is an active service template'
do
before
do
create
(
:service
,
project:
nil
,
template:
true
,
active:
true
)
end
it
'creates a service from this template'
do
project
=
create_project
(
@user
,
@opts
)
project
.
reload
expect
(
project
.
services
.
count
).
to
eq
1
end
end
end
def
create_project
(
user
,
opts
)
...
...
Write
Preview
Supports
Markdown
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