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
bd22f4968883
Commit
bd22f496
authored
Jul 13, 2017
by
Grzegorz Bizon
Browse files
Recover from renaming project that has container images
parent
a9a88bb620ea
Changes
6
Hide whitespace changes
Inline
Side-by-side
app/controllers/projects_controller.rb
View file @
bd22f496
...
...
@@ -50,7 +50,8 @@
respond_to
do
|
format
|
if
result
[
:status
]
==
:success
flash
[
:notice
]
=
_
(
"Project '%{project_name}' was successfully updated."
)
%
{
project_name:
@project
.
name
}
format
.
html
do
redirect_to
(
edit_project_path
(
@project
))
end
else
...
...
@@ -53,7 +54,9 @@
format
.
html
do
redirect_to
(
edit_project_path
(
@project
))
end
else
flash
[
:alert
]
=
result
[
:message
]
format
.
html
{
render
'edit'
}
end
...
...
app/models/project.rb
View file @
bd22f496
...
...
@@ -977,8 +977,6 @@
Rails
.
logger
.
error
"Attempting to rename
#{
old_path_with_namespace
}
->
#{
new_path_with_namespace
}
"
expire_caches_before_rename
(
old_path_with_namespace
)
if
has_container_registry_tags?
Rails
.
logger
.
error
"Project
#{
old_path_with_namespace
}
cannot be renamed because container registry tags are present!"
...
...
@@ -986,6 +984,8 @@
raise
StandardError
.
new
(
'Project cannot be renamed, because images are present in its container registry'
)
end
expire_caches_before_rename
(
old_path_with_namespace
)
if
gitlab_shell
.
mv_repository
(
repository_storage_path
,
old_path_with_namespace
,
new_path_with_namespace
)
# If repository moved successfully we need to send update instructions to users.
# However we cannot allow rollback since we moved repository
...
...
app/services/projects/update_service.rb
View file @
bd22f496
module
Projects
class
UpdateService
<
BaseService
def
execute
# check that user is allowed to set specified visibility_level
new_visibility
=
params
[
:visibility_level
]
if
new_visibility
&&
new_visibility
.
to_i
!=
project
.
visibility_level
unless
can?
(
current_user
,
:change_visibility_level
,
project
)
&&
Gitlab
::
VisibilityLevel
.
allowed_for?
(
current_user
,
new_visibility
)
deny_visibility_level
(
project
,
new_visibility
)
return
error
(
'Visibility level unallowed'
)
end
unless
visibility_level_allowed?
return
error
(
'New visibility level not allowed!'
)
end
...
...
@@ -14,4 +6,6 @@
end
new_branch
=
params
[
:default_branch
]
if
project
.
has_container_registry_tags?
return
error
(
'Cannot rename project because it contains container registry tags!'
)
end
...
...
@@ -17,5 +11,5 @@
if
project
.
repository
.
exists?
&&
new_branch
&&
new_branch
!=
project
.
default_branch
if
changing_
default_branch
?
project
.
change_head
(
new_branch
)
end
...
...
@@ -28,6 +22,6 @@
success
else
error
(
'Project could not be updated'
)
error
(
'Project could not be updated
!
'
)
end
end
...
...
@@ -32,4 +26,29 @@
end
end
private
def
visibility_level_allowed?
# check that user is allowed to set specified visibility_level
new_visibility
=
params
[
:visibility_level
]
if
new_visibility
&&
new_visibility
.
to_i
!=
project
.
visibility_level
unless
can?
(
current_user
,
:change_visibility_level
,
project
)
&&
Gitlab
::
VisibilityLevel
.
allowed_for?
(
current_user
,
new_visibility
)
deny_visibility_level
(
project
,
new_visibility
)
return
false
end
end
true
end
def
changing_default_branch?
new_branch
=
params
[
:default_branch
]
project
.
repository
.
exists?
&&
new_branch
&&
new_branch
!=
project
.
default_branch
end
end
end
spec/controllers/projects_controller_spec.rb
View file @
bd22f496
...
...
@@ -211,10 +211,8 @@
let
(
:admin
)
{
create
(
:admin
)
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:new_path
)
{
'renamed_path'
}
let
(
:project_params
)
{
{
path:
new_path
}
}
before
do
sign_in
(
admin
)
end
...
...
@@ -216,8 +214,16 @@
before
do
sign_in
(
admin
)
end
it
"sets the repository to the right path after a rename"
do
controller
.
instance_variable_set
(
:@project
,
project
)
context
'when only renaming a project path'
do
it
"sets the repository to the right path after a rename"
do
expect
{
update_project
path:
'renamed_path'
}
.
to
change
{
project
.
reload
.
path
}
expect
(
project
.
reload
.
path
).
to
include
'renamed_path'
expect
(
assigns
(
:repository
).
path
).
to
include
project
.
reload
.
path
expect
(
response
).
to
have_http_status
(
302
)
end
end
...
...
@@ -223,2 +229,20 @@
context
'when project has container repositories with tags'
do
before
do
stub_container_registry_config
(
enabled:
true
)
stub_container_registry_tags
(
repository:
/image/
,
tags:
%w[rc1]
)
create
(
:container_repository
,
project:
project
,
name: :image
)
end
it
'does not allow to rename the project'
do
expect
{
update_project
path:
'renamed_path'
}
.
not_to
change
{
project
.
reload
.
path
}
expect
(
project
.
reload
.
path
).
to_not
include
'renamed_path'
expect
(
controller
).
to
set_flash
[
:alert
].
to
(
/container registry tags/
)
expect
(
response
).
to
have_http_status
(
200
)
end
end
def
update_project
(
**
parameters
)
put
:update
,
...
...
@@ -224,11 +248,7 @@
put
:update
,
namespace_id:
project
.
namespace
,
id:
project
.
id
,
project:
project_params
expect
(
project
.
repository
.
path
).
to
include
(
new_path
)
expect
(
assigns
(
:repository
).
path
).
to
eq
(
project
.
repository
.
path
)
expect
(
response
).
to
have_http_status
(
302
)
namespace_id:
project
.
namespace
.
path
,
id:
project
.
path
,
project:
parameters
end
end
...
...
spec/models/project_spec.rb
View file @
bd22f496
...
...
@@ -1236,7 +1236,7 @@
subject
{
project
.
rename_repo
}
it
{
expect
{
subject
}.
to
raise_error
(
Exception
)
}
it
{
expect
{
subject
}.
to
raise_error
(
StandardError
)
}
end
end
...
...
spec/services/projects/update_service_spec.rb
View file @
bd22f496
...
...
@@ -40,7 +40,7 @@
it
'does not update the project to public'
do
result
=
update_project
(
project
,
user
,
visibility_level:
Gitlab
::
VisibilityLevel
::
PUBLIC
)
expect
(
result
).
to
eq
({
status: :error
,
message:
'
V
isibility level
u
nallowed'
})
expect
(
result
).
to
eq
({
status: :error
,
message:
'
New v
isibility level n
ot
allowed
!
'
})
expect
(
project
).
to
be_private
end
...
...
@@ -92,7 +92,8 @@
it
'returns an error result when record cannot be updated'
do
result
=
update_project
(
project
,
admin
,
{
name:
'foo&bar'
})
expect
(
result
).
to
eq
({
status: :error
,
message:
'Project could not be updated'
})
expect
(
result
).
to
eq
({
status: :error
,
message:
'Project could not be updated!'
})
end
def
update_project
(
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