Merge branch 'master' into 25426-group-dashboard-ui
This commit is contained in:
commit
b55bd9ef95
48
CHANGELOG.md
48
CHANGELOG.md
|
@ -2,6 +2,26 @@
|
|||
documentation](doc/development/changelog.md) for instructions on adding your own
|
||||
entry.
|
||||
|
||||
## 9.2.5 (2017-06-07)
|
||||
|
||||
- No changes.
|
||||
|
||||
## 9.2.4 (2017-06-02)
|
||||
|
||||
- Fix visibility when referencing snippets.
|
||||
|
||||
## 9.2.3 (2017-05-31)
|
||||
|
||||
- Move uploads from 'public/uploads' to 'public/uploads/system'.
|
||||
- Escapes html content before appending it to the DOM.
|
||||
- Restrict API X-Frame-Options to same origin.
|
||||
- Allow users autocomplete by author_id only for authenticated users.
|
||||
|
||||
## 9.2.2 (2017-05-25)
|
||||
|
||||
- Fix issue where real time pipelines were not cached. !11615
|
||||
- Make all notes use equal padding.
|
||||
|
||||
## 9.2.1 (2017-05-23)
|
||||
|
||||
- Fix placement of note emoji on hover.
|
||||
|
@ -207,6 +227,20 @@ entry.
|
|||
- Fix preemptive scroll bar on user activity calendar.
|
||||
- Pipeline chat notifications convert seconds to minutes and hours.
|
||||
|
||||
## 9.1.7 (2017-06-07)
|
||||
|
||||
- No changes.
|
||||
|
||||
## 9.1.6 (2017-06-02)
|
||||
|
||||
- Fix visibility when referencing snippets.
|
||||
|
||||
## 9.1.5 (2017-05-31)
|
||||
|
||||
- Move uploads from 'public/uploads' to 'public/uploads/system'.
|
||||
- Restrict API X-Frame-Options to same origin.
|
||||
- Allow users autocomplete by author_id only for authenticated users.
|
||||
|
||||
## 9.1.4 (2017-05-12)
|
||||
|
||||
- Fix error on CI/CD Settings page related to invalid pipeline trigger. !10948 (dosuken123)
|
||||
|
@ -505,6 +539,20 @@ entry.
|
|||
- Only send chat notifications for the default branch.
|
||||
- Don't fill in the default kubernetes namespace.
|
||||
|
||||
## 9.0.10 (2017-06-07)
|
||||
|
||||
- No changes.
|
||||
|
||||
## 9.0.9 (2017-06-02)
|
||||
|
||||
- Fix visibility when referencing snippets.
|
||||
|
||||
## 9.0.8 (2017-05-31)
|
||||
|
||||
- Move uploads from 'public/uploads' to 'public/uploads/system'.
|
||||
- Restrict API X-Frame-Options to same origin.
|
||||
- Allow users autocomplete by author_id only for authenticated users.
|
||||
|
||||
## 9.0.7 (2017-05-05)
|
||||
|
||||
- Enforce project features when searching blobs and wikis.
|
||||
|
|
|
@ -655,7 +655,7 @@ GEM
|
|||
retriable (1.4.1)
|
||||
rinku (2.0.0)
|
||||
rotp (2.1.2)
|
||||
rouge (2.0.7)
|
||||
rouge (2.1.0)
|
||||
rqrcode (0.7.0)
|
||||
chunky_png
|
||||
rqrcode-rails3 (0.1.7)
|
||||
|
|
|
@ -80,7 +80,7 @@ window.Build = (function () {
|
|||
this.$scrollContainer.niceScroll({
|
||||
cursorcolor: '#fff',
|
||||
cursoropacitymin: 1,
|
||||
cursorwidth: '3px',
|
||||
cursorwidth: '7px',
|
||||
railpadding: { top: 5, bottom: 5, right: 5 },
|
||||
});
|
||||
|
||||
|
@ -238,7 +238,7 @@ window.Build = (function () {
|
|||
};
|
||||
|
||||
Build.prototype.toggleSidebar = function (shouldHide) {
|
||||
const shouldShow = !shouldHide;
|
||||
const shouldShow = typeof shouldHide === 'boolean' ? !shouldHide : undefined;
|
||||
|
||||
this.$buildTrace
|
||||
.toggleClass('sidebar-expanded', shouldShow)
|
||||
|
|
|
@ -230,7 +230,7 @@ export default {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content-list environments-container">
|
||||
<div class="environments-container">
|
||||
<loading-icon
|
||||
label="Loading environments"
|
||||
size="3"
|
||||
|
|
|
@ -70,7 +70,7 @@ export default {
|
|||
</span>
|
||||
</button>
|
||||
|
||||
<ul class="dropdown-menu">
|
||||
<ul class="dropdown-menu dropdown-menu-align-right">
|
||||
<li v-for="action in actions">
|
||||
<button
|
||||
type="button"
|
||||
|
|
|
@ -422,11 +422,13 @@ export default {
|
|||
</script>
|
||||
<template>
|
||||
<div
|
||||
:class="{ 'js-child-row environment-child-row': model.isChildren, 'folder-row': model.isFolder, 'gl-responsive-table-row': !model.isFolder }">
|
||||
:class="{ 'js-child-row environment-child-row': model.isChildren, 'folder-row': model.isFolder, 'gl-responsive-table-row': !model.isFolder }"
|
||||
role="row">
|
||||
<div class="table-section section-10" role="gridcell">
|
||||
<div
|
||||
v-if="!model.isFolder"
|
||||
class="table-mobile-header">
|
||||
class="table-mobile-header"
|
||||
role="rowheader">
|
||||
Environment
|
||||
</div>
|
||||
<a
|
||||
|
@ -497,6 +499,7 @@ export default {
|
|||
<div class="table-section section-25" role="gridcell">
|
||||
<div
|
||||
v-if="!model.isFolder"
|
||||
role="rowheader"
|
||||
class="table-mobile-header">
|
||||
Commit
|
||||
</div>
|
||||
|
@ -513,7 +516,7 @@ export default {
|
|||
</div>
|
||||
<div
|
||||
v-if="!model.isFolder && !hasLastDeploymentKey"
|
||||
class="commit-title">
|
||||
class="commit-title table-mobile-content">
|
||||
No deployments yet
|
||||
</div>
|
||||
</div>
|
||||
|
@ -521,6 +524,7 @@ export default {
|
|||
<div class="table-section section-10" role="gridcell">
|
||||
<div
|
||||
v-if="!model.isFolder"
|
||||
role="rowheader"
|
||||
class="table-mobile-header">
|
||||
Updated
|
||||
</div>
|
||||
|
|
|
@ -47,19 +47,19 @@ export default {
|
|||
<template>
|
||||
<div class="ci-table" role="grid">
|
||||
<div class="gl-responsive-table-row table-row-header" role="row">
|
||||
<div class="table-section section-10 environments-name" role="rowheader">
|
||||
<div class="table-section section-10 environments-name" role="columnheader">
|
||||
Environment
|
||||
</div>
|
||||
<div class="table-section section-10 environments-deploy" role="rowheader">
|
||||
<div class="table-section section-10 environments-deploy" role="columnheader">
|
||||
Deployment
|
||||
</div>
|
||||
<div class="table-section section-15 environments-build" role="rowheader">
|
||||
<div class="table-section section-15 environments-build" role="columnheader">
|
||||
Job
|
||||
</div>
|
||||
<div class="table-section section-25 environments-commit" role="rowheader">
|
||||
<div class="table-section section-25 environments-commit" role="columnheader">
|
||||
Commit
|
||||
</div>
|
||||
<div class="table-section section-10 environments-date" role="rowheader">
|
||||
<div class="table-section section-10 environments-date" role="columnheader">
|
||||
Updated
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -3,6 +3,11 @@
|
|||
import timeago from 'timeago.js';
|
||||
import dateFormat from 'vendor/date.format';
|
||||
|
||||
import {
|
||||
lang,
|
||||
s__,
|
||||
} from '../../locale';
|
||||
|
||||
window.timeago = timeago;
|
||||
window.dateFormat = dateFormat;
|
||||
|
||||
|
@ -48,26 +53,45 @@ window.dateFormat = dateFormat;
|
|||
var locale;
|
||||
|
||||
if (!timeagoInstance) {
|
||||
const localeRemaining = function(number, index) {
|
||||
return [
|
||||
[s__('Timeago|less than a minute ago'), s__('Timeago|a while')],
|
||||
[s__('Timeago|less than a minute ago'), s__('Timeago|%s seconds remaining')],
|
||||
[s__('Timeago|about a minute ago'), s__('Timeago|1 minute remaining')],
|
||||
[s__('Timeago|%s minutes ago'), s__('Timeago|%s minutes remaining')],
|
||||
[s__('Timeago|about an hour ago'), s__('Timeago|1 hour remaining')],
|
||||
[s__('Timeago|about %s hours ago'), s__('Timeago|%s hours remaining')],
|
||||
[s__('Timeago|a day ago'), s__('Timeago|1 day remaining')],
|
||||
[s__('Timeago|%s days ago'), s__('Timeago|%s days remaining')],
|
||||
[s__('Timeago|a week ago'), s__('Timeago|1 week remaining')],
|
||||
[s__('Timeago|%s weeks ago'), s__('Timeago|%s weeks remaining')],
|
||||
[s__('Timeago|a month ago'), s__('Timeago|1 month remaining')],
|
||||
[s__('Timeago|%s months ago'), s__('Timeago|%s months remaining')],
|
||||
[s__('Timeago|a year ago'), s__('Timeago|1 year remaining')],
|
||||
[s__('Timeago|%s years ago'), s__('Timeago|%s years remaining')]
|
||||
][index];
|
||||
};
|
||||
locale = function(number, index) {
|
||||
return [
|
||||
['less than a minute ago', 'a while'],
|
||||
['less than a minute ago', 'in %s seconds'],
|
||||
['about a minute ago', 'in 1 minute'],
|
||||
['%s minutes ago', 'in %s minutes'],
|
||||
['about an hour ago', 'in 1 hour'],
|
||||
['about %s hours ago', 'in %s hours'],
|
||||
['a day ago', 'in 1 day'],
|
||||
['%s days ago', 'in %s days'],
|
||||
['a week ago', 'in 1 week'],
|
||||
['%s weeks ago', 'in %s weeks'],
|
||||
['a month ago', 'in 1 month'],
|
||||
['%s months ago', 'in %s months'],
|
||||
['a year ago', 'in 1 year'],
|
||||
['%s years ago', 'in %s years']
|
||||
[s__('Timeago|less than a minute ago'), s__('Timeago|a while')],
|
||||
[s__('Timeago|less than a minute ago'), s__('Timeago|in %s seconds')],
|
||||
[s__('Timeago|about a minute ago'), s__('Timeago|in 1 minute')],
|
||||
[s__('Timeago|%s minutes ago'), s__('Timeago|in %s minutes')],
|
||||
[s__('Timeago|about an hour ago'), s__('Timeago|in 1 hour')],
|
||||
[s__('Timeago|about %s hours ago'), s__('Timeago|in %s hours')],
|
||||
[s__('Timeago|a day ago'), s__('Timeago|in 1 day')],
|
||||
[s__('Timeago|%s days ago'), s__('Timeago|in %s days')],
|
||||
[s__('Timeago|a week ago'), s__('Timeago|in 1 week')],
|
||||
[s__('Timeago|%s weeks ago'), s__('Timeago|in %s weeks')],
|
||||
[s__('Timeago|a month ago'), s__('Timeago|in 1 month')],
|
||||
[s__('Timeago|%s months ago'), s__('Timeago|in %s months')],
|
||||
[s__('Timeago|a year ago'), s__('Timeago|in 1 year')],
|
||||
[s__('Timeago|%s years ago'), s__('Timeago|in %s years')]
|
||||
][index];
|
||||
};
|
||||
|
||||
timeago.register('gl_en', locale);
|
||||
timeago.register(lang, locale);
|
||||
timeago.register(`${lang}-remaining`, localeRemaining);
|
||||
timeagoInstance = timeago();
|
||||
}
|
||||
|
||||
|
@ -79,13 +103,11 @@ window.dateFormat = dateFormat;
|
|||
if (!time) {
|
||||
return '';
|
||||
}
|
||||
suffix || (suffix = 'remaining');
|
||||
expiredLabel || (expiredLabel = 'Past due');
|
||||
timefor = gl.utils.getTimeago().format(time).replace('in', '');
|
||||
if (timefor.indexOf('ago') > -1) {
|
||||
if (new Date(time) < new Date()) {
|
||||
expiredLabel || (expiredLabel = s__('Timeago|Past due'));
|
||||
timefor = expiredLabel;
|
||||
} else {
|
||||
timefor = timefor.trim() + ' ' + suffix;
|
||||
timefor = gl.utils.getTimeago().format(time, `${lang}-remaining`).trim();
|
||||
}
|
||||
return timefor;
|
||||
};
|
||||
|
@ -102,7 +124,7 @@ window.dateFormat = dateFormat;
|
|||
};
|
||||
|
||||
w.gl.utils.updateTimeagoText = function(el) {
|
||||
const formattedDate = gl.utils.getTimeago().format(el.getAttribute('datetime'), 'gl_en');
|
||||
const formattedDate = gl.utils.getTimeago().format(el.getAttribute('datetime'), lang);
|
||||
|
||||
if (el.textContent !== formattedDate) {
|
||||
el.textContent = formattedDate;
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,4 +1,7 @@
|
|||
.awards {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.emoji-icon {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
|
@ -100,7 +103,6 @@
|
|||
|
||||
.award-menu-holder {
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
|
||||
.tooltip {
|
||||
white-space: nowrap;
|
||||
|
@ -108,9 +110,11 @@
|
|||
}
|
||||
|
||||
.award-control {
|
||||
margin: 0 5px 6px 0;
|
||||
margin: 4px 8px 4px 0;
|
||||
outline: 0;
|
||||
position: relative;
|
||||
display: block;
|
||||
float: left;
|
||||
|
||||
&.disabled {
|
||||
cursor: default;
|
||||
|
|
|
@ -266,7 +266,14 @@
|
|||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.separator + .dropdown-header {
|
||||
.dropdown-bold-header {
|
||||
font-weight: 600;
|
||||
line-height: 22px;
|
||||
padding: 0 16px;
|
||||
}
|
||||
|
||||
.separator + .dropdown-header,
|
||||
.separator + .dropdown-bold-header {
|
||||
padding-top: 2px;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,10 +19,6 @@
|
|||
.table-section {
|
||||
white-space: nowrap;
|
||||
|
||||
.branch-commit {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
$section-widths: 10 15 20 25 30 40;
|
||||
@each $width in $section-widths {
|
||||
&.section-#{$width} {
|
||||
|
@ -87,4 +83,9 @@
|
|||
@media (min-width: $screen-md-min) {
|
||||
flex: 0 0 90%;
|
||||
}
|
||||
|
||||
.avatar {
|
||||
float: none;
|
||||
margin-right: 4px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -228,7 +228,7 @@
|
|||
margin: 10px 0;
|
||||
background: $gray-light;
|
||||
display: none;
|
||||
white-space: pre-line;
|
||||
white-space: pre-wrap;
|
||||
word-break: normal;
|
||||
|
||||
pre {
|
||||
|
|
|
@ -143,8 +143,8 @@
|
|||
}
|
||||
|
||||
> .btn-group,
|
||||
.external-url,
|
||||
.btn {
|
||||
> .external-url,
|
||||
> .btn {
|
||||
flex: 1;
|
||||
flex-basis: 28px;
|
||||
margin: 0 5px;
|
||||
|
@ -153,6 +153,10 @@
|
|||
.dropdown-new {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
min-width: initial;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
}
|
||||
|
||||
.emoji-block {
|
||||
padding: 10px 0 4px;
|
||||
padding: 10px 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -756,7 +756,6 @@
|
|||
position: -webkit-sticky;
|
||||
top: 60px;
|
||||
z-index: 200;
|
||||
@include transition(all);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -249,14 +249,19 @@ ul.related-merge-requests > li {
|
|||
}
|
||||
|
||||
@media (min-width: $screen-sm-min) {
|
||||
.new-branch-col {
|
||||
padding-top: 0;
|
||||
text-align: right;
|
||||
}
|
||||
.emoji-block .row {
|
||||
display: flex;
|
||||
|
||||
.create-mr-dropdown-wrap {
|
||||
.btn-group:not(.hide) {
|
||||
display: inline-block;
|
||||
.new-branch-col {
|
||||
padding-top: 0;
|
||||
text-align: right;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.create-mr-dropdown-wrap {
|
||||
.btn-group:not(.hide) {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ class Projects::BlobController < Projects::ApplicationController
|
|||
|
||||
def edit
|
||||
if can_collaborate_with_project?
|
||||
blob.load_all_data!(@repository)
|
||||
blob.load_all_data!
|
||||
else
|
||||
redirect_to action: 'show'
|
||||
end
|
||||
|
@ -74,7 +74,7 @@ class Projects::BlobController < Projects::ApplicationController
|
|||
|
||||
def preview
|
||||
@content = params[:content]
|
||||
@blob.load_all_data!(@repository)
|
||||
@blob.load_all_data!
|
||||
diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', include_diff_info: true)
|
||||
diff_lines = diffy.diff.scan(/.*\n/)[2..-1]
|
||||
diff_lines = Gitlab::Diff::Parser.new.parse(diff_lines)
|
||||
|
@ -111,7 +111,7 @@ class Projects::BlobController < Projects::ApplicationController
|
|||
private
|
||||
|
||||
def blob
|
||||
@blob ||= Blob.decorate(@repository.blob_at(@commit.id, @path), @project)
|
||||
@blob ||= @repository.blob_at(@commit.id, @path)
|
||||
|
||||
if @blob
|
||||
@blob
|
||||
|
|
|
@ -8,7 +8,7 @@ class Projects::LabelsController < Projects::ApplicationController
|
|||
before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update,
|
||||
:generate, :destroy, :remove_priority,
|
||||
:set_priorities]
|
||||
before_action :authorize_admin_group!, only: [:promote]
|
||||
before_action :authorize_admin_group_labels!, only: [:promote]
|
||||
|
||||
respond_to :js, :html
|
||||
|
||||
|
@ -161,7 +161,7 @@ class Projects::LabelsController < Projects::ApplicationController
|
|||
return render_404 unless can?(current_user, :admin_label, @project)
|
||||
end
|
||||
|
||||
def authorize_admin_group!
|
||||
return render_404 unless can?(current_user, :admin_group, @project.group)
|
||||
def authorize_admin_group_labels!
|
||||
return render_404 unless can?(current_user, :admin_label, @project.group)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -43,7 +43,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
|
|||
if schedule.update(owner: current_user)
|
||||
redirect_to pipeline_schedules_path(@project)
|
||||
else
|
||||
redirect_to pipeline_schedules_path(@project), alert: "Failed to change the owner"
|
||||
redirect_to pipeline_schedules_path(@project), alert: _("Failed to change the owner")
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -53,7 +53,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
|
|||
else
|
||||
redirect_to pipeline_schedules_path(@project),
|
||||
status: 302,
|
||||
alert: "Failed to remove the pipeline schedule"
|
||||
alert: _("Failed to remove the pipeline schedule")
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
|
||||
redirect_to(
|
||||
project_path(@project),
|
||||
notice: "Project '#{@project.name}' was successfully created."
|
||||
notice: _("Project '%{project_name}' was successfully created.") % { project_name: @project.name }
|
||||
)
|
||||
else
|
||||
render 'new'
|
||||
|
@ -49,7 +49,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
|
||||
respond_to do |format|
|
||||
if result[:status] == :success
|
||||
flash[:notice] = "Project '#{@project.name}' was successfully updated."
|
||||
flash[:notice] = _("Project '%{project_name}' was successfully updated.") % { project_name: @project.name }
|
||||
format.html do
|
||||
redirect_to(edit_project_path(@project))
|
||||
end
|
||||
|
@ -76,7 +76,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
return access_denied! unless can?(current_user, :remove_fork_project, @project)
|
||||
|
||||
if ::Projects::UnlinkForkService.new(@project, current_user).execute
|
||||
flash[:notice] = 'The fork relationship has been removed.'
|
||||
flash[:notice] = _('The fork relationship has been removed.')
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -97,7 +97,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
if @project.pending_delete?
|
||||
flash[:alert] = "Project #{@project.name} queued for deletion."
|
||||
flash[:alert] = _("Project '%{project_name}' queued for deletion.") % { project_name: @project.name }
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
|
@ -117,7 +117,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
return access_denied! unless can?(current_user, :remove_project, @project)
|
||||
|
||||
::Projects::DestroyService.new(@project, current_user, {}).async_execute
|
||||
flash[:alert] = "Project '#{@project.name_with_namespace}' will be deleted."
|
||||
flash[:alert] = _("Project '%{project_name}' will be deleted.") % { project_name: @project.name_with_namespace }
|
||||
|
||||
redirect_to dashboard_projects_path, status: 302
|
||||
rescue Projects::DestroyService::DestroyError => ex
|
||||
|
@ -156,7 +156,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
|
||||
redirect_to(
|
||||
project_path(@project),
|
||||
notice: "Housekeeping successfully started"
|
||||
notice: _("Housekeeping successfully started")
|
||||
)
|
||||
rescue ::Projects::HousekeepingService::LeaseTaken => ex
|
||||
redirect_to(
|
||||
|
@ -170,7 +170,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
|
||||
redirect_to(
|
||||
edit_project_path(@project),
|
||||
notice: "Project export started. A download link will be sent by email."
|
||||
notice: _("Project export started. A download link will be sent by email.")
|
||||
)
|
||||
end
|
||||
|
||||
|
@ -182,16 +182,16 @@ class ProjectsController < Projects::ApplicationController
|
|||
else
|
||||
redirect_to(
|
||||
edit_project_path(@project),
|
||||
alert: "Project export link has expired. Please generate a new export from your project settings."
|
||||
alert: _("Project export link has expired. Please generate a new export from your project settings.")
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def remove_export
|
||||
if @project.remove_exports
|
||||
flash[:notice] = "Project export has been deleted."
|
||||
flash[:notice] = _("Project export has been deleted.")
|
||||
else
|
||||
flash[:alert] = "Project export could not be deleted."
|
||||
flash[:alert] = _("Project export could not be deleted.")
|
||||
end
|
||||
redirect_to(edit_project_path(@project))
|
||||
end
|
||||
|
@ -202,7 +202,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
else
|
||||
redirect_to(
|
||||
edit_project_path(@project),
|
||||
alert: "Project export could not be deleted."
|
||||
alert: _("Project export could not be deleted.")
|
||||
)
|
||||
end
|
||||
end
|
||||
|
@ -220,13 +220,13 @@ class ProjectsController < Projects::ApplicationController
|
|||
branches = BranchesFinder.new(@repository, params).execute.map(&:name)
|
||||
|
||||
options = {
|
||||
'Branches' => branches.take(100)
|
||||
s_('RefSwitcher|Branches') => branches.take(100)
|
||||
}
|
||||
|
||||
unless @repository.tag_count.zero?
|
||||
tags = TagsFinder.new(@repository, params).execute.map(&:name)
|
||||
|
||||
options['Tags'] = tags.take(100)
|
||||
options[s_('RefSwitcher|Tags')] = tags.take(100)
|
||||
end
|
||||
|
||||
# If reference is commit id - we should add it to branch/tag selectbox
|
||||
|
|
|
@ -61,7 +61,7 @@ module ButtonHelper
|
|||
html: true,
|
||||
placement: placement,
|
||||
container: 'body',
|
||||
title: "Set a password on your account<br>to pull or push via #{protocol}"
|
||||
title: _("Set a password on your account to pull or push via %{protocol}") % { protocol: protocol }
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -76,7 +76,7 @@ module ButtonHelper
|
|||
html: true,
|
||||
placement: placement,
|
||||
container: 'body',
|
||||
title: 'Add an SSH key to your profile<br>to pull or push via SSH.'
|
||||
title: _('Add an SSH key to your profile to pull or push via SSH.')
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -16,16 +16,18 @@ module CiStatusHelper
|
|||
return status.label
|
||||
end
|
||||
|
||||
case status
|
||||
when 'success'
|
||||
'passed'
|
||||
when 'success_with_warnings'
|
||||
'passed with warnings'
|
||||
when 'manual'
|
||||
'waiting for manual action'
|
||||
else
|
||||
status
|
||||
end
|
||||
label = case status
|
||||
when 'success'
|
||||
'passed'
|
||||
when 'success_with_warnings'
|
||||
'passed with warnings'
|
||||
when 'manual'
|
||||
'waiting for manual action'
|
||||
else
|
||||
status
|
||||
end
|
||||
translation = "CiStatusLabel|#{label}"
|
||||
s_(translation)
|
||||
end
|
||||
|
||||
def ci_text_for_status(status)
|
||||
|
@ -35,13 +37,22 @@ module CiStatusHelper
|
|||
|
||||
case status
|
||||
when 'success'
|
||||
'passed'
|
||||
s_('CiStatusText|passed')
|
||||
when 'success_with_warnings'
|
||||
'passed'
|
||||
s_('CiStatusText|passed')
|
||||
when 'manual'
|
||||
'blocked'
|
||||
s_('CiStatusText|blocked')
|
||||
else
|
||||
status
|
||||
# All states are already being translated inside the detailed statuses:
|
||||
# :running => Gitlab::Ci::Status::Running
|
||||
# :skipped => Gitlab::Ci::Status::Skipped
|
||||
# :failed => Gitlab::Ci::Status::Failed
|
||||
# :success => Gitlab::Ci::Status::Success
|
||||
# :canceled => Gitlab::Ci::Status::Canceled
|
||||
# The following states are customized above:
|
||||
# :manual => Gitlab::Ci::Status::Manual
|
||||
status_translation = "CiStatusText|#{status}"
|
||||
s_(status_translation)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ module NavHelper
|
|||
else
|
||||
"page-gutter right-sidebar-expanded"
|
||||
end
|
||||
elsif current_path?('builds#show')
|
||||
elsif current_path?('jobs#show')
|
||||
"page-gutter build-sidebar right-sidebar-expanded"
|
||||
elsif current_path?('wikis#show') ||
|
||||
current_path?('wikis#edit') ||
|
||||
|
|
|
@ -21,30 +21,36 @@ module NotificationsHelper
|
|||
end
|
||||
|
||||
def notification_title(level)
|
||||
# Can be anything in `NotificationSetting.level:
|
||||
case level.to_sym
|
||||
when :participating
|
||||
'Participate'
|
||||
s_('NotificationLevel|Participate')
|
||||
when :mention
|
||||
'On mention'
|
||||
s_('NotificationLevel|On mention')
|
||||
else
|
||||
level.to_s.titlecase
|
||||
N_('NotificationLevel|Global')
|
||||
N_('NotificationLevel|Watch')
|
||||
N_('NotificationLevel|Disabled')
|
||||
N_('NotificationLevel|Custom')
|
||||
level = "NotificationLevel|#{level.to_s.humanize}"
|
||||
s_(level)
|
||||
end
|
||||
end
|
||||
|
||||
def notification_description(level)
|
||||
case level.to_sym
|
||||
when :participating
|
||||
'You will only receive notifications for threads you have participated in'
|
||||
_('You will only receive notifications for threads you have participated in')
|
||||
when :mention
|
||||
'You will receive notifications only for comments in which you were @mentioned'
|
||||
_('You will receive notifications only for comments in which you were @mentioned')
|
||||
when :watch
|
||||
'You will receive notifications for any activity'
|
||||
_('You will receive notifications for any activity')
|
||||
when :disabled
|
||||
'You will not get any notifications via email'
|
||||
_('You will not get any notifications via email')
|
||||
when :global
|
||||
'Use your global notification setting'
|
||||
_('Use your global notification setting')
|
||||
when :custom
|
||||
'You will only receive notifications for the events you choose'
|
||||
_('You will only receive notifications for the events you choose')
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -76,11 +82,22 @@ module NotificationsHelper
|
|||
end
|
||||
|
||||
def notification_event_name(event)
|
||||
# All values from NotificationSetting::EMAIL_EVENTS
|
||||
case event
|
||||
when :success_pipeline
|
||||
'Successful pipeline'
|
||||
s_('NotificationEvent|Successful pipeline')
|
||||
else
|
||||
event.to_s.humanize
|
||||
N_('NotificationEvent|New note')
|
||||
N_('NotificationEvent|New issue')
|
||||
N_('NotificationEvent|Reopen issue')
|
||||
N_('NotificationEvent|Close issue')
|
||||
N_('NotificationEvent|Reassign issue')
|
||||
N_('NotificationEvent|New merge request')
|
||||
N_('NotificationEvent|Close merge request')
|
||||
N_('NotificationEvent|Reassign merge request')
|
||||
N_('NotificationEvent|Merge merge request')
|
||||
N_('NotificationEvent|Failed pipeline')
|
||||
s_(event.to_s.humanize)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -70,15 +70,18 @@ module ProjectsHelper
|
|||
end
|
||||
|
||||
def remove_project_message(project)
|
||||
"You are going to remove #{project.name_with_namespace}.\n Removed project CANNOT be restored!\n Are you ABSOLUTELY sure?"
|
||||
_("You are going to remove %{project_name_with_namespace}.\nRemoved project CANNOT be restored!\nAre you ABSOLUTELY sure?") %
|
||||
{ project_name_with_namespace: project.name_with_namespace }
|
||||
end
|
||||
|
||||
def transfer_project_message(project)
|
||||
"You are going to transfer #{project.name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
|
||||
_("You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?") %
|
||||
{ project_name_with_namespace: project.name_with_namespace }
|
||||
end
|
||||
|
||||
def remove_fork_project_message(project)
|
||||
"You are going to remove the fork relationship to source project #{@project.forked_from_project.name_with_namespace}. Are you ABSOLUTELY sure?"
|
||||
_("You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?") %
|
||||
{ forked_from_project: @project.forked_from_project.name_with_namespace }
|
||||
end
|
||||
|
||||
def project_nav_tabs
|
||||
|
@ -143,7 +146,7 @@ module ProjectsHelper
|
|||
end
|
||||
|
||||
options = options_for_select(
|
||||
options,
|
||||
options.invert,
|
||||
selected: highest_available_option || @project.project_feature.public_send(field),
|
||||
disabled: disabled_option
|
||||
)
|
||||
|
@ -159,12 +162,13 @@ module ProjectsHelper
|
|||
end
|
||||
|
||||
def link_to_autodeploy_doc
|
||||
link_to 'About auto deploy', help_page_path('ci/autodeploy/index'), target: '_blank'
|
||||
link_to _('About auto deploy'), help_page_path('ci/autodeploy/index'), target: '_blank'
|
||||
end
|
||||
|
||||
def autodeploy_flash_notice(branch_name)
|
||||
"Branch <strong>#{truncate(sanitize(branch_name))}</strong> was created. To set up auto deploy, \
|
||||
choose a GitLab CI Yaml template and commit your changes. #{link_to_autodeploy_doc}".html_safe
|
||||
translation = _("Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}") %
|
||||
{ branch_name: truncate(sanitize(branch_name)), link_to_autodeploy_doc: link_to_autodeploy_doc }
|
||||
translation.html_safe
|
||||
end
|
||||
|
||||
def project_list_cache_key(project)
|
||||
|
@ -250,11 +254,11 @@ module ProjectsHelper
|
|||
def project_lfs_status(project)
|
||||
if project.lfs_enabled?
|
||||
content_tag(:span, class: 'lfs-enabled') do
|
||||
'Enabled'
|
||||
s_('LFSStatus|Enabled')
|
||||
end
|
||||
else
|
||||
content_tag(:span, class: 'lfs-disabled') do
|
||||
'Disabled'
|
||||
s_('LFSStatus|Disabled')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -263,7 +267,7 @@ module ProjectsHelper
|
|||
if current_user
|
||||
current_user.name
|
||||
else
|
||||
"Your name"
|
||||
_("Your name")
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -300,17 +304,18 @@ module ProjectsHelper
|
|||
if project.last_activity_at
|
||||
time_ago_with_tooltip(project.last_activity_at, placement: 'bottom', html_class: 'last_activity_time_ago')
|
||||
else
|
||||
"Never"
|
||||
s_("ProjectLastActivity|Never")
|
||||
end
|
||||
end
|
||||
|
||||
def add_special_file_path(project, file_name:, commit_message: nil, branch_name: nil, context: nil)
|
||||
commit_message ||= s_("CommitMessage|Add %{file_name}") % { file_name: file_name.downcase }
|
||||
namespace_project_new_blob_path(
|
||||
project.namespace,
|
||||
project,
|
||||
project.default_branch || 'master',
|
||||
file_name: file_name,
|
||||
commit_message: commit_message || "Add #{file_name.downcase}",
|
||||
commit_message: commit_message,
|
||||
branch_name: branch_name,
|
||||
context: context
|
||||
)
|
||||
|
@ -447,9 +452,9 @@ module ProjectsHelper
|
|||
|
||||
def project_feature_options
|
||||
{
|
||||
'Disabled' => ProjectFeature::DISABLED,
|
||||
'Only team members' => ProjectFeature::PRIVATE,
|
||||
'Everyone with access' => ProjectFeature::ENABLED
|
||||
ProjectFeature::DISABLED => s_('ProjectFeature|Disabled'),
|
||||
ProjectFeature::PRIVATE => s_('ProjectFeature|Only team members'),
|
||||
ProjectFeature::ENABLED => s_('ProjectFeature|Everyone with access')
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
@ -29,11 +29,11 @@ module VisibilityLevelHelper
|
|||
def project_visibility_level_description(level)
|
||||
case level
|
||||
when Gitlab::VisibilityLevel::PRIVATE
|
||||
"Project access must be granted explicitly to each user."
|
||||
_("Project access must be granted explicitly to each user.")
|
||||
when Gitlab::VisibilityLevel::INTERNAL
|
||||
"The project can be accessed by any logged in user."
|
||||
_("The project can be accessed by any logged in user.")
|
||||
when Gitlab::VisibilityLevel::PUBLIC
|
||||
"The project can be accessed without any authentication."
|
||||
_("The project can be accessed without any authentication.")
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -81,7 +81,9 @@ module VisibilityLevelHelper
|
|||
end
|
||||
|
||||
def visibility_level_label(level)
|
||||
Project.visibility_levels.key(level)
|
||||
# The visibility level can be:
|
||||
# 'VisibilityLevel|Private', 'VisibilityLevel|Internal', 'VisibilityLevel|Public'
|
||||
s_(Project.visibility_levels.key(level))
|
||||
end
|
||||
|
||||
def restricted_visibility_levels(show_all = false)
|
||||
|
|
|
@ -5,7 +5,7 @@ class AwardEmoji < ActiveRecord::Base
|
|||
include Participable
|
||||
include GhostUser
|
||||
|
||||
belongs_to :awardable, polymorphic: true
|
||||
belongs_to :awardable, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
belongs_to :user
|
||||
|
||||
validates :awardable, :user, presence: true
|
||||
|
|
|
@ -94,6 +94,10 @@ class Blob < SimpleDelegator
|
|||
end
|
||||
end
|
||||
|
||||
def load_all_data!
|
||||
super(project.repository) if project
|
||||
end
|
||||
|
||||
def no_highlighting?
|
||||
raw_size && raw_size > MAXIMUM_TEXT_HIGHLIGHT_SIZE
|
||||
end
|
||||
|
|
|
@ -9,9 +9,7 @@ module BlobViewer
|
|||
end
|
||||
|
||||
def prepare!
|
||||
if blob.project
|
||||
blob.load_all_data!(blob.project.repository)
|
||||
end
|
||||
blob.load_all_data!
|
||||
end
|
||||
|
||||
def render_error
|
||||
|
|
|
@ -114,16 +114,16 @@ class Commit
|
|||
#
|
||||
# Usually, the commit title is the first line of the commit message.
|
||||
# In case this first line is longer than 100 characters, it is cut off
|
||||
# after 80 characters and ellipses (`&hellp;`) are appended.
|
||||
# after 80 characters + `...`
|
||||
def title
|
||||
full_title.length > 100 ? full_title[0..79] << "…" : full_title
|
||||
return full_title if full_title.length < 100
|
||||
|
||||
full_title.truncate(81, separator: ' ', omission: '…')
|
||||
end
|
||||
|
||||
# Returns the full commits title
|
||||
def full_title
|
||||
return @full_title if @full_title
|
||||
|
||||
@full_title =
|
||||
@full_title ||=
|
||||
if safe_message.blank?
|
||||
no_commit_message
|
||||
else
|
||||
|
@ -131,19 +131,14 @@ class Commit
|
|||
end
|
||||
end
|
||||
|
||||
# Returns the commits description
|
||||
#
|
||||
# cut off, ellipses (`&hellp;`) are prepended to the commit message.
|
||||
# Returns full commit message if title is truncated (greater than 99 characters)
|
||||
# otherwise returns commit message without first line
|
||||
def description
|
||||
title_end = safe_message.index("\n")
|
||||
@description ||=
|
||||
if (!title_end && safe_message.length > 100) || (title_end && title_end > 100)
|
||||
"…" << safe_message[80..-1]
|
||||
else
|
||||
safe_message.split("\n", 2)[1].try(:chomp)
|
||||
end
|
||||
end
|
||||
return safe_message if full_title.length >= 100
|
||||
|
||||
safe_message.split("\n", 2)[1].try(:chomp)
|
||||
end
|
||||
|
||||
def description?
|
||||
description.present?
|
||||
end
|
||||
|
|
|
@ -4,7 +4,7 @@ class Deployment < ActiveRecord::Base
|
|||
belongs_to :project, required: true, validate: true
|
||||
belongs_to :environment, required: true, validate: true
|
||||
belongs_to :user
|
||||
belongs_to :deployable, polymorphic: true
|
||||
belongs_to :deployable, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
|
||||
validates :sha, presence: true
|
||||
validates :ref, presence: true
|
||||
|
|
|
@ -47,7 +47,7 @@ class Event < ActiveRecord::Base
|
|||
|
||||
belongs_to :author, class_name: "User"
|
||||
belongs_to :project
|
||||
belongs_to :target, polymorphic: true
|
||||
belongs_to :target, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
|
||||
# For Hash only
|
||||
serialize :data # rubocop:disable Cop/ActiverecordSerialize
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class LabelLink < ActiveRecord::Base
|
||||
include Importable
|
||||
|
||||
belongs_to :target, polymorphic: true
|
||||
belongs_to :target, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
belongs_to :label
|
||||
|
||||
validates :target, presence: true, unless: :importing?
|
||||
|
|
|
@ -8,7 +8,7 @@ class Member < ActiveRecord::Base
|
|||
|
||||
belongs_to :created_by, class_name: "User"
|
||||
belongs_to :user
|
||||
belongs_to :source, polymorphic: true
|
||||
belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
|
||||
delegate :name, :username, :email, to: :user, prefix: true
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ class Note < ActiveRecord::Base
|
|||
participant :author
|
||||
|
||||
belongs_to :project
|
||||
belongs_to :noteable, polymorphic: true, touch: true
|
||||
belongs_to :noteable, polymorphic: true, touch: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
belongs_to :author, class_name: "User"
|
||||
belongs_to :updated_by, class_name: "User"
|
||||
belongs_to :last_edited_by, class_name: 'User'
|
||||
|
|
|
@ -4,7 +4,7 @@ class NotificationSetting < ActiveRecord::Base
|
|||
default_value_for :level, NotificationSetting.levels[:global]
|
||||
|
||||
belongs_to :user
|
||||
belongs_to :source, polymorphic: true
|
||||
belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
belongs_to :project, foreign_key: 'source_id'
|
||||
|
||||
validates :user, presence: true
|
||||
|
|
|
@ -63,16 +63,6 @@ class Project < ActiveRecord::Base
|
|||
|
||||
# update visibility_level of forks
|
||||
after_update :update_forks_visibility_level
|
||||
def update_forks_visibility_level
|
||||
return unless visibility_level < visibility_level_was
|
||||
|
||||
forks.each do |forked_project|
|
||||
if forked_project.visibility_level > visibility_level
|
||||
forked_project.visibility_level = visibility_level
|
||||
forked_project.save!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
after_validation :check_pending_delete
|
||||
|
||||
|
@ -165,7 +155,7 @@ class Project < ActiveRecord::Base
|
|||
has_many :todos, dependent: :destroy
|
||||
has_many :notification_settings, dependent: :destroy, as: :source
|
||||
|
||||
has_one :import_data, dependent: :delete, class_name: "ProjectImportData"
|
||||
has_one :import_data, dependent: :delete, class_name: 'ProjectImportData'
|
||||
has_one :project_feature, dependent: :destroy
|
||||
has_one :statistics, class_name: 'ProjectStatistics', dependent: :delete
|
||||
has_many :container_repositories, dependent: :destroy
|
||||
|
@ -488,7 +478,11 @@ class Project < ActiveRecord::Base
|
|||
ProjectCacheWorker.perform_async(self.id)
|
||||
end
|
||||
|
||||
self.import_data&.destroy
|
||||
remove_import_data
|
||||
end
|
||||
|
||||
def remove_import_data
|
||||
import_data&.destroy
|
||||
end
|
||||
|
||||
def import_url=(value)
|
||||
|
@ -1060,6 +1054,17 @@ class Project < ActiveRecord::Base
|
|||
!!repository.exists?
|
||||
end
|
||||
|
||||
def update_forks_visibility_level
|
||||
return unless visibility_level < visibility_level_was
|
||||
|
||||
forks.each do |forked_project|
|
||||
if forked_project.visibility_level > visibility_level
|
||||
forked_project.visibility_level = visibility_level
|
||||
forked_project.save!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def create_wiki
|
||||
ProjectWiki.new(self, self.owner).wiki
|
||||
true
|
||||
|
@ -1068,6 +1073,10 @@ class Project < ActiveRecord::Base
|
|||
false
|
||||
end
|
||||
|
||||
def wiki
|
||||
@wiki ||= ProjectWiki.new(self, self.owner)
|
||||
end
|
||||
|
||||
def jira_tracker_active?
|
||||
jira_tracker? && jira_service.active
|
||||
end
|
||||
|
@ -1190,10 +1199,6 @@ class Project < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
def wiki
|
||||
@wiki ||= ProjectWiki.new(self, self.owner)
|
||||
end
|
||||
|
||||
def running_or_pending_build_count(force: false)
|
||||
Rails.cache.fetch(['projects', id, 'running_or_pending_build_count'], force: force) do
|
||||
builds.running_or_pending.count(:all)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
class RedirectRoute < ActiveRecord::Base
|
||||
belongs_to :source, polymorphic: true
|
||||
belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
|
||||
validates :source, presence: true
|
||||
|
||||
|
|
|
@ -946,6 +946,8 @@ class Repository
|
|||
end
|
||||
|
||||
def is_ancestor?(ancestor_id, descendant_id)
|
||||
return false if ancestor_id.nil? || descendant_id.nil?
|
||||
|
||||
Gitlab::GitalyClient.migrate(:is_ancestor) do |is_enabled|
|
||||
if is_enabled
|
||||
raw_repository.is_ancestor?(ancestor_id, descendant_id)
|
||||
|
@ -1102,7 +1104,7 @@ class Repository
|
|||
blob = blob_at(sha, path)
|
||||
return unless blob
|
||||
|
||||
blob.load_all_data!(self)
|
||||
blob.load_all_data!
|
||||
blob.data
|
||||
end
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
class Route < ActiveRecord::Base
|
||||
belongs_to :source, polymorphic: true
|
||||
belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
|
||||
validates :source, presence: true
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ class SentNotification < ActiveRecord::Base
|
|||
serialize :position, Gitlab::Diff::Position # rubocop:disable Cop/ActiverecordSerialize
|
||||
|
||||
belongs_to :project
|
||||
belongs_to :noteable, polymorphic: true
|
||||
belongs_to :noteable, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
belongs_to :recipient, class_name: "User"
|
||||
|
||||
validates :project, :recipient, presence: true
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class Subscription < ActiveRecord::Base
|
||||
belongs_to :user
|
||||
belongs_to :project
|
||||
belongs_to :subscribable, polymorphic: true
|
||||
belongs_to :subscribable, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
|
||||
validates :user, :subscribable, presence: true
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ class Todo < ActiveRecord::Base
|
|||
belongs_to :author, class_name: "User"
|
||||
belongs_to :note
|
||||
belongs_to :project
|
||||
belongs_to :target, polymorphic: true, touch: true
|
||||
belongs_to :target, polymorphic: true, touch: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
belongs_to :user
|
||||
|
||||
delegate :name, :email, to: :author, prefix: true, allow_nil: true
|
||||
|
|
|
@ -2,7 +2,7 @@ class Upload < ActiveRecord::Base
|
|||
# Upper limit for foreground checksum processing
|
||||
CHECKSUM_THRESHOLD = 100.megabytes
|
||||
|
||||
belongs_to :model, polymorphic: true
|
||||
belongs_to :model, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
|
||||
validates :size, presence: true
|
||||
validates :path, presence: true
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
class UserAgentDetail < ActiveRecord::Base
|
||||
belongs_to :subject, polymorphic: true
|
||||
belongs_to :subject, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
|
||||
|
||||
validates :user_agent, :ip_address, :subject_id, :subject_type, presence: true
|
||||
|
||||
|
|
|
@ -57,6 +57,8 @@ module Ci
|
|||
|
||||
cancel_pending_pipelines if project.auto_cancel_pending_pipelines?
|
||||
|
||||
pipeline_created_counter.increment(source: source)
|
||||
|
||||
pipeline.tap(&:process!)
|
||||
end
|
||||
|
||||
|
@ -131,5 +133,9 @@ module Ci
|
|||
pipeline.drop if save
|
||||
pipeline
|
||||
end
|
||||
|
||||
def pipeline_created_counter
|
||||
@pipeline_created_counter ||= Gitlab::Metrics.counter(:pipelines_created_count, "Pipelines created count")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
|
||||
= webpack_bundle_tag "runtime"
|
||||
= webpack_bundle_tag "common"
|
||||
= webpack_bundle_tag "locale"
|
||||
= webpack_bundle_tag "main"
|
||||
= webpack_bundle_tag "raven" if current_application_settings.clientside_sentry_enabled
|
||||
= webpack_bundle_tag "test" if Rails.env.test?
|
||||
|
|
|
@ -36,10 +36,7 @@
|
|||
%li
|
||||
= link_to admin_root_path, title: 'Admin area', aria: { label: "Admin area" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
|
||||
= icon('wrench fw')
|
||||
- if current_user.can_create_project?
|
||||
%li
|
||||
= link_to new_project_path, title: 'New project', aria: { label: "New project" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
|
||||
= icon('plus fw')
|
||||
= render 'layouts/header/new_dropdown'
|
||||
- if Gitlab::Sherlock.enabled?
|
||||
%li
|
||||
= link_to sherlock_transactions_path, title: 'Sherlock Transactions',
|
||||
|
@ -74,12 +71,12 @@
|
|||
@#{current_user.username}
|
||||
%li.divider
|
||||
%li
|
||||
= link_to "Profile", current_user, class: 'profile-link', aria: { label: "Profile" }, data: { user: current_user.username }
|
||||
= link_to "Profile", current_user, class: 'profile-link', data: { user: current_user.username }
|
||||
%li
|
||||
= link_to "Settings", profile_path, aria: { label: "Settings" }
|
||||
= link_to "Settings", profile_path
|
||||
%li.divider
|
||||
%li
|
||||
= link_to "Sign out", destroy_user_session_path, method: :delete, class: "sign-out-link", aria: { label: "Sign out" }
|
||||
= link_to "Sign out", destroy_user_session_path, method: :delete, class: "sign-out-link"
|
||||
- else
|
||||
%li
|
||||
%div
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
%li.header-new.dropdown
|
||||
= link_to new_project_path, class: "header-new-dropdown-toggle has-tooltip", title: "New...", ref: 'tooltip', aria: { label: "New..." }, data: { toggle: 'dropdown', placement: 'bottom', container: 'body' } do
|
||||
= icon('plus fw')
|
||||
= icon('caret-down')
|
||||
.dropdown-menu-nav.dropdown-menu-align-right
|
||||
%ul
|
||||
- if @group
|
||||
- create_group_project = can?(current_user, :create_projects, @group)
|
||||
- create_group_subgroup = can?(current_user, :create_subgroup, @group)
|
||||
- if create_group_project || create_group_subgroup
|
||||
%li.dropdown-bold-header This group
|
||||
- if create_group_project
|
||||
%li.header-new-group-project
|
||||
= link_to 'New project', new_project_path(namespace_id: @group.id)
|
||||
- if create_group_subgroup
|
||||
%li
|
||||
= link_to 'New subgroup', new_group_path(parent_id: @group.id)
|
||||
%li.divider
|
||||
%li.dropdown-bold-header GitLab
|
||||
|
||||
- if @project && @project.persisted?
|
||||
- create_project_issue = can?(current_user, :create_issue, @project)
|
||||
- merge_project = can?(current_user, :create_merge_request, @project) ? @project : (current_user && current_user.fork_of(@project))
|
||||
- create_project_snippet = can?(current_user, :create_project_snippet, @project)
|
||||
- if create_project_issue || merge_project || create_project_snippet
|
||||
%li.dropdown-bold-header This project
|
||||
- if create_project_issue
|
||||
%li
|
||||
= link_to 'New issue', new_namespace_project_issue_path(@project.namespace, @project)
|
||||
- if merge_project
|
||||
%li
|
||||
= link_to 'New merge request', new_namespace_project_merge_request_path(merge_project.namespace, merge_project)
|
||||
- if create_project_snippet
|
||||
%li.header-new-project-snippet
|
||||
= link_to 'New snippet', new_namespace_project_snippet_path(@project.namespace, @project)
|
||||
%li.divider
|
||||
%li.dropdown-bold-header GitLab
|
||||
- if current_user.can_create_project?
|
||||
%li
|
||||
= link_to 'New project', new_project_path
|
||||
- if current_user.can_create_group?
|
||||
%li
|
||||
= link_to 'New group', new_group_path
|
||||
%li
|
||||
= link_to 'New snippet', new_snippet_path
|
|
@ -1,3 +1,3 @@
|
|||
= link_to namespace_project_find_file_path(@project.namespace, @project, @ref), class: 'btn btn-grouped shortcuts-find-file', rel: 'nofollow' do
|
||||
= icon('search')
|
||||
%span Find file
|
||||
%span= _('Find file')
|
||||
|
|
|
@ -4,17 +4,14 @@
|
|||
.nav-links.sub-nav.scrolling-tabs
|
||||
%ul{ class: container_class }
|
||||
= nav_link(path: 'projects#show') do
|
||||
= link_to project_path(@project), title: 'Project home', class: 'shortcuts-project' do
|
||||
%span
|
||||
Home
|
||||
= link_to project_path(@project), title: _('Project home'), class: 'shortcuts-project' do
|
||||
%span= _('Home')
|
||||
|
||||
= nav_link(path: 'projects#activity') do
|
||||
= link_to activity_project_path(@project), title: 'Activity', class: 'shortcuts-project-activity' do
|
||||
%span
|
||||
Activity
|
||||
= link_to activity_project_path(@project), title: _('Activity'), class: 'shortcuts-project-activity' do
|
||||
%span= _('Activity')
|
||||
|
||||
- if can?(current_user, :read_cycle_analytics, @project)
|
||||
= nav_link(path: 'cycle_analytics#show') do
|
||||
= link_to project_cycle_analytics_path(@project), title: 'Cycle Analytics', class: 'shortcuts-project-cycle-analytics' do
|
||||
%span
|
||||
Cycle Analytics
|
||||
= link_to project_cycle_analytics_path(@project), title: _('Cycle Analytics'), class: 'shortcuts-project-cycle-analytics' do
|
||||
%span= _('Cycle Analytics')
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
- if forked_from_project = @project.forked_from_project
|
||||
%p
|
||||
Forked from
|
||||
#{ s_('ForkedFromProjectPath|Forked from') }
|
||||
= link_to project_path(forked_from_project) do
|
||||
= forked_from_project.namespace.try(:name)
|
||||
|
||||
|
|
|
@ -15,4 +15,4 @@
|
|||
|
||||
.pull-right
|
||||
= link_to new_mr_path_from_push_event(event), title: "New merge request", class: "btn btn-info btn-sm" do
|
||||
Create merge request
|
||||
#{ _('Create merge request') }
|
||||
|
|
|
@ -3,18 +3,18 @@
|
|||
.modal-content
|
||||
.modal-header
|
||||
%a.close{ href: "#", "data-dismiss" => "modal" } ×
|
||||
%h3.page-title Create New Directory
|
||||
%h3.page-title= _('Create New Directory')
|
||||
.modal-body
|
||||
= form_tag namespace_project_create_dir_path(@project.namespace, @project, @id), method: :post, remote: false, class: 'form-horizontal js-create-dir-form js-quick-submit js-requires-input' do
|
||||
.form-group
|
||||
= label_tag :dir_name, 'Directory name', class: 'control-label'
|
||||
= label_tag :dir_name, _('Directory name'), class: 'control-label'
|
||||
.col-sm-10
|
||||
= text_field_tag :dir_name, params[:dir_name], required: true, class: 'form-control'
|
||||
|
||||
= render 'shared/new_commit_form', placeholder: "Add new directory"
|
||||
= render 'shared/new_commit_form', placeholder: _("Add new directory")
|
||||
|
||||
.form-actions
|
||||
= submit_tag "Create directory", class: 'btn btn-create'
|
||||
= submit_tag _("Create directory"), class: 'btn btn-create'
|
||||
= link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal"
|
||||
|
||||
- unless can?(current_user, :push_code, @project)
|
||||
|
|
|
@ -2,29 +2,29 @@
|
|||
|
||||
- if !project.empty_repo? && can?(current_user, :download_code, project)
|
||||
.project-action-button.dropdown.inline>
|
||||
%button.btn.has-tooltip{ title: 'Download', 'data-toggle' => 'dropdown', 'aria-label' => 'Download' }
|
||||
%button.btn.has-tooltip{ title: 'Download', 'data-toggle' => 'dropdown', 'aria-label' => s_('DownloadSource|Download') }
|
||||
= icon('download')
|
||||
= icon("caret-down")
|
||||
%span.sr-only
|
||||
Select Archive Format
|
||||
%span.sr-only= _('Select Archive Format')
|
||||
%ul.dropdown-menu.dropdown-menu-align-right{ role: 'menu' }
|
||||
%li.dropdown-header Source code
|
||||
%li.dropdown-header
|
||||
#{ _('Source code') }
|
||||
%li
|
||||
= link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'zip'), rel: 'nofollow', download: '' do
|
||||
%i.fa.fa-download
|
||||
%span Download zip
|
||||
%span= _('Download zip')
|
||||
%li
|
||||
= link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar.gz'), rel: 'nofollow', download: '' do
|
||||
%i.fa.fa-download
|
||||
%span Download tar.gz
|
||||
%span= _('Download tar.gz')
|
||||
%li
|
||||
= link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar.bz2'), rel: 'nofollow', download: '' do
|
||||
%i.fa.fa-download
|
||||
%span Download tar.bz2
|
||||
%span= _('Download tar.bz2')
|
||||
%li
|
||||
= link_to archive_namespace_project_repository_path(project.namespace, project, ref: ref, format: 'tar'), rel: 'nofollow', download: '' do
|
||||
%i.fa.fa-download
|
||||
%span Download tar
|
||||
%span= _('Download tar')
|
||||
|
||||
- if pipeline
|
||||
- artifacts = pipeline.builds.latest.with_artifacts
|
||||
|
@ -39,4 +39,5 @@
|
|||
%li
|
||||
= link_to latest_succeeded_namespace_project_artifacts_path(project.namespace, project, "#{ref}/download", job: job.name), rel: 'nofollow', download: '' do
|
||||
%i.fa.fa-download
|
||||
%span Download '#{job.name}'
|
||||
%span
|
||||
#{ s_('DownloadArtifacts|Download') } '#{job.name}'
|
||||
|
|
|
@ -12,19 +12,19 @@
|
|||
%li
|
||||
= link_to new_namespace_project_issue_path(@project.namespace, @project) do
|
||||
= icon('exclamation-circle fw')
|
||||
New issue
|
||||
#{ _('New issue') }
|
||||
|
||||
- if merge_project
|
||||
%li
|
||||
= link_to new_namespace_project_merge_request_path(merge_project.namespace, merge_project) do
|
||||
= icon('tasks fw')
|
||||
New merge request
|
||||
#{ _('New merge request') }
|
||||
|
||||
- if can_create_snippet
|
||||
%li
|
||||
= link_to new_namespace_project_snippet_path(@project.namespace, @project) do
|
||||
= icon('file-text-o fw')
|
||||
New snippet
|
||||
#{ _('New snippet') }
|
||||
|
||||
- if can_create_issue || merge_project || can_create_snippet
|
||||
%li.divider
|
||||
|
@ -33,20 +33,20 @@
|
|||
%li
|
||||
= link_to namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master') do
|
||||
= icon('file fw')
|
||||
New file
|
||||
#{ _('New file') }
|
||||
%li
|
||||
= link_to new_namespace_project_branch_path(@project.namespace, @project) do
|
||||
= icon('code-fork fw')
|
||||
New branch
|
||||
#{ _('New branch') }
|
||||
%li
|
||||
= link_to new_namespace_project_tag_path(@project.namespace, @project) do
|
||||
= icon('tags fw')
|
||||
New tag
|
||||
#{ _('New tag') }
|
||||
- elsif current_user && current_user.already_forked?(@project)
|
||||
%li
|
||||
= link_to namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master') do
|
||||
= icon('file fw')
|
||||
New file
|
||||
#{ _('New file') }
|
||||
- elsif can?(current_user, :fork_project, @project)
|
||||
%li
|
||||
- continue_params = { to: namespace_project_new_blob_path(@project.namespace, @project, @project.default_branch || 'master'),
|
||||
|
@ -56,4 +56,4 @@
|
|||
continue: continue_params)
|
||||
= link_to fork_path, method: :post do
|
||||
= icon('file fw')
|
||||
New file
|
||||
#{ _('New file') }
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
- unless @project.empty_repo?
|
||||
- if current_user && can?(current_user, :fork_project, @project)
|
||||
- if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2
|
||||
= link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to your fork', class: 'btn has-tooltip' do
|
||||
= link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: _('Go to your fork'), class: 'btn has-tooltip' do
|
||||
= custom_icon('icon_fork')
|
||||
%span Fork
|
||||
%span= s_('GoToYourFork|Fork')
|
||||
- else
|
||||
= link_to new_namespace_project_fork_path(@project.namespace, @project), class: 'btn' do
|
||||
= custom_icon('icon_fork')
|
||||
%span Fork
|
||||
%span= s_('CreateNewFork|Fork')
|
||||
.count-with-arrow
|
||||
%span.arrow
|
||||
= link_to namespace_project_forks_path(@project.namespace, @project), title: 'Forks', class: 'count' do
|
||||
= link_to namespace_project_forks_path(@project.namespace, @project), title: n_('Forks', @project.forks_count), class: 'count' do
|
||||
= @project.forks_count
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
- if koding_enabled? && current_user && @repository.koding_yml && can_push_branch?(@project, @project.default_branch)
|
||||
= link_to koding_project_url(@project), class: 'btn project-action-button inline', target: '_blank', rel: 'noopener noreferrer' do
|
||||
Run in IDE (Koding)
|
||||
_('Run in IDE (Koding)')
|
||||
|
|
|
@ -2,19 +2,19 @@
|
|||
= link_to toggle_star_namespace_project_path(@project.namespace, @project), { class: 'btn star-btn toggle-star', method: :post, remote: true } do
|
||||
- if current_user.starred?(@project)
|
||||
= icon('star')
|
||||
%span.starred Unstar
|
||||
%span.starred= _('Unstar')
|
||||
- else
|
||||
= icon('star-o')
|
||||
%span Star
|
||||
%span= s_('StarProject|Star')
|
||||
.count-with-arrow
|
||||
%span.arrow
|
||||
%span.count.star-count
|
||||
= @project.star_count
|
||||
|
||||
- else
|
||||
= link_to new_user_session_path, class: 'btn has-tooltip star-btn', title: 'You must sign in to star a project' do
|
||||
= link_to new_user_session_path, class: 'btn has-tooltip star-btn', title: _('You must sign in to star a project') do
|
||||
= icon('star')
|
||||
Star
|
||||
#{ s_('StarProject|Star') }
|
||||
.count-with-arrow
|
||||
%span.arrow
|
||||
%span.count
|
||||
|
|
|
@ -31,12 +31,12 @@
|
|||
= preserve(markdown(commit.description, pipeline: :single_line, author: commit.author))
|
||||
.commiter
|
||||
= commit_author_link(commit, avatar: false, size: 24)
|
||||
committed
|
||||
#{ _('committed') }
|
||||
#{time_ago_with_tooltip(commit.committed_date)}
|
||||
|
||||
.commit-actions.flex-row.hidden-xs
|
||||
- if commit.status(ref)
|
||||
= render_commit_status(commit, ref: ref)
|
||||
= link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit-sha btn btn-transparent"
|
||||
= clipboard_button(text: commit.id, title: "Copy commit SHA to clipboard")
|
||||
= clipboard_button(text: commit.id, title: _("Copy commit SHA to clipboard"))
|
||||
= link_to_browse_code(project, commit)
|
||||
|
|
|
@ -5,32 +5,32 @@
|
|||
%ul{ class: (container_class) }
|
||||
= nav_link(controller: %w(tree blob blame edit_tree new_tree find_file)) do
|
||||
= link_to project_files_path(@project) do
|
||||
Files
|
||||
#{ _('Files') }
|
||||
|
||||
= nav_link(controller: [:commit, :commits]) do
|
||||
= link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do
|
||||
Commits
|
||||
#{ _('Commits') }
|
||||
|
||||
= nav_link(html_options: {class: branches_tab_class}) do
|
||||
= link_to namespace_project_branches_path(@project.namespace, @project) do
|
||||
Branches
|
||||
#{ _('Branches') }
|
||||
|
||||
= nav_link(controller: [:tags, :releases]) do
|
||||
= link_to namespace_project_tags_path(@project.namespace, @project) do
|
||||
Tags
|
||||
#{ _('Tags') }
|
||||
|
||||
= nav_link(path: 'graphs#show') do
|
||||
= link_to namespace_project_graph_path(@project.namespace, @project, current_ref) do
|
||||
Contributors
|
||||
#{ _('Contributors') }
|
||||
|
||||
= nav_link(controller: %w(network)) do
|
||||
= link_to namespace_project_network_path(@project.namespace, @project, current_ref) do
|
||||
Graph
|
||||
#{ s_('ProjectNetworkGraph|Graph') }
|
||||
|
||||
= nav_link(controller: :compare) do
|
||||
= link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: current_ref) do
|
||||
Compare
|
||||
#{ _('Compare') }
|
||||
|
||||
= nav_link(path: 'graphs#charts') do
|
||||
= link_to charts_namespace_project_graph_path(@project.namespace, @project, current_ref) do
|
||||
Charts
|
||||
#{ _('Charts') }
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
- page_title "Cycle Analytics"
|
||||
- content_for :page_specific_javascripts do
|
||||
= page_specific_javascript_bundle_tag('common_vue')
|
||||
= page_specific_javascript_bundle_tag('locale')
|
||||
= page_specific_javascript_bundle_tag('cycle_analytics')
|
||||
|
||||
= render "projects/head"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
%button.dropdown.dropdown-new.btn.btn-default{ type: 'button', 'data-toggle' => 'dropdown' }
|
||||
= custom_icon('icon_play')
|
||||
= icon('caret-down')
|
||||
%ul.dropdown-menu
|
||||
%ul.dropdown-menu.dropdown-menu-align-right
|
||||
- actions.each do |action|
|
||||
- next unless can?(current_user, :update_build, action)
|
||||
%li
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
.branch-commit
|
||||
- if deployment.ref
|
||||
%span.icon-container
|
||||
= deployment.tag? ? icon('tag') : icon('code-fork')
|
||||
= link_to deployment.ref, project_ref_path(@project, deployment.ref), class: "ref-name"
|
||||
.icon-container.commit-icon
|
||||
= custom_icon("icon_commit")
|
||||
= link_to deployment.short_sha, namespace_project_commit_path(@project.namespace, @project, deployment.sha), class: "commit-sha"
|
||||
.table-mobile-content
|
||||
.branch-commit
|
||||
- if deployment.ref
|
||||
%span.icon-container
|
||||
= deployment.tag? ? icon('tag') : icon('code-fork')
|
||||
= link_to deployment.ref, project_ref_path(@project, deployment.ref), class: "ref-name"
|
||||
.icon-container.commit-icon
|
||||
= custom_icon("icon_commit")
|
||||
= link_to deployment.short_sha, namespace_project_commit_path(@project.namespace, @project, deployment.sha), class: "commit-sha"
|
||||
|
||||
%p.commit-title.flex-truncate-parent
|
||||
%span.flex-truncate-child
|
||||
- if commit_title = deployment.commit_title
|
||||
= author_avatar(deployment.commit, size: 20)
|
||||
= link_to_gfm commit_title, namespace_project_commit_path(@project.namespace, @project, deployment.sha), class: "commit-row-message"
|
||||
- else
|
||||
Cant find HEAD commit for this branch
|
||||
%p.commit-title.flex-truncate-parent
|
||||
%span.flex-truncate-child
|
||||
- if commit_title = deployment.commit_title
|
||||
= author_avatar(deployment.commit, size: 20)
|
||||
= link_to_gfm commit_title, namespace_project_commit_path(@project.namespace, @project, deployment.sha), class: "commit-row-message"
|
||||
- else
|
||||
Cant find HEAD commit for this branch
|
||||
|
|
|
@ -1,20 +1,24 @@
|
|||
.gl-responsive-table-row.deployment
|
||||
.gl-responsive-table-row.deployment{ role: 'row' }
|
||||
.table-section.section-10{ role: 'gridcell' }
|
||||
%strong ##{deployment.iid}
|
||||
.table-mobile-header{ role: 'rowheader' } ID
|
||||
%strong.table-mobile-content ##{deployment.iid}
|
||||
|
||||
.table-section.section-40{ role: 'gridcell' }
|
||||
.table-mobile-header{ role: 'rowheader' } Commit
|
||||
= render 'projects/deployments/commit', deployment: deployment
|
||||
|
||||
.table-section.section-15.build-column{ role: 'gridcell' }
|
||||
.table-mobile-header{ role: 'rowheader' } Job
|
||||
- if deployment.deployable
|
||||
= link_to [@project.namespace.becomes(Namespace), @project, deployment.deployable], class: 'build-link' do
|
||||
= link_to [@project.namespace.becomes(Namespace), @project, deployment.deployable], class: 'build-link table-mobile-content' do
|
||||
#{deployment.deployable.name} (##{deployment.deployable.id})
|
||||
- if deployment.user
|
||||
by
|
||||
= user_avatar(user: deployment.user, size: 20)
|
||||
|
||||
.table-section.section-15{ role: 'gridcell' }
|
||||
#{time_ago_with_tooltip(deployment.created_at)}
|
||||
.table-mobile-header{ role: 'rowheader' } Created
|
||||
%span.table-mobile-content= time_ago_with_tooltip(deployment.created_at)
|
||||
|
||||
.table-section.section-20.environments-actions.table-button-footer{ role: 'gridcell' }
|
||||
.btn-group.environment-action-buttons
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
- blob = diff_file.blob
|
||||
- blob.load_all_data!(diff_file.repository)
|
||||
- blob.load_all_data!
|
||||
- total_lines = blob.lines.size
|
||||
- total_lines -= 1 if total_lines > 0 && blob.lines.last.blank?
|
||||
- if diff_view == :parallel
|
||||
|
|
|
@ -28,12 +28,12 @@
|
|||
= link_to "Read more", help_page_path("ci/environments"), class: "btn btn-success"
|
||||
- else
|
||||
.table-holder
|
||||
.ci-table.environments
|
||||
.ci-table.environments{ role: 'grid' }
|
||||
.gl-responsive-table-row.table-row-header{ role: 'row' }
|
||||
.table-section.section-10{ role: 'rollheader' } ID
|
||||
.table-section.section-40{ role: 'rollheader' } Commit
|
||||
.table-section.section-15{ role: 'rollheader' } Job
|
||||
.table-section.section-15{ role: 'rollheader' } Created
|
||||
.table-section.section-10{ role: 'columnheader' } ID
|
||||
.table-section.section-40{ role: 'columnheader' } Commit
|
||||
.table-section.section-15{ role: 'columnheader' } Job
|
||||
.table-section.section-15{ role: 'columnheader' } Created
|
||||
|
||||
= render @deployments
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
= link_to namespace_project_tree_path(@project.namespace, @project, @ref) do
|
||||
= @project.path
|
||||
%li.file-finder
|
||||
%input#file_find.form-control.file-finder-input{ type: "text", placeholder: 'Find by path', autocomplete: 'off' }
|
||||
%input#file_find.form-control.file-finder-input{ type: "text", placeholder: _('Find by path'), autocomplete: 'off' }
|
||||
|
||||
.tree-content-holder
|
||||
.table-holder
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
%h2
|
||||
%i.fa.fa-warning
|
||||
No repository
|
||||
#{ _('No repository') }
|
||||
|
||||
%p.slead
|
||||
The repository for this project does not exist.
|
||||
#{ _('The repository for this project does not exist.') }
|
||||
%br
|
||||
This means you can not push code until you create an empty repository or import existing one.
|
||||
#{ _('This means you can not push code until you create an empty repository or import existing one.') }
|
||||
%hr
|
||||
|
||||
.no-repo-actions
|
||||
= link_to namespace_project_repository_path(@project.namespace, @project), method: :post, class: 'btn btn-primary' do
|
||||
Create empty bare repository
|
||||
#{ _('Create empty bare repository') }
|
||||
|
||||
%strong.prepend-left-10.append-right-10 or
|
||||
|
||||
= link_to new_namespace_project_import_path(@project.namespace, @project), class: 'btn' do
|
||||
Import repository
|
||||
#{ _('Import repository') }
|
||||
|
||||
- if can? current_user, :remove_project, @project
|
||||
.prepend-top-20
|
||||
= link_to 'Remove project', project_path(@project), data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right"
|
||||
= link_to _('Remove project'), project_path(@project), data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right"
|
||||
|
|
|
@ -6,28 +6,28 @@
|
|||
= form_errors(@schedule)
|
||||
.form-group
|
||||
.col-md-9
|
||||
= f.label :description, 'Description', class: 'label-light'
|
||||
= f.text_field :description, class: 'form-control', required: true, autofocus: true, placeholder: 'Provide a short description for this pipeline'
|
||||
= f.label :description, _('Description'), class: 'label-light'
|
||||
= f.text_field :description, class: 'form-control', required: true, autofocus: true, placeholder: _('PipelineSchedules|Provide a short description for this pipeline')
|
||||
.form-group
|
||||
.col-md-9
|
||||
= f.label :cron, 'Interval Pattern', class: 'label-light'
|
||||
= f.label :cron, _('Interval Pattern'), class: 'label-light'
|
||||
#interval-pattern-input{ data: { initial_interval: @schedule.cron } }
|
||||
.form-group
|
||||
.col-md-9
|
||||
= f.label :cron_timezone, 'Cron Timezone', class: 'label-light'
|
||||
= dropdown_tag("Select a timezone", options: { toggle_class: 'btn js-timezone-dropdown', title: "Select a timezone", filter: true, placeholder: "Filter", data: { data: timezone_data } } )
|
||||
= f.label :cron_timezone, _('Cron Timezone'), class: 'label-light'
|
||||
= dropdown_tag(_("Select a timezone"), options: { toggle_class: 'btn js-timezone-dropdown', title: _("Select a timezone"), filter: true, placeholder: _("Filter"), data: { data: timezone_data } } )
|
||||
= f.text_field :cron_timezone, value: @schedule.cron_timezone, id: 'schedule_cron_timezone', class: 'hidden', name: 'schedule[cron_timezone]', required: true
|
||||
.form-group
|
||||
.col-md-9
|
||||
= f.label :ref, 'Target Branch', class: 'label-light'
|
||||
= dropdown_tag("Select target branch", options: { toggle_class: 'btn js-target-branch-dropdown git-revision-dropdown-toggle', dropdown_class: 'git-revision-dropdown', title: "Select target branch", filter: true, placeholder: "Filter", data: { data: @project.repository.branch_names, default_branch: @project.default_branch } } )
|
||||
= f.label :ref, _('Target Branch'), class: 'label-light'
|
||||
= dropdown_tag(_("Select target branch"), options: { toggle_class: 'btn js-target-branch-dropdown git-revision-dropdown-toggle', dropdown_class: 'git-revision-dropdown', title: _("Select target branch"), filter: true, placeholder: _("Filter"), data: { data: @project.repository.branch_names, default_branch: @project.default_branch } } )
|
||||
= f.text_field :ref, value: @schedule.ref, id: 'schedule_ref', class: 'hidden', name: 'schedule[ref]', required: true
|
||||
.form-group
|
||||
.col-md-9
|
||||
= f.label :active, 'Activated', class: 'label-light'
|
||||
= f.label :active, _('PipelineSchedules|Activated'), class: 'label-light'
|
||||
%div
|
||||
= f.check_box :active, required: false, value: @schedule.active?
|
||||
Active
|
||||
.footer-block.row-content-block
|
||||
= f.submit 'Save pipeline schedule', class: 'btn btn-create', tabindex: 3
|
||||
= link_to 'Cancel', pipeline_schedules_path(@project), class: 'btn btn-cancel'
|
||||
= f.submit _('Save pipeline schedule'), class: 'btn btn-create', tabindex: 3
|
||||
= link_to _('Cancel'), pipeline_schedules_path(@project), class: 'btn btn-cancel'
|
||||
|
|
|
@ -13,12 +13,12 @@
|
|||
= ci_icon_for_status(pipeline_schedule.last_pipeline.status)
|
||||
%span ##{pipeline_schedule.last_pipeline.id}
|
||||
- else
|
||||
None
|
||||
= _("PipelineSchedules|None")
|
||||
%td.next-run-cell
|
||||
- if pipeline_schedule.active?
|
||||
= time_ago_with_tooltip(pipeline_schedule.real_next_run)
|
||||
- else
|
||||
Inactive
|
||||
= _("PipelineSchedules|Inactive")
|
||||
%td
|
||||
- if pipeline_schedule.owner
|
||||
= image_tag avatar_icon(pipeline_schedule.owner, 20), class: "avatar s20"
|
||||
|
@ -27,11 +27,11 @@
|
|||
%td
|
||||
.pull-right.btn-group
|
||||
- if can?(current_user, :update_pipeline_schedule, @project) && !pipeline_schedule.owned_by?(current_user)
|
||||
= link_to take_ownership_pipeline_schedule_path(pipeline_schedule), method: :post, title: 'Take Ownership', class: 'btn' do
|
||||
Take ownership
|
||||
= link_to take_ownership_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('PipelineSchedules|Take ownership'), class: 'btn' do
|
||||
= s_('PipelineSchedules|Take ownership')
|
||||
- if can?(current_user, :update_pipeline_schedule, pipeline_schedule)
|
||||
= link_to edit_pipeline_schedule_path(pipeline_schedule), title: 'Edit', class: 'btn' do
|
||||
= link_to edit_pipeline_schedule_path(pipeline_schedule), title: _('Edit'), class: 'btn' do
|
||||
= icon('pencil')
|
||||
- if can?(current_user, :admin_pipeline_schedule, pipeline_schedule)
|
||||
= link_to pipeline_schedule_path(pipeline_schedule), title: 'Delete', method: :delete, class: 'btn btn-remove', data: { confirm: "Are you sure you want to cancel this pipeline?" } do
|
||||
= link_to pipeline_schedule_path(pipeline_schedule), title: _('Delete'), method: :delete, class: 'btn btn-remove', data: { confirm: _("Are you sure you want to delete this pipeline schedule?") } do
|
||||
= icon('trash')
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
%table.table.ci-table
|
||||
%thead
|
||||
%tr
|
||||
%th Description
|
||||
%th Target
|
||||
%th Last Pipeline
|
||||
%th Next Run
|
||||
%th Owner
|
||||
%th= _("Description")
|
||||
%th= s_("PipelineSchedules|Target")
|
||||
%th= _("Last Pipeline")
|
||||
%th= s_("PipelineSchedules|Next Run")
|
||||
%th= _("Owner")
|
||||
%th
|
||||
|
||||
= render partial: "pipeline_schedule", collection: @schedules
|
||||
|
|
|
@ -1,18 +1,18 @@
|
|||
%ul.nav-links
|
||||
%li{ class: active_when(scope.nil?) }>
|
||||
= link_to schedule_path_proc.call(nil) do
|
||||
All
|
||||
= s_("PipelineSchedules|All")
|
||||
%span.badge.js-totalbuilds-count
|
||||
= number_with_delimiter(all_schedules.count(:id))
|
||||
|
||||
%li{ class: active_when(scope == 'active') }>
|
||||
= link_to schedule_path_proc.call('active') do
|
||||
Active
|
||||
= s_("PipelineSchedules|Active")
|
||||
%span.badge
|
||||
= number_with_delimiter(all_schedules.active.count(:id))
|
||||
|
||||
%li{ class: active_when(scope == 'inactive') }>
|
||||
= link_to schedule_path_proc.call('inactive') do
|
||||
Inactive
|
||||
= s_("PipelineSchedules|Inactive")
|
||||
%span.badge
|
||||
= number_with_delimiter(all_schedules.inactive.count(:id))
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
- page_title "Edit", @schedule.description, "Pipeline Schedule"
|
||||
- page_title _("Edit"), @schedule.description, _("Pipeline Schedule")
|
||||
|
||||
%h3.page-title
|
||||
Edit Pipeline Schedule #{@schedule.id}
|
||||
= _("Edit Pipeline Schedule %{id}") % { id: @schedule.id }
|
||||
%hr
|
||||
|
||||
= render "form"
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
= webpack_bundle_tag 'schedules_index'
|
||||
|
||||
- @no_container = true
|
||||
- page_title "Pipeline Schedules"
|
||||
- page_title _("Pipeline Schedules")
|
||||
= render "projects/pipelines/head"
|
||||
|
||||
%div{ class: container_class }
|
||||
|
@ -21,4 +21,4 @@
|
|||
= render partial: "table"
|
||||
- else
|
||||
.light-well
|
||||
.nothing-here-block No schedules
|
||||
.nothing-here-block= _("No schedules")
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
- page_title "New Pipeline Schedule"
|
||||
- page_title _("New Pipeline Schedule")
|
||||
|
||||
%h3.page-title
|
||||
Schedule a new pipeline
|
||||
= _("Schedule a new pipeline")
|
||||
%hr
|
||||
|
||||
= render "form"
|
||||
|
|
|
@ -17,24 +17,24 @@
|
|||
%ul.nav
|
||||
%li
|
||||
= link_to project_files_path(@project) do
|
||||
Files (#{storage_counter(@project.statistics.total_repository_size)})
|
||||
#{_('Files')} (#{storage_counter(@project.statistics.total_repository_size)})
|
||||
%li
|
||||
= link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do
|
||||
#{'Commit'.pluralize(@project.statistics.commit_count)} (#{number_with_delimiter(@project.statistics.commit_count)})
|
||||
%li
|
||||
#{n_('Commit', 'Commits', @project.statistics.commit_count)} (#{number_with_delimiter(@project.statistics.commit_count)})
|
||||
%l
|
||||
= link_to namespace_project_branches_path(@project.namespace, @project) do
|
||||
#{'Branch'.pluralize(@repository.branch_count)} (#{number_with_delimiter(@repository.branch_count)})
|
||||
#{n_('Branch', 'Branches', @repository.branch_count)} (#{number_with_delimiter(@repository.branch_count)})
|
||||
%li
|
||||
= link_to namespace_project_tags_path(@project.namespace, @project) do
|
||||
#{'Tag'.pluralize(@repository.tag_count)} (#{number_with_delimiter(@repository.tag_count)})
|
||||
#{n_('Tag', 'Tags', @repository.tag_count)} (#{number_with_delimiter(@repository.tag_count)})
|
||||
|
||||
- if default_project_view != 'readme' && @repository.readme
|
||||
%li
|
||||
= link_to 'Readme', readme_path(@project)
|
||||
= link_to _('Readme'), readme_path(@project)
|
||||
|
||||
- if @repository.changelog
|
||||
%li
|
||||
= link_to 'Changelog', changelog_path(@project)
|
||||
= link_to _('Changelog'), changelog_path(@project)
|
||||
|
||||
- if @repository.license_blob
|
||||
%li
|
||||
|
@ -42,43 +42,43 @@
|
|||
|
||||
- if @repository.contribution_guide
|
||||
%li
|
||||
= link_to 'Contribution guide', contribution_guide_path(@project)
|
||||
= link_to _('Contribution guide'), contribution_guide_path(@project)
|
||||
|
||||
- if @repository.gitlab_ci_yml
|
||||
%li
|
||||
= link_to 'CI configuration', ci_configuration_path(@project)
|
||||
= link_to _('CI configuration'), ci_configuration_path(@project)
|
||||
|
||||
- if current_user && can_push_branch?(@project, @project.default_branch)
|
||||
- unless @repository.changelog
|
||||
%li.missing
|
||||
= link_to add_special_file_path(@project, file_name: 'CHANGELOG') do
|
||||
Add Changelog
|
||||
#{ _('Add Changelog') }
|
||||
- unless @repository.license_blob
|
||||
%li.missing
|
||||
= link_to add_special_file_path(@project, file_name: 'LICENSE') do
|
||||
Add License
|
||||
#{ _('Add License') }
|
||||
- unless @repository.contribution_guide
|
||||
%li.missing
|
||||
= link_to add_special_file_path(@project, file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') do
|
||||
Add Contribution guide
|
||||
#{ _('Add Contribution guide') }
|
||||
- unless @repository.gitlab_ci_yml
|
||||
%li.missing
|
||||
= link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml') do
|
||||
Set up CI
|
||||
#{ _('Set up CI') }
|
||||
- if koding_enabled? && @repository.koding_yml.blank?
|
||||
%li.missing
|
||||
= link_to 'Set up Koding', add_koding_stack_path(@project)
|
||||
= link_to _('Set up Koding'), add_koding_stack_path(@project)
|
||||
- if @repository.gitlab_ci_yml.blank? && @project.deployment_service.present?
|
||||
%li.missing
|
||||
= link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml', commit_message: 'Set up auto deploy', branch_name: 'auto-deploy', context: 'autodeploy') do
|
||||
Set up auto deploy
|
||||
#{ _('Set up auto deploy') }
|
||||
|
||||
%div{ class: container_class }
|
||||
- if @project.archived?
|
||||
.text-warning.center.prepend-top-20
|
||||
%p
|
||||
= icon("exclamation-triangle fw")
|
||||
Archived project! Repository is read-only
|
||||
#{ _('Archived project! Repository is read-only') }
|
||||
|
||||
- view_path = default_project_view
|
||||
|
||||
|
|
|
@ -3,10 +3,10 @@
|
|||
%table.table#tree-slider{ class: "table_#{@hex_path} tree-table" }
|
||||
%thead
|
||||
%tr
|
||||
%th Name
|
||||
%th= s_('ProjectFileTree|Name')
|
||||
%th.hidden-xs
|
||||
.pull-left Last commit
|
||||
%th.text-right Last Update
|
||||
.pull-left= _('Last commit')
|
||||
%th.text-right= _('Last Update')
|
||||
- if @path.present?
|
||||
%tr.tree-item
|
||||
%td.tree-item-file-name
|
||||
|
@ -20,7 +20,7 @@
|
|||
= render "projects/tree/readme", readme: tree.readme
|
||||
|
||||
- if can_edit_tree?
|
||||
= render 'projects/blob/upload', title: 'Upload New File', placeholder: 'Upload new file', button_title: 'Upload file', form_path: namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post
|
||||
= render 'projects/blob/upload', title: _('Upload New File'), placeholder: _('Upload New File'), button_title: _('Upload file'), form_path: namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post
|
||||
= render 'projects/blob/new_dir'
|
||||
|
||||
:javascript
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.tree-controls
|
||||
= render 'projects/find_file_link'
|
||||
|
||||
= link_to 'History', namespace_project_commits_path(@project.namespace, @project, @id), class: 'btn btn-grouped'
|
||||
= link_to s_('Commits|History'), namespace_project_commits_path(@project.namespace, @project, @id), class: 'btn btn-grouped'
|
||||
|
||||
= render 'projects/buttons/download', project: @project, ref: @ref
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
|||
- if current_user
|
||||
%li
|
||||
- if !on_top_of_branch?
|
||||
%span.btn.add-to-tree.disabled.has-tooltip{ title: "You can only add files when you are on a branch", data: { container: 'body' } }
|
||||
%span.btn.add-to-tree.disabled.has-tooltip{ title: _("You can only add files when you are on a branch"), data: { container: 'body' } }
|
||||
= icon('plus')
|
||||
- else
|
||||
%span.dropdown
|
||||
|
@ -30,15 +30,15 @@
|
|||
%li
|
||||
= link_to namespace_project_new_blob_path(@project.namespace, @project, @id) do
|
||||
= icon('pencil fw')
|
||||
New file
|
||||
#{ _('New file') }
|
||||
%li
|
||||
= link_to '#modal-upload-blob', { 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal' } do
|
||||
= icon('file fw')
|
||||
Upload file
|
||||
#{ _('Upload file') }
|
||||
%li
|
||||
= link_to '#modal-create-new-dir', { 'data-target' => '#modal-create-new-dir', 'data-toggle' => 'modal' } do
|
||||
= icon('folder fw')
|
||||
New directory
|
||||
#{ _('New directory') }
|
||||
- elsif can?(current_user, :fork_project, @project)
|
||||
%li
|
||||
- continue_params = { to: namespace_project_new_blob_path(@project.namespace, @project, @id),
|
||||
|
@ -48,7 +48,7 @@
|
|||
continue: continue_params)
|
||||
= link_to fork_path, method: :post do
|
||||
= icon('pencil fw')
|
||||
New file
|
||||
#{ _('New file') }
|
||||
%li
|
||||
- continue_params = { to: request.fullpath,
|
||||
notice: edit_in_new_fork_notice + " Try to upload a file again.",
|
||||
|
@ -57,7 +57,7 @@
|
|||
continue: continue_params)
|
||||
= link_to fork_path, method: :post do
|
||||
= icon('file fw')
|
||||
Upload file
|
||||
#{ _('Upload file') }
|
||||
%li
|
||||
- continue_params = { to: request.fullpath,
|
||||
notice: edit_in_new_fork_notice + " Try to create a new directory again.",
|
||||
|
@ -66,14 +66,14 @@
|
|||
continue: continue_params)
|
||||
= link_to fork_path, method: :post do
|
||||
= icon('folder fw')
|
||||
New directory
|
||||
#{ _('New directory') }
|
||||
|
||||
%li.divider
|
||||
%li
|
||||
= link_to new_namespace_project_branch_path(@project.namespace, @project) do
|
||||
= icon('code-fork fw')
|
||||
New branch
|
||||
#{ _('New branch') }
|
||||
%li
|
||||
= link_to new_namespace_project_tag_path(@project.namespace, @project) do
|
||||
= icon('tags fw')
|
||||
New tag
|
||||
#{ _('New tag') }
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
- @no_container = true
|
||||
|
||||
- page_title @path.presence || "Files", @ref
|
||||
- page_title @path.presence || _("Files"), @ref
|
||||
= content_for :meta_tags do
|
||||
= auto_discovery_link_tag(:atom, namespace_project_commits_url(@project.namespace, @project, @ref, rss_url_options), title: "#{@project.name}:#{@ref} commits")
|
||||
= render "projects/commits/head"
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
= text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: 'Project clone URL' }
|
||||
.input-group-btn
|
||||
= clipboard_button(target: '#project_clone', title: "Copy URL to clipboard")
|
||||
= clipboard_button(target: '#project_clone', title: _("Copy URL to clipboard"))
|
||||
|
||||
:javascript
|
||||
$('ul.clone-options-dropdown a').on('click',function(e){
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
%a.js-subscribe-button{ data: { url: toggle_subscription_group_label_path(label.group, label) } }
|
||||
Group level
|
||||
|
||||
- if label.is_a?(ProjectLabel) && label.project.group && can?(current_user, :admin_group, label.project.group)
|
||||
- if label.is_a?(ProjectLabel) && label.project.group && can?(current_user, :admin_label, label.project.group)
|
||||
= link_to promote_namespace_project_label_path(label.project.namespace, label.project, label), title: "Promote to Group Label", class: 'btn btn-transparent btn-action', data: {confirm: "Promoting this label will make this label available to all projects inside this group. Existing project labels with the same name will be merged. Are you sure?", toggle: "tooltip"}, method: :post do
|
||||
%span.sr-only Promote to Group
|
||||
= icon('level-up')
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
- if cookies[:hide_no_password_message].blank? && !current_user.hide_no_password && current_user.require_password?
|
||||
.no-password-message.alert.alert-warning
|
||||
You won't be able to pull or push project code via #{gitlab_config.protocol.upcase} until you #{link_to 'set a password', edit_profile_password_path} on your account
|
||||
- set_password_link = link_to s_('SetPasswordToCloneLink|set a password'), edit_profile_password_path
|
||||
- translation_params = { protocol: gitlab_config.protocol.upcase, set_password_link: set_password_link }
|
||||
- set_password_message = _("You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account") % translation_params
|
||||
|
||||
.alert-link-group
|
||||
= link_to "Don't show again", profile_path(user: {hide_no_password: true}), method: :put
|
||||
= link_to _("Don't show again"), profile_path(user: {hide_no_password: true}), method: :put
|
||||
|
|
||||
= link_to 'Remind later', '#', class: 'hide-no-password-message'
|
||||
= link_to _('Remind later'), '#', class: 'hide-no-password-message'
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
- if cookies[:hide_no_ssh_message].blank? && !current_user.hide_no_ssh_key && current_user.require_ssh_key?
|
||||
.no-ssh-key-message.alert.alert-warning
|
||||
You won't be able to pull or push project code via SSH until you #{link_to 'add an SSH key', profile_keys_path, class: 'alert-link'} to your profile
|
||||
|
||||
- add_ssh_key_link = link_to s_('MissingSSHKeyWarningLink|add an SSH key'), profile_keys_path, class: 'alert-link'
|
||||
- ssh_message = _("You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile") % { add_ssh_key_link: add_ssh_key_link }
|
||||
#{ ssh_message.html_safe }
|
||||
.alert-link-group
|
||||
= link_to "Don't show again", profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'alert-link'
|
||||
= link_to _("Don't show again"), profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'alert-link'
|
||||
|
|
||||
= link_to 'Remind later', '#', class: 'hide-no-ssh-message alert-link'
|
||||
= link_to _('Remind later'), '#', class: 'hide-no-ssh-message alert-link'
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
- @options && @options.each do |key, value|
|
||||
= hidden_field_tag key, value, id: nil
|
||||
.dropdown
|
||||
= dropdown_toggle dropdown_toggle_text, { toggle: "dropdown", selected: dropdown_toggle_text, ref: @ref, refs_url: refs_namespace_project_path(@project.namespace, @project), field_name: 'ref', submit_form_on_click: true }, { toggle_class: "js-project-refs-dropdown git-revision-dropdown-toggle" }
|
||||
= dropdown_toggle dropdown_toggle_text, { toggle: "dropdown", selected: dropdown_toggle_text, ref: @ref, refs_url: refs_namespace_project_path(@project.namespace, @project), field_name: 'ref', submit_form_on_click: true }, { toggle_class: "js-project-refs-dropdown" }
|
||||
.dropdown-menu.dropdown-menu-selectable.git-revision-dropdown{ class: ("dropdown-menu-align-right" if local_assigns[:align_right]) }
|
||||
= dropdown_title "Switch branch/tag"
|
||||
= dropdown_filter "Search branches and tags"
|
||||
= dropdown_title _("Switch branch/tag")
|
||||
= dropdown_filter _("Search branches and tags")
|
||||
= dropdown_content
|
||||
= dropdown_loading
|
||||
|
|
|
@ -2,16 +2,17 @@
|
|||
|
||||
.project-action-button.inline
|
||||
- if can?(current_user, :"destroy_#{model_name}_member", source.members.find_by(user_id: current_user.id))
|
||||
= link_to "Leave #{model_name}", polymorphic_path([:leave, source, :members]),
|
||||
- link_text = source.is_a?(Group) ? _('Leave group') : _('Leave project')
|
||||
= link_to link_text, polymorphic_path([:leave, source, :members]),
|
||||
method: :delete,
|
||||
data: { confirm: leave_confirmation_message(source) },
|
||||
class: 'btn'
|
||||
- elsif requester = source.requesters.find_by(user_id: current_user.id)
|
||||
= link_to 'Withdraw Access Request', polymorphic_path([:leave, source, :members]),
|
||||
= link_to _('Withdraw Access Request'), polymorphic_path([:leave, source, :members]),
|
||||
method: :delete,
|
||||
data: { confirm: remove_member_message(requester) },
|
||||
class: 'btn'
|
||||
- elsif source.request_access_enabled && can?(current_user, :request_access, source)
|
||||
= link_to 'Request Access', polymorphic_path([:request_access, source, :members]),
|
||||
= link_to _('Request Access'), polymorphic_path([:request_access, source, :members]),
|
||||
method: :post,
|
||||
class: 'btn'
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
%button.close{ type: "button", "aria-label": "close", data: { dismiss: "modal" } }
|
||||
%span{ "aria-hidden": "true" } } ×
|
||||
%h4#custom-notifications-title.modal-title
|
||||
Custom notification events
|
||||
#{ _('Custom notification events') }
|
||||
|
||||
.modal-body
|
||||
.container-fluid
|
||||
|
@ -13,12 +13,11 @@
|
|||
= hidden_setting_source_input(notification_setting)
|
||||
.row
|
||||
.col-lg-4
|
||||
%h4.prepend-top-0
|
||||
Notification events
|
||||
%h4.prepend-top-0= _('Notification events')
|
||||
%p
|
||||
Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out
|
||||
= succeed "." do
|
||||
%a{ href: help_page_path('workflow/notifications'), target: "_blank" } notification emails
|
||||
- notification_link = link_to _('notification emails'), help_page_path('workflow/notifications'), target: '_blank'
|
||||
- paragraph = _('Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}.') % { notification_link: notification_link.html_safe }
|
||||
#{ paragraph.html_safe }
|
||||
.col-lg-8
|
||||
- NotificationSetting::EMAIL_EVENTS.each_with_index do |event, index|
|
||||
- field_id = "#{notifications_menu_identifier("modal", notification_setting)}_notification_setting[#{event}]"
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Fix long urls in the title of commit
|
||||
merge_request: 10938
|
||||
author: Alexander Randa
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Add extra context-sensitive functionality for the top right menu button
|
||||
merge_request: 11632
|
||||
author:
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Confirm Project forking behaviour via the API
|
||||
merge_request:
|
||||
author:
|
|
@ -1,4 +0,0 @@
|
|||
---
|
||||
title: Make all notes use equal padding
|
||||
merge_request:
|
||||
author:
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Create equal padding for emoji
|
||||
merge_request:
|
||||
author:
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Add all pipeline sources as special keywords to 'only' and 'except'
|
||||
merge_request: 11844
|
||||
author: Filip Krakowski
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue