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
9ba1176e
Commit
9ba1176e
authored
Nov 02, 2020
by
GitLab Bot
Browse files
Options
Browse Files
Download
Plain Diff
Automatic merge of gitlab-org/gitlab master
parents
e4515e07
263a9980
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
636 additions
and
15 deletions
+636
-15
app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue
.../vue_shared/components/sidebar/issuable_move_dropdown.vue
+211
-0
app/assets/stylesheets/pages/issuable.scss
app/assets/stylesheets/pages/issuable.scss
+19
-0
app/services/projects/container_repository/delete_tags_service.rb
...ices/projects/container_repository/delete_tags_service.rb
+3
-3
app/services/projects/container_repository/gitlab/delete_tags_service.rb
...ojects/container_repository/gitlab/delete_tags_service.rb
+7
-4
changelogs/unreleased/delete_tags_service_logging_enhancement.yml
...gs/unreleased/delete_tags_service_logging_enhancement.yml
+6
-0
locale/gitlab.pot
locale/gitlab.pot
+3
-0
spec/frontend/vue_shared/components/sidebar/issuable_move_dropdown_spec.js
..._shared/components/sidebar/issuable_move_dropdown_spec.js
+375
-0
spec/services/projects/container_repository/delete_tags_service_spec.rb
...projects/container_repository/delete_tags_service_spec.rb
+11
-7
spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb
...s/container_repository/gitlab/delete_tags_service_spec.rb
+1
-1
No files found.
app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue
0 → 100644
View file @
9ba1176e
<
script
>
import
{
GlIcon
,
GlLoadingIcon
,
GlDropdown
,
GlDropdownForm
,
GlDropdownItem
,
GlSearchBoxByType
,
GlButton
,
GlTooltipDirective
as
GlTooltip
,
}
from
'
@gitlab/ui
'
;
import
axios
from
'
~/lib/utils/axios_utils
'
;
export
default
{
components
:
{
GlIcon
,
GlLoadingIcon
,
GlDropdown
,
GlDropdownForm
,
GlDropdownItem
,
GlSearchBoxByType
,
GlButton
,
},
directives
:
{
GlTooltip
,
},
props
:
{
projectsFetchPath
:
{
type
:
String
,
required
:
true
,
},
dropdownButtonTitle
:
{
type
:
String
,
required
:
true
,
},
dropdownHeaderTitle
:
{
type
:
String
,
required
:
true
,
},
moveInProgress
:
{
type
:
Boolean
,
required
:
false
,
default
:
false
,
},
},
data
()
{
return
{
projectsListLoading
:
false
,
projectsListLoadFailed
:
false
,
searchKey
:
''
,
projects
:
[],
selectedProject
:
null
,
projectItemClick
:
false
,
};
},
computed
:
{
hasNoSearchResults
()
{
return
Boolean
(
!
this
.
projectsListLoading
&&
!
this
.
projectsListLoadFailed
&&
this
.
searchKey
&&
!
this
.
projects
.
length
,
);
},
failedToLoadResults
()
{
return
!
this
.
projectsListLoading
&&
this
.
projectsListLoadFailed
;
},
},
watch
:
{
searchKey
(
value
=
''
)
{
this
.
fetchProjects
(
value
);
},
},
methods
:
{
fetchProjects
(
search
=
''
)
{
this
.
projectsListLoading
=
true
;
this
.
projectsListLoadFailed
=
false
;
return
axios
.
get
(
this
.
projectsFetchPath
,
{
params
:
{
search
,
},
})
.
then
(({
data
})
=>
{
this
.
projects
=
data
;
this
.
$refs
.
searchInput
.
focusInput
();
})
.
catch
(()
=>
{
this
.
projectsListLoadFailed
=
true
;
})
.
finally
(()
=>
{
this
.
projectsListLoading
=
false
;
});
},
isSelectedProject
(
project
)
{
if
(
this
.
selectedProject
)
{
return
this
.
selectedProject
.
id
===
project
.
id
;
}
return
false
;
},
/**
* This handler is to prevent dropdown
* from closing when an item is selected
* and emit an event only when dropdown closes.
*/
handleDropdownHide
(
e
)
{
if
(
this
.
projectItemClick
)
{
e
.
preventDefault
();
this
.
projectItemClick
=
false
;
}
else
{
this
.
$emit
(
'
dropdown-close
'
);
}
},
handleDropdownCloseClick
()
{
this
.
$refs
.
dropdown
.
hide
();
},
handleProjectSelect
(
project
)
{
this
.
selectedProject
=
project
.
id
===
this
.
selectedProject
?.
id
?
null
:
project
;
this
.
projectItemClick
=
true
;
},
handleMoveClick
()
{
this
.
$refs
.
dropdown
.
hide
();
this
.
$emit
(
'
move-issuable
'
,
this
.
selectedProject
);
},
},
};
</
script
>
<
template
>
<div
class=
"block js-issuable-move-block issuable-move-dropdown sidebar-move-issue-dropdown"
>
<div
v-gl-tooltip
.
left
.
viewport
data-testid=
"move-collapsed"
:title=
"dropdownButtonTitle"
class=
"sidebar-collapsed-icon"
@
click=
"$emit('toggle-collapse')"
>
<gl-icon
name=
"arrow-right"
/>
</div>
<gl-dropdown
ref=
"dropdown"
:block=
"true"
:disabled=
"moveInProgress"
class=
"hide-collapsed"
toggle-class=
"js-sidebar-dropdown-toggle"
@
shown=
"fetchProjects"
@
hide=
"handleDropdownHide"
>
<template
#button-content
><gl-loading-icon
v-if=
"moveInProgress"
class=
"gl-mr-3"
/>
{{
dropdownButtonTitle
}}
</
template
>
<gl-dropdown-form
class=
"gl-pt-0"
>
<div
data-testid=
"header"
class=
"gl-display-flex gl-pb-3 gl-border-1 gl-border-b-solid gl-border-gray-100"
>
<span
class=
"gl-flex-grow-1 gl-text-center gl-font-weight-bold gl-py-1"
>
{{
dropdownHeaderTitle
}}
</span>
<gl-button
variant=
"link"
icon=
"close"
class=
"gl-mr-2 gl-w-auto! gl-p-2!"
@
click.prevent=
"handleDropdownCloseClick"
/>
</div>
<gl-search-box-by-type
ref=
"searchInput"
v-model.trim=
"searchKey"
:placeholder=
"__('Search project')"
:debounce=
"300"
/>
<div
data-testid=
"content"
class=
"dropdown-content"
>
<gl-loading-icon
v-if=
"projectsListLoading"
size=
"md"
class=
"gl-p-5"
/>
<ul
v-else
>
<gl-dropdown-item
v-for=
"project in projects"
:key=
"project.id"
:is-check-item=
"true"
:is-checked=
"isSelectedProject(project)"
@
click.stop.prevent=
"handleProjectSelect(project)"
>
{{ project.name_with_namespace }}
</gl-dropdown-item
>
</ul>
<div
v-if=
"hasNoSearchResults"
class=
"gl-text-center gl-p-3"
>
{{ __('No matching results') }}
</div>
<div
v-if=
"failedToLoadResults"
class=
"gl-text-center gl-p-3"
>
{{ __('Failed to load projects') }}
</div>
</div>
<div
data-testid=
"footer"
class=
"gl-pt-3 gl-px-3 gl-border-1 gl-border-t-solid gl-border-gray-100"
>
<gl-button
category=
"primary"
variant=
"success"
:disabled=
"!Boolean(selectedProject)"
class=
"gl-text-center! issuable-move-button"
@
click=
"handleMoveClick"
>
{{ __('Move') }}
</gl-button
>
</div>
</gl-dropdown-form>
</gl-dropdown>
</div>
</template>
app/assets/stylesheets/pages/issuable.scss
View file @
9ba1176e
...
@@ -921,6 +921,25 @@
...
@@ -921,6 +921,25 @@
}
}
}
}
/*
* Following overrides are done to prevent
* legacy dropdown styles from influencing
* GitLab UI components used within GlDropdown
*/
.issuable-move-dropdown
{
.b-dropdown-form
{
@include
gl-p-0
;
}
.gl-search-box-by-type
button
.gl-clear-icon-button
:hover
{
@include
gl-bg-transparent
;
}
.issuable-move-button
:not
(
.disabled
)
:hover
{
@include
gl-text-white
;
}
}
.right-sidebar-collapsed
{
.right-sidebar-collapsed
{
.sidebar-grouped-item
{
.sidebar-grouped-item
{
.sidebar-collapsed-icon
{
.sidebar-collapsed-icon
{
...
...
app/services/projects/container_repository/delete_tags_service.rb
View file @
9ba1176e
...
@@ -36,11 +36,11 @@ module Projects
...
@@ -36,11 +36,11 @@ module Projects
def
log_response
(
response
)
def
log_response
(
response
)
log_data
=
LOG_DATA_BASE
.
merge
(
log_data
=
LOG_DATA_BASE
.
merge
(
container_repository_id:
@container_repository
.
id
,
container_repository_id:
@container_repository
.
id
,
message:
'deleted tags'
message:
'deleted tags'
,
)
deleted_tags_count:
response
[
:deleted
]
&
.
size
).
compact
if
response
[
:status
]
==
:success
if
response
[
:status
]
==
:success
log_data
[
:deleted_tags_count
]
=
response
[
:deleted
].
size
log_info
(
log_data
)
log_info
(
log_data
)
else
else
log_data
[
:message
]
=
response
[
:message
]
log_data
[
:message
]
=
response
[
:message
]
...
...
app/services/projects/container_repository/gitlab/delete_tags_service.rb
View file @
9ba1176e
...
@@ -14,6 +14,7 @@ module Projects
...
@@ -14,6 +14,7 @@ module Projects
def
initialize
(
container_repository
,
tag_names
)
def
initialize
(
container_repository
,
tag_names
)
@container_repository
=
container_repository
@container_repository
=
container_repository
@tag_names
=
tag_names
@tag_names
=
tag_names
@deleted_tags
=
[]
end
end
# Delete tags by name with a single DELETE request. This is only supported
# Delete tags by name with a single DELETE request. This is only supported
...
@@ -25,7 +26,7 @@ module Projects
...
@@ -25,7 +26,7 @@ module Projects
delete_tags
delete_tags
rescue
TimeoutError
=>
e
rescue
TimeoutError
=>
e
::
Gitlab
::
ErrorTracking
.
track_exception
(
e
,
tags_count:
@tag_names
&
.
size
,
container_repository_id:
@container_repository
&
.
id
)
::
Gitlab
::
ErrorTracking
.
track_exception
(
e
,
tags_count:
@tag_names
&
.
size
,
container_repository_id:
@container_repository
&
.
id
)
error
(
'timeout while deleting tags'
)
error
(
'timeout while deleting tags'
,
nil
,
pass_back:
{
deleted:
@deleted_tags
}
)
end
end
private
private
...
@@ -33,13 +34,15 @@ module Projects
...
@@ -33,13 +34,15 @@ module Projects
def
delete_tags
def
delete_tags
start_time
=
Time
.
zone
.
now
start_time
=
Time
.
zone
.
now
deleted_tags
=
@tag_names
.
select
do
|
name
|
@tag_names
.
each
do
|
name
|
raise
TimeoutError
if
timeout?
(
start_time
)
raise
TimeoutError
if
timeout?
(
start_time
)
@container_repository
.
delete_tag_by_name
(
name
)
if
@container_repository
.
delete_tag_by_name
(
name
)
@deleted_tags
.
append
(
name
)
end
end
end
deleted_tags
.
any?
?
success
(
deleted:
deleted_tags
)
:
error
(
'could not delete tags'
)
@deleted_tags
.
any?
?
success
(
deleted:
@
deleted_tags
)
:
error
(
'could not delete tags'
)
end
end
def
timeout?
(
start_time
)
def
timeout?
(
start_time
)
...
...
changelogs/unreleased/delete_tags_service_logging_enhancement.yml
0 → 100644
View file @
9ba1176e
---
title
:
Improving Container Registry Delete Tags Service to log number of successfully
deleted tags even if deletion process was interrupted by a timeout
merge_request
:
46079
author
:
Maksim Stankevic, @maksimstankevic
type
:
changed
locale/gitlab.pot
View file @
9ba1176e
...
@@ -11139,6 +11139,9 @@ msgstr ""
...
@@ -11139,6 +11139,9 @@ msgstr ""
msgid "Failed to load milestones. Please try again."
msgid "Failed to load milestones. Please try again."
msgstr ""
msgstr ""
msgid "Failed to load projects"
msgstr ""
msgid "Failed to load related branches"
msgid "Failed to load related branches"
msgstr ""
msgstr ""
...
...
spec/frontend/vue_shared/components/sidebar/issuable_move_dropdown_spec.js
0 → 100644
View file @
9ba1176e
This diff is collapsed.
Click to expand it.
spec/services/projects/container_repository/delete_tags_service_spec.rb
View file @
9ba1176e
...
@@ -27,13 +27,17 @@ RSpec.describe Projects::ContainerRepository::DeleteTagsService do
...
@@ -27,13 +27,17 @@ RSpec.describe Projects::ContainerRepository::DeleteTagsService do
end
end
end
end
RSpec
.
shared_examples
'logging an error response'
do
|
message:
'could not delete tags'
|
RSpec
.
shared_examples
'logging an error response'
do
|
message:
'could not delete tags'
,
extra_log:
{}
|
it
'logs an error message'
do
it
'logs an error message'
do
expect
(
service
).
to
receive
(
:log_error
).
with
(
log_data
=
{
service_class:
'Projects::ContainerRepository::DeleteTagsService'
,
service_class:
'Projects::ContainerRepository::DeleteTagsService'
,
message:
message
,
message:
message
,
container_repository_id:
repository
.
id
container_repository_id:
repository
.
id
)
}
log_data
.
merge!
(
extra_log
)
if
extra_log
.
any?
expect
(
service
).
to
receive
(
:log_error
).
with
(
log_data
)
subject
subject
end
end
...
@@ -115,7 +119,7 @@ RSpec.describe Projects::ContainerRepository::DeleteTagsService do
...
@@ -115,7 +119,7 @@ RSpec.describe Projects::ContainerRepository::DeleteTagsService do
it
{
is_expected
.
to
include
(
status: :error
,
message:
'timeout while deleting tags'
)
}
it
{
is_expected
.
to
include
(
status: :error
,
message:
'timeout while deleting tags'
)
}
it_behaves_like
'logging an error response'
,
message:
'timeout while deleting tags'
it_behaves_like
'logging an error response'
,
message:
'timeout while deleting tags'
,
extra_log:
{
deleted_tags_count:
0
}
end
end
end
end
end
end
...
...
spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb
View file @
9ba1176e
...
@@ -67,7 +67,7 @@ RSpec.describe Projects::ContainerRepository::Gitlab::DeleteTagsService do
...
@@ -67,7 +67,7 @@ RSpec.describe Projects::ContainerRepository::Gitlab::DeleteTagsService do
stub_delete_reference_requests
(
'A'
=>
200
)
stub_delete_reference_requests
(
'A'
=>
200
)
end
end
it
{
is_expected
.
to
include
(
status: :error
,
message:
'timeout while deleting tags'
)
}
it
{
is_expected
.
to
eq
(
status: :error
,
message:
'timeout while deleting tags'
,
deleted:
[
'A'
]
)
}
it
'tracks the exception'
do
it
'tracks the exception'
do
expect
(
::
Gitlab
::
ErrorTracking
)
expect
(
::
Gitlab
::
ErrorTracking
)
...
...
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