Commit a653c8ea authored by Kamil Trzciński's avatar Kamil Trzciński

Merge branch 'master' into 'backstage/gb/rename-ci-cd-processing-sidekiq-queues'

# Conflicts:
#   db/schema.rb
parents faf92651 676f7726
......@@ -6,6 +6,7 @@
},
"extends": "airbnb-base",
"globals": {
"__webpack_public_path__": true,
"_": false,
"gl": false,
"gon": false,
......
This diff is collapsed.
......@@ -207,9 +207,6 @@ gem 'kubeclient', '~> 2.2.0'
# d3
gem 'd3_rails', '~> 3.5.0'
# underscore-rails
gem 'underscore-rails', '~> 1.8.0'
# Sanitize user input
gem 'sanitize', '~> 2.0'
gem 'babosa', '~> 1.0.2'
......@@ -396,12 +393,12 @@ gem 'net-ssh', '~> 4.1.0'
# Required for ED25519 SSH host key support
group :ed25519 do
gem 'rbnacl-libsodium'
gem 'rbnacl', '~> 3.2'
gem 'rbnacl', '~> 4.0'
gem 'bcrypt_pbkdf', '~> 1.0'
end
# Gitaly GRPC client
gem 'gitaly', '~> 0.29.0'
gem 'gitaly-proto', '~> 0.31.0', require: 'gitaly'
gem 'toml-rb', '~> 0.3.15', require: false
......
......@@ -203,7 +203,7 @@ GEM
multi_json
fast_gettext (1.4.0)
ffaker (2.4.0)
ffi (1.9.10)
ffi (1.9.18)
flay (2.8.1)
erubis (~> 2.7.0)
path_expander (~> 1.0)
......@@ -275,7 +275,7 @@ GEM
po_to_json (>= 1.0.0)
rails (>= 3.2.0)
gherkin-ruby (0.3.2)
gitaly (0.29.0)
gitaly-proto (0.31.0)
google-protobuf (~> 3.1)
grpc (~> 1.0)
github-linguist (4.7.6)
......@@ -682,7 +682,7 @@ GEM
rake (12.0.0)
rblineprof (0.3.6)
debugger-ruby_core_source (~> 1.3)
rbnacl (3.4.0)
rbnacl (4.0.2)
ffi
rbnacl-libsodium (1.0.11)
rbnacl (>= 3.0.1)
......@@ -899,7 +899,6 @@ GEM
uglifier (2.7.2)
execjs (>= 0.3.0)
json (>= 1.8.0)
underscore-rails (1.8.3)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.2)
......@@ -1019,7 +1018,7 @@ DEPENDENCIES
gettext (~> 3.2.2)
gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.2.0)
gitaly (~> 0.29.0)
gitaly-proto (~> 0.31.0)
github-linguist (~> 4.7.0)
gitlab-flowdock-git-hook (~> 1.0.1)
gitlab-markup (~> 1.5.1)
......@@ -1107,7 +1106,7 @@ DEPENDENCIES
rainbow (~> 2.2)
raindrops (~> 0.18)
rblineprof (~> 0.3.6)
rbnacl (~> 3.2)
rbnacl (~> 4.0)
rbnacl-libsodium
rdoc (~> 4.2)
re2 (~> 1.1.1)
......@@ -1163,7 +1162,6 @@ DEPENDENCIES
truncato (~> 0.7.8)
u2f (~> 0.2.1)
uglifier (~> 2.7.2)
underscore-rails (~> 1.8.0)
unf (~> 0.1.4)
unicorn (~> 5.1.0)
unicorn-worker-killer (~> 0.4.4)
......
9.5.0-pre
9.6.0-pre
......@@ -96,18 +96,17 @@ const Api = {
.done(projects => callback(projects));
},
commitMultiple(id, data, callback) {
commitMultiple(id, data) {
// see https://docs.gitlab.com/ce/api/commits.html#create-a-commit-with-multiple-files-and-actions
const url = Api.buildUrl(Api.commitPath)
.replace(':id', id);
return $.ajax({
return this.wrapAjaxCall({
url,
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(data),
dataType: 'json',
})
.done(commitData => callback(commitData))
.fail(message => callback(message.responseJSON));
});
},
// Return text for a specific license
......
......@@ -42,7 +42,9 @@ export default {
actions,
};
Store.submitCommitsLoading = true;
Service.commitFiles(payload, this.resetCommitState);
Service.commitFiles(payload)
.then(this.resetCommitState)
.catch(() => Flash('An error occured while committing your changes'));
},
resetCommitState() {
......
/* eslint-disable no-underscore-dangle, camelcase */
/* global __webpack_public_path__ */
import monacoContext from 'monaco-editor/dev/vs/loader';
monacoContext.require.config({
paths: {
vs: `${__webpack_public_path__}monaco-editor/vs`,
vs: `${__webpack_public_path__}monaco-editor/vs`, // eslint-disable-line camelcase
},
});
// eslint-disable-next-line no-underscore-dangle
window.__monaco_context__ = monacoContext;
export default monacoContext.require;
......@@ -65,15 +65,17 @@ const RepoService = {
return urlArray.join('/');
},
commitFiles(payload, cb) {
Api.commitMultiple(Store.projectId, payload, (data) => {
commitFiles(payload) {
return Api.commitMultiple(Store.projectId, payload)
.then(this.commitFlash);
},
commitFlash(data) {
if (data.short_id && data.stats) {
Flash(`Your changes have been committed. Commit ${data.short_id} with ${data.stats.additions} additions, ${data.stats.deletions} deletions.`, 'notice');
window.Flash(`Your changes have been committed. Commit ${data.short_id} with ${data.stats.additions} additions, ${data.stats.deletions} deletions.`, 'notice');
} else {
Flash(data.message);
window.Flash(data.message);
}
cb();
});
},
};
......
......@@ -588,9 +588,10 @@ function UsersSelect(currentUser, els) {
if (showEmailUser && data.results.length === 0 && query.term.match(/^[^@]+@[^@]+$/)) {
var trimmed = query.term.trim();
emailUser = {
name: "Invite \"" + query.term + "\"",
name: "Invite \"" + query.term + "\" by email",
username: trimmed,
id: trimmed
id: trimmed,
invite: true
};
data.results.unshift(emailUser);
}
......@@ -642,7 +643,7 @@ UsersSelect.prototype.formatResult = function(user) {
} else {
avatar = gon.default_avatar_url;
}
return "<div class='user-result " + (!user.username ? 'no-username' : void 0) + "'> <div class='user-image'><img class='avatar avatar-inline s32' src='" + avatar + "'></div> <div class='user-name dropdown-menu-user-full-name'>" + user.name + "</div> <div class='user-username dropdown-menu-user-username'>" + ("@" + user.username || "") + "</div> </div>";
return "<div class='user-result " + (!user.username ? 'no-username' : void 0) + "'> <div class='user-image'><img class='avatar avatar-inline s32' src='" + avatar + "'></div> <div class='user-name dropdown-menu-user-full-name'>" + user.name + "</div> <div class='user-username dropdown-menu-user-username'>" + (!user.invite ? "@" + _.escape(user.username) : "") + "</div> </div>";
};
UsersSelect.prototype.formatSelection = function(user) {
......
......@@ -5,5 +5,5 @@
*/
if (gon && gon.webpack_public_path) {
__webpack_public_path__ = gon.webpack_public_path; // eslint-disable-line
__webpack_public_path__ = gon.webpack_public_path; // eslint-disable-line camelcase
}
......@@ -78,7 +78,7 @@
&.s60 { font-size: 32px; line-height: 58px; }
&.s70 { font-size: 34px; line-height: 70px; }
&.s90 { font-size: 36px; line-height: 88px; }
&.s110 { font-size: 40px; line-height: 108px; font-weight: 300; }
&.s110 { font-size: 40px; line-height: 108px; font-weight: $gl-font-weight-normal; }
&.s140 { font-size: 72px; line-height: 138px; }
&.s160 { font-size: 96px; line-height: 158px; }
}
......
.badge {
font-weight: normal;
font-weight: $gl-font-weight-normal;
background-color: $badge-bg;
color: $badge-color;
vertical-align: baseline;
......
......@@ -8,7 +8,7 @@
text-align: center;
padding: 20px;
color: $gl-text-color;
font-weight: normal;
font-weight: $gl-font-weight-normal;
font-size: 14px;
line-height: 36px;
......@@ -213,7 +213,7 @@
h1 {
display: inline;
font-weight: normal;
font-weight: $gl-font-weight-normal;
font-size: 24px;
color: $gl-text-color;
}
......
@mixin btn-default {
border-radius: 3px;
font-size: $gl-font-size;
font-weight: 400;
font-weight: $gl-font-weight-normal;
padding: $gl-vert-padding $gl-btn-padding;
&:focus,
......
......@@ -52,13 +52,13 @@
.pika-label {
color: $gl-text-color-secondary;
font-size: 14px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
th {
padding: 2px 0;
color: $note-disabled-comment-color;
font-weight: normal;
font-weight: $gl-font-weight-normal;
text-transform: lowercase;
border-top: 1px solid $calendar-border-color;
}
......@@ -88,7 +88,7 @@
.is-today {
.pika-day {
color: inherit;
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
}
......
......@@ -36,12 +36,12 @@
color: $common-gray;
font-size: 14px;
margin-bottom: 12px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
line-height: 24px;
}
.bold {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
.tab-content {
......@@ -89,7 +89,7 @@ hr {
}
}
.item-title { font-weight: 600; }
.item-title { font-weight: $gl-font-weight-bold; }
/** FLASH message **/
.author_link,
......@@ -118,18 +118,18 @@ table a code {
span.update-author {
display: block;
color: $update-author-color;
font-weight: normal;
font-weight: $gl-font-weight-normal;
font-style: italic;
strong {
font-weight: bold;
font-weight: $gl-font-weight-bold;
font-style: normal;
}
}
.user-mention {
color: $user-mention-color;
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
.field_with_errors {
......@@ -222,7 +222,7 @@ li.note {
text-align: center;
background: $error-bg;
color: $white-light;
font-weight: bold;
font-weight: $gl-font-weight-bold;
a {
color: $white-light;
......@@ -339,7 +339,7 @@ table {
.header-with-avatar {
h3 {
margin: 0;
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
.username {
......
......@@ -195,7 +195,7 @@
margin-top: 2px;
margin-bottom: 0;
font-size: 14px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
padding: 8px 0;
background-color: $white-light;
border: 1px solid $dropdown-border-color;
......@@ -268,7 +268,7 @@
}
.dropdown-bold-header {
font-weight: 600;
font-weight: $gl-font-weight-bold;
line-height: 22px;
padding: 0 16px;
}
......@@ -432,7 +432,7 @@
.dropdown-menu-user-full-name {
display: block;
font-weight: 500;
font-weight: $gl-font-weight-normal;
line-height: 16px;
text-overflow: ellipsis;
overflow: hidden;
......@@ -468,7 +468,7 @@
&.is-indeterminate,
&.is-active {
font-weight: 600;
font-weight: $gl-font-weight-bold;
color: $gl-text-color;
&::before {
......@@ -502,7 +502,7 @@
position: relative;
padding: 2px 25px 10px;
margin: 0 10px 10px;
font-weight: 600;
font-weight: $gl-font-weight-bold;
line-height: 1;
text-align: center;
text-overflow: ellipsis;
......@@ -685,7 +685,7 @@
.dropdown-menu-inner-title {
display: block;
color: $gl-text-color;
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
.dropdown-menu-inner-content {
......
......@@ -371,7 +371,7 @@
}
> .value {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......@@ -452,7 +452,7 @@
.dropdown-light-content {
font-size: 14px;
font-weight: 400;
font-weight: $gl-font-weight-normal;
}
.dropdown-user {
......
......@@ -25,7 +25,7 @@
a.flash-action {
margin-left: 5px;
text-decoration: none;
font-weight: normal;
font-weight: $gl-font-weight-normal;
border-bottom: 1px solid;
&:hover {
......
......@@ -32,7 +32,7 @@ label {
}
&.label-light {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......@@ -73,7 +73,7 @@ label {
margin-right: 0;
.control-label {
font-weight: bold;
font-weight: $gl-font-weight-bold;
padding-top: 4px;
}
......@@ -157,7 +157,7 @@ label {
.form-group .control-label,
.form-group .control-label-full-width {
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
.form-control::-webkit-input-placeholder {
......
......@@ -160,7 +160,7 @@ header {
li {
&.active a {
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
}
}
......@@ -250,7 +250,7 @@ header {
font-size: 18px;
line-height: 22px;
display: inline-block;
font-weight: normal;
font-weight: $gl-font-weight-normal;
color: $gl-text-color;
vertical-align: top;
white-space: nowrap;
......@@ -326,7 +326,7 @@ header {
.badge {
position: inherit;
top: -8px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
margin-left: -11px;
font-size: 11px;
color: $white-light;
......
......@@ -113,7 +113,7 @@ ul.content-list {
}
.title {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
a {
......@@ -212,7 +212,7 @@ ul.content-list {
}
.row-title {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
.row-second-line {
......
......@@ -43,7 +43,7 @@
background: $gray-light;
a {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......
......@@ -8,7 +8,7 @@
}
.text-danger {
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
}
......
......@@ -70,7 +70,7 @@
&.active a {
border-bottom: 2px solid $link-underline-blue;
color: $black;
font-weight: 600;
font-weight: $gl-font-weight-bold;
.badge {
color: $black;
......@@ -352,7 +352,7 @@
z-index: 300;
li.active {
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
}
}
......
......@@ -43,7 +43,7 @@
.commit-committer-link,
.commit-author-link {
color: $gl-text-color;
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
.commit-info {
......
......@@ -76,7 +76,7 @@
}
.select2-results li.select2-result-with-children > .select2-result-label {
font-weight: 600;
font-weight: $gl-font-weight-bold;
color: $gl-text-color;
}
......@@ -227,7 +227,7 @@
}
.group-name {
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
.group-path {
......@@ -252,12 +252,12 @@
.namespace-result {
.namespace-kind {
color: $namespace-kind-color;
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
.namespace-path {
margin-left: 10px;
font-weight: bolder;
font-weight: $gl-font-weight-bold;
}
}
......@@ -283,7 +283,7 @@
padding: 0 1px;
.select2-match {
font-weight: bold;
font-weight: $gl-font-weight-bold;
text-decoration: none;
}
......
......@@ -30,7 +30,7 @@
.snippet-title {
font-size: 24px;
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
.snippet-edited-ago {
......
......@@ -32,7 +32,7 @@ table {
th {
background-color: $gray-light;
font-weight: normal;
font-weight: $gl-font-weight-normal;
border-bottom: none;
&.wide {
......
......@@ -103,7 +103,7 @@ summary {
padding: 4px 5px;
font-size: 12px;
font-style: normal;
font-weight: normal;
font-weight: $gl-font-weight-normal;
display: inline-block;
&.label-gray {
......@@ -165,7 +165,7 @@ summary {
.panel-heading {
padding: 6px 15px;
font-size: 13px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
a {
color: $panel-heading-link-color;
......
......@@ -13,6 +13,9 @@
img {
/*max-width: 100%;*/
margin: 0 0 8px;
}
img.lazy {
min-width: 200px;
min-height: 100px;
background-color: $gray-lightest;
......@@ -71,7 +74,7 @@
h1 {
font-size: 1.75em;
font-weight: 600;
font-weight: $gl-font-weight-bold;
margin: 24px 0 16px;
padding-bottom: 0.3em;
border-bottom: 1px solid $white-dark;
......@@ -84,7 +87,7 @@
h2 {
font-size: 1.5em;
font-weight: 600;
font-weight: $gl-font-weight-bold;
margin: 24px 0 16px;
padding-bottom: 0.3em;
border-bottom: 1px solid $white-dark;
......@@ -277,7 +280,7 @@ body {
margin-top: $gl-padding;
line-height: 1.3;
font-size: 1.25em;
font-weight: 600;
font-weight: $gl-font-weight-bold;
&:last-child {
margin-bottom: 0;
......@@ -288,7 +291,7 @@ body {
margin-top: 0;
line-height: 1.3;
font-size: 1.25em;
font-weight: 600;
font-weight: $gl-font-weight-bold;
margin: 12px 7px;
}
......@@ -299,11 +302,11 @@ h4,
h5,
h6 {
color: $gl-text-color;
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
.light-header {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
/** CODE **/
......
......@@ -111,6 +111,8 @@ $well-light-text-color: #5b6169;
* Text
*/
$gl-font-size: 14px;
$gl-font-weight-normal: 400;
$gl-font-weight-bold: 600;
$gl-text-color: #2e2e2e;
$gl-text-color-secondary: #707070;
$gl-text-color-tertiary: #949494;
......
......@@ -69,7 +69,7 @@
.well-centered {
h1 {
font-weight: normal;
font-weight: $gl-font-weight-normal;
text-align: center;
font-size: 48px;
}
......
......@@ -204,11 +204,11 @@ $dark-il: #de935f;
.cs { color: $dark-cs; } /* Comment.Special */
.gd { color: $dark-gd; } /* Generic.Deleted */
.ge { font-style: italic; } /* Generic.Emph */
.gh { color: $dark-gh; font-weight: bold; } /* Generic.Heading */
.gh { color: $dark-gh; font-weight: $gl-font-weight-bold; } /* Generic.Heading */
.gi { color: $dark-gi; } /* Generic.Inserted */
.gp { color: $dark-gp; font-weight: bold; } /* Generic.Prompt */
.gs { font-weight: bold; } /* Generic.Strong */
.gu { color: $dark-gu; font-weight: bold; } /* Generic.Subheading */
.gp { color: $dark-gp; font-weight: $gl-font-weight-bold; } /* Generic.Prompt */
.gs { font-weight: $gl-font-weight-bold; } /* Generic.Strong */
.gu { color: $dark-gu; font-weight: $gl-font-weight-bold; } /* Generic.Subheading */
.kc { color: $dark-kc; } /* Keyword.Constant */
.kd { color: $dark-kd; } /* Keyword.Declaration */
.kn { color: $dark-kn; } /* Keyword.Namespace */
......
......@@ -203,7 +203,7 @@ $monokai-gi: #a6e22e;
.c1 { color: $monokai-c1; } /* Comment.Single */
.cs { color: $monokai-cs; } /* Comment.Special */
.ge { font-style: italic; } /* Generic.Emph */
.gs { font-weight: bold; } /* Generic.Strong */
.gs { font-weight: $gl-font-weight-bold; } /* Generic.Strong */
.kc { color: $monokai-kc; } /* Keyword.Constant */
.kd { color: $monokai-kd; } /* Keyword.Declaration */
.kn { color: $monokai-kn; } /* Keyword.Namespace */
......
......@@ -231,7 +231,7 @@ $solarized-dark-il: #2aa198;
.gi { color: $solarized-dark-gi; } /* Generic.Inserted */
.go { color: $solarized-dark-go; } /* Generic.Output */
.gp { color: $solarized-dark-gp; } /* Generic.Prompt */
.gs { color: $solarized-dark-gs; font-weight: bold; } /* Generic.Strong */
.gs { color: $solarized-dark-gs; font-weight: $gl-font-weight-bold; } /* Generic.Strong */
.gu { color: $solarized-dark-gu; } /* Generic.Subheading */
.gt { color: $solarized-dark-gt; } /* Generic.Traceback */
.kc { color: $solarized-dark-kc; } /* Keyword.Constant */
......
......@@ -239,7 +239,7 @@ $solarized-light-il: #2aa198;
.gi { color: $solarized-light-gi; } /* Generic.Inserted */
.go { color: $solarized-light-go; } /* Generic.Output */
.gp { color: $solarized-light-gp; } /* Generic.Prompt */
.gs { color: $solarized-light-gs; font-weight: bold; } /* Generic.Strong */
.gs { color: $solarized-light-gs; font-weight: $gl-font-weight-bold; } /* Generic.Strong */
.gu { color: $solarized-light-gu; } /* Generic.Subheading */
.gt { color: $solarized-light-gt; } /* Generic.Traceback */
.kc { color: $solarized-light-kc; } /* Keyword.Constant */
......
......@@ -211,12 +211,12 @@ $white-gc-bg: #eaf2f5;
.hll { background-color: $white-hll-bg; }
.c { color: $white-c; font-style: italic; }
.err { color: $white-err; background-color: $white-err-bg; }
.k { font-weight: bold; }
.o { font-weight: bold; }
.k { font-weight: $gl-font-weight-bold; }
.o { font-weight: $gl-font-weight-bold; }
.cm { color: $white-cm; font-style: italic; }
.cp { color: $white-cp; font-weight: bold; }
.cp { color: $white-cp; font-weight: $gl-font-weight-bold; }
.c1 { color: $white-c1; font-style: italic; }
.cs { color: $white-cs; font-weight: bold; font-style: italic; }
.cs { color: $white-cs; font-weight: $gl-font-weight-bold; font-style: italic; }
.gd { color: $white-gd; background-color: $white-gd-bg; }
.gd .x { color: $white-gd-x; background-color: $white-gd-x-bg; }
.ge { font-style: italic; }
......@@ -226,29 +226,29 @@ $white-gc-bg: #eaf2f5;
.gi .x { color: $white-gi-x; background-color: $white-gi-x-bg; }
.go { color: $white-go; }
.gp { color: $white-gp; }
.gs { font-weight: bold; }
.gu { color: $white-gu; font-weight: bold; }
.gs { font-weight: $gl-font-weight-bold; }
.gu { color: $white-gu; font-weight: $gl-font-weight-bold; }
.gt { color: $white-gt; }
.kc { font-weight: bold; }
.kd { font-weight: bold; }
.kn { font-weight: bold; }
.kp { font-weight: bold; }
.kr { font-weight: bold; }
.kt { color: $white-kt; font-weight: bold; }
.kc { font-weight: $gl-font-weight-bold; }
.kd { font-weight: $gl-font-weight-bold; }
.kn { font-weight: $gl-font-weight-bold; }
.kp { font-weight: $gl-font-weight-bold; }
.kr { font-weight: $gl-font-weight-bold; }
.kt { color: $white-kt; font-weight: $gl-font-weight-bold; }
.m { color: $white-m; }
.s { color: $white-s; }
.n { color: $white-n; }
.na { color: $white-na; }
.nb { color: $white-nb; }
.nc { color: $white-nc; font-weight: bold; }
.nc { color: $white-nc; font-weight: $gl-font-weight-bold; }
.no { color: $white-no; }
.ni { color: $white-ni; }
.ne { color: $white-ne; font-weight: bold; }
.nf { color: $white-nf; font-weight: bold; }
.ne { color: $white-ne; font-weight: $gl-font-weight-bold; }
.nf { color: $white-nf; font-weight: $gl-font-weight-bold; }
.nn { color: $white-nn; }
.nt { color: $white-nt; }
.nv { color: $white-nv; }
.ow { font-weight: bold; }
.ow { font-weight: $gl-font-weight-bold; }
.w { color: $white-w; }
.mf { color: $white-mf; }
.mh { color: $white-mh; }
......
......@@ -152,12 +152,12 @@ span.highlight_word {
.hll { background-color: $highlighted-hll-bg; }
.c { color: $highlighted-c; font-style: italic; }
.err { color: $highlighted-err; background-color: $highlighted-err-bg; }
.k { font-weight: bold; }
.o { font-weight: bold; }
.k { font-weight: $gl-font-weight-bold; }
.o { font-weight: $gl-font-weight-bold; }
.cm { color: $highlighted-cm; font-style: italic; }
.cp { color: $highlighted-cp; font-weight: bold; }
.cp { color: $highlighted-cp; font-weight: $gl-font-weight-bold; }
.c1 { color: $highlighted-c1; font-style: italic; }
.cs { color: $highlighted-cs; font-weight: bold; font-style: italic; }
.cs { color: $highlighted-cs; font-weight: $gl-font-weight-bold; font-style: italic; }
.gd { color: $highlighted-gd; background-color: $highlighted-gd-bg; }
.gd .x { color: $highlighted-gd; background-color: $highlighted-gd-x-bg; }
.ge { font-style: italic; }
......@@ -167,29 +167,29 @@ span.highlight_word {
.gi .x { color: $highlighted-gi; background-color: $highlighted-gi-x-bg; }
.go { color: $highlighted-go; }
.gp { color: $highlighted-gp; }
.gs { font-weight: bold; }
.gu { color: $highlighted-gu; font-weight: bold; }
.gs { font-weight: $gl-font-weight-bold; }
.gu { color: $highlighted-gu; font-weight: $gl-font-weight-bold; }
.gt { color: $highlighted-gt; }
.kc { font-weight: bold; }
.kd { font-weight: bold; }
.kn { font-weight: bold; }
.kp { font-weight: bold; }
.kr { font-weight: bold; }
.kt { color: $highlighted-kt; font-weight: bold; }
.kc { font-weight: $gl-font-weight-bold; }
.kd { font-weight: $gl-font-weight-bold; }
.kn { font-weight: $gl-font-weight-bold; }
.kp { font-weight: $gl-font-weight-bold; }
.kr { font-weight: $gl-font-weight-bold; }
.kt { color: $highlighted-kt; font-weight: $gl-font-weight-bold; }
.m { color: $highlighted-m; }
.s { color: $highlighted-s; }
.n { color: $highlighted-n; }
.na { color: $highlighted-na; }
.nb { color: $highlighted-nb; }
.nc { color: $highlighted-nc; font-weight: bold; }
.nc { color: $highlighted-nc; font-weight: $gl-font-weight-bold; }
.no { color: $highlighted-no; }
.ni { color: $highlighted-ni; }
.ne { color: $highlighted-ne; font-weight: bold; }
.nf { color: $highlighted-nf; font-weight: bold; }
.ne { color: $highlighted-ne; font-weight: $gl-font-weight-bold; }
.nf { color: $highlighted-nf; font-weight: $gl-font-weight-bold; }
.nn { color: $highlighted-nn; }
.nt { color: $highlighted-nt; }
.nv { color: $highlighted-nv; }
.ow { font-weight: bold; }
.ow { font-weight: $gl-font-weight-bold; }
.w { color: $highlighted-w; }
.mf { color: $highlighted-mf; }
.mh { color: $highlighted-mh; }
......
......@@ -134,7 +134,7 @@ header.navbar-gitlab-new {
li {
.badge {
box-shadow: none;
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
}
......@@ -193,7 +193,7 @@ header.navbar-gitlab-new {
&.active > a {
box-shadow: inset 0 -3px 0 $indigo-500;
color: $white-light;
font-weight: 700;
font-weight: $gl-font-weight-bold;
}
> a {
......@@ -371,7 +371,7 @@ header.navbar-gitlab-new {
> a {
&:last-of-type:not(:first-child) {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
}
......@@ -411,7 +411,7 @@ header.navbar-gitlab-new {
.breadcrumbs-sub-title {
margin: 2px 0;
font-size: 16px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
line-height: 1;
ul {
......@@ -430,7 +430,7 @@ header.navbar-gitlab-new {
}
&:last-child a {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......
......@@ -46,7 +46,7 @@ $new-sidebar-collapsed-width: 50px;
a {
border-bottom: 1px solid $border-color;
font-weight: 600;
font-weight: $gl-font-weight-bold;
display: flex;
align-items: center;
padding: 10px 16px 10px 10px;
......@@ -70,8 +70,7 @@ $new-sidebar-collapsed-width: 50px;
background-color: $white-light;
}
.project-title,
.group-title {
.sidebar-context-title {
overflow: hidden;
text-overflow: ellipsis;
}
......@@ -109,7 +108,7 @@ $new-sidebar-collapsed-width: 50px;
}
.badge,
.project-title {
.sidebar-context-title {
display: none;
}
......@@ -160,7 +159,7 @@ $new-sidebar-collapsed-width: 50px;
> a {
color: $active-color;
font-weight: 700;
font-weight: $gl-font-weight-bold;
}
svg {
......@@ -308,7 +307,7 @@ $new-sidebar-collapsed-width: 50px;
.badge {
color: $active-color;
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
.sidebar-sub-level-items {
......@@ -474,6 +473,6 @@ $new-sidebar-collapsed-width: 50px;
border-bottom-color: $active-border;
.badge {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......@@ -471,7 +471,7 @@
padding-right: 35px;
> strong {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
}
......
......@@ -277,7 +277,7 @@
}
.trigger-build-variable {
font-weight: normal;
font-weight: $gl-font-weight-normal;
color: $code-color;
}
......@@ -378,7 +378,7 @@
}
&.active {
font-weight: bold;
font-weight: $gl-font-weight-bold;
.fa-arrow-right {
display: block;
......
......@@ -22,7 +22,7 @@
vertical-align: middle !important;
a {
font-weight: normal;
font-weight: $gl-font-weight-normal;
text-decoration: none;
}
}
......
......@@ -213,7 +213,7 @@
.commit-sha {
font-size: 14px;
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......@@ -286,6 +286,9 @@
.gpg-status-box {
padding: 2px 10px;
margin-right: $gl-padding;
&:empty {
display: none;
}
......@@ -303,7 +306,7 @@
.gpg-popover-status {
display: flex;
align-items: center;
font-weight: normal;
font-weight: $gl-font-weight-normal;
line-height: 1.5;
}
......@@ -314,7 +317,6 @@
&.valid {
svg {
border: 1px solid $brand-success;
fill: $brand-success;
}
}
......@@ -322,7 +324,6 @@
&.invalid {
svg {
border: 1px solid $common-gray-light;
fill: $common-gray-light;
}
}
......
......@@ -23,7 +23,7 @@ $space-between-cards: 8px;
line-height: 1;
color: $gl-text-color-secondary;
margin-left: 8px;
font-weight: 500;
font-weight: $gl-font-weight-normal;
a {
font-size: 18px;
......@@ -139,7 +139,7 @@ $space-between-cards: 8px;
.card-score-value {
font-size: 16px;
color: $gl-text-color;
font-weight: 500;
font-weight: $gl-font-weight-normal;
}
.card-score-big {
......@@ -147,7 +147,7 @@ $space-between-cards: 8px;
border-bottom: 1px solid $border-color;
font-size: 22px;
padding: 10px 0;
font-weight: 500;
font-weight: $gl-font-weight-normal;
}
.card-buttons {
......
......@@ -68,7 +68,7 @@
}
.stage-name {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......@@ -93,7 +93,7 @@
.header {
font-size: 30px;
line-height: 38px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
margin: 0;
}
......@@ -130,7 +130,7 @@
&.title {
line-height: 19px;
font-size: 14px;
font-weight: 600;
font-weight: $gl-font-weight-bold;
color: $gl-text-color;
}
......@@ -211,7 +211,7 @@
box-shadow: inset 2px 0 0 0 $active-item-blue;
.stage-name {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......@@ -404,7 +404,7 @@
color: $gl-link-color;
line-height: 1.3;
vertical-align: top;
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
.fa {
......
......@@ -40,7 +40,7 @@
// "Changes suppressed. Click to show." link
.show-suppressed-diff {
font-size: 110%;
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
}
......@@ -104,7 +104,7 @@
a {
float: left;
width: 35px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
&[disabled] {
cursor: default;
......@@ -395,7 +395,7 @@
background-color: transparent;
border: 0;
color: $gl-link-color;
font-weight: 600;
font-weight: $gl-font-weight-bold;
&:hover,
&:focus {
......
......@@ -6,7 +6,7 @@
}
.environments-folder-name {
font-weight: normal;
font-weight: $gl-font-weight-normal;
padding-top: 20px;
}
......@@ -246,13 +246,13 @@
}
.text-metric-bold {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
.label-axis-text,
.text-metric-usage {
fill: $black;
font-weight: 500;
font-weight: $gl-font-weight-normal;
font-size: 12px;
}
......
......@@ -57,7 +57,7 @@
.event-title {
@include str-truncated(calc(100% - 174px));
font-weight: 600;
font-weight: $gl-font-weight-bold;
color: $list-text-color;
}
......
......@@ -271,7 +271,7 @@
}
.light {
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
.no-value {
......@@ -306,7 +306,7 @@
display: block;
margin-top: 4px;
font-size: 13px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
.hide-expanded {
......@@ -689,7 +689,7 @@
.issuable-info,
.task-status,
.issuable-updated-at {
font-weight: normal;
font-weight: $gl-font-weight-normal;
color: $gl-text-color-secondary;
a {
......
......@@ -75,7 +75,7 @@ ul.related-merge-requests > li {
.merge-requests-title,
.related-branches-title {
font-size: 16px;
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
.merge-request-id {
......@@ -244,7 +244,7 @@ ul.related-merge-requests > li {
strong {
display: block;
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
}
......
......@@ -22,7 +22,7 @@
}
h1:first-child {
font-weight: normal;
font-weight: $gl-font-weight-normal;
margin-bottom: 0.68em;
margin-top: 0;
font-size: 34px;
......@@ -38,7 +38,7 @@
}
a {
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
}
......@@ -54,7 +54,7 @@
padding: 15px;
.login-heading h3 {
font-weight: 300;
font-weight: $gl-font-weight-normal;
line-height: 1.5;
margin: 0 0 10px;
}
......@@ -186,7 +186,7 @@
}
label {
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
.submit-container {
......
......@@ -46,7 +46,7 @@
}
strong {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......@@ -221,7 +221,7 @@
}
.member {
font-weight: bold;
font-weight: $gl-font-weight-bold;
overflow-wrap: break-word;
word-break: break-all;
}
......
......@@ -197,7 +197,7 @@
@extend .ref-name;
color: $gl-text-color;
font-weight: 600;
font-weight: $gl-font-weight-bold;
overflow: hidden;
word-break: break-all;
......@@ -228,7 +228,7 @@
.mr-widget-body {
h4 {
float: left;
font-weight: 600;
font-weight: $gl-font-weight-bold;
font-size: 14px;
line-height: inherit;
margin-top: 0;
......@@ -239,7 +239,7 @@
}
time {
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
}
......@@ -249,7 +249,7 @@
}
label {
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
.spacing {
......@@ -257,12 +257,12 @@
}
.bold {
font-weight: 600;
font-weight: $gl-font-weight-bold;
color: $gl-gray-light;
}
.state-label {
font-weight: 600;
font-weight: $gl-font-weight-bold;
padding-right: 10px;
}
......@@ -336,7 +336,7 @@
.text {
span {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
p {
......@@ -505,7 +505,7 @@
.panel-new-merge-request {
.panel-heading {
padding: 5px 10px;
font-weight: 600;
font-weight: $gl-font-weight-bold;
line-height: 25px;
}
......
......@@ -7,7 +7,7 @@
padding: 10px 16px;
h4 {
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
.progress {
......@@ -81,7 +81,7 @@
}
.remaining-days strong {
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
.milestone-stat {
......
......@@ -188,7 +188,7 @@
.close {
color: $white-light;
opacity: 0.85;
font-weight: normal;
font-weight: $gl-font-weight-normal;
&:hover {
opacity: 1;
......
......@@ -12,7 +12,7 @@
.interval-pattern-form-group {
label {
margin-right: 10px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
&[for='custom'] {
margin-right: 0;
......
......@@ -128,7 +128,7 @@
.branch-commit {
.ref-name {
font-weight: bold;
font-weight: $gl-font-weight-bold;
max-width: 120px;
overflow: hidden;
display: inline-block;
......@@ -272,7 +272,7 @@
.build-name {
float: right;
font-weight: 500;
font-weight: $gl-font-weight-normal;
}
.ci-status-icon-failed svg {
......@@ -281,7 +281,7 @@
.stage {
color: $gl-text-color-secondary;
font-weight: 500;
font-weight: $gl-font-weight-normal;
vertical-align: middle;
}
}
......@@ -420,7 +420,7 @@
.stage-name {
margin: 0 0 15px 10px;
font-weight: bold;
font-weight: $gl-font-weight-bold;
width: 176px;
white-space: nowrap;
overflow: hidden;
......@@ -580,7 +580,7 @@
vertical-align: bottom;
display: inline-block;
position: relative;
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
@mixin mini-pipeline-graph-color($color-light, $color-main, $color-dark) {
......@@ -724,7 +724,7 @@ button.mini-pipeline-graph-dropdown-toggle {
.mini-pipeline-graph-dropdown-item {
padding: 3px 7px 4px;
clear: both;
font-weight: normal;
font-weight: $gl-font-weight-normal;
line-height: 1.428571429;
white-space: nowrap;
margin: 0 5px;
......
......@@ -83,7 +83,7 @@
&::after {
content: "\00B7"; // Middle Dot
padding: 0 6px;
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
&:last-child {
......@@ -277,7 +277,7 @@ table.u2f-registrations {
.oauth-application-show {
.scope-name {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
.scopes-list {
......
......@@ -2,7 +2,7 @@
margin: -16px;
.alert-link {
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
}
......@@ -114,7 +114,7 @@
margin-top: 10px;
margin-bottom: 10px;
font-size: 24px;
font-weight: 400;
font-weight: $gl-font-weight-normal;
line-height: 1;
word-wrap: break-word;
......@@ -259,7 +259,7 @@
border-width: 1px;
border-style: solid;
font-size: 13px;
font-weight: 600;
font-weight: $gl-font-weight-bold;
line-height: 13px;
letter-spacing: .4px;
padding: 6px 14px;
......@@ -309,7 +309,7 @@
}
.option-title {
font-weight: normal;
font-weight: $gl-font-weight-normal;
display: inline-block;
color: $gl-text-color;
}
......@@ -575,7 +575,7 @@ a.deploy-project-label {
color: $gl-text-color-tertiary;
transform: translateY(-50%);
font-size: 12px;
font-weight: bold;
font-weight: $gl-font-weight-bold;
line-height: 20px;
// Mobile
......@@ -826,7 +826,7 @@ pre.light-well {
.new-protected-tag {
label {
margin-top: 6px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
}
......@@ -853,7 +853,7 @@ pre.light-well {
}
&.is-active {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......@@ -952,7 +952,7 @@ pre.light-well {
&::before {
font-family: FontAwesome;
font-weight: normal;
font-weight: $gl-font-weight-normal;
font-style: normal;
}
}
......
......@@ -267,7 +267,7 @@
display: inline-block;
font-size: 10px;
text-transform: uppercase;
font-weight: bold;
font-weight: $gl-font-weight-bold;
color: $gray-darkest;
white-space: nowrap;
overflow: hidden;
......
......@@ -30,7 +30,7 @@
}
h4 {
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
}
......
......@@ -94,7 +94,7 @@ input[type="checkbox"]:hover {
&::before {
font-family: FontAwesome;
font-weight: normal;
font-weight: $gl-font-weight-normal;
font-style: normal;
}
}
......
......@@ -29,5 +29,5 @@ table .sherlock-code {
.sherlock-line-samples-table .slow {
color: $red-500;
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
......@@ -108,14 +108,14 @@
margin: 0;
float: none;
display: inline-block;
font-weight: normal;
font-weight: $gl-font-weight-normal;
padding: 0 5px;
line-height: inherit;
font-size: 14px;
}
.action-name {
font-weight: normal;
font-weight: $gl-font-weight-normal;
}
.todo-body {
......@@ -262,6 +262,6 @@
}
a {
font-weight: 600;
font-weight: $gl-font-weight-bold;
}
}
......@@ -231,7 +231,7 @@
}
.upload-link {
font-weight: normal;
font-weight: $gl-font-weight-normal;
color: $md-link-color;
}
......
.gitlab-ui-dev-kit {
> h2 {
margin: 35px 0 20px;
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
.example {
......
......@@ -37,7 +37,7 @@
}
.light {
font-weight: normal;
font-weight: $gl-font-weight-normal;
color: $gl-text-color-secondary;
}
......@@ -89,7 +89,7 @@
h3 {
font-size: 19px;
font-weight: normal;
font-weight: $gl-font-weight-normal;
margin: $gl-padding 0;
}
}
......
......@@ -281,7 +281,7 @@
$xterm-fg-255: #eee;
.term-bold {
font-weight: bold;
font-weight: $gl-font-weight-bold;
}
.term-italic {
......
......@@ -17,7 +17,7 @@
.wiki h3 {
font-size: 18px;
font-weight: bold;
font-weight: 600;
}
header,
......
class Admin::LogsController < Admin::ApplicationController
def show
@loggers = [
Gitlab::AppLogger,
Gitlab::GitLogger,
Gitlab::EnvironmentLogger,
Gitlab::SidekiqLogger,
Gitlab::RepositoryCheckLogger
]
end
end
......@@ -3,9 +3,9 @@ class Admin::ProjectsController < Admin::ApplicationController
before_action :group, only: [:show, :transfer]
def index
finder = Admin::ProjectsFinder.new(params: params, current_user: current_user)
@projects = finder.execute
@sort = finder.sort
params[:sort] ||= 'latest_activity_desc'
@sort = params[:sort]
@projects = Admin::ProjectsFinder.new(params: params, current_user: current_user).execute
respond_to do |format|
format.html
......
......@@ -10,6 +10,14 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
end
end
if Gitlab::LDAP::Config.enabled?
Gitlab::LDAP::Config.available_servers.each do |server|
define_method server['provider_name'] do
ldap
end
end
end
# Extend the standard message generation to accept our custom exception
def failure_message
exception = env["omniauth.error"]
......
......@@ -4,7 +4,6 @@ class Projects::ServicesController < Projects::ApplicationController
# Authorize
before_action :authorize_admin_project!
before_action :service, only: [:edit, :update, :test]
before_action :update_service, only: [:update, :test]
respond_to :html
......@@ -14,6 +13,8 @@ class Projects::ServicesController < Projects::ApplicationController
end
def update
@service.attributes = service_params[:service]
if @service.save(context: :manual_change)
redirect_to(project_settings_integrations_path(@project), notice: success_message)
else
......@@ -24,7 +25,7 @@ class Projects::ServicesController < Projects::ApplicationController
def test
message = {}
if @service.can_test?
if @service.can_test? && @service.update_attributes(service_params[:service])
data = @service.test_data(project, current_user)
outcome = @service.test(data)
......@@ -50,10 +51,6 @@ class Projects::ServicesController < Projects::ApplicationController
end
end
def update_service
@service.assign_attributes(service_params[:service])
end
def service
@service ||= @project.find_or_initialize_service(params[:id])
end
......
......@@ -5,14 +5,6 @@ class SessionsController < Devise::SessionsController
skip_before_action :check_two_factor_requirement, only: [:destroy]
# Explicitly call protect from forgery before anything else. Otherwise the
# CSFR-token might be cleared before authentication is done. This was the case
# when LDAP was enabled and the `OmniauthCallbacksController` is loaded
#
# *Note:* `prepend: true` is the default for rails4, but this will be changed
# to `prepend: false` in rails5.
protect_from_forgery prepend: true, with: :exception
prepend_before_action :check_initial_setup, only: [:new]
prepend_before_action :authenticate_with_two_factor,
if: :two_factor_enabled?, only: [:create]
......
class Admin::ProjectsFinder
attr_reader :sort, :namespace_id, :visibility_level, :with_push,
:abandoned, :last_repository_check_failed, :archived,
:personal, :name, :page, :current_user
attr_reader :params, :current_user
def initialize(params:, current_user:)
@params = params
@current_user = current_user
@sort = params.fetch(:sort) { 'latest_activity_desc' }
@namespace_id = params[:namespace_id]
@visibility_level = params[:visibility_level]
@with_push = params[:with_push]
@abandoned = params[:abandoned]
@last_repository_check_failed = params[:last_repository_check_failed]
@archived = params[:archived]
@personal = params[:personal]
@name = params[:name]
@page = params[:page]
end
def execute
items = Project.without_deleted.with_statistics
items = items.in_namespace(namespace_id) if namespace_id.present?
items = items.where(visibility_level: visibility_level) if visibility_level.present?
items = items.with_push if with_push.present?
items = items.abandoned if abandoned.present?
items = items.where(last_repository_check_failed: true) if last_repository_check_failed.present?
items = items.non_archived unless archived.present?
items = items.personal(current_user) if personal.present?
items = items.search(name) if name.present?
items = items.sort(sort)
items.includes(:namespace).order("namespaces.path, projects.name ASC").page(page)
items = by_namespace_id(items)
items = by_visibilty_level(items)
items = by_with_push(items)
items = by_abandoned(items)
items = by_last_repository_check_failed(items)
items = by_archived(items)
items = by_personal(items)
items = by_name(items)
items = sort(items)
items.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page])
end
private
def by_namespace_id(items)
params[:namespace_id].present? ? items.in_namespace(params[:namespace_id]) : items
end
def by_visibilty_level(items)
params[:visibility_level].present? ? items.where(visibility_level: params[:visibility_level]) : items
end
def by_with_push(items)
params[:with_push].present? ? items.with_push : items
end
def by_abandoned(items)
params[:abandoned].present? ? items.abandoned : items
end
def by_last_repository_check_failed(items)
params[:last_repository_check_failed].present? ? items.where(last_repository_check_failed: true) : items
end
def by_archived(items)
if params[:archived] == 'only'
items.archived
elsif params[:archived].blank?
items.non_archived
else
items
end
end
def by_personal(items)
params[:personal].present? ? items.personal(current_user) : items
end
def by_name(items)
params[:name].present? ? items.search(params[:name]) : items
end
def sort(items)
sort = params.fetch(:sort) { 'latest_activity_desc' }
items.sort(sort)
end
end
......@@ -125,9 +125,18 @@ class ProjectsFinder < UnionFinder
end
def by_archived(projects)
# Back-compatibility with the places where `params[:archived]` can be set explicitly to `false`
params[:non_archived] = !Gitlab::Utils.to_boolean(params[:archived]) if params.key?(:archived)
params[:non_archived] ? projects.non_archived : projects
if params[:non_archived]
projects.non_archived
elsif params.key?(:archived) # Back-compatibility with the places where `params[:archived]` can be set explicitly to `false`
if params[:archived] == 'only'
projects.archived
elsif Gitlab::Utils.to_boolean(params[:archived])
projects
else
projects.non_archived
end
else
projects
end
end
end
......@@ -12,11 +12,18 @@ module AvatarsHelper
avatar_size = options[:size] || 16
user_name = options[:user].try(:name) || options[:user_name]
avatar_url = options[:url] || avatar_icon(options[:user] || options[:user_email], avatar_size)
has_tooltip = options[:has_tooltip].nil? ? true : options[:has_tooltip]
data_attributes = {}
css_class = %W[avatar s#{avatar_size}].push(*options[:css_class])
if has_tooltip
css_class.push('has-tooltip')
data_attributes = { container: 'body' }
end
image_tag(
avatar_url,
class: %W[avatar has-tooltip s#{avatar_size}].push(*options[:css_class]),
class: css_class,
alt: "#{user_name}'s avatar",
title: user_name,
data: data_attributes,
......
......@@ -114,7 +114,7 @@ module CommitsHelper
end
def commit_signature_badge_classes(additional_classes)
%w(btn status-box gpg-status-box) + Array(additional_classes)
%w(btn gpg-status-box) + Array(additional_classes)
end
protected
......
......@@ -181,6 +181,7 @@ module EventsHelper
end
def event_commit_title(message)
message ||= ''
(message.split("\n").first || "").truncate(70)
rescue
"--broken encoding"
......
......@@ -19,11 +19,21 @@ class BroadcastMessage < ActiveRecord::Base
after_commit :flush_redis_cache
def self.current
Rails.cache.fetch(CACHE_KEY) do
where('ends_at > :now AND starts_at <= :now', now: Time.zone.now)
.reorder(id: :asc)
.to_a
messages = Rails.cache.fetch(CACHE_KEY) { current_and_future_messages.to_a }
return messages if messages.empty?
now_or_future = messages.select(&:now_or_future?)
# If there are cached entries but none are to be displayed we'll purge the
# cache so we don't keep running this code all the time.
Rails.cache.delete(CACHE_KEY) if now_or_future.empty?
now_or_future.select(&:now?)
end
def self.current_and_future_messages
where('ends_at > :now', now: Time.zone.now).reorder(id: :asc)
end
def active?
......@@ -38,6 +48,18 @@ class BroadcastMessage < ActiveRecord::Base
ends_at < Time.zone.now
end
def now?
(starts_at..ends_at).cover?(Time.zone.now)
end
def future?
starts_at > Time.zone.now
end
def now_or_future?
now? || future?
end
def flush_redis_cache
Rails.cache.delete(CACHE_KEY)
end
......
......@@ -46,7 +46,10 @@ module Ci
before_save :ensure_token
before_destroy { unscoped_project }
after_create :execute_hooks
after_create do |build|
run_after_commit { BuildHooksWorker.perform_async(build.id) }
end
after_commit :update_project_statistics_after_save, on: [:create, :update]
after_commit :update_project_statistics, on: :destroy
......
......@@ -393,7 +393,8 @@ module Ci
def predefined_variables
[
{ key: 'CI_PIPELINE_ID', value: id.to_s, public: true },
{ key: 'CI_CONFIG_PATH', value: ci_yaml_file_path, public: true }
{ key: 'CI_CONFIG_PATH', value: ci_yaml_file_path, public: true },
{ key: 'CI_PIPELINE_SOURCE', value: source.to_s, public: true }
]
end
......
......@@ -17,6 +17,10 @@ module Ci
validates :pipeline, presence: true, unless: :importing?
validates :name, presence: true, unless: :importing?
after_initialize do |stage|
self.status = DEFAULT_STATUS if self.status.nil?
end
state_machine :status, initial: :created do
event :enqueue do
transition created: :pending
......
......@@ -406,7 +406,7 @@ class Event < ActiveRecord::Base
def body?
if push?
push_with_commits? || rm_ref?
push_with_commits?
elsif note?
true
else
......
......@@ -50,7 +50,10 @@ class Issue < ActiveRecord::Base
scope :preload_associations, -> { preload(:labels, project: :namespace) }
scope :public_only, -> { where(confidential: false) }
after_save :expire_etag_cache
after_commit :update_project_counter_caches, on: :destroy
attr_spammable :title, spam_title: true
attr_spammable :description, spam_description: true
......@@ -266,6 +269,10 @@ class Issue < ActiveRecord::Base
end
end
def update_project_counter_caches
Projects::OpenIssuesCountService.new(project).refresh_cache
end
private
# Returns `true` if the given User can read the current Issue.
......
......@@ -31,6 +31,7 @@ class MergeRequest < ActiveRecord::Base
after_create :ensure_merge_request_diff, unless: :importing?
after_update :reload_diff_if_branch_changed
after_commit :update_project_counter_caches, on: :destroy
# When this attribute is true some MR validation is ignored
# It allows us to close or modify broken merge requests
......@@ -682,9 +683,8 @@ class MergeRequest < ActiveRecord::Base
if !include_description && closes_issues_references.present?
message << "Closes #{closes_issues_references.to_sentence}"
end
message << "#{description}" if include_description && description.present?
message << "See merge request #{to_reference}"
message << "See merge request #{to_reference(full: true)}"
message.join("\n\n")
end
......@@ -936,6 +936,10 @@ class MergeRequest < ActiveRecord::Base
true
end
def update_project_counter_caches
Projects::OpenMergeRequestsCountService.new(target_project).refresh_cache
end
private
def write_ref
......
......@@ -247,6 +247,7 @@ class Project < ActiveRecord::Base
scope :joined, ->(user) { where('namespace_id != ?', user.namespace_id) }
scope :starred_by, ->(user) { joins(:users_star_projects).where('users_star_projects.user_id': user.id) }
scope :visible_to_user, ->(user) { where(id: user.authorized_projects.select(:id).reorder(nil)) }
scope :archived, -> { where(archived: true) }
scope :non_archived, -> { where(archived: false) }
scope :for_milestones, ->(ids) { joins(:milestones).where('milestones.id' => ids).distinct }
scope :with_push, -> { joins(:events).where('events.action = ?', Event::PUSHED) }
......@@ -1017,7 +1018,7 @@ class Project < ActiveRecord::Base
name: name,
description: description,
web_url: web_url,
avatar_url: avatar_url,
avatar_url: avatar_url(only_path: false),
git_ssh_url: ssh_url_to_repo,
git_http_url: http_url_to_repo,
namespace: namespace.name,
......@@ -1167,7 +1168,11 @@ class Project < ActiveRecord::Base
end
def open_issues_count
issues.opened.count
Projects::OpenIssuesCountService.new(self).count
end
def open_merge_requests_count
Projects::OpenMergeRequestsCountService.new(self).count
end
def visibility_level_allowed_as_fork?(level = self.visibility_level)
......
......@@ -24,6 +24,8 @@ class KubernetesService < DeploymentService
validates :token
end
before_validation :enforce_namespace_to_lower_case
validates :namespace,
allow_blank: true,
length: 1..63,
......@@ -207,4 +209,8 @@ class KubernetesService < DeploymentService
max_session_time: current_application_settings.terminal_max_session_time
}
end
def enforce_namespace_to_lower_case
self.namespace = self.namespace&.downcase
end
end
......@@ -206,12 +206,18 @@ class Repository
end
def branch_exists?(branch_name)
branch_names.include?(branch_name)
return false unless raw_repository
@branch_exists_memo ||= Hash.new do |hash, key|
hash[key] = raw_repository.branch_exists?(key)
end
@branch_exists_memo[branch_name]
end
def ref_exists?(ref)
rugged.references.exist?(ref)
rescue Rugged::ReferenceError
!!raw_repository&.ref_exists?(ref)
rescue ArgumentError
false
end
......@@ -266,6 +272,7 @@ class Repository
def expire_branches_cache
expire_method_caches(%i(branch_names branch_count))
@local_branches = nil
@branch_exists_memo = nil
end
def expire_statistics_caches
......@@ -1185,7 +1192,7 @@ class Repository
end
def initialize_raw_repository
Gitlab::Git::Repository.new(project.repository_storage, disk_path + '.git')
Gitlab::Git::Repository.new(project.repository_storage, disk_path + '.git', Gitlab::GlRepository.gl_repository(project, false))
end
def circuit_breaker
......
......@@ -17,7 +17,7 @@ module Commits
new_commit = create_commit!
success(result: new_commit)
rescue ValidationError, ChangeError, Gitlab::Git::Index::IndexError, Repository::CommitError, GitHooksService::PreReceiveError => ex
rescue ValidationError, ChangeError, Gitlab::Git::Index::IndexError, Repository::CommitError, Gitlab::Git::HooksService::PreReceiveError => ex
error(ex.message)
end
......
......@@ -14,7 +14,7 @@ class CreateBranchService < BaseService
else
error('Invalid reference name')
end
rescue GitHooksService::PreReceiveError => ex
rescue Gitlab::Git::HooksService::PreReceiveError => ex
error(ex.message)
end
......
......@@ -16,7 +16,7 @@ class DeleteBranchService < BaseService
else
error('Failed to remove branch')
end
rescue GitHooksService::PreReceiveError => ex
rescue Gitlab::Git::HooksService::PreReceiveError => ex
error(ex.message)
end
......
class GitHooksService
PreReceiveError = Class.new(StandardError)
attr_accessor :oldrev, :newrev, :ref
def execute(user, project, oldrev, newrev, ref)
@project = project
@user = Gitlab::GlId.gl_id(user)
@oldrev = oldrev
@newrev = newrev
@ref = ref
%w(pre-receive update).each do |hook_name|
status, message = run_hook(hook_name)
unless status
raise PreReceiveError, message
end
end
yield(self).tap do
run_hook('post-receive')
end
end
private
def run_hook(name)
hook = Gitlab::Git::Hook.new(name, @project)
hook.trigger(@user, oldrev, newrev, ref)
end
end
class GitOperationService
attr_reader :user, :repository
attr_reader :committer, :repository
def initialize(committer, new_repository)
committer = Gitlab::Git::Committer.from_user(committer) if committer.is_a?(User)
@committer = committer
def initialize(new_user, new_repository)
@user = new_user
@repository = new_repository
end
......@@ -118,9 +120,9 @@ class GitOperationService
end
def with_hooks(ref, newrev, oldrev)
GitHooksService.new.execute(
user,
repository.project,
Gitlab::Git::HooksService.new.execute(
committer,
repository,
oldrev,
newrev,
ref) do |service|
......
module Groups
class NestedCreateService < Groups::BaseService
attr_reader :group_path
def initialize(user, params)
@current_user, @params = user, params.dup
@group_path = @params.delete(:group_path)
end
def execute
return nil unless group_path
if group = Group.find_by_full_path(group_path)
return group
end
create_group_path
end
private
def create_group_path
group_path_segments = group_path.split('/')
last_group = nil
partial_path_segments = []
while subgroup_name = group_path_segments.shift
partial_path_segments << subgroup_name
partial_path = partial_path_segments.join('/')
new_params = params.reverse_merge(
path: subgroup_name,
name: subgroup_name,
parent: last_group
)
new_params[:visibility_level] ||= Gitlab::CurrentSettings.current_application_settings.default_group_visibility
last_group = Group.find_by_full_path(partial_path) || Groups::CreateService.new(current_user, new_params).execute
end
last_group
end
end
end
......@@ -192,6 +192,8 @@ class IssuableBaseService < BaseService
def after_create(issuable)
# To be overridden by subclasses
issuable.update_project_counter_caches
end
def before_update(issuable)
......@@ -200,6 +202,8 @@ class IssuableBaseService < BaseService
def after_update(issuable)
# To be overridden by subclasses
issuable.update_project_counter_caches
end
def update(issuable)
......
......@@ -27,6 +27,8 @@ module Issues
todo_service.new_issue(issuable, current_user)
user_agent_detail_service.create
resolve_discussions_with_issue(issuable)
super
end
def resolve_discussions_with_issue(issue)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment