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
9a956a02
Commit
9a956a02
authored
Oct 25, 2016
by
Valery Sizov
Browse files
Options
Browse Files
Download
Plain Diff
Merge ce master into ce_upstream
parents
8249551f
02f835c1
Changes
28
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
316 additions
and
265 deletions
+316
-265
.scss-lint.yml
.scss-lint.yml
+3
-3
CHANGELOG.md
CHANGELOG.md
+4
-0
app/assets/javascripts/build.js
app/assets/javascripts/build.js
+1
-1
app/assets/javascripts/dispatcher.js.es6
app/assets/javascripts/dispatcher.js.es6
+3
-0
app/assets/javascripts/merge_request_tabs.js
app/assets/javascripts/merge_request_tabs.js
+1
-0
app/assets/stylesheets/framework/animations.scss
app/assets/stylesheets/framework/animations.scss
+2
-2
app/assets/stylesheets/framework/logo.scss
app/assets/stylesheets/framework/logo.scss
+1
-1
app/assets/stylesheets/framework/modal.scss
app/assets/stylesheets/framework/modal.scss
+1
-1
app/assets/stylesheets/framework/tw_bootstrap_variables.scss
app/assets/stylesheets/framework/tw_bootstrap_variables.scss
+61
-61
app/assets/stylesheets/framework/variables.scss
app/assets/stylesheets/framework/variables.scss
+22
-22
app/assets/stylesheets/mailers/devise.scss
app/assets/stylesheets/mailers/devise.scss
+5
-5
app/assets/stylesheets/pages/cycle_analytics.scss
app/assets/stylesheets/pages/cycle_analytics.scss
+9
-9
app/assets/stylesheets/pages/diff.scss
app/assets/stylesheets/pages/diff.scss
+2
-2
app/assets/stylesheets/pages/environments.scss
app/assets/stylesheets/pages/environments.scss
+4
-4
app/assets/stylesheets/pages/events.scss
app/assets/stylesheets/pages/events.scss
+1
-1
app/assets/stylesheets/pages/login.scss
app/assets/stylesheets/pages/login.scss
+7
-0
app/assets/stylesheets/pages/merge_conflicts.scss
app/assets/stylesheets/pages/merge_conflicts.scss
+1
-1
app/assets/stylesheets/pages/note_form.scss
app/assets/stylesheets/pages/note_form.scss
+1
-1
app/assets/stylesheets/pages/notes.scss
app/assets/stylesheets/pages/notes.scss
+1
-1
app/assets/stylesheets/pages/status.scss
app/assets/stylesheets/pages/status.scss
+1
-1
app/assets/stylesheets/pages/tree.scss
app/assets/stylesheets/pages/tree.scss
+2
-2
app/finders/labels_finder.rb
app/finders/labels_finder.rb
+5
-3
app/views/devise/sessions/_new_base.html.haml
app/views/devise/sessions/_new_base.html.haml
+1
-1
lib/api/builds.rb
lib/api/builds.rb
+79
-83
lib/api/labels.rb
lib/api/labels.rb
+38
-53
spec/finders/labels_finder_spec.rb
spec/finders/labels_finder_spec.rb
+32
-0
spec/requests/api/labels_spec.rb
spec/requests/api/labels_spec.rb
+3
-3
spec/services/issues/move_service_spec.rb
spec/services/issues/move_service_spec.rb
+25
-4
No files found.
.scss-lint.yml
View file @
9a956a02
...
...
@@ -191,7 +191,7 @@ linters:
# Variables should be formatted with a single space separating the colon
# from the variable's value.
SpaceAfterVariableColon
:
enabled
:
fals
e
enabled
:
tru
e
# Variables should be formatted with no space between the name and the
# colon.
...
...
@@ -201,7 +201,7 @@ linters:
# Operators should be formatted with a single space on both sides of an
# infix operator.
SpaceAroundOperator
:
enabled
:
fals
e
enabled
:
tru
e
# Opening braces should be preceded by a single space.
SpaceBeforeBrace
:
...
...
@@ -223,7 +223,7 @@ linters:
# Reports lines containing trailing whitespace.
TrailingWhitespace
:
enabled
:
fals
e
enabled
:
tru
e
# Don't write trailing zeros for numeric values with a decimal point.
TrailingZero
:
...
...
CHANGELOG.md
View file @
9a956a02
...
...
@@ -5,17 +5,21 @@ Please view this file on the master branch, on stable branches it's out of date.
-
Trim leading and trailing whitespace on project_path (Linus Thiel)
-
Prevent award emoji via notes for issues/MRs authored by user (barthc)
-
Adds an optional path parameter to the Commits API to filter commits by path (Luis HGO)
-
Fix extra space on Build sidebar on Firefox !7060
-
Fix HipChat notifications rendering (airatshigapov, eisnerd)
-
Add hover to trash icon in notes !7008 (blackst0ne)
-
Simpler arguments passed to named_route on toggle_award_url helper method
-
Fix: Backup restore doesn't clear cache
-
Use MergeRequestsClosingIssues cache data on Issue#closed_by_merge_requests method
-
Fix Sign in page 'Forgot your password?' link overlaps on medium-large screens
-
Fix documents and comments on Build API
`scope`
-
Refactor email, use setter method instead AR callbacks for email attribute (Semyon Pupkov)
## 8.13.1 (unreleased)
-
Fix bug where labels would be assigned to issues that were moved
-
Fix error in generating labels
-
Fix reply-by-email not working due to queue name mismatch
-
Fixed hidden pipeline graph on commit and MR page !6895
-
Expire and build repository cache after project import
-
Fix 404 for group pages when GitLab setup uses relative url
-
Simpler arguments passed to named_route on toggle_award_url helper method
...
...
app/assets/javascripts/build.js
View file @
9a956a02
...
...
@@ -148,7 +148,7 @@
};
Build
.
prototype
.
translateSidebar
=
function
(
e
)
{
var
newPosition
=
this
.
sidebarTranslationLimits
.
max
-
document
.
body
.
scrollTop
;
var
newPosition
=
this
.
sidebarTranslationLimits
.
max
-
(
document
.
body
.
scrollTop
||
document
.
documentElement
.
scrollTop
)
;
if
(
newPosition
<
this
.
sidebarTranslationLimits
.
min
)
newPosition
=
this
.
sidebarTranslationLimits
.
min
;
this
.
$sidebar
.
css
({
top
:
newPosition
...
...
app/assets/javascripts/dispatcher.js.es6
View file @
9a956a02
...
...
@@ -117,6 +117,9 @@
new ZenMode();
shortcut_handler = new ShortcutsNavigation();
break;
case 'projects:commit:builds':
new gl.Pipelines();
break;
case 'projects:commits:show':
case 'projects:activity':
shortcut_handler = new ShortcutsNavigation();
...
...
app/assets/javascripts/merge_request_tabs.js
View file @
9a956a02
...
...
@@ -282,6 +282,7 @@
document
.
querySelector
(
"
div#builds
"
).
innerHTML
=
data
.
html
;
gl
.
utils
.
localTimeAgo
(
$
(
'
.js-timeago
'
,
'
div#builds
'
));
_this
.
buildsLoaded
=
true
;
if
(
!
this
.
pipelines
)
this
.
pipelines
=
new
gl
.
Pipelines
();
return
_this
.
scrollToElement
(
"
#builds
"
);
};
})(
this
)
...
...
app/assets/stylesheets/framework/animations.scss
View file @
9a956a02
// This file is based off animate.css 3.5.1, available here:
// https://github.com/daneden/animate.css/blob/3.5.1/animate.css
//
//
// animate.css - http://daneden.me/animate
// Version - 3.5.1
// Licensed under the MIT license - http://opensource.org/licenses/MIT
//
//
// Copyright (c) 2016 Daniel Eden
.animated
{
...
...
app/assets/stylesheets/framework/logo.scss
View file @
9a956a02
...
...
@@ -61,7 +61,7 @@
10
%
,
80
%
{
fill
:
$tanuki-red
;
}
20
%
,
90
%
{
fill
:
lighten
(
$tanuki-red
,
25%
);
}
...
...
app/assets/stylesheets/framework/modal.scss
View file @
9a956a02
...
...
@@ -3,7 +3,7 @@
padding
:
15px
;
.form-actions
{
margin
:
-
$gl-padding
+
1
;
margin
:
-
$gl-padding
+
1
;
margin-top
:
15px
;
}
...
...
app/assets/stylesheets/framework/tw_bootstrap_variables.scss
View file @
9a956a02
...
...
@@ -16,21 +16,21 @@
// $gray-light: lighten($gray-base, 46.7%) // #777
// $gray-lighter: lighten($gray-base, 93.5%) // #eee
$brand-primary
:
$gl-primary
;
$brand-success
:
$gl-success
;
$brand-info
:
$gl-info
;
$brand-warning
:
$gl-warning
;
$brand-danger
:
$gl-danger
;
$brand-primary
:
$gl-primary
;
$brand-success
:
$gl-success
;
$brand-info
:
$gl-info
;
$brand-warning
:
$gl-warning
;
$brand-danger
:
$gl-danger
;
$border-radius-base
:
3px
!
default
;
$border-radius-large
:
3px
!
default
;
$border-radius-small
:
3px
!
default
;
$border-radius-base
:
3px
!
default
;
$border-radius-large
:
3px
!
default
;
$border-radius-small
:
3px
!
default
;
//== Scaffolding
//
$text-color
:
$gl-text-color
;
$link-color
:
$gl-link-color
;
$text-color
:
$gl-text-color
;
$link-color
:
$gl-link-color
;
//== Typography
...
...
@@ -38,112 +38,112 @@ $link-color: $gl-link-color;
//## Font, line-height, and color for body text, headings, and more.
$font-family-sans-serif
:
$regular_font
;
$font-family-monospace
:
$monospace_font
;
$font-size-base
:
$gl-font-size
;
$font-family-monospace
:
$monospace_font
;
$font-size-base
:
$gl-font-size
;
//== Components
//
//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
$padding-base-vertical
:
$gl-vert-padding
;
$padding-base-horizontal
:
$gl-padding
;
$component-active-color
:
#fff
;
$component-active-bg
:
$brand-info
;
$padding-base-vertical
:
$gl-vert-padding
;
$padding-base-horizontal
:
$gl-padding
;
$component-active-color
:
#fff
;
$component-active-bg
:
$brand-info
;
//== Forms
//
//##
$input-color
:
$text-color
;
$input-border
:
$border-color
;
$input-border-focus
:
$focus-border-color
;
$legend-color
:
$text-color
;
$input-color
:
$text-color
;
$input-border
:
$border-color
;
$input-border-focus
:
$focus-border-color
;
$legend-color
:
$text-color
;
//== Pagination
//
//##
$pagination-color
:
$gl-gray
;
$pagination-bg
:
#fff
;
$pagination-border
:
$border-color
;
$pagination-color
:
$gl-gray
;
$pagination-bg
:
#fff
;
$pagination-border
:
$border-color
;
$pagination-hover-color
:
$gl-gray
;
$pagination-hover-bg
:
$row-hover
;
$pagination-hover-border
:
$border-color
;
$pagination-hover-color
:
$gl-gray
;
$pagination-hover-bg
:
$row-hover
;
$pagination-hover-border
:
$border-color
;
$pagination-active-color
:
$blue-dark
;
$pagination-active-bg
:
#fff
;
$pagination-active-border
:
$border-color
;
$pagination-active-color
:
$blue-dark
;
$pagination-active-bg
:
#fff
;
$pagination-active-border
:
$border-color
;
$pagination-disabled-color
:
#cdcdcd
;
$pagination-disabled-bg
:
$background-color
;
$pagination-disabled-border
:
$border-color
;
$pagination-disabled-color
:
#cdcdcd
;
$pagination-disabled-bg
:
$background-color
;
$pagination-disabled-border
:
$border-color
;
//== Form states and alerts
//
//## Define colors for form feedback states and, by default, alerts.
$state-success-text
:
#fff
;
$state-success-bg
:
$brand-success
;
$state-success-border
:
$brand-success
;
$state-success-text
:
#fff
;
$state-success-bg
:
$brand-success
;
$state-success-border
:
$brand-success
;
$state-info-text
:
#fff
;
$state-info-bg
:
$brand-info
;
$state-info-border
:
$brand-info
;
$state-info-text
:
#fff
;
$state-info-bg
:
$brand-info
;
$state-info-border
:
$brand-info
;
$state-warning-text
:
#fff
;
$state-warning-bg
:
$brand-warning
;
$state-warning-border
:
$brand-warning
;
$state-warning-text
:
#fff
;
$state-warning-bg
:
$brand-warning
;
$state-warning-border
:
$brand-warning
;
$state-danger-text
:
#fff
;
$state-danger-bg
:
$brand-danger
;
$state-danger-border
:
$brand-danger
;
$state-danger-text
:
#fff
;
$state-danger-bg
:
$brand-danger
;
$state-danger-border
:
$brand-danger
;
//== Alerts
//
//## Define alert colors, border radius, and padding.
$alert-border-radius
:
0
;
$alert-border-radius
:
0
;
//== Panels
//
//##
$panel-border-radius
:
2px
;
$panel-default-text
:
$text-color
;
$panel-default-border
:
$border-color
;
$panel-border-radius
:
2px
;
$panel-default-text
:
$text-color
;
$panel-default-border
:
$border-color
;
$panel-default-heading-bg
:
$background-color
;
$panel-footer-bg
:
$background-color
;
$panel-inner-border
:
$border-color
;
$panel-footer-bg
:
$background-color
;
$panel-inner-border
:
$border-color
;
//== Wells
//
//##
$well-bg
:
$gray-light
;
$well-border
:
#eee
;
$well-bg
:
$gray-light
;
$well-border
:
#eee
;
//== Code
//
//##
$code-color
:
#c7254e
;
$code-bg
:
#f9f2f4
;
$code-color
:
#c7254e
;
$code-bg
:
#f9f2f4
;
$kbd-color
:
#fff
;
$kbd-bg
:
#333
;
$kbd-color
:
#fff
;
$kbd-bg
:
#333
;
//== Buttons
//
//##
$btn-default-color
:
$gl-text-color
;
$btn-default-bg
:
#fff
;
$btn-default-border
:
#e7e9ed
;
$btn-default-color
:
$gl-text-color
;
$btn-default-bg
:
#fff
;
$btn-default-border
:
#e7e9ed
;
//== Nav
//
...
...
@@ -153,8 +153,8 @@ $nav-link-padding: 13px $gl-padding;
//== Code
//
//##
$pre-bg
:
$background-color
!
default
;
$pre-color
:
$gl-gray
!
default
;
$pre-bg
:
$background-color
!
default
;
$pre-color
:
$gl-gray
!
default
;
$pre-border-color
:
$border-color
;
$table-bg-accent
:
$background-color
;
app/assets/stylesheets/framework/variables.scss
View file @
9a956a02
...
...
@@ -84,39 +84,39 @@ $warning-message-border: #f0e2bb;
/*
* UI elements
*/
$border-color
:
#e5e5e5
;
$focus-border-color
:
#3aabf0
;
$table-border-color
:
#f0f0f0
;
$background-color
:
$gray-light
;
$border-color
:
#e5e5e5
;
$focus-border-color
:
#3aabf0
;
$table-border-color
:
#f0f0f0
;
$background-color
:
$gray-light
;
$dark-background-color
:
#f5f5f5
;
$table-text-gray
:
#8f8f8f
;
$table-text-gray
:
#8f8f8f
;
/*
* Text
*/
$gl-font-size
:
15px
;
$gl-title-color
:
#333
;
$gl-text-color
:
#5c5c5c
;
$gl-text-color-light
:
#8c8c8c
;
$gl-text-green
:
#4a2
;
$gl-text-red
:
#d12f19
;
$gl-text-orange
:
#d90
;
$gl-link-color
:
#3084bb
;
$gl-dark-link-color
:
#333
;
$gl-font-size
:
15px
;
$gl-title-color
:
#333
;
$gl-text-color
:
#5c5c5c
;
$gl-text-color-light
:
#8c8c8c
;
$gl-text-green
:
#4a2
;
$gl-text-red
:
#d12f19
;
$gl-text-orange
:
#d90
;
$gl-link-color
:
#3084bb
;
$gl-dark-link-color
:
#333
;
$gl-placeholder-color
:
#8f8f8f
;
$gl-icon-color
:
$gl-placeholder-color
;
$gl-grayish-blue
:
#7f8fa4
;
$gl-gray
:
$gl-text-color
;
$gl-gray-dark
:
#313236
;
$gl-gray-light
:
$gl-placeholder-color
;
$gl-header-color
:
#4c4e54
;
$gl-icon-color
:
$gl-placeholder-color
;
$gl-grayish-blue
:
#7f8fa4
;
$gl-gray
:
$gl-text-color
;
$gl-gray-dark
:
#313236
;
$gl-gray-light
:
$gl-placeholder-color
;
$gl-header-color
:
#4c4e54
;
/*
* Lists
*/
$list-font-size
:
$gl-font-size
;
$list-font-size
:
$gl-font-size
;
$list-title-color
:
$gl-title-color
;
$list-text-color
:
$gl-text-color
;
$list-text-color
:
$gl-text-color
;
$list-text-height
:
42px
;
/*
...
...
app/assets/stylesheets/mailers/devise.scss
View file @
9a956a02
...
...
@@ -5,13 +5,13 @@
// Styles defined here are embedded directly into the resulting email HTML via
// the `premailer` gem.
$body-background-color
:
#363636
;
$body-background-color
:
#363636
;
$message-background-color
:
#fafafa
;
$header-color
:
#6b4fbb
;
$body-color
:
#444
;
$cta-color
:
#e14329
;
$footer-link-color
:
#7e7e7e
;
$header-color
:
#6b4fbb
;
$body-color
:
#444
;
$cta-color
:
#e14329
;
$footer-link-color
:
#7e7e7e
;
$font-family
:
Helvetica
,
Arial
,
sans-serif
;
...
...
app/assets/stylesheets/pages/cycle_analytics.scss
View file @
9a956a02
...
...
@@ -9,15 +9,15 @@
padding
:
24px
0
;
border-bottom
:
none
;
position
:
relative
;
@media
(
max-width
:
$screen-sm-min
)
{
padding
:
6px
0
24px
;
}
}
}
.column
{
text-align
:
center
;
@media
(
max-width
:
$screen-sm-min
)
{
padding
:
15px
0
;
}
...
...
@@ -36,7 +36,7 @@
&
:last-child
{
text-align
:
right
;
@media
(
max-width
:
$screen-sm-min
)
{
text-align
:
center
;
}
...
...
@@ -51,7 +51,7 @@
.bordered-box
{
border
:
1px
solid
$border-color
;
border-radius
:
$border-radius-default
;
}
.content-list
{
...
...
@@ -73,10 +73,10 @@
font-weight
:
600
;
color
:
$gl-title-color
;
}
&
.text
{
color
:
$layout-link-gray
;
&
.value-col
{
color
:
$gl-title-color
;
}
...
...
@@ -108,13 +108,13 @@
.svg-container
{
text-align
:
center
;
svg
{
width
:
136px
;
height
:
136px
;
}
}
.inner-content
{
@media
(
max-width
:
$screen-sm-min
)
{
padding
:
0
28px
;
...
...
app/assets/stylesheets/pages/diff.scss
View file @
9a956a02
...
...
@@ -222,12 +222,12 @@
top
:
13px
;
right
:
7px
;
}
.frame
{
top
:
0
;
right
:
0
;
position
:
absolute
;
&
.deleted
{
margin
:
0
;
display
:
block
;
...
...
app/assets/stylesheets/pages/environments.scss
View file @
9a956a02
...
...
@@ -37,10 +37,10 @@
.branch-name
{
color
:
$gl-dark-link-color
;
}
.stop-env-link
{
color
:
$table-text-gray
;
.stop-env-icon
{
font-size
:
14px
;
}
...
...
@@ -48,11 +48,11 @@
.deployment
{
.build-column
{
.build-link
{
color
:
$gl-dark-link-color
;
}
.avatar
{
float
:
none
;
}
...
...
app/assets/stylesheets/pages/events.scss
View file @
9a956a02
...
...
@@ -142,7 +142,7 @@
.event-last-push
{
overflow
:
auto
;
width
:
100%
;
.event-last-push-text
{
@include
str-truncated
(
100%
);
padding
:
4px
0
;
...
...
app/assets/stylesheets/pages/login.scss
View file @
9a956a02
...
...
@@ -286,6 +286,13 @@
.new_user
{
position
:
relative
;
padding-bottom
:
35px
;
@media
(
min-width
:
$screen-sm-min
)
and
(
max-width
:
$screen-sm-max
)
{
.forgot-password
{
float
:
none
!
important
;
margin-top
:
5px
;
}
}
}
.move-submit-down
{
...
...
app/assets/stylesheets/pages/merge_conflicts.scss
View file @
9a956a02
...
...
@@ -254,7 +254,7 @@ $colors: (
border-top
:
solid
2px
$border-green-extra-light
;
}
}
.editor
{
pre
{
height
:
350px
;
...
...
app/assets/stylesheets/pages/note_form.scss
View file @
9a956a02
...
...
@@ -8,7 +8,7 @@
.diff-file
.diff-content
{
tr
.line_holder
:hover
>
td
.line_note_link
{
opacity
:
1
.0
;
filter
:
alpha
(
opacity
=
100
);
filter
:
alpha
(
opacity
=
100
);
}
}
...
...
app/assets/stylesheets/pages/notes.scss
View file @
9a956a02
...
...
@@ -458,7 +458,7 @@ ul.notes {
.discussion-next-btn
{
svg
{
margin
:
0
;
path
{
fill
:
$gray-darkest
;
}
...
...
app/assets/stylesheets/pages/status.scss
View file @
9a956a02
...
...
@@ -74,7 +74,7 @@
.ci-status-icon-success_with_warning
{
color
:
$gl-warning
;
}
.ci-status-icon-running
{
color
:
$blue-normal
;
}
...
...
app/assets/stylesheets/pages/tree.scss
View file @
9a956a02
...
...
@@ -29,11 +29,11 @@
.last-commit
{
@include
str-truncated
(
506px
);
@media
(
min-width
:
$screen-sm-max
)
and
(
max-width
:
$screen-md-max
)
{
@include
str-truncated
(
450px
);
}
}
.commit-history-link-spacer
{
...
...
app/finders/labels_finder.rb
View file @
9a956a02
...
...
@@ -35,8 +35,10 @@ class LabelsFinder < UnionFinder
end
def
with_title
(
items
)
items
=
items
.
where
(
title:
title
)
if
title
items
return
items
if
title
.
nil?
return
items
.
none
if
title
.
blank?
items
.
where
(
title:
title
)
end
def
group_id
...
...
@@ -52,7 +54,7 @@ class LabelsFinder < UnionFinder
end
def
title
params
[
:title
]
.
presence
||
params
[
:name
].
presence
params
[
:title
]
||
params
[
:name
]
end
def
project
...
...
app/views/devise/sessions/_new_base.html.haml
View file @
9a956a02
...
...
@@ -12,5 +12,5 @@
%label
{
for:
"user_remember_me"
}
=
f
.
check_box
:remember_me
%span
Remember me
.pull-right
.pull-right
.forgot-password
=
link_to
"Forgot your password?"
,
new_password_path
(
resource_name
)
lib/api/builds.rb
View file @
9a956a02
...
...
@@ -3,15 +3,32 @@ module API
class
Builds
<
Grape
::
API
before
{
authenticate!
}
params
do
requires
:id
,
type:
String
,
desc:
'The ID of a project'
end
resource
:projects
do
# Get a project builds
#
# Parameters:
# id (required) - The ID of a project
# scope (optional) - The scope of builds to show (one or array of: created, pending, running, failed, success, canceled, skipped;
# if none provided showing all builds)
# Example Request:
# GET /projects/:id/builds
helpers
do
params
:optional_scope
do
optional
:scope
,
types:
[
String
,
Array
[
String
]],
desc:
'The scope of builds to show'
,
values:
[
'pending'
,
'running'
,
'failed'
,
'success'
,
'canceled'
],
coerce_with:
->
(
scope
)
{
if
scope
.
is_a?
(
String
)
[
scope
]
elsif
scope
.
is_a?
(
Hashie
::
Mash
)
scope
.
values
else
[
'unknown'
]
end
}
end
end
desc
'Get a project builds'
do
success
Entities
::
Build
end
params
do
use
:optional_scope
end
get
':id/builds'
do
builds
=
user_project
.
builds
.
order
(
'id DESC'
)
builds
=
filter_builds
(
builds
,
params
[
:scope
])
...
...
@@ -20,15 +37,13 @@ module API
user_can_download_artifacts:
can?
(
current_user
,
:read_build
,
user_project
)
end
# Get builds for a specific commit of a project
#
# Parameters:
# id (required) - The ID of a project
# sha (required) - The SHA id of a commit
# scope (optional) - The scope of builds to show (one or array of: created, pending, running, failed, success, canceled, skipped;
# if none provided showing all builds)
# Example Request:
# GET /projects/:id/repository/commits/:sha/builds
desc
'Get builds for a specific commit of a project'
do
success
Entities
::
Build
end
params
do
requires
:sha
,
type:
String
,
desc:
'The SHA id of a commit'
use
:optional_scope
end
get
':id/repository/commits/:sha/builds'
do
authorize_read_builds!
...
...
@@ -42,13 +57,12 @@ module API
user_can_download_artifacts:
can?
(
current_user
,
:read_build
,
user_project
)
end
# Get a specific build of a project
#
# Parameters:
# id (required) - The ID of a project
# build_id (required) - The ID of a build
# Example Request:
# GET /projects/:id/builds/:build_id
desc
'Get a specific build of a project'
do
success
Entities
::
Build
end
params
do
requires
:build_id
,
type:
Integer
,
desc:
'The ID of a build'
end
get
':id/builds/:build_id'
do
authorize_read_builds!
...
...
@@ -58,13 +72,12 @@ module API
user_can_download_artifacts:
can?
(
current_user
,
:read_build
,
user_project
)
end
# Download the artifacts file from build
#
# Parameters:
# id (required) - The ID of a build
# token (required) - The build authorization token
# Example Request:
# GET /projects/:id/builds/:build_id/artifacts
desc
'Download the artifacts file from build'
do
detail
'This feature was introduced in GitLab 8.5'
end
params
do
requires
:build_id
,
type:
Integer
,
desc:
'The ID of a build'
end
get
':id/builds/:build_id/artifacts'
do
authorize_read_builds!
...
...
@@ -73,14 +86,13 @@ module API
present_artifacts!
(
build
.
artifacts_file
)
end
# Download the artifacts file from ref_name and job
#
# Parameters:
# id (required) - The ID of a project
# ref_name (required) - The ref from repository
# job (required) - The name for the build
# Example Request:
# GET /projects/:id/builds/artifacts/:ref_name/download?job=name
desc
'Download the artifacts file from build'
do
detail
'This feature was introduced in GitLab 8.10'
end
params
do
requires
:ref_name
,
type:
String
,
desc:
'The ref from repository'
requires
:job
,
type:
String
,
desc:
'The name for the build'
end
get
':id/builds/artifacts/:ref_name/download'
,
requirements:
{
ref_name:
/.+/
}
do
authorize_read_builds!
...
...
@@ -91,17 +103,13 @@ module API
present_artifacts!
(
latest_build
.
artifacts_file
)
end
# Get a trace of a specific build of a project
#
# Parameters:
# id (required) - The ID of a project
# build_id (required) - The ID of a build
# Example Request:
# GET /projects/:id/build/:build_id/trace
#
# TODO: We should use `present_file!` and leave this implementation for backward compatibility (when build trace
# is saved in the DB instead of file). But before that, we need to consider how to replace the value of
# `runners_token` with some mask (like `xxxxxx`) when sending trace file directly by workhorse.
desc
'Get a trace of a specific build of a project'
params
do
requires
:build_id
,
type:
Integer
,
desc:
'The ID of a build'
end
get
':id/builds/:build_id/trace'
do
authorize_read_builds!
...
...
@@ -115,13 +123,12 @@ module API
body
trace
end
# Cancel a specific build of a project
#
# parameters:
# id (required) - the id of a project
# build_id (required) - the id of a build
# example request:
# post /projects/:id/build/:build_id/cancel
desc
'Cancel a specific build of a project'
do
success
Entities
::
Build
end
params
do
requires
:build_id
,
type:
Integer
,
desc:
'The ID of a build'
end
post
':id/builds/:build_id/cancel'
do
authorize_update_builds!
...
...
@@ -133,13 +140,12 @@ module API
user_can_download_artifacts:
can?
(
current_user
,
:read_build
,
user_project
)
end
# Retry a specific build of a project
#
# parameters:
# id (required) - the id of a project
# build_id (required) - the id of a build
# example request:
# post /projects/:id/build/:build_id/retry
desc
'Retry a specific build of a project'
do
success
Entities
::
Build
end
params
do
requires
:build_id
,
type:
Integer
,
desc:
'The ID of a build'
end
post
':id/builds/:build_id/retry'
do
authorize_update_builds!
...
...
@@ -152,13 +158,12 @@ module API
user_can_download_artifacts:
can?
(
current_user
,
:read_build
,
user_project
)
end
# Erase build (remove artifacts and build trace)
#
# Parameters:
# id (required) - the id of a project
# build_id (required) - the id of a build
# example Request:
# post /projects/:id/build/:build_id/erase
desc
'Erase build (remove artifacts and build trace)'
do
success
Entities
::
Build
end
params
do
requires
:build_id
,
type:
Integer
,
desc:
'The ID of a build'
end
post
':id/builds/:build_id/erase'
do
authorize_update_builds!
...
...
@@ -170,13 +175,12 @@ module API
user_can_download_artifacts:
can?
(
current_user
,
:download_build_artifacts
,
user_project
)
end
# Keep the artifacts to prevent them from being deleted
#
# Parameters:
# id (required) - the id of a project
# build_id (required) - The ID of a build
# Example Request:
# POST /projects/:id/builds/:build_id/artifacts/keep
desc
'Keep the artifacts to prevent them from being deleted'
do
success
Entities
::
Build
end
params
do
requires
:build_id
,
type:
Integer
,
desc:
'The ID of a build'
end
post
':id/builds/:build_id/artifacts/keep'
do
authorize_update_builds!
...
...
@@ -235,14 +239,6 @@ module API
return
builds
if
scope
.
nil?
||
scope
.
empty?
available_statuses
=
::
CommitStatus
::
AVAILABLE_STATUSES
scope
=
if
scope
.
is_a?
(
String
)
[
scope
]
elsif
scope
.
is_a?
(
Hashie
::
Mash
)
scope
.
values
else
[
'unknown'
]
end
unknown
=
scope
-
available_statuses
render_api_error!
(
'Scope contains invalid value(s)'
,
400
)
unless
unknown
.
empty?
...
...
lib/api/labels.rb
View file @
9a956a02
...
...
@@ -3,37 +3,32 @@ module API
class
Labels
<
Grape
::
API
before
{
authenticate!
}
params
do
requires
:id
,
type:
String
,
desc:
'The ID of a project'
end
resource
:projects
do
# Get all labels of the project
#
# Parameters:
# id (required) - The ID of a project
# Example Request:
# GET /projects/:id/labels
desc
'Get all labels of the project'
do
success
Entities
::
Label
end
get
':id/labels'
do
present
available_labels
,
with:
Entities
::
Label
,
current_user:
current_user
end
# Creates a new label
#
# Parameters:
# id (required) - The ID of a project
# name (required) - The name of the label to be created
# color (required) - Color of the label given in 6-digit hex
# notation with leading '#' sign (e.g. #FFAABB)
# description (optional) - The description of label to be created
# Example Request:
# POST /projects/:id/labels
desc
'Create a new label'
do
success
Entities
::
Label
end
params
do
requires
:name
,
type:
String
,
desc:
'The name of the label to be created'
requires
:color
,
type:
String
,
desc:
"The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB)"
optional
:description
,
type:
String
,
desc:
'The description of label to be created'
end
post
':id/labels'
do
authorize!
:admin_label
,
user_project
required_attributes!
[
:name
,
:color
]
attrs
=
attributes_for_keys
[
:name
,
:color
,
:description
]
label
=
user_project
.
find_label
(
attrs
[
:name
])
label
=
user_project
.
find_label
(
params
[
:name
])
conflict!
(
'Label already exists'
)
if
label
label
=
user_project
.
labels
.
create
(
attrs
)
label
=
user_project
.
labels
.
create
(
declared
(
params
,
include_parent_namespaces:
false
).
to_h
)
if
label
.
valid?
present
label
,
with:
Entities
::
Label
,
current_user:
current_user
...
...
@@ -42,54 +37,44 @@ module API
end
end
# Deletes an existing label
#
# Parameters:
# id (required) - The ID of a project
# name (required) - The name of the label to be deleted
#
# Example Request:
# DELETE /projects/:id/labels
desc
'Delete an existing label'
do
success
Entities
::
Label
end
params
do
requires
:name
,
type:
String
,
desc:
'The name of the label to be deleted'
end
delete
':id/labels'
do
authorize!
:admin_label
,
user_project
required_attributes!
[
:name
]
label
=
user_project
.
find_label
(
params
[
:name
])
not_found!
(
'Label'
)
unless
label
label
.
destroy
present
label
.
destroy
,
with:
Entities
::
Label
,
current_user:
current_user
end
# Updates an existing label. At least one optional parameter is required.
#
# Parameters:
# id (required) - The ID of a project
# name (required) - The name of the label to be deleted
# new_name (optional) - The new name of the label
# color (optional) - Color of the label given in 6-digit hex
# notation with leading '#' sign (e.g. #FFAABB)
# description (optional) - The description of label to be created
# Example Request:
# PUT /projects/:id/labels
desc
'Update an existing label. At least one optional parameter is required.'
do
success
Entities
::
Label
end
params
do
requires
:name
,
type:
String
,
desc:
'The name of the label to be updated'
optional
:new_name
,
type:
String
,
desc:
'The new name of the label'
optional
:color
,
type:
String
,
desc:
"The new color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB)"
optional
:description
,
type:
String
,
desc:
'The new description of label'
at_least_one_of
:new_name
,
:color
,
:description
end
put
':id/labels'
do
authorize!
:admin_label
,
user_project
required_attributes!
[
:name
]
label
=
user_project
.
find_label
(
params
[
:name
])
not_found!
(
'Label not found'
)
unless
label
attrs
=
attributes_for_keys
[
:new_name
,
:color
,
:description
]
if
attrs
.
empty?
render_api_error!
(
'Required parameters "new_name" or "color" '
\
'missing'
,
400
)
end
update_params
=
declared
(
params
,
include_parent_namespaces:
false
,
include_missing:
false
).
to_h
# Rename new name to the actual label attribute name
attrs
[
:name
]
=
attrs
.
delete
(
:new_name
)
if
attrs
.
key?
(
:new_name
)
update_params
[
'name'
]
=
update_params
.
delete
(
'new_name'
)
if
update_params
.
key?
(
'new_name'
)
if
label
.
update
(
attr
s
)
if
label
.
update
(
update_param
s
)
present
label
,
with:
Entities
::
Label
,
current_user:
current_user
else
render_validation_error!
(
label
)
...
...
spec/finders/labels_finder_spec.rb
View file @
9a956a02
...
...
@@ -38,6 +38,14 @@ describe LabelsFinder do
expect
(
finder
.
execute
).
to
eq
[
group_label_2
,
group_label_3
,
project_label_1
,
group_label_1
,
project_label_2
,
project_label_4
]
end
it
'returns labels available if nil title is supplied'
do
group_2
.
add_developer
(
user
)
# params[:title] will return `nil` regardless whether it is specified
finder
=
described_class
.
new
(
user
,
title:
nil
)
expect
(
finder
.
execute
).
to
eq
[
group_label_2
,
group_label_3
,
project_label_1
,
group_label_1
,
project_label_2
,
project_label_4
]
end
end
context
'filtering by group_id'
do
...
...
@@ -64,6 +72,30 @@ describe LabelsFinder do
expect
(
finder
.
execute
).
to
eq
[
group_label_2
]
end
it
'returns label with title alias'
do
finder
=
described_class
.
new
(
user
,
name:
'Group Label 2'
)
expect
(
finder
.
execute
).
to
eq
[
group_label_2
]
end
it
'returns no labels if empty title is supplied'
do
finder
=
described_class
.
new
(
user
,
title:
[])
expect
(
finder
.
execute
).
to
be_empty
end
it
'returns no labels if blank title is supplied'
do
finder
=
described_class
.
new
(
user
,
title:
''
)
expect
(
finder
.
execute
).
to
be_empty
end
it
'returns no labels if empty name is supplied'
do
finder
=
described_class
.
new
(
user
,
name:
[])
expect
(
finder
.
execute
).
to
be_empty
end
end
end
end
spec/requests/api/labels_spec.rb
View file @
9a956a02
...
...
@@ -159,14 +159,14 @@ describe API::API, api: true do
it
'returns 400 if no label name given'
do
put
api
(
"/projects/
#{
project
.
id
}
/labels"
,
user
),
new_name:
'label2'
expect
(
response
).
to
have_http_status
(
400
)
expect
(
json_response
[
'
message'
]).
to
eq
(
'400 (Bad request) "name" not given
'
)
expect
(
json_response
[
'
error'
]).
to
eq
(
'name is missing
'
)
end
it
'returns 400 if no new parameters given'
do
put
api
(
"/projects/
#{
project
.
id
}
/labels"
,
user
),
name:
'label1'
expect
(
response
).
to
have_http_status
(
400
)
expect
(
json_response
[
'
message'
]).
to
eq
(
'Required parameters
'
\
'"new_name" or "color" missing
'
)
expect
(
json_response
[
'
error'
]).
to
eq
(
'new_name, color, description are missing,
'
\
'at least one parameter must be provided
'
)
end
it
'returns 400 for invalid name'
do
...
...
spec/services/issues/move_service_spec.rb
View file @
9a956a02
...
...
@@ -23,14 +23,15 @@ describe Issues::MoveService, services: true do
old_project
.
team
<<
[
user
,
:reporter
]
new_project
.
team
<<
[
user
,
:reporter
]
[
'label1'
,
'label2'
].
each
do
|
label
|
labels
=
Array
.
new
(
2
)
{
|
x
|
"label%d"
%
(
x
+
1
)
}
labels
.
each
do
|
label
|
old_issue
.
labels
<<
create
(
:label
,
project_id:
old_project
.
id
,
title:
label
)
end
new_project
.
labels
<<
create
(
:label
,
title:
'label1'
)
new_project
.
labels
<<
create
(
:label
,
title:
'label2'
)
new_project
.
labels
<<
create
(
:label
,
title:
label
)
end
end
end
...
...
@@ -277,5 +278,25 @@ describe Issues::MoveService, services: true do
it
{
expect
{
move
}.
to
raise_error
(
StandardError
,
/permissions/
)
}
end
end
context
'movable issue with no assigned labels'
do
before
do
old_project
.
team
<<
[
user
,
:reporter
]
new_project
.
team
<<
[
user
,
:reporter
]
labels
=
Array
.
new
(
2
)
{
|
x
|
"label%d"
%
(
x
+
1
)
}
labels
.
each
do
|
label
|
new_project
.
labels
<<
create
(
:label
,
title:
label
)
end
end
include_context
'issue move executed'
it
'does not assign labels to new issue'
do
expected_label_titles
=
new_issue
.
reload
.
labels
.
map
(
&
:title
)
expect
(
expected_label_titles
.
size
).
to
eq
0
end
end
end
end
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