Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
a246b5fffa
commit
2458ea5140
28 changed files with 162 additions and 234 deletions
|
@ -87,6 +87,7 @@ export default {
|
|||
},
|
||||
helpHtmlConfig: {
|
||||
ADD_TAGS: ['use'], // to support icon SVGs
|
||||
FORBID_ATTR: [], // This is trusted input so we can override the default config to allow data-* attributes
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
5
app/assets/stylesheets/_jh/application_jh.scss
Normal file
5
app/assets/stylesheets/_jh/application_jh.scss
Normal file
|
@ -0,0 +1,5 @@
|
|||
/*
|
||||
This is a noop-file. In JH:
|
||||
jh/app/assets/stylesheets/_jh/application_jh.scss
|
||||
will take precedence over it and import more styles
|
||||
*/
|
|
@ -24,6 +24,9 @@
|
|||
// EE-only stylesheets
|
||||
@import 'application_ee';
|
||||
|
||||
// JH-only stylesheets
|
||||
@import 'application_jh';
|
||||
|
||||
/* print styles */
|
||||
@media print {
|
||||
@import 'print';
|
||||
|
|
|
@ -60,6 +60,7 @@ module Groups
|
|||
|
||||
def define_variables
|
||||
define_ci_variables
|
||||
define_view_variables
|
||||
end
|
||||
|
||||
def define_ci_variables
|
||||
|
@ -69,6 +70,10 @@ module Groups
|
|||
.map { |variable| variable.present(current_user: current_user) }
|
||||
end
|
||||
|
||||
def define_view_variables
|
||||
@content_class = 'limit-container-width' unless fluid_layout
|
||||
end
|
||||
|
||||
def authorize_admin_group!
|
||||
return render_404 unless can?(current_user, :admin_group, group)
|
||||
end
|
||||
|
|
|
@ -11,7 +11,7 @@ module TimeTrackable
|
|||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
attr_reader :time_spent, :time_spent_user, :spent_at
|
||||
attr_reader :time_spent, :time_spent_user, :spent_at, :summary
|
||||
|
||||
alias_method :time_spent?, :time_spent
|
||||
|
||||
|
@ -29,6 +29,7 @@ module TimeTrackable
|
|||
@time_spent_note_id = options[:note_id]
|
||||
@time_spent_user = User.find(options[:user_id])
|
||||
@spent_at = options[:spent_at]
|
||||
@summary = options[:summary]
|
||||
@original_total_time_spent = nil
|
||||
|
||||
return if @time_spent == 0
|
||||
|
@ -78,7 +79,8 @@ module TimeTrackable
|
|||
time_spent: time_spent,
|
||||
note_id: @time_spent_note_id,
|
||||
user: @time_spent_user,
|
||||
spent_at: @spent_at
|
||||
spent_at: @spent_at,
|
||||
summary: @summary
|
||||
)
|
||||
end
|
||||
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|
||||
|
|
|
@ -50,11 +50,7 @@ class MergeRequestPollCachedWidgetEntity < IssuableEntity
|
|||
MergeRequests::PipelineEntity.represent(merge_request.actual_head_pipeline, options)
|
||||
end
|
||||
|
||||
expose :merge_pipeline, if: ->(mr, _) {
|
||||
Feature.enabled?(:merge_request_cached_merge_pipeline_serializer, mr.project, default_enabled: :yaml) &&
|
||||
mr.merged? &&
|
||||
can?(request.current_user, :read_pipeline, mr.target_project)
|
||||
} do |merge_request, options|
|
||||
expose :merge_pipeline, if: ->(mr, _) { mr.merged? && can?(request.current_user, :read_pipeline, mr.target_project) } do |merge_request, options|
|
||||
MergeRequests::PipelineEntity.represent(merge_request.merge_pipeline, options)
|
||||
end
|
||||
|
||||
|
|
|
@ -19,14 +19,6 @@ class MergeRequestPollWidgetEntity < Grape::Entity
|
|||
# User entities
|
||||
expose :merge_user, using: UserEntity
|
||||
|
||||
expose :merge_pipeline, if: ->(mr, _) {
|
||||
Feature.disabled?(:merge_request_cached_merge_pipeline_serializer, mr.project, default_enabled: :yaml) &&
|
||||
mr.merged? &&
|
||||
can?(request.current_user, :read_pipeline, mr.target_project)
|
||||
} do |merge_request, options|
|
||||
MergeRequests::PipelineEntity.represent(merge_request.merge_pipeline, options)
|
||||
end
|
||||
|
||||
expose :default_merge_commit_message
|
||||
|
||||
expose :mergeable do |merge_request, options|
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
- link = link_to _("Install GitLab Runner and ensure it's running."), 'https://docs.gitlab.com/runner/install/', target: '_blank'
|
||||
.gl-mb-3
|
||||
%h5= _("Set up a %{type} runner manually") % { type: type }
|
||||
|
||||
%h5= _("Set up a %{type} Runner for a project") % { type: type }
|
||||
%ol
|
||||
%li
|
||||
= link.html_safe
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
%h5= _('Set up a %{type} runner automatically') % { type: type }
|
||||
|
||||
%p
|
||||
- link_to_help_page = link_to(_('Learn more.'),
|
||||
help_page_path('user/project/clusters/index'),
|
||||
target: '_blank',
|
||||
rel: 'noopener noreferrer')
|
||||
|
||||
= _('Register a runner on a Kubernetes cluster. %{link_to_help_page}').html_safe % { link_to_help_page: link_to_help_page }
|
||||
|
||||
%ol
|
||||
%li
|
||||
= _('Click the button below.')
|
||||
%li
|
||||
= _('Select an existing Kubernetes cluster or create a new one.')
|
||||
%li
|
||||
= _('From the Kubernetes cluster details view, applications list, install GitLab Runner.')
|
||||
|
||||
= link_to _('Install GitLab Runner on Kubernetes'),
|
||||
clusters_path,
|
||||
class: 'gl-button btn btn-info'
|
|
@ -5,25 +5,23 @@
|
|||
.settings-content#integrations-settings-section
|
||||
- if can?(current_user, :admin_cluster, @cluster)
|
||||
.sub-section.form-group
|
||||
= form_for @prometheus_integration, as: :integration, namespace: :prometheus, url: @cluster.integrations_path, method: :post, html: { class: 'js-cluster-integrations-form' } do |prometheus_form|
|
||||
= gitlab_ui_form_for @prometheus_integration, as: :integration, namespace: :prometheus, url: @cluster.integrations_path, method: :post, html: { class: 'js-cluster-integrations-form' } do |prometheus_form|
|
||||
= prometheus_form.hidden_field :application_type
|
||||
.form-group.gl-form-group
|
||||
.gl-form-checkbox.custom-control.custom-checkbox
|
||||
= prometheus_form.check_box :enabled, class: 'custom-control-input'
|
||||
= prometheus_form.label :enabled, s_('ClusterIntegration|Enable Prometheus integration'), class: 'custom-control-label'
|
||||
.form-text.text-gl-muted
|
||||
= s_('ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics.')
|
||||
= link_to _('More information.'), help_page_path("user/clusters/integrations", anchor: "prometheus-cluster-integration"), target: '_blank'
|
||||
- help_text = s_('ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics.')
|
||||
- help_link = link_to(_('More information.'), help_page_path("user/clusters/integrations", anchor: "prometheus-cluster-integration"), target: '_blank', rel: 'noopener noreferrer')
|
||||
= prometheus_form.gitlab_ui_checkbox_component :enabled,
|
||||
s_('ClusterIntegration|Enable Prometheus integration'),
|
||||
help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
|
||||
= prometheus_form.submit _('Save changes'), class: 'btn gl-button btn-success'
|
||||
|
||||
.sub-section.form-group
|
||||
= form_for @elastic_stack_integration, as: :integration, namespace: :elastic_stack, url: @cluster.integrations_path, method: :post, html: { class: 'js-cluster-integrations-form' } do |elastic_stack_form|
|
||||
= gitlab_ui_form_for @elastic_stack_integration, as: :integration, namespace: :elastic_stack, url: @cluster.integrations_path, method: :post, html: { class: 'js-cluster-integrations-form' } do |elastic_stack_form|
|
||||
= elastic_stack_form.hidden_field :application_type
|
||||
.form-group.gl-form-group
|
||||
.gl-form-checkbox.custom-control.custom-checkbox
|
||||
= elastic_stack_form.check_box :enabled, class: 'custom-control-input'
|
||||
= elastic_stack_form.label :enabled, s_('ClusterIntegration|Enable Elastic Stack integration'), class: 'custom-control-label'
|
||||
.form-text.text-gl-muted
|
||||
= s_('ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs.')
|
||||
= link_to _('More information.'), help_page_path("user/clusters/integrations", anchor: "elastic-stack-cluster-integration"), target: '_blank'
|
||||
- help_text = s_('ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs.')
|
||||
- help_link = link_to(_('More information.'), help_page_path("user/clusters/integrations", anchor: "elastic-stack-cluster-integration"), target: '_blank', rel: 'noopener noreferrer')
|
||||
= elastic_stack_form.gitlab_ui_checkbox_component :enabled,
|
||||
s_('ClusterIntegration|Enable Elastic Stack integration'),
|
||||
help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
|
||||
= elastic_stack_form.submit _('Save changes'), class: 'btn gl-button btn-success'
|
||||
|
|
|
@ -3,17 +3,14 @@
|
|||
%h4
|
||||
= _('Group runners')
|
||||
|
||||
%p
|
||||
= _('These runners are shared across projects in this group.')
|
||||
= _('Group runners can be managed with the %{link}.').html_safe % { link: link }
|
||||
|
||||
-# Proper policies should be implemented per
|
||||
-# https://gitlab.com/gitlab-org/gitlab-foss/issues/45894
|
||||
.bs-callout.help-callout
|
||||
%p
|
||||
= _('These runners are shared across projects in this group.')
|
||||
= _('Group runners can be managed with the %{link}.').html_safe % { link: link }
|
||||
|
||||
- if can?(current_user, :admin_pipeline, @group) && valid_runner_registrars.include?('group')
|
||||
= render partial: 'ci/runner/how_to_setup_runner_automatically',
|
||||
locals: { type: 'group',
|
||||
clusters_path: group_clusters_path(@group) }
|
||||
- if params[:ci_runner_templates]
|
||||
%hr
|
||||
= render partial: 'ci/runner/setup_runner_in_aws',
|
||||
|
|
|
@ -7,17 +7,15 @@
|
|||
%p= s_('Check the %{docs_link_start}documentation%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
|
||||
|
||||
.form-group
|
||||
.gl-form-checkbox.custom-control.custom-checkbox
|
||||
= f.check_box :require_two_factor_authentication, class: 'custom-control-input', data: { qa_selector: 'require_2fa_checkbox' }
|
||||
= f.label :require_two_factor_authentication, class: 'custom-control-label' do
|
||||
= _('Require all users in this group to setup two-factor authentication')
|
||||
= f.gitlab_ui_checkbox_component :require_two_factor_authentication,
|
||||
_('Require all users in this group to setup two-factor authentication'),
|
||||
checkbox_options: { data: { qa_selector: 'require_2fa_checkbox' } }
|
||||
.form-group
|
||||
= f.label :two_factor_grace_period, _('Time before enforced'), class: 'label-bold'
|
||||
= f.text_field :two_factor_grace_period, class: 'form-control form-control-sm w-auto'
|
||||
.form-text.text-muted= _('Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication')
|
||||
- unless group.has_parent?
|
||||
.form-group
|
||||
.gl-form-checkbox.custom-control.custom-checkbox
|
||||
= f.check_box :allow_mfa_for_subgroups, class: 'custom-control-input', checked: group.namespace_settings&.allow_mfa_for_subgroups
|
||||
= f.label :allow_mfa_for_subgroups, class: 'custom-control-label' do
|
||||
= _('Allow subgroups to set up their own two-factor authentication rules')
|
||||
= f.gitlab_ui_checkbox_component :allow_mfa_for_subgroups,
|
||||
_('Allow subgroups to set up their own two-factor authentication rules'),
|
||||
checkbox_options: { checked: group.namespace_settings&.allow_mfa_for_subgroups }
|
||||
|
|
|
@ -4,10 +4,6 @@
|
|||
.bs-callout.help-callout
|
||||
- if valid_runner_registrars.include?('project')
|
||||
= _('These runners are specific to this project.')
|
||||
%hr
|
||||
= render partial: 'ci/runner/how_to_setup_runner_automatically',
|
||||
locals: { type: s_('Runners|specific'),
|
||||
clusters_path: project_clusters_path(@project) }
|
||||
- if params[:ci_runner_templates]
|
||||
%hr
|
||||
= render partial: 'ci/runner/setup_runner_in_aws',
|
||||
|
|
|
@ -264,7 +264,9 @@ module Gitlab
|
|||
# Import path for EE specific SCSS entry point
|
||||
# In CE it will import a noop file, in EE a functioning file
|
||||
# Order is important, so that the ee file takes precedence:
|
||||
config.assets.paths << "#{config.root}/jh/app/assets/stylesheets/_jh" if Gitlab.jh?
|
||||
config.assets.paths << "#{config.root}/ee/app/assets/stylesheets/_ee" if Gitlab.ee?
|
||||
config.assets.paths << "#{config.root}/app/assets/stylesheets/_jh"
|
||||
config.assets.paths << "#{config.root}/app/assets/stylesheets/_ee"
|
||||
|
||||
config.assets.paths << "#{config.root}/vendor/assets/javascripts/"
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
---
|
||||
name: merge_request_cached_merge_pipeline_serializer
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57827
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/326317
|
||||
milestone: '13.11'
|
||||
type: development
|
||||
group: group::source code
|
||||
default_enabled: false
|
|
@ -1950,6 +1950,7 @@ POST /projects/:id/issues/:issue_iid/add_spent_time
|
|||
| `duration` | string | yes | The duration in human format. e.g: 3h30m |
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
|
||||
| `issue_iid` | integer | yes | The internal ID of a project's issue |
|
||||
| `summary` | string | no | A summary of how the time was spent |
|
||||
|
||||
```shell
|
||||
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/issues/93/add_spent_time?duration=1h"
|
||||
|
|
|
@ -2538,6 +2538,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/add_spent_time
|
|||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
|
||||
| `duration` | string | yes | The duration in human format, such as `3h30m` |
|
||||
| `summary` | string | no | A summary of how the time was spent. |
|
||||
|
||||
```shell
|
||||
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/93/add_spent_time?duration=1h"
|
||||
|
|
|
@ -54,28 +54,6 @@ results. On failure, the analyzer outputs an
|
|||
[`docker` executor](https://docs.gitlab.com/runner/executors/docker.html).
|
||||
- Target application deployed. For more details, read [Deployment options](#deployment-options).
|
||||
|
||||
### DAST job order
|
||||
|
||||
When using the `DAST.gitlab-ci.yml` template, the `dast` stage is run last as shown in
|
||||
the example below. To ensure DAST scans the latest code, deploy your application
|
||||
in a stage before the `dast` stage.
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
- dast
|
||||
```
|
||||
|
||||
Be aware that if your pipeline is configured to deploy to the same webserver in
|
||||
each run, running a pipeline while another is still running could cause a race condition
|
||||
where one pipeline overwrites the code from another pipeline. The site to be scanned
|
||||
should be excluded from changes for the duration of a DAST scan.
|
||||
The only changes to the site should be from the DAST scanner. Be aware that any
|
||||
changes that users, scheduled tasks, database changes, code changes, other pipelines, or other scanners make to
|
||||
the site during a scan could lead to inaccurate results.
|
||||
|
||||
### Deployment options
|
||||
|
||||
Depending on the complexity of the target application, there are a few options as to how to deploy and configure
|
||||
|
@ -143,6 +121,34 @@ services: # use services to link the container to the dast job
|
|||
alias: yourapp
|
||||
```
|
||||
|
||||
### DAST job order
|
||||
|
||||
When using the `DAST.gitlab-ci.yml` template, the `dast` stage is run last as shown in
|
||||
the example below. To ensure DAST scans the latest code, deploy your application
|
||||
in a stage before the `dast` stage.
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
- dast
|
||||
```
|
||||
|
||||
Take care if your pipeline is configured to deploy to the same web server in each run. Running a
|
||||
pipeline while another is still running could result in one pipeline overwriting the code from
|
||||
another pipeline. The site to be scanned should be excluded from changes for the duration of a DAST
|
||||
scan. The only changes to the site should be from the DAST scanner.
|
||||
|
||||
Changes to the site during a scan from any of the following could lead to inaccurate results:
|
||||
|
||||
- Users.
|
||||
- Scheduled tasks.
|
||||
- Database changes.
|
||||
- Code changes.
|
||||
- Other pipelines.
|
||||
- Other scanners.
|
||||
|
||||
## DAST run options
|
||||
|
||||
You can use DAST to examine your web application:
|
||||
|
@ -838,8 +844,8 @@ Chrome DevTools element selector tool is an effective way to find a selector.
|
|||
![highlight](img/dast_auth_browser_scan_highlight.png)
|
||||
1. Once highlighted, you can see the element's details, including attributes that would make a good candidate for a selector.
|
||||
|
||||
In this example, the `id="user_login"` appears to be a good candidate. You can use this as a selector as the DAST username field by setting
|
||||
`DAST_USERNAME_FIELD: "id:user_login"`.
|
||||
In this example, the `id="user_login"` appears to be a good candidate. You can use this as a selector as the DAST username field by setting
|
||||
`DAST_USERNAME_FIELD: "id:user_login"`.
|
||||
|
||||
##### Choose the right selector
|
||||
|
||||
|
|
|
@ -88,6 +88,7 @@ module API
|
|||
update_params = {
|
||||
spend_time: {
|
||||
duration: Gitlab::TimeTrackingFormatter.parse(params.delete(:duration)),
|
||||
summary: params.delete(:summary),
|
||||
user_id: current_user.id
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1873,9 +1873,6 @@ msgstr ""
|
|||
msgid "Add GitLab to Slack"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add Group Webhooks and GitLab Enterprise Edition."
|
||||
msgstr ""
|
||||
|
||||
msgid "Add Jaeger URL"
|
||||
msgstr ""
|
||||
|
||||
|
@ -4622,9 +4619,6 @@ msgstr ""
|
|||
msgid "Audit Events"
|
||||
msgstr ""
|
||||
|
||||
msgid "Audit Events is a way to keep track of important events that happened in GitLab."
|
||||
msgstr ""
|
||||
|
||||
msgid "AuditLogs|(removed)"
|
||||
msgstr ""
|
||||
|
||||
|
@ -6847,9 +6841,6 @@ msgstr ""
|
|||
msgid "Click %{link_to} to view the request."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click the button below."
|
||||
msgstr ""
|
||||
|
||||
msgid "Click the link below to confirm your email address (%{email})"
|
||||
msgstr ""
|
||||
|
||||
|
@ -11057,9 +11048,6 @@ msgstr ""
|
|||
msgid "Description template"
|
||||
msgstr ""
|
||||
|
||||
msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Description:"
|
||||
msgstr ""
|
||||
|
||||
|
@ -14386,9 +14374,6 @@ msgstr ""
|
|||
msgid "From merge request merge until deploy to production"
|
||||
msgstr ""
|
||||
|
||||
msgid "From the Kubernetes cluster details view, applications list, install GitLab Runner."
|
||||
msgstr ""
|
||||
|
||||
msgid "Full"
|
||||
msgstr ""
|
||||
|
||||
|
@ -16754,12 +16739,6 @@ msgstr ""
|
|||
msgid "Improve customer support with Service Desk"
|
||||
msgstr ""
|
||||
|
||||
msgid "Improve merge requests and customer support with GitLab Enterprise Edition."
|
||||
msgstr ""
|
||||
|
||||
msgid "Improve search with Advanced Search and GitLab Enterprise Edition."
|
||||
msgstr ""
|
||||
|
||||
msgid "Improves Git cloning performance."
|
||||
msgstr ""
|
||||
|
||||
|
@ -17537,9 +17516,6 @@ msgstr ""
|
|||
msgid "Install GitLab Runner and ensure it's running."
|
||||
msgstr ""
|
||||
|
||||
msgid "Install GitLab Runner on Kubernetes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Install on clusters"
|
||||
msgstr ""
|
||||
|
||||
|
@ -26369,6 +26345,12 @@ msgstr ""
|
|||
msgid "Promotion is not supported."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Add Group Webhooks and GitLab Enterprise Edition."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Audit Events is a way to keep track of important events that happened in GitLab."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Burndown Charts are visual representations of the progress of completing a milestone. At a glance, you see the current state for the completion a given milestone. Without them, you would have to organize the data from the milestone and plot it yourself to have the same sense of progress."
|
||||
msgstr ""
|
||||
|
||||
|
@ -26387,6 +26369,9 @@ msgstr ""
|
|||
msgid "Promotions|Contact your Administrator to upgrade your license."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Dismiss burndown charts promotion"
|
||||
msgstr ""
|
||||
|
||||
|
@ -26399,39 +26384,72 @@ msgstr ""
|
|||
msgid "Promotions|Improve issues management with Issue weight and GitLab Enterprise Edition."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Improve merge requests and customer support with GitLab Enterprise Edition."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Improve milestones with Burndown Charts."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Improve search with Advanced Search and GitLab Enterprise Edition."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Learn more"
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Merge request approvals"
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Not now, thanks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|See the other features in the %{subscription_link_start}Premium plan%{subscription_link_end}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Set the number of necessary approvals and define a list of approvers needed for every merge request in a project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Start GitLab Ultimate trial"
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|This feature is locked."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Track activity with Contribution Analytics."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Track your project with Audit Events."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Try it for free"
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Upgrade plan"
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Upgrade your plan to activate Advanced Search."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Upgrade your plan to activate Audit Events."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Upgrade your plan to activate Group Webhooks."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Upgrade your plan to improve merge requests."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Upgrade your plan to improve milestones with Burndown Charts."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|Weight"
|
||||
msgstr ""
|
||||
|
||||
|
@ -26444,6 +26462,12 @@ msgstr ""
|
|||
msgid "Promotions|With Contribution Analytics you can have an overview for the activity of issues, merge requests, and push events of your organization and its members."
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|description templates"
|
||||
msgstr ""
|
||||
|
||||
msgid "Promotions|to help your contributors communicate effectively!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Prompt users to upload SSH keys"
|
||||
msgstr ""
|
||||
|
||||
|
@ -27013,9 +27037,6 @@ msgstr ""
|
|||
msgid "Register WebAuthn Device"
|
||||
msgstr ""
|
||||
|
||||
msgid "Register a runner on a Kubernetes cluster. %{link_to_help_page}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Register as many runners as you want. You can register runners as separate users, on separate servers, and on your local machine. Runners are either:"
|
||||
msgstr ""
|
||||
|
||||
|
@ -29447,9 +29468,6 @@ msgstr ""
|
|||
msgid "Select an assignee"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select an existing Kubernetes cluster or create a new one."
|
||||
msgstr ""
|
||||
|
||||
msgid "Select an iteration"
|
||||
msgstr ""
|
||||
|
||||
|
@ -29909,9 +29927,6 @@ msgstr ""
|
|||
msgid "Set the milestone to %{milestone_reference}."
|
||||
msgstr ""
|
||||
|
||||
msgid "Set the number of necessary approvals and define a list of approvers needed for every merge request in a project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Set the timeout in seconds to send a secondary node status to the primary and IPs allowed for the secondary nodes."
|
||||
msgstr ""
|
||||
|
||||
|
@ -29927,7 +29942,7 @@ msgstr ""
|
|||
msgid "Set up Jira Integration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Set up a %{type} runner automatically"
|
||||
msgid "Set up a %{type} Runner for a project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Set up a %{type} runner manually"
|
||||
|
@ -32476,9 +32491,6 @@ msgstr[1] ""
|
|||
msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
|
||||
msgstr ""
|
||||
|
||||
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
|
||||
msgstr ""
|
||||
|
||||
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
|
||||
msgstr ""
|
||||
|
||||
|
@ -34552,9 +34564,6 @@ msgstr ""
|
|||
msgid "Track your GitLab projects with GitLab for Slack."
|
||||
msgstr ""
|
||||
|
||||
msgid "Track your project with Audit Events."
|
||||
msgstr ""
|
||||
|
||||
msgid "Transfer"
|
||||
msgstr ""
|
||||
|
||||
|
@ -35259,18 +35268,6 @@ msgstr ""
|
|||
msgid "Upgrade your plan"
|
||||
msgstr ""
|
||||
|
||||
msgid "Upgrade your plan to activate Advanced Search."
|
||||
msgstr ""
|
||||
|
||||
msgid "Upgrade your plan to activate Audit Events."
|
||||
msgstr ""
|
||||
|
||||
msgid "Upgrade your plan to activate Group Webhooks."
|
||||
msgstr ""
|
||||
|
||||
msgid "Upgrade your plan to improve merge requests."
|
||||
msgstr ""
|
||||
|
||||
msgid "Upload"
|
||||
msgstr ""
|
||||
|
||||
|
@ -36751,9 +36748,6 @@ msgstr ""
|
|||
msgid "Webhooks Help"
|
||||
msgstr ""
|
||||
|
||||
msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
|
||||
msgstr ""
|
||||
|
||||
msgid "Webhooks|Comments"
|
||||
msgstr ""
|
||||
|
||||
|
@ -39727,9 +39721,6 @@ msgstr ""
|
|||
msgid "time summary"
|
||||
msgstr ""
|
||||
|
||||
msgid "to help your contributors communicate effectively!"
|
||||
msgstr ""
|
||||
|
||||
msgid "to join %{source_name}"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -97,7 +97,9 @@ module QA
|
|||
group.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
|
||||
end
|
||||
|
||||
after do
|
||||
after do |example|
|
||||
next if example.pending?
|
||||
|
||||
# save data for comparison after run finished
|
||||
save_json(
|
||||
"data",
|
||||
|
|
|
@ -16,10 +16,10 @@ RSpec.describe 'Runners' do
|
|||
project.add_maintainer(user)
|
||||
end
|
||||
|
||||
it 'user can see a button to install runners on kubernetes clusters' do
|
||||
it 'user can see a link with instructions on how to install GitLab Runner' do
|
||||
visit project_runners_path(project)
|
||||
|
||||
expect(page).to have_link('Install GitLab Runner on Kubernetes', href: project_clusters_path(project))
|
||||
expect(page).to have_link('Install GitLab Runner and ensure it\'s running.', href: "https://docs.gitlab.com/runner/install/")
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -343,12 +343,6 @@ RSpec.describe 'Runners' do
|
|||
|
||||
expect(page).to have_content 'No runners found'
|
||||
end
|
||||
|
||||
it 'user can see a link to install runners on kubernetes clusters' do
|
||||
visit group_settings_ci_cd_path(group)
|
||||
|
||||
expect(page).to have_link('Install GitLab Runner on Kubernetes', href: group_clusters_path(group))
|
||||
end
|
||||
end
|
||||
|
||||
context 'group with a runner' do
|
||||
|
|
|
@ -278,6 +278,7 @@ describe('IntegrationForm', () => {
|
|||
<svg class="gl-icon">
|
||||
<use></use>
|
||||
</svg>
|
||||
<a data-confirm="Are you sure?" data-method="delete" href="/settings/slack"></a>
|
||||
</div>
|
||||
`);
|
||||
|
||||
|
@ -291,9 +292,14 @@ describe('IntegrationForm', () => {
|
|||
});
|
||||
|
||||
const helpHtml = wrapper.findByTestId(mockTestId);
|
||||
const helpLink = helpHtml.find('a');
|
||||
|
||||
expect(helpHtml.isVisible()).toBe(true);
|
||||
expect(helpHtml.find('svg').isVisible()).toBe(true);
|
||||
expect(helpLink.attributes()).toMatchObject({
|
||||
'data-confirm': 'Are you sure?',
|
||||
'data-method': 'delete',
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -302,16 +302,6 @@ RSpec.describe MergeRequestPollCachedWidgetEntity do
|
|||
expect(subject[:merge_pipeline]).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
context 'when merge_request_cached_merge_pipeline_serializer is disabled' do
|
||||
before do
|
||||
stub_feature_flags(merge_request_cached_merge_pipeline_serializer: false)
|
||||
end
|
||||
|
||||
it 'returns nil' do
|
||||
expect(subject[:merge_pipeline]).to be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -22,54 +22,6 @@ RSpec.describe MergeRequestPollWidgetEntity do
|
|||
.to eq(resource.default_merge_commit_message(include_description: true))
|
||||
end
|
||||
|
||||
describe 'merge_pipeline' do
|
||||
before do
|
||||
stub_feature_flags(merge_request_cached_merge_pipeline_serializer: false)
|
||||
end
|
||||
|
||||
it 'returns nil' do
|
||||
expect(subject[:merge_pipeline]).to be_nil
|
||||
end
|
||||
|
||||
context 'when is merged' do
|
||||
let_it_be(:resource) { create(:merged_merge_request, source_project: project, merge_commit_sha: project.commit.id) }
|
||||
let_it_be(:pipeline) { create(:ci_empty_pipeline, project: project, ref: resource.target_branch, sha: resource.merge_commit_sha) }
|
||||
|
||||
before do
|
||||
project.add_maintainer(user)
|
||||
end
|
||||
|
||||
context 'when user cannot read pipelines on target project' do
|
||||
before do
|
||||
project.team.truncate
|
||||
end
|
||||
|
||||
it 'returns nil' do
|
||||
expect(subject[:merge_pipeline]).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
it 'returns merge_pipeline' do
|
||||
pipeline_payload =
|
||||
MergeRequests::PipelineEntity
|
||||
.represent(pipeline, request: request)
|
||||
.as_json
|
||||
|
||||
expect(subject[:merge_pipeline]).to eq(pipeline_payload)
|
||||
end
|
||||
|
||||
context 'when merge_request_cached_merge_pipeline_serializer is enabled' do
|
||||
before do
|
||||
stub_feature_flags(merge_request_cached_merge_pipeline_serializer: true)
|
||||
end
|
||||
|
||||
it 'returns nil' do
|
||||
expect(subject[:merge_pipeline]).to be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'new_blob_path' do
|
||||
context 'when user can push to project' do
|
||||
it 'returns path' do
|
||||
|
|
|
@ -8,7 +8,7 @@ RSpec.describe MergeRequests::AddSpentTimeService do
|
|||
let_it_be_with_reload(:merge_request) { create(:merge_request, :simple, :unique_branches, source_project: project) }
|
||||
|
||||
let(:duration) { 1500 }
|
||||
let(:params) { { spend_time: { duration: duration, user_id: user.id } } }
|
||||
let(:params) { { spend_time: { duration: duration, summary: 'summary', user_id: user.id } } }
|
||||
let(:service) { described_class.new(project: project, current_user: user, params: params) }
|
||||
|
||||
describe '#execute' do
|
||||
|
@ -16,13 +16,14 @@ RSpec.describe MergeRequests::AddSpentTimeService do
|
|||
project.add_developer(user)
|
||||
end
|
||||
|
||||
it 'creates a new timelog with the specified duration' do
|
||||
it 'creates a new timelog with the specified duration and summary' do
|
||||
expect { service.execute(merge_request) }.to change { Timelog.count }.from(0).to(1)
|
||||
|
||||
timelog = merge_request.timelogs.last
|
||||
|
||||
expect(timelog).not_to be_nil
|
||||
expect(timelog.time_spent).to eq(1500)
|
||||
expect(timelog.summary).to eq('summary')
|
||||
end
|
||||
|
||||
it 'creates a system note with the time added' do
|
||||
|
|
|
@ -128,17 +128,25 @@ RSpec.shared_examples 'time tracking endpoints' do |issuable_name|
|
|||
|
||||
if issuable_name == 'merge_request'
|
||||
it 'calls update service with :use_specialized_service param' do
|
||||
expect(::MergeRequests::UpdateService).to receive(:new).with(project: project, current_user: user, params: hash_including(use_specialized_service: true))
|
||||
expect(::MergeRequests::UpdateService).to receive(:new).with(
|
||||
project: project,
|
||||
current_user: user,
|
||||
params: hash_including(
|
||||
use_specialized_service: true,
|
||||
spend_time: hash_including(duration: 7200, summary: 'summary')))
|
||||
|
||||
post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/add_spent_time", user), params: { duration: '2h' }
|
||||
post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/add_spent_time", user), params: { duration: '2h', summary: 'summary' }
|
||||
end
|
||||
end
|
||||
|
||||
if issuable_name == 'issue'
|
||||
it 'calls update service without :use_specialized_service param' do
|
||||
expect(::Issues::UpdateService).to receive(:new).with(project: project, current_user: user, params: hash_not_including(use_specialized_service: true))
|
||||
expect(::Issues::UpdateService).to receive(:new).with(
|
||||
project: project,
|
||||
current_user: user,
|
||||
params: { spend_time: { duration: 3600, summary: 'summary', user_id: user.id } })
|
||||
|
||||
post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/add_spent_time", user), params: { duration: '2h' }
|
||||
post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/add_spent_time", user), params: { duration: '1h', summary: 'summary' }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -5,6 +5,7 @@ const path = require('path');
|
|||
const sass = require('node-sass'); // eslint-disable-line import/no-unresolved
|
||||
const { buildIncludePaths, resolveGlobUrl } = require('node-sass-magic-importer/dist/toolbox'); // eslint-disable-line import/no-unresolved
|
||||
const webpack = require('webpack');
|
||||
const IS_JH = require('../../config/helpers/is_jh_env');
|
||||
const gitlabWebpackConfig = require('../../config/webpack.config');
|
||||
|
||||
const ROOT = path.resolve(__dirname, '../../');
|
||||
|
@ -13,11 +14,20 @@ const TRANSPARENT_1X1_PNG =
|
|||
const SASS_INCLUDE_PATHS = [
|
||||
'app/assets/stylesheets',
|
||||
'app/assets/stylesheets/_ee',
|
||||
'app/assets/stylesheets/_jh',
|
||||
'ee/app/assets/stylesheets',
|
||||
'ee/app/assets/stylesheets/_ee',
|
||||
'node_modules',
|
||||
].map((p) => path.resolve(ROOT, p));
|
||||
|
||||
if (IS_JH) {
|
||||
SASS_INCLUDE_PATHS.push(
|
||||
...['jh/app/assets/stylesheets', 'jh/app/assets/stylesheets/_jh'].map((p) =>
|
||||
path.resolve(ROOT, p),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom importer for node-sass, used when LibSass encounters the `@import` directive.
|
||||
* Doc source: https://github.com/sass/node-sass#importer--v200---experimental
|
||||
|
|
Loading…
Reference in a new issue