Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
a662b146ac
commit
74dd67ddea
|
@ -230,7 +230,13 @@ export default {
|
||||||
:href="titleLink"
|
:href="titleLink"
|
||||||
@click="handleFileNameClick"
|
@click="handleFileNameClick"
|
||||||
>
|
>
|
||||||
<file-icon :file-name="filePath" :size="18" aria-hidden="true" css-classes="gl-mr-2" />
|
<file-icon
|
||||||
|
:file-name="filePath"
|
||||||
|
:size="18"
|
||||||
|
aria-hidden="true"
|
||||||
|
css-classes="gl-mr-2"
|
||||||
|
:submodule="diffFile.submodule"
|
||||||
|
/>
|
||||||
<span v-if="isFileRenamed">
|
<span v-if="isFileRenamed">
|
||||||
<strong
|
<strong
|
||||||
v-gl-tooltip
|
v-gl-tooltip
|
||||||
|
|
|
@ -664,6 +664,7 @@ export const generateTreeList = files => {
|
||||||
addedLines: file.added_lines,
|
addedLines: file.added_lines,
|
||||||
removedLines: file.removed_lines,
|
removedLines: file.removed_lines,
|
||||||
parentPath: parent ? `${parent.path}/` : '/',
|
parentPath: parent ? `${parent.path}/` : '/',
|
||||||
|
submodule: file.submodule,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
Object.assign(entry, {
|
Object.assign(entry, {
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* Used in environments table.
|
* Used in environments table.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { GlTooltipDirective, GlButton } from '@gitlab/ui';
|
import { GlTooltipDirective, GlButton, GlModalDirective } from '@gitlab/ui';
|
||||||
import { s__ } from '~/locale';
|
import { s__ } from '~/locale';
|
||||||
import eventHub from '../event_hub';
|
import eventHub from '../event_hub';
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ export default {
|
||||||
},
|
},
|
||||||
directives: {
|
directives: {
|
||||||
GlTooltip: GlTooltipDirective,
|
GlTooltip: GlTooltipDirective,
|
||||||
|
GlModalDirective,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
environment: {
|
environment: {
|
||||||
|
@ -54,14 +55,13 @@ export default {
|
||||||
<template>
|
<template>
|
||||||
<gl-button
|
<gl-button
|
||||||
v-gl-tooltip="{ id: $options.stopEnvironmentTooltipId }"
|
v-gl-tooltip="{ id: $options.stopEnvironmentTooltipId }"
|
||||||
|
v-gl-modal-directive="'stop-environment-modal'"
|
||||||
:loading="isLoading"
|
:loading="isLoading"
|
||||||
:title="title"
|
:title="title"
|
||||||
:aria-label="title"
|
:aria-label="title"
|
||||||
icon="stop"
|
icon="stop"
|
||||||
category="primary"
|
category="primary"
|
||||||
variant="danger"
|
variant="danger"
|
||||||
data-toggle="modal"
|
|
||||||
data-target="#stop-environment-modal"
|
|
||||||
@click="onClick"
|
@click="onClick"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
<script>
|
<script>
|
||||||
/* eslint-disable @gitlab/vue-require-i18n-strings */
|
import { GlSprintf, GlTooltipDirective, GlModal } from '@gitlab/ui';
|
||||||
import { GlSprintf, GlTooltipDirective } from '@gitlab/ui';
|
|
||||||
import DeprecatedModal2 from '~/vue_shared/components/deprecated_modal_2.vue';
|
|
||||||
import eventHub from '../event_hub';
|
import eventHub from '../event_hub';
|
||||||
|
import { __, s__ } from '~/locale';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
id: 'stop-environment-modal',
|
id: 'stop-environment-modal',
|
||||||
name: 'StopEnvironmentModal',
|
name: 'StopEnvironmentModal',
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
GlModal: DeprecatedModal2,
|
GlModal,
|
||||||
GlSprintf,
|
GlSprintf,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -24,6 +23,20 @@ export default {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
primaryProps() {
|
||||||
|
return {
|
||||||
|
text: s__('Environments|Stop environment'),
|
||||||
|
attributes: [{ variant: 'danger' }],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
cancelProps() {
|
||||||
|
return {
|
||||||
|
text: __('Cancel'),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
eventHub.$emit('stopEnvironment', this.environment);
|
eventHub.$emit('stopEnvironment', this.environment);
|
||||||
|
@ -34,18 +47,23 @@ export default {
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<gl-modal
|
<gl-modal
|
||||||
:id="$options.id"
|
:modal-id="$options.id"
|
||||||
:footer-primary-button-text="s__('Environments|Stop environment')"
|
:action-primary="primaryProps"
|
||||||
footer-primary-button-variant="danger"
|
:action-cancel="cancelProps"
|
||||||
@submit="onSubmit"
|
@primary="onSubmit"
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #modal-title>
|
||||||
<h4 class="modal-title d-flex mw-100">
|
<gl-sprintf :message="s__('Environments|Stopping %{environmentName}')">
|
||||||
Stopping
|
<template #environmentName>
|
||||||
<span v-gl-tooltip :title="environment.name" class="text-truncate ml-1 mr-1 flex-fill">
|
<span
|
||||||
{{ environment.name }}?
|
v-gl-tooltip
|
||||||
</span>
|
:title="environment.name"
|
||||||
</h4>
|
class="gl-text-truncate gl-ml-2 gl-mr-2 gl-flex-fill"
|
||||||
|
>
|
||||||
|
{{ environment.name }}?
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</gl-sprintf>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<p>{{ s__('Environments|Are you sure you want to stop this environment?') }}</p>
|
<p>{{ s__('Environments|Are you sure you want to stop this environment?') }}</p>
|
||||||
|
|
|
@ -143,7 +143,7 @@ export default {
|
||||||
<div class="media-body">
|
<div class="media-body">
|
||||||
<div class="gl-ml-3 float-left">
|
<div class="gl-ml-3 float-left">
|
||||||
<span class="gl-font-weight-bold">
|
<span class="gl-font-weight-bold">
|
||||||
{{ __('This merge request is still a work in progress.') }}
|
{{ __('This merge request is still a draft.') }}
|
||||||
</span>
|
</span>
|
||||||
<span class="gl-display-block text-muted">{{
|
<span class="gl-display-block text-muted">{{
|
||||||
__("Draft merge requests can't be merged.")
|
__("Draft merge requests can't be merged.")
|
||||||
|
|
|
@ -153,6 +153,7 @@ export default {
|
||||||
:folder="isTree"
|
:folder="isTree"
|
||||||
:opened="file.opened"
|
:opened="file.opened"
|
||||||
:size="16"
|
:size="16"
|
||||||
|
:submodule="file.submodule"
|
||||||
/>
|
/>
|
||||||
<gl-truncate v-if="truncateMiddle" :text="file.name" position="middle" class="gl-pr-7" />
|
<gl-truncate v-if="truncateMiddle" :text="file.name" position="middle" class="gl-pr-7" />
|
||||||
<template v-else>{{ file.name }}</template>
|
<template v-else>{{ file.name }}</template>
|
||||||
|
|
|
@ -1823,6 +1823,10 @@ class Project < ApplicationRecord
|
||||||
ensure_pages_metadatum.update!(deployed: false, artifacts_archive: nil, pages_deployment: nil)
|
ensure_pages_metadatum.update!(deployed: false, artifacts_archive: nil, pages_deployment: nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_pages_deployment!(deployment)
|
||||||
|
ensure_pages_metadatum.update!(pages_deployment: deployment)
|
||||||
|
end
|
||||||
|
|
||||||
def write_repository_config(gl_full_path: full_path)
|
def write_repository_config(gl_full_path: full_path)
|
||||||
# We'd need to keep track of project full path otherwise directory tree
|
# We'd need to keep track of project full path otherwise directory tree
|
||||||
# created with hashed storage enabled cannot be usefully imported using
|
# created with hashed storage enabled cannot be usefully imported using
|
||||||
|
|
|
@ -138,7 +138,7 @@ module Projects
|
||||||
deployment = project.pages_deployments.create!(file: file,
|
deployment = project.pages_deployments.create!(file: file,
|
||||||
file_count: entries_count,
|
file_count: entries_count,
|
||||||
file_sha256: sha256)
|
file_sha256: sha256)
|
||||||
project.pages_metadatum.update!(pages_deployment: deployment)
|
project.update_pages_deployment!(deployment)
|
||||||
end
|
end
|
||||||
|
|
||||||
DestroyPagesDeploymentsWorker.perform_in(
|
DestroyPagesDeploymentsWorker.perform_in(
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Add a /draft alias to the /wip quick action
|
||||||
|
merge_request: 46277
|
||||||
|
author:
|
||||||
|
type: added
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Display submodules in MR tree and file header
|
||||||
|
merge_request: 46840
|
||||||
|
author:
|
||||||
|
type: fixed
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Add usage ping for web users of geo secondaries
|
||||||
|
merge_request: 46278
|
||||||
|
author:
|
||||||
|
type: added
|
|
@ -0,0 +1,18 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AddIndexToOauthAccessGrantsResourceOwnerId < ActiveRecord::Migration[6.0]
|
||||||
|
include Gitlab::Database::MigrationHelpers
|
||||||
|
|
||||||
|
DOWNTIME = false
|
||||||
|
INDEX_NAME = 'index_oauth_access_grants_on_resource_owner_id'
|
||||||
|
|
||||||
|
disable_ddl_transaction!
|
||||||
|
|
||||||
|
def up
|
||||||
|
add_concurrent_index :oauth_access_grants, %i[resource_owner_id application_id created_at], name: INDEX_NAME
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
remove_concurrent_index_by_name :oauth_access_grants, INDEX_NAME
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
c269a999cabce99d26f3be303656bbb27f2b843b639755b112ad350d4cb5b5c6
|
|
@ -21257,6 +21257,8 @@ CREATE INDEX index_notification_settings_on_user_id ON notification_settings USI
|
||||||
|
|
||||||
CREATE UNIQUE INDEX index_notifications_on_user_id_and_source_id_and_source_type ON notification_settings USING btree (user_id, source_id, source_type);
|
CREATE UNIQUE INDEX index_notifications_on_user_id_and_source_id_and_source_type ON notification_settings USING btree (user_id, source_id, source_type);
|
||||||
|
|
||||||
|
CREATE INDEX index_oauth_access_grants_on_resource_owner_id ON oauth_access_grants USING btree (resource_owner_id, application_id, created_at);
|
||||||
|
|
||||||
CREATE UNIQUE INDEX index_oauth_access_grants_on_token ON oauth_access_grants USING btree (token);
|
CREATE UNIQUE INDEX index_oauth_access_grants_on_token ON oauth_access_grants USING btree (token);
|
||||||
|
|
||||||
CREATE INDEX index_oauth_access_tokens_on_application_id ON oauth_access_tokens USING btree (application_id);
|
CREATE INDEX index_oauth_access_tokens_on_application_id ON oauth_access_tokens USING btree (application_id);
|
||||||
|
|
|
@ -25,12 +25,12 @@ No matter how you use GitLab, we have documentation for you.
|
||||||
|
|
||||||
| Essential documentation | Essential documentation |
|
| Essential documentation | Essential documentation |
|
||||||
|:-------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------|
|
|:-------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [**User Documentation**](user/index.md)<br/>Discover features and concepts for GitLab users. | [**Administrator documentation**](administration/index.md)<br/>Everything GitLab self-managed administrators need to know. |
|
| [**User documentation**](user/index.md)<br/>Discover features and concepts for GitLab users. | [**Administrator documentation**](administration/index.md)<br/>Everything GitLab self-managed administrators need to know. |
|
||||||
| [**Contributing to GitLab**](#contributing-to-gitlab)<br/>At GitLab, everyone can contribute! | [**New to Git and GitLab?**](#new-to-git-and-gitlab)<br/>We have the resources to get you started. |
|
| [**Contributing to GitLab**](#contributing-to-gitlab)<br/>At GitLab, everyone can contribute! | [**New to Git and GitLab?**](#new-to-git-and-gitlab)<br/>We have the resources to get you started. |
|
||||||
| [**Build an integration with GitLab?**](#build-an-integration-with-gitlab)<br/>Consult our automation and integration documentation. | [**Coming to GitLab from another platform?**](#coming-to-gitlab-from-another-platform)<br/>Consult our handy guides. |
|
| [**Build an integration with GitLab**](#build-an-integration-with-gitlab)<br/>Consult our automation and integration documentation. | [**Coming to GitLab from another platform?**](#coming-to-gitlab-from-another-platform)<br/>Consult our handy guides. |
|
||||||
| [**Install GitLab**](https://about.gitlab.com/install/)<br/>Installation options for different platforms. | [**Customers**](subscriptions/index.md)<br/>Information for new and existing customers. |
|
| [**Install GitLab**](https://about.gitlab.com/install/)<br/>Installation options for different platforms. | [**Customers**](subscriptions/index.md)<br/>Information for new and existing customers. |
|
||||||
| [**Update GitLab**](update/README.md)<br/>Update your GitLab self-managed instance to the latest version. | [**Reference Architectures**](administration/reference_architectures/index.md)<br/>GitLab's reference architectures |
|
| [**Update GitLab**](update/README.md)<br/>Update your GitLab self-managed instance to the latest version. | [**Reference Architectures**](administration/reference_architectures/index.md)<br/>GitLab's reference architectures |
|
||||||
| [**GitLab Releases**](https://about.gitlab.com/releases/)<br/>What's new in GitLab. | |
|
| [**GitLab releases**](https://about.gitlab.com/releases/)<br/>What's new in GitLab. | |
|
||||||
|
|
||||||
## Popular topics
|
## Popular topics
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ Have a look at some of our most popular topics:
|
||||||
| [Omnibus GitLab SSL configuration](https://docs.gitlab.com/omnibus/settings/ssl.html) **(CORE ONLY)** | SSL settings for Omnibus GitLab self-managed instances. |
|
| [Omnibus GitLab SSL configuration](https://docs.gitlab.com/omnibus/settings/ssl.html) **(CORE ONLY)** | SSL settings for Omnibus GitLab self-managed instances. |
|
||||||
| [GitLab.com settings](user/gitlab_com/index.md) | Settings used for GitLab.com. |
|
| [GitLab.com settings](user/gitlab_com/index.md) | Settings used for GitLab.com. |
|
||||||
|
|
||||||
## The entire DevOps Lifecycle
|
## The entire DevOps lifecycle
|
||||||
|
|
||||||
GitLab is the first single application for software development, security,
|
GitLab is the first single application for software development, security,
|
||||||
and operations that enables [Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/),
|
and operations that enables [Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/),
|
||||||
|
@ -96,7 +96,7 @@ The following documentation relates to the DevOps **Manage** stage:
|
||||||
|:--------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|:--------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [Authentication and<br/>Authorization](administration/auth/README.md) **(CORE ONLY)** | Supported authentication and authorization providers. |
|
| [Authentication and<br/>Authorization](administration/auth/README.md) **(CORE ONLY)** | Supported authentication and authorization providers. |
|
||||||
| [GitLab Value Stream Analytics](user/analytics/value_stream_analytics.md) | Measure the time it takes to go from an [idea to production](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#from-idea-to-production-with-gitlab) for each project you have. |
|
| [GitLab Value Stream Analytics](user/analytics/value_stream_analytics.md) | Measure the time it takes to go from an [idea to production](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#from-idea-to-production-with-gitlab) for each project you have. |
|
||||||
| [Instance-level Analytics](user/admin_area/analytics/index.md) | Discover statistics on how many GitLab features you use and user activity. |
|
| [Instance-level analytics](user/admin_area/analytics/index.md) | Discover statistics on how many GitLab features you use and user activity. |
|
||||||
|
|
||||||
<div align="right">
|
<div align="right">
|
||||||
<a type="button" class="btn btn-default" href="#overview">
|
<a type="button" class="btn btn-default" href="#overview">
|
||||||
|
@ -115,21 +115,21 @@ The following documentation relates to the DevOps **Plan** stage:
|
||||||
|
|
||||||
| Plan topics | Description |
|
| Plan topics | Description |
|
||||||
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------|
|
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [Burndown Charts](user/project/milestones/burndown_charts.md) **(STARTER)** | Watch your project's progress throughout a specific milestone. |
|
| [Burndown charts](user/project/milestones/burndown_charts.md) **(STARTER)** | Watch your project's progress throughout a specific milestone. |
|
||||||
| [Discussions](user/discussions/index.md) | Threads, comments, and resolvable threads in issues, commits, and merge requests. |
|
| [Discussions](user/discussions/index.md) | Threads, comments, and resolvable threads in issues, commits, and merge requests. |
|
||||||
| [Due Dates](user/project/issues/due_dates.md) | Keep track of issue deadlines. |
|
| [Due dates](user/project/issues/due_dates.md) | Keep track of issue deadlines. |
|
||||||
| [Epics](user/group/epics/index.md) **(ULTIMATE)** | Tracking groups of issues that share a theme. |
|
| [Epics](user/group/epics/index.md) **(ULTIMATE)** | Tracking groups of issues that share a theme. |
|
||||||
| [Issues](user/project/issues/index.md), including [confidential issues](user/project/issues/confidential_issues.md),<br/>[issue and merge request templates](user/project/description_templates.md),<br/>and [moving issues](user/project/issues/managing_issues.md#moving-issues) | Project issues and restricting access to issues as well as creating templates for submitting new issues and merge requests. Also, moving issues between projects. |
|
| [Issues](user/project/issues/index.md), including [confidential issues](user/project/issues/confidential_issues.md),<br/>[issue and merge request templates](user/project/description_templates.md),<br/>and [moving issues](user/project/issues/managing_issues.md#moving-issues) | Project issues and restricting access to issues as well as creating templates for submitting new issues and merge requests. Also, moving issues between projects. |
|
||||||
| [Labels](user/project/labels.md) | Categorize issues or merge requests with descriptive labels. |
|
| [Labels](user/project/labels.md) | Categorize issues or merge requests with descriptive labels. |
|
||||||
| [Milestones](user/project/milestones/index.md) | Set milestones for delivery of issues and merge requests, with optional due date. |
|
| [Milestones](user/project/milestones/index.md) | Set milestones for delivery of issues and merge requests, with optional due date. |
|
||||||
| [Project Issue Board](user/project/issue_board.md) | Display issues on a Scrum or Kanban board. |
|
| [Project Issue Board](user/project/issue_board.md) | Display issues on a Scrum or Kanban board. |
|
||||||
| [Quick Actions](user/project/quick_actions.md) | Shortcuts for common actions on issues or merge requests, replacing the need to click buttons or use dropdowns in GitLab's UI. |
|
| [Quick Actions](user/project/quick_actions.md) | Shortcuts for common actions on issues or merge requests, replacing the need to click buttons or use dropdowns in GitLab's UI. |
|
||||||
| [Related Issues](user/project/issues/related_issues.md) | Create a relationship between issues. |
|
| [Related issues](user/project/issues/related_issues.md) | Create a relationship between issues. |
|
||||||
| [Requirements Management](user/project/requirements/index.md) **(ULTIMATE)** | Check your products against a set of criteria. |
|
| [Requirements Management](user/project/requirements/index.md) **(ULTIMATE)** | Check your products against a set of criteria. |
|
||||||
| [Roadmap](user/group/roadmap/index.md) **(ULTIMATE)** | Visualize epic timelines. |
|
| [Roadmap](user/group/roadmap/index.md) **(ULTIMATE)** | Visualize epic timelines. |
|
||||||
| [Service Desk](user/project/service_desk.md) | A simple way to allow people to create issues in your GitLab instance without needing their own user account. |
|
| [Service Desk](user/project/service_desk.md) | A simple way to allow people to create issues in your GitLab instance without needing their own user account. |
|
||||||
| [Time Tracking](user/project/time_tracking.md) | Track time spent on issues and merge requests. |
|
| [Time Tracking](user/project/time_tracking.md) | Track time spent on issues and merge requests. |
|
||||||
| [To-Do List](user/todos.md) | Keep track of work requiring attention with a chronological list displayed on a simple dashboard. |
|
| [To-Do list](user/todos.md) | Keep track of work requiring attention with a chronological list displayed on a simple dashboard. |
|
||||||
|
|
||||||
<div align="right">
|
<div align="right">
|
||||||
<a type="button" class="btn btn-default" href="#overview">
|
<a type="button" class="btn btn-default" href="#overview">
|
||||||
|
@ -148,7 +148,7 @@ on projects and code.
|
||||||
|
|
||||||
The following documentation relates to the DevOps **Create** stage:
|
The following documentation relates to the DevOps **Create** stage:
|
||||||
|
|
||||||
#### Projects and Groups
|
#### Projects and groups
|
||||||
|
|
||||||
| Create topics - Projects and Groups | Description |
|
| Create topics - Projects and Groups | Description |
|
||||||
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------|
|
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------|
|
||||||
|
@ -159,8 +159,8 @@ The following documentation relates to the DevOps **Create** stage:
|
||||||
| [File locking](user/project/file_lock.md) **(PREMIUM)** | Lock files to avoid merge conflicts. |
|
| [File locking](user/project/file_lock.md) **(PREMIUM)** | Lock files to avoid merge conflicts. |
|
||||||
| [GitLab Pages](user/project/pages/index.md) | Build, test, and deploy your static website with GitLab Pages. |
|
| [GitLab Pages](user/project/pages/index.md) | Build, test, and deploy your static website with GitLab Pages. |
|
||||||
| [Groups](user/group/index.md) and [Subgroups](user/group/subgroups/index.md) | Organize your projects in groups. |
|
| [Groups](user/group/index.md) and [Subgroups](user/group/subgroups/index.md) | Organize your projects in groups. |
|
||||||
| [Issue Analytics](user/group/issues_analytics/index.md) **(PREMIUM)** | Check how many issues were created per month. |
|
| [Issue analytics](user/group/issues_analytics/index.md) **(PREMIUM)** | Check how many issues were created per month. |
|
||||||
| [Merge Request Analytics](user/analytics/merge_request_analytics.md) **(PREMIUM)** | Check your throughput productivity - how many merge requests were merged per month. |
|
| [Merge Request analytics](user/analytics/merge_request_analytics.md) **(PREMIUM)** | Check your throughput productivity - how many merge requests were merged per month. |
|
||||||
| [Projects](user/project/index.md), including [project access](public_access/public_access.md)<br/>and [settings](user/project/settings/index.md) | Host source code, and control your project's visibility and set configuration. |
|
| [Projects](user/project/index.md), including [project access](public_access/public_access.md)<br/>and [settings](user/project/settings/index.md) | Host source code, and control your project's visibility and set configuration. |
|
||||||
| [Search through GitLab](user/search/index.md) | Search for issues, merge requests, projects, groups, and to-dos. |
|
| [Search through GitLab](user/search/index.md) | Search for issues, merge requests, projects, groups, and to-dos. |
|
||||||
| [Snippets](user/snippets.md) | Snippets allow you to create little bits of code. |
|
| [Snippets](user/snippets.md) | Snippets allow you to create little bits of code. |
|
||||||
|
@ -197,7 +197,7 @@ The following documentation relates to the DevOps **Create** stage:
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
#### Merge Requests
|
#### Merge requests
|
||||||
|
|
||||||
| Create topics - Merge Requests | Description |
|
| Create topics - Merge Requests | Description |
|
||||||
|:--------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|
|
|:--------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
@ -205,7 +205,7 @@ The following documentation relates to the DevOps **Create** stage:
|
||||||
| [Cherry-picking](user/project/merge_requests/cherry_pick_changes.md) | Use GitLab for cherry-picking changes. |
|
| [Cherry-picking](user/project/merge_requests/cherry_pick_changes.md) | Use GitLab for cherry-picking changes. |
|
||||||
| [Merge request thread resolution](user/discussions/index.md#moving-a-single-thread-to-a-new-issue) | Resolve threads, move threads in a merge request to an issue, and only allow merge requests to be merged if all threads are resolved. |
|
| [Merge request thread resolution](user/discussions/index.md#moving-a-single-thread-to-a-new-issue) | Resolve threads, move threads in a merge request to an issue, and only allow merge requests to be merged if all threads are resolved. |
|
||||||
| [Merge requests](user/project/merge_requests/index.md) | Merge request management. |
|
| [Merge requests](user/project/merge_requests/index.md) | Merge request management. |
|
||||||
| [**Draft** merge requests](user/project/merge_requests/work_in_progress_merge_requests.md) | Prevent merges of draft merge requests. |
|
| [Draft merge requests](user/project/merge_requests/work_in_progress_merge_requests.md) | Prevent merges of draft merge requests. |
|
||||||
|
|
||||||
<div align="right">
|
<div align="right">
|
||||||
<a type="button" class="btn btn-default" href="#overview">
|
<a type="button" class="btn btn-default" href="#overview">
|
||||||
|
@ -219,7 +219,7 @@ The following documentation relates to the DevOps **Create** stage:
|
||||||
|:------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------|
|
|:------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------|
|
||||||
| [GitLab REST API](api/README.md) | Integrate with GitLab using our REST API. |
|
| [GitLab REST API](api/README.md) | Integrate with GitLab using our REST API. |
|
||||||
| [GitLab GraphQL API](api/graphql/index.md) | Integrate with GitLab using our GraphQL API. |
|
| [GitLab GraphQL API](api/graphql/index.md) | Integrate with GitLab using our GraphQL API. |
|
||||||
| [GitLab Integration](integration/README.md) | Integrate with multiple third-party services with GitLab to allow external issue trackers and external authentication. |
|
| [GitLab integrations](integration/README.md) | Integrate with multiple third-party services with GitLab to allow external issue trackers and external authentication. |
|
||||||
| [GitLab Webhooks](user/project/integrations/webhooks.md) | Let GitLab notify you when new code has been pushed to your project. |
|
| [GitLab Webhooks](user/project/integrations/webhooks.md) | Let GitLab notify you when new code has been pushed to your project. |
|
||||||
| [Jira Development Panel](integration/jira_development_panel.md) | See GitLab information in the Jira Development Panel. |
|
| [Jira Development Panel](integration/jira_development_panel.md) | See GitLab information in the Jira Development Panel. |
|
||||||
| [Integrations](user/project/integrations/overview.md) | Integrate a project with external services, such as CI and chat. |
|
| [Integrations](user/project/integrations/overview.md) | Integrate a project with external services, such as CI and chat. |
|
||||||
|
@ -249,7 +249,7 @@ The following documentation relates to the DevOps **Verify** stage:
|
||||||
| [GitLab CI/CD](ci/README.md) | Explore the features and capabilities of Continuous Integration with GitLab. |
|
| [GitLab CI/CD](ci/README.md) | Explore the features and capabilities of Continuous Integration with GitLab. |
|
||||||
| [Unit test reports](ci/unit_test_reports.md) | Display Unit test reports on merge requests. |
|
| [Unit test reports](ci/unit_test_reports.md) | Display Unit test reports on merge requests. |
|
||||||
| [Multi-project pipelines](ci/multi_project_pipelines.md) **(PREMIUM)** | Visualize entire pipelines that span multiple projects, including all cross-project inter-dependencies. |
|
| [Multi-project pipelines](ci/multi_project_pipelines.md) **(PREMIUM)** | Visualize entire pipelines that span multiple projects, including all cross-project inter-dependencies. |
|
||||||
| [Pipeline Graphs](ci/pipelines/index.md#visualize-pipelines) | Visualize builds. |
|
| [Pipeline graphs](ci/pipelines/index.md#visualize-pipelines) | Visualize builds. |
|
||||||
| [Review Apps](ci/review_apps/index.md) | Preview changes to your application right from a merge request. |
|
| [Review Apps](ci/review_apps/index.md) | Preview changes to your application right from a merge request. |
|
||||||
|
|
||||||
<div align="right">
|
<div align="right">
|
||||||
|
@ -319,8 +319,8 @@ The following documentation relates to the DevOps **Release** stage:
|
||||||
| [Environment-specific variables](ci/variables/README.md#limit-the-environment-scopes-of-environment-variables) | Limit the scope of variables to specific environments. |
|
| [Environment-specific variables](ci/variables/README.md#limit-the-environment-scopes-of-environment-variables) | Limit the scope of variables to specific environments. |
|
||||||
| [GitLab CI/CD](ci/README.md) | Explore the features and capabilities of Continuous Deployment and Delivery with GitLab. |
|
| [GitLab CI/CD](ci/README.md) | Explore the features and capabilities of Continuous Deployment and Delivery with GitLab. |
|
||||||
| [GitLab Pages](user/project/pages/index.md) | Build, test, and deploy a static site directly from GitLab. |
|
| [GitLab Pages](user/project/pages/index.md) | Build, test, and deploy a static site directly from GitLab. |
|
||||||
| [Protected Runners](ci/runners/README.md#prevent-runners-from-revealing-sensitive-information) | Select Runners to only pick jobs for protected branches and tags. |
|
| [Protected runners](ci/runners/README.md#prevent-runners-from-revealing-sensitive-information) | Select Runners to only pick jobs for protected branches and tags. |
|
||||||
| [Scheduled Pipelines](ci/pipelines/schedules.md) | Execute pipelines on a schedule. |
|
| [Schedule pipelines](ci/pipelines/schedules.md) | Execute pipelines on a schedule. |
|
||||||
|
|
||||||
<div align="right">
|
<div align="right">
|
||||||
<a type="button" class="btn btn-default" href="#overview">
|
<a type="button" class="btn btn-default" href="#overview">
|
||||||
|
@ -342,9 +342,9 @@ The following documentation relates to the DevOps **Configure** stage:
|
||||||
| [Create Kubernetes clusters](user/project/clusters/add_remove_clusters.md#create-new-cluster) | Use Kubernetes and GitLab. |
|
| [Create Kubernetes clusters](user/project/clusters/add_remove_clusters.md#create-new-cluster) | Use Kubernetes and GitLab. |
|
||||||
| [Executable Runbooks](user/project/clusters/runbooks/index.md) | Documented procedures that explain how to carry out particular processes. |
|
| [Executable Runbooks](user/project/clusters/runbooks/index.md) | Documented procedures that explain how to carry out particular processes. |
|
||||||
| [GitLab ChatOps](ci/chatops/README.md) | Interact with CI/CD jobs through chat services. |
|
| [GitLab ChatOps](ci/chatops/README.md) | Interact with CI/CD jobs through chat services. |
|
||||||
| [Installing Applications](user/project/clusters/index.md#installing-applications) | Install Helm charts such as Ingress and Prometheus on Kubernetes. |
|
| [Installing applications](user/project/clusters/index.md#installing-applications) | Install Helm charts such as Ingress and Prometheus on Kubernetes. |
|
||||||
| [Mattermost slash commands](user/project/integrations/mattermost_slash_commands.md) | Enable and use slash commands from within Mattermost. |
|
| [Mattermost slash commands](user/project/integrations/mattermost_slash_commands.md) | Enable and use slash commands from within Mattermost. |
|
||||||
| [Multiple Kubernetes Clusters](user/project/clusters/index.md#multiple-kubernetes-clusters) | Associate more than one Kubernetes clusters to your project. |
|
| [Multiple Kubernetes clusters](user/project/clusters/index.md#multiple-kubernetes-clusters) | Associate more than one Kubernetes clusters to your project. |
|
||||||
| [Protected variables](ci/variables/README.md#protect-a-custom-variable) | Restrict variables to protected branches and tags. |
|
| [Protected variables](ci/variables/README.md#protect-a-custom-variable) | Restrict variables to protected branches and tags. |
|
||||||
| [Serverless](user/project/clusters/serverless/index.md) | Run serverless workloads on Kubernetes. |
|
| [Serverless](user/project/clusters/serverless/index.md) | Run serverless workloads on Kubernetes. |
|
||||||
| [Slack slash commands](user/project/integrations/slack_slash_commands.md) | Enable and use slash commands from within Slack. |
|
| [Slack slash commands](user/project/integrations/slack_slash_commands.md) | Enable and use slash commands from within Slack. |
|
||||||
|
@ -394,8 +394,8 @@ The following documentation relates to the DevOps **Defend** stage:
|
||||||
| Defend topics | Description |
|
| Defend topics | Description |
|
||||||
|:------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------|
|
|:------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------|
|
||||||
| [Web Application Firewall with ModSecurity](user/compliance/compliance_dashboard/index.md) | Filter, monitor, and block HTTP traffic to and from a web application. |
|
| [Web Application Firewall with ModSecurity](user/compliance/compliance_dashboard/index.md) | Filter, monitor, and block HTTP traffic to and from a web application. |
|
||||||
| [Container Host Security](user/clusters/applications.md#install-falco-using-gitlab-cicd) | Detect and respond to security threats at the Kubernetes, network, and host level. |
|
| [Container host security](user/clusters/applications.md#install-falco-using-gitlab-cicd) | Detect and respond to security threats at the Kubernetes, network, and host level. |
|
||||||
| [Container Network Security](user/clusters/applications.md#install-cilium-using-gitlab-cicd) | Detect and block unauthorized network traffic between pods and to/from the internet.|
|
| [Container network security](user/clusters/applications.md#install-cilium-using-gitlab-cicd) | Detect and block unauthorized network traffic between pods and to/from the internet.|
|
||||||
|
|
||||||
## New to Git and GitLab?
|
## New to Git and GitLab?
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
stage: none
|
stage: none
|
||||||
group: unassigned
|
group: unassigned
|
||||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
|
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers"
|
||||||
description: 'Learn how to install, configure, update, and maintain your GitLab instance.'
|
description: 'Learn how to install, configure, update, and maintain your GitLab instance.'
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -411,6 +411,8 @@ job B:
|
||||||
- cat vendor/hello.txt
|
- cat vendor/hello.txt
|
||||||
cache:
|
cache:
|
||||||
key: build-cache
|
key: build-cache
|
||||||
|
paths:
|
||||||
|
- vendor/
|
||||||
```
|
```
|
||||||
|
|
||||||
Here's what happens behind the scenes:
|
Here's what happens behind the scenes:
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
description: "Internal users documentation."
|
||||||
|
type: concepts, reference, dev
|
||||||
|
stage: none
|
||||||
|
group: Development
|
||||||
|
info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Internal users
|
||||||
|
|
||||||
|
GitLab uses internal users (sometimes referred to as "bots") to perform
|
||||||
|
actions or functions that cannot be attributed to a regular user.
|
||||||
|
|
||||||
|
These users are created programatically throughout the codebase itself when
|
||||||
|
necessary, and do not count towards a license limit.
|
||||||
|
|
||||||
|
They are used when a traditional user account would not be applicable, for
|
||||||
|
example when generating alerts or automatic review feedback.
|
||||||
|
|
||||||
|
Technically, an internal user is a type of user, but they have reduced access
|
||||||
|
and a very specific purpose. They cannot be used for regular user actions,
|
||||||
|
such as authentication or API requests.
|
||||||
|
|
||||||
|
They have email addresses and names which can be attributed to any actions
|
||||||
|
they perform.
|
||||||
|
|
||||||
|
For example, when we [migrated](https://gitlab.com/gitlab-org/gitlab/-/issues/216120)
|
||||||
|
GitLab Snippets to [Versioned Snippets](../user/snippets.md#versioned-snippets)
|
||||||
|
in GitLab 13.0, we used an internal user to attribute the authorship of
|
||||||
|
snippets to itself when a snippet's author wasn't available for creating
|
||||||
|
repository commits, such as when the user has been disabled, so the Migration
|
||||||
|
Bot was used instead.
|
||||||
|
|
||||||
|
For this bot:
|
||||||
|
|
||||||
|
- The name was set to `GitLab Migration Bot`.
|
||||||
|
- The email was set to `noreply+gitlab-migration-bot@{instance host}`.
|
||||||
|
|
||||||
|
Other examples of internal users:
|
||||||
|
|
||||||
|
- [Alert Bot](../operations/metrics/alerts.md#trigger-actions-from-alerts)
|
||||||
|
- [Ghost User](../user/profile/account/delete_account.md#associated-records)
|
||||||
|
- [Support Bot](../user/project/service_desk.md#support-bot-user)
|
||||||
|
- Visual Review Bot
|
|
@ -72,6 +72,17 @@ With GitLab Enterprise Edition, you can also:
|
||||||
|
|
||||||
You can also [integrate](project/integrations/overview.md) GitLab with numerous third-party applications, such as Mattermost, Microsoft Teams, HipChat, Trello, Slack, Bamboo CI, Jira, and a lot more.
|
You can also [integrate](project/integrations/overview.md) GitLab with numerous third-party applications, such as Mattermost, Microsoft Teams, HipChat, Trello, Slack, Bamboo CI, Jira, and a lot more.
|
||||||
|
|
||||||
|
## User types
|
||||||
|
|
||||||
|
There are several types of users in GitLab:
|
||||||
|
|
||||||
|
- Regular users and GitLab.com users. <!-- Note: further description TBA -->
|
||||||
|
- [Groups](group/index.md) of users.
|
||||||
|
- GitLab [admin area](admin_area/index.md) user.
|
||||||
|
- [GitLab Administrator](../administration/index.md) with full access to
|
||||||
|
self-managed instances' features and settings.
|
||||||
|
- [Internal users](../development/internal_users.md).
|
||||||
|
|
||||||
## Projects
|
## Projects
|
||||||
|
|
||||||
In GitLab, you can create [projects](project/index.md) to host
|
In GitLab, you can create [projects](project/index.md) to host
|
||||||
|
|
|
@ -27,7 +27,7 @@ There are several ways to flag a merge request as a Draft:
|
||||||
description will have the same effect.
|
description will have the same effect.
|
||||||
- **Deprecated** Add `[WIP]` or `WIP:` to the start of the merge request's title.
|
- **Deprecated** Add `[WIP]` or `WIP:` to the start of the merge request's title.
|
||||||
**WIP** still works but was deprecated in favor of **Draft**. It will be removed in the next major version (GitLab 14.0).
|
**WIP** still works but was deprecated in favor of **Draft**. It will be removed in the next major version (GitLab 14.0).
|
||||||
- Add the `/wip` [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
|
- Add the `/draft` (or `/wip`) [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
|
||||||
in a comment in the merge request. This is a toggle, and can be repeated
|
in a comment in the merge request. This is a toggle, and can be repeated
|
||||||
to change the status back. Note that any other text in the comment will be discarded.
|
to change the status back. Note that any other text in the comment will be discarded.
|
||||||
- Add `draft:`, `Draft:`, `fixup!`, or `Fixup!` to the beginning of a commit message targeting the
|
- Add `draft:`, `Draft:`, `fixup!`, or `Fixup!` to the beginning of a commit message targeting the
|
||||||
|
@ -43,7 +43,7 @@ Similar to above, when a Merge Request is ready to be merged, you can remove the
|
||||||
- Remove `[Draft]`, `Draft:` or `(Draft)` from the start of the merge request's title. Clicking on
|
- Remove `[Draft]`, `Draft:` or `(Draft)` from the start of the merge request's title. Clicking on
|
||||||
**Remove the Draft: prefix from the title**, under the title box, when editing the merge
|
**Remove the Draft: prefix from the title**, under the title box, when editing the merge
|
||||||
request's description, will have the same effect.
|
request's description, will have the same effect.
|
||||||
- Add the `/wip` [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
|
- Add the `/draft` (or `/wip`) [quick action](../quick_actions.md#quick-actions-for-issues-merge-requests-and-epics)
|
||||||
in a comment in the merge request. This is a toggle, and can be repeated
|
in a comment in the merge request. This is a toggle, and can be repeated
|
||||||
to change the status back. Note that any other text in the comment will be discarded.
|
to change the status back. Note that any other text in the comment will be discarded.
|
||||||
- Click on the **Resolve Draft status** button near the bottom of the merge request description,
|
- Click on the **Resolve Draft status** button near the bottom of the merge request description,
|
||||||
|
|
|
@ -40,6 +40,7 @@ The following quick actions are applicable to descriptions, discussions and thre
|
||||||
| `/copy_metadata <#issue>` | ✓ | ✓ | | Copy labels and milestone from another issue in the project. |
|
| `/copy_metadata <#issue>` | ✓ | ✓ | | Copy labels and milestone from another issue in the project. |
|
||||||
| `/create_merge_request <branch name>` | ✓ | | | Create a new merge request starting from the current issue. |
|
| `/create_merge_request <branch name>` | ✓ | | | Create a new merge request starting from the current issue. |
|
||||||
| `/done` | ✓ | ✓ | ✓ | Mark to do as done. |
|
| `/done` | ✓ | ✓ | ✓ | Mark to do as done. |
|
||||||
|
| `/draft` | | ✓ | | Toggle the draft status. |
|
||||||
| `/due <date>` | ✓ | | | Set due date. Examples of valid `<date>` include `in 2 days`, `this Friday` and `December 31st`. |
|
| `/due <date>` | ✓ | | | Set due date. Examples of valid `<date>` include `in 2 days`, `this Friday` and `December 31st`. |
|
||||||
| `/duplicate <#issue>` | ✓ | | | Close this issue and mark as a duplicate of another issue. **(CORE)** Also, mark both as related. **(STARTER)** |
|
| `/duplicate <#issue>` | ✓ | | | Close this issue and mark as a duplicate of another issue. **(CORE)** Also, mark both as related. **(STARTER)** |
|
||||||
| `/epic <epic>` | ✓ | | | Add to epic `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic. **(PREMIUM)** |
|
| `/epic <epic>` | ✓ | | | Add to epic `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic. **(PREMIUM)** |
|
||||||
|
@ -82,7 +83,7 @@ The following quick actions are applicable to descriptions, discussions and thre
|
||||||
| `/unlock` | ✓ | ✓ | | Unlock the discussions. |
|
| `/unlock` | ✓ | ✓ | | Unlock the discussions. |
|
||||||
| `/unsubscribe` | ✓ | ✓ | ✓ | Unsubscribe from notifications. |
|
| `/unsubscribe` | ✓ | ✓ | ✓ | Unsubscribe from notifications. |
|
||||||
| `/weight <value>` | ✓ | | | Set weight. Valid options for `<value>` include `0`, `1`, `2`, and so on. **(STARTER)** |
|
| `/weight <value>` | ✓ | | | Set weight. Valid options for `<value>` include `0`, `1`, `2`, and so on. **(STARTER)** |
|
||||||
| `/wip` | | ✓ | | Toggle the Work In Progress status. |
|
| `/wip` | | ✓ | | Toggle the draft status. |
|
||||||
| `/zoom <Zoom URL>` | ✓ | | | Add Zoom meeting to this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
|
| `/zoom <Zoom URL>` | ✓ | | | Add Zoom meeting to this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). |
|
||||||
|
|
||||||
## Autocomplete characters
|
## Autocomplete characters
|
||||||
|
|
|
@ -20,6 +20,7 @@ module Atlassian
|
||||||
commits: commits,
|
commits: commits,
|
||||||
branches: branches,
|
branches: branches,
|
||||||
merge_requests: merge_requests,
|
merge_requests: merge_requests,
|
||||||
|
user_notes_count: user_notes_count(merge_requests),
|
||||||
update_sequence_id: update_sequence_id
|
update_sequence_id: update_sequence_id
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
@ -37,6 +38,14 @@ module Atlassian
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def user_notes_count(merge_requests)
|
||||||
|
return unless merge_requests
|
||||||
|
|
||||||
|
Note.count_for_collection(merge_requests.map(&:id), 'MergeRequest').map do |count_group|
|
||||||
|
[count_group.noteable_id, count_group.count]
|
||||||
|
end.to_h
|
||||||
|
end
|
||||||
|
|
||||||
def jwt_token(http_method, uri)
|
def jwt_token(http_method, uri)
|
||||||
claims = Atlassian::Jwt.build_claims(
|
claims = Atlassian::Jwt.build_claims(
|
||||||
Atlassian::JiraConnect.app_key,
|
Atlassian::JiraConnect.app_key,
|
||||||
|
|
|
@ -20,7 +20,13 @@ module Atlassian
|
||||||
end
|
end
|
||||||
expose :title
|
expose :title
|
||||||
expose :author, using: JiraConnect::Serializers::AuthorEntity
|
expose :author, using: JiraConnect::Serializers::AuthorEntity
|
||||||
expose :user_notes_count, as: :commentCount
|
expose :commentCount do |mr|
|
||||||
|
if options[:user_notes_count]
|
||||||
|
options[:user_notes_count].fetch(mr.id, 0)
|
||||||
|
else
|
||||||
|
mr.user_notes_count
|
||||||
|
end
|
||||||
|
end
|
||||||
expose :source_branch, as: :sourceBranch
|
expose :source_branch, as: :sourceBranch
|
||||||
expose :target_branch, as: :destinationBranch
|
expose :target_branch, as: :destinationBranch
|
||||||
expose :lastUpdate do |mr|
|
expose :lastUpdate do |mr|
|
||||||
|
|
|
@ -21,7 +21,11 @@ module Atlassian
|
||||||
JiraConnect::Serializers::BranchEntity.represent options[:branches], project: project, update_sequence_id: options[:update_sequence_id]
|
JiraConnect::Serializers::BranchEntity.represent options[:branches], project: project, update_sequence_id: options[:update_sequence_id]
|
||||||
end
|
end
|
||||||
expose :pullRequests do |project, options|
|
expose :pullRequests do |project, options|
|
||||||
JiraConnect::Serializers::PullRequestEntity.represent options[:merge_requests], project: project, update_sequence_id: options[:update_sequence_id]
|
JiraConnect::Serializers::PullRequestEntity.represent(
|
||||||
|
options[:merge_requests],
|
||||||
|
update_sequence_id: options[:update_sequence_id],
|
||||||
|
user_notes_count: options[:user_notes_count]
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -56,21 +56,21 @@ module Gitlab
|
||||||
@updates[:merge] = params[:merge_request_diff_head_sha]
|
@updates[:merge] = params[:merge_request_diff_head_sha]
|
||||||
end
|
end
|
||||||
|
|
||||||
desc 'Toggle the Work In Progress status'
|
desc 'Toggle the Draft status'
|
||||||
explanation do
|
explanation do
|
||||||
noun = quick_action_target.to_ability_name.humanize(capitalize: false)
|
noun = quick_action_target.to_ability_name.humanize(capitalize: false)
|
||||||
if quick_action_target.work_in_progress?
|
if quick_action_target.work_in_progress?
|
||||||
_("Unmarks this %{noun} as Work In Progress.")
|
_("Unmarks this %{noun} as a draft.")
|
||||||
else
|
else
|
||||||
_("Marks this %{noun} as Work In Progress.")
|
_("Marks this %{noun} as a draft.")
|
||||||
end % { noun: noun }
|
end % { noun: noun }
|
||||||
end
|
end
|
||||||
execution_message do
|
execution_message do
|
||||||
noun = quick_action_target.to_ability_name.humanize(capitalize: false)
|
noun = quick_action_target.to_ability_name.humanize(capitalize: false)
|
||||||
if quick_action_target.work_in_progress?
|
if quick_action_target.work_in_progress?
|
||||||
_("Unmarked this %{noun} as Work In Progress.")
|
_("Unmarked this %{noun} as a draft.")
|
||||||
else
|
else
|
||||||
_("Marked this %{noun} as Work In Progress.")
|
_("Marked this %{noun} as a draft.")
|
||||||
end % { noun: noun }
|
end % { noun: noun }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ module Gitlab
|
||||||
# Allow it to mark as WIP on MR creation page _or_ through MR notes.
|
# Allow it to mark as WIP on MR creation page _or_ through MR notes.
|
||||||
(quick_action_target.new_record? || current_user.can?(:"update_#{quick_action_target.to_ability_name}", quick_action_target))
|
(quick_action_target.new_record? || current_user.can?(:"update_#{quick_action_target.to_ability_name}", quick_action_target))
|
||||||
end
|
end
|
||||||
command :wip do
|
command :draft, :wip do
|
||||||
@updates[:wip_event] = quick_action_target.work_in_progress? ? 'unwip' : 'wip'
|
@updates[:wip_event] = quick_action_target.work_in_progress? ? 'unwip' : 'wip'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -527,6 +527,7 @@ module Gitlab
|
||||||
key => {
|
key => {
|
||||||
configure: usage_activity_by_stage_configure(time_period),
|
configure: usage_activity_by_stage_configure(time_period),
|
||||||
create: usage_activity_by_stage_create(time_period),
|
create: usage_activity_by_stage_create(time_period),
|
||||||
|
enablement: usage_activity_by_stage_enablement(time_period),
|
||||||
manage: usage_activity_by_stage_manage(time_period),
|
manage: usage_activity_by_stage_manage(time_period),
|
||||||
monitor: usage_activity_by_stage_monitor(time_period),
|
monitor: usage_activity_by_stage_monitor(time_period),
|
||||||
package: usage_activity_by_stage_package(time_period),
|
package: usage_activity_by_stage_package(time_period),
|
||||||
|
@ -582,6 +583,11 @@ module Gitlab
|
||||||
end
|
end
|
||||||
# rubocop: enable CodeReuse/ActiveRecord
|
# rubocop: enable CodeReuse/ActiveRecord
|
||||||
|
|
||||||
|
# Empty placeholder allows this to match the pattern used by other sections
|
||||||
|
def usage_activity_by_stage_enablement(time_period)
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
|
||||||
# Omitted because no user, creator or author associated: `campaigns_imported_from_github`, `ldap_group_links`
|
# Omitted because no user, creator or author associated: `campaigns_imported_from_github`, `ldap_group_links`
|
||||||
# rubocop: disable CodeReuse/ActiveRecord
|
# rubocop: disable CodeReuse/ActiveRecord
|
||||||
def usage_activity_by_stage_manage(time_period)
|
def usage_activity_by_stage_manage(time_period)
|
||||||
|
|
|
@ -10451,6 +10451,9 @@ msgstr ""
|
||||||
msgid "Environments|Stopping"
|
msgid "Environments|Stopping"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Environments|Stopping %{environmentName}"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Environments|There was an error fetching the logs. Please try again."
|
msgid "Environments|There was an error fetching the logs. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -16305,7 +16308,7 @@ msgstr ""
|
||||||
msgid "Marked For Deletion At - %{deletion_time}"
|
msgid "Marked For Deletion At - %{deletion_time}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Marked this %{noun} as Work In Progress."
|
msgid "Marked this %{noun} as a draft."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Marked this issue as a duplicate of %{duplicate_param}."
|
msgid "Marked this issue as a duplicate of %{duplicate_param}."
|
||||||
|
@ -16317,7 +16320,7 @@ msgstr ""
|
||||||
msgid "Marked to do as done."
|
msgid "Marked to do as done."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Marks this %{noun} as Work In Progress."
|
msgid "Marks this %{noun} as a draft."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
|
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
|
||||||
|
@ -27514,7 +27517,7 @@ msgstr ""
|
||||||
msgid "This merge request is locked."
|
msgid "This merge request is locked."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "This merge request is still a work in progress."
|
msgid "This merge request is still a draft."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "This merge request was merged. To apply this suggestion, edit this file directly."
|
msgid "This merge request was merged. To apply this suggestion, edit this file directly."
|
||||||
|
@ -28694,10 +28697,10 @@ msgstr ""
|
||||||
msgid "Unlocks the discussion."
|
msgid "Unlocks the discussion."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Unmarked this %{noun} as Work In Progress."
|
msgid "Unmarked this %{noun} as a draft."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Unmarks this %{noun} as Work In Progress."
|
msgid "Unmarks this %{noun} as a draft."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Unreachable"
|
msgid "Unreachable"
|
||||||
|
|
|
@ -50,3 +50,4 @@ UsageData/DistinctCountByLargeForeignKey:
|
||||||
- 'owner_id'
|
- 'owner_id'
|
||||||
- 'project_id'
|
- 'project_id'
|
||||||
- 'user_id'
|
- 'user_id'
|
||||||
|
- 'resource_owner_id'
|
||||||
|
|
|
@ -33,7 +33,7 @@ RSpec.describe 'Merge request > User resolves Work in Progress', :js do
|
||||||
|
|
||||||
it 'retains merge request data after clicking Resolve WIP status' do
|
it 'retains merge request data after clicking Resolve WIP status' do
|
||||||
expect(page.find('.ci-widget-content')).to have_content("Pipeline ##{pipeline.id}")
|
expect(page.find('.ci-widget-content')).to have_content("Pipeline ##{pipeline.id}")
|
||||||
expect(page).to have_content "This merge request is still a work in progress."
|
expect(page).to have_content "This merge request is still a draft."
|
||||||
|
|
||||||
page.within('.mr-state-widget') do
|
page.within('.mr-state-widget') do
|
||||||
click_button('Mark as ready')
|
click_button('Mark as ready')
|
||||||
|
@ -45,7 +45,7 @@ RSpec.describe 'Merge request > User resolves Work in Progress', :js do
|
||||||
# merge request widget refreshes, which masks missing elements
|
# merge request widget refreshes, which masks missing elements
|
||||||
# that should already be present.
|
# that should already be present.
|
||||||
expect(page.find('.ci-widget-content', wait: 0)).to have_content("Pipeline ##{pipeline.id}")
|
expect(page.find('.ci-widget-content', wait: 0)).to have_content("Pipeline ##{pipeline.id}")
|
||||||
expect(page).not_to have_content('This merge request is still a work in progress.')
|
expect(page).not_to have_content('This merge request is still a draft.')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { mockTracking, triggerEvent } from 'helpers/tracking_helper';
|
||||||
|
|
||||||
import DiffFileHeader from '~/diffs/components/diff_file_header.vue';
|
import DiffFileHeader from '~/diffs/components/diff_file_header.vue';
|
||||||
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
|
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
|
||||||
|
import FileIcon from '~/vue_shared/components/file_icon.vue';
|
||||||
import diffDiscussionsMockData from '../mock_data/diff_discussions';
|
import diffDiscussionsMockData from '../mock_data/diff_discussions';
|
||||||
import { truncateSha } from '~/lib/utils/text_utility';
|
import { truncateSha } from '~/lib/utils/text_utility';
|
||||||
import { diffViewerModes } from '~/ide/constants';
|
import { diffViewerModes } from '~/ide/constants';
|
||||||
|
@ -207,6 +208,14 @@ describe('DiffFileHeader component', () => {
|
||||||
});
|
});
|
||||||
expect(findFileActions().exists()).toBe(false);
|
expect(findFileActions().exists()).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('renders submodule icon', () => {
|
||||||
|
createComponent({
|
||||||
|
diffFile: submoduleDiffFile,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(wrapper.find(FileIcon).props('submodule')).toBe(true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('for any file', () => {
|
describe('for any file', () => {
|
||||||
|
|
|
@ -84,7 +84,7 @@ describe('Wip', () => {
|
||||||
|
|
||||||
it('should have correct elements', () => {
|
it('should have correct elements', () => {
|
||||||
expect(el.classList.contains('mr-widget-body')).toBeTruthy();
|
expect(el.classList.contains('mr-widget-body')).toBeTruthy();
|
||||||
expect(el.innerText).toContain('This merge request is still a work in progress.');
|
expect(el.innerText).toContain('This merge request is still a draft.');
|
||||||
expect(el.querySelector('button').getAttribute('disabled')).toBeTruthy();
|
expect(el.querySelector('button').getAttribute('disabled')).toBeTruthy();
|
||||||
expect(el.querySelector('button').innerText).toContain('Merge');
|
expect(el.querySelector('button').innerText).toContain('Merge');
|
||||||
expect(el.querySelector('.js-remove-wip').innerText.replace(/\s\s+/g, ' ')).toContain(
|
expect(el.querySelector('.js-remove-wip').innerText.replace(/\s\s+/g, ' ')).toContain(
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { shallowMount } from '@vue/test-utils';
|
||||||
import { nextTick } from 'vue';
|
import { nextTick } from 'vue';
|
||||||
import FileRow from '~/vue_shared/components/file_row.vue';
|
import FileRow from '~/vue_shared/components/file_row.vue';
|
||||||
import FileHeader from '~/vue_shared/components/file_row_header.vue';
|
import FileHeader from '~/vue_shared/components/file_row_header.vue';
|
||||||
|
import FileIcon from '~/vue_shared/components/file_icon.vue';
|
||||||
import { escapeFileUrl } from '~/lib/utils/url_utility';
|
import { escapeFileUrl } from '~/lib/utils/url_utility';
|
||||||
|
|
||||||
describe('File row component', () => {
|
describe('File row component', () => {
|
||||||
|
@ -151,4 +152,18 @@ describe('File row component', () => {
|
||||||
|
|
||||||
expect(wrapper.find('.file-row-name').classes()).toContain('font-weight-bold');
|
expect(wrapper.find('.file-row-name').classes()).toContain('font-weight-bold');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('renders submodule icon', () => {
|
||||||
|
const submodule = true;
|
||||||
|
|
||||||
|
createComponent({
|
||||||
|
file: {
|
||||||
|
...file(),
|
||||||
|
submodule,
|
||||||
|
},
|
||||||
|
level: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(wrapper.find(FileIcon).props('submodule')).toBe(submodule);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -20,8 +20,11 @@ RSpec.describe Atlassian::JiraConnect::Client do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#store_dev_info' do
|
describe '#store_dev_info' do
|
||||||
it "calls the API with auth headers" do
|
let_it_be(:project) { create_default(:project, :repository) }
|
||||||
expected_jwt = Atlassian::Jwt.encode(
|
let_it_be(:merge_requests) { create_list(:merge_request, 2, :unique_branches) }
|
||||||
|
|
||||||
|
let(:expected_jwt) do
|
||||||
|
Atlassian::Jwt.encode(
|
||||||
Atlassian::Jwt.build_claims(
|
Atlassian::Jwt.build_claims(
|
||||||
Atlassian::JiraConnect.app_key,
|
Atlassian::JiraConnect.app_key,
|
||||||
'/rest/devinfo/0.10/bulk',
|
'/rest/devinfo/0.10/bulk',
|
||||||
|
@ -29,7 +32,9 @@ RSpec.describe Atlassian::JiraConnect::Client do
|
||||||
),
|
),
|
||||||
'sample_secret'
|
'sample_secret'
|
||||||
)
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
stub_full_request('https://gitlab-test.atlassian.net/rest/devinfo/0.10/bulk', method: :post)
|
stub_full_request('https://gitlab-test.atlassian.net/rest/devinfo/0.10/bulk', method: :post)
|
||||||
.with(
|
.with(
|
||||||
headers: {
|
headers: {
|
||||||
|
@ -37,8 +42,18 @@ RSpec.describe Atlassian::JiraConnect::Client do
|
||||||
'Content-Type' => 'application/json'
|
'Content-Type' => 'application/json'
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
end
|
||||||
|
|
||||||
subject.store_dev_info(project: create(:project))
|
it "calls the API with auth headers" do
|
||||||
|
subject.store_dev_info(project: project)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'avoids N+1 database queries' do
|
||||||
|
control_count = ActiveRecord::QueryRecorder.new { subject.store_dev_info(project: project, merge_requests: merge_requests) }.count
|
||||||
|
|
||||||
|
merge_requests << create(:merge_request, :unique_branches)
|
||||||
|
|
||||||
|
expect { subject.store_dev_info(project: project, merge_requests: merge_requests) }.not_to exceed_query_limit(control_count)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
RSpec.describe Atlassian::JiraConnect::Serializers::PullRequestEntity do
|
||||||
|
let_it_be(:project) { create_default(:project, :repository) }
|
||||||
|
let_it_be(:merge_requests) { create_list(:merge_request, 2, :unique_branches) }
|
||||||
|
let_it_be(:notes) { create_list(:note, 2, system: false, noteable: merge_requests.first) }
|
||||||
|
|
||||||
|
subject { described_class.represent(merge_requests).as_json }
|
||||||
|
|
||||||
|
it 'exposes commentCount' do
|
||||||
|
expect(subject.first[:commentCount]).to eq(2)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with user_notes_count option' do
|
||||||
|
let(:user_notes_count) { merge_requests.map { |merge_request| [merge_request.id, 1] }.to_h }
|
||||||
|
|
||||||
|
subject { described_class.represent(merge_requests, user_notes_count: user_notes_count).as_json }
|
||||||
|
|
||||||
|
it 'avoids N+1 database queries' do
|
||||||
|
control_count = ActiveRecord::QueryRecorder.new do
|
||||||
|
described_class.represent(merge_requests, user_notes_count: user_notes_count)
|
||||||
|
end.count
|
||||||
|
|
||||||
|
merge_requests << create(:merge_request, :unique_branches)
|
||||||
|
|
||||||
|
expect { subject }.not_to exceed_query_limit(control_count)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'uses counts from user_notes_count' do
|
||||||
|
expect(subject.map { |entity| entity[:commentCount] }).to match_array([1, 1, 1])
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when count is missing for some MRs' do
|
||||||
|
let(:user_notes_count) { [[merge_requests.last.id, 1]].to_h }
|
||||||
|
|
||||||
|
it 'uses 0 as default when count for the MR is not available' do
|
||||||
|
expect(subject.map { |entity| entity[:commentCount] }).to match_array([0, 0, 1])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -5927,6 +5927,26 @@ RSpec.describe Project, factory_default: :keep do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#update_pages_deployment!' do
|
||||||
|
let(:project) { create(:project) }
|
||||||
|
let(:deployment) { create(:pages_deployment, project: project) }
|
||||||
|
|
||||||
|
it "creates new metadata record if none exists yet and sets deployment" do
|
||||||
|
project.pages_metadatum.destroy!
|
||||||
|
project.reload
|
||||||
|
|
||||||
|
project.update_pages_deployment!(deployment)
|
||||||
|
|
||||||
|
expect(project.pages_metadatum.pages_deployment).to eq(deployment)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "updates the existing metadara record with deployment" do
|
||||||
|
expect do
|
||||||
|
project.update_pages_deployment!(deployment)
|
||||||
|
end.to change { project.pages_metadatum.reload.pages_deployment }.from(nil).to(deployment)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#has_pool_repsitory?' do
|
describe '#has_pool_repsitory?' do
|
||||||
it 'returns false when it does not have a pool repository' do
|
it 'returns false when it does not have a pool repository' do
|
||||||
subject = create(:project, :repository)
|
subject = create(:project, :repository)
|
||||||
|
|
|
@ -3,9 +3,9 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
RSpec.describe Ci::AppendBuildTraceService do
|
RSpec.describe Ci::AppendBuildTraceService do
|
||||||
let(:project) { create(:project) }
|
let_it_be(:project) { create(:project) }
|
||||||
let(:pipeline) { create(:ci_pipeline, project: project) }
|
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
|
||||||
let(:build) { create(:ci_build, :running, pipeline: pipeline) }
|
let_it_be(:build) { create(:ci_build, :running, pipeline: pipeline) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
stub_feature_flags(ci_enable_live_trace: true)
|
stub_feature_flags(ci_enable_live_trace: true)
|
||||||
|
|
|
@ -71,6 +71,17 @@ RSpec.describe Projects::UpdatePagesService do
|
||||||
expect(project.pages_metadatum.reload.pages_deployment_id).to eq(deployment.id)
|
expect(project.pages_metadatum.reload.pages_deployment_id).to eq(deployment.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'does not fail if pages_metadata is absent' do
|
||||||
|
project.pages_metadatum.destroy!
|
||||||
|
project.reload
|
||||||
|
|
||||||
|
expect do
|
||||||
|
expect(execute).to eq(:success)
|
||||||
|
end.to change { project.pages_deployments.count }.by(1)
|
||||||
|
|
||||||
|
expect(project.pages_metadatum.reload.pages_deployment).to eq(project.pages_deployments.last)
|
||||||
|
end
|
||||||
|
|
||||||
context 'when there is an old pages deployment' do
|
context 'when there is an old pages deployment' do
|
||||||
let!(:old_deployment_from_another_project) { create(:pages_deployment) }
|
let!(:old_deployment_from_another_project) { create(:pages_deployment) }
|
||||||
let!(:old_deployment) { create(:pages_deployment, project: project) }
|
let!(:old_deployment) { create(:pages_deployment, project: project) }
|
||||||
|
|
|
@ -312,8 +312,8 @@ RSpec.describe QuickActions::InterpretService do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples 'wip command' do
|
shared_examples 'draft command' do
|
||||||
it 'returns wip_event: "wip" if content contains /wip' do
|
it 'returns wip_event: "wip" if content contains /draft' do
|
||||||
_, updates, _ = service.execute(content, issuable)
|
_, updates, _ = service.execute(content, issuable)
|
||||||
|
|
||||||
expect(updates).to eq(wip_event: 'wip')
|
expect(updates).to eq(wip_event: 'wip')
|
||||||
|
@ -322,12 +322,12 @@ RSpec.describe QuickActions::InterpretService do
|
||||||
it 'returns the wip message' do
|
it 'returns the wip message' do
|
||||||
_, _, message = service.execute(content, issuable)
|
_, _, message = service.execute(content, issuable)
|
||||||
|
|
||||||
expect(message).to eq("Marked this #{issuable.to_ability_name.humanize(capitalize: false)} as Work In Progress.")
|
expect(message).to eq("Marked this #{issuable.to_ability_name.humanize(capitalize: false)} as a draft.")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples 'unwip command' do
|
shared_examples 'undraft command' do
|
||||||
it 'returns wip_event: "unwip" if content contains /wip' do
|
it 'returns wip_event: "unwip" if content contains /draft' do
|
||||||
issuable.update!(title: issuable.wip_title)
|
issuable.update!(title: issuable.wip_title)
|
||||||
_, updates, _ = service.execute(content, issuable)
|
_, updates, _ = service.execute(content, issuable)
|
||||||
|
|
||||||
|
@ -338,7 +338,7 @@ RSpec.describe QuickActions::InterpretService do
|
||||||
issuable.update!(title: issuable.wip_title)
|
issuable.update!(title: issuable.wip_title)
|
||||||
_, _, message = service.execute(content, issuable)
|
_, _, message = service.execute(content, issuable)
|
||||||
|
|
||||||
expect(message).to eq("Unmarked this #{issuable.to_ability_name.humanize(capitalize: false)} as Work In Progress.")
|
expect(message).to eq("Unmarked this #{issuable.to_ability_name.humanize(capitalize: false)} as a draft.")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1026,16 +1026,26 @@ RSpec.describe QuickActions::InterpretService do
|
||||||
let(:issuable) { issue }
|
let(:issuable) { issue }
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like 'wip command' do
|
it_behaves_like 'draft command' do
|
||||||
let(:content) { '/wip' }
|
let(:content) { '/wip' }
|
||||||
let(:issuable) { merge_request }
|
let(:issuable) { merge_request }
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like 'unwip command' do
|
it_behaves_like 'undraft command' do
|
||||||
let(:content) { '/wip' }
|
let(:content) { '/wip' }
|
||||||
let(:issuable) { merge_request }
|
let(:issuable) { merge_request }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'draft command' do
|
||||||
|
let(:content) { '/draft' }
|
||||||
|
let(:issuable) { merge_request }
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'undraft command' do
|
||||||
|
let(:content) { '/draft' }
|
||||||
|
let(:issuable) { merge_request }
|
||||||
|
end
|
||||||
|
|
||||||
it_behaves_like 'empty command' do
|
it_behaves_like 'empty command' do
|
||||||
let(:content) { '/remove_due_date' }
|
let(:content) { '/remove_due_date' }
|
||||||
let(:issuable) { merge_request }
|
let(:issuable) { merge_request }
|
||||||
|
@ -1896,13 +1906,13 @@ RSpec.describe QuickActions::InterpretService do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'wip command' do
|
describe 'draft command' do
|
||||||
let(:content) { '/wip' }
|
let(:content) { '/draft' }
|
||||||
|
|
||||||
it 'includes the new status' do
|
it 'includes the new status' do
|
||||||
_, explanations = service.explain(content, merge_request)
|
_, explanations = service.explain(content, merge_request)
|
||||||
|
|
||||||
expect(explanations).to eq(['Marks this merge request as Work In Progress.'])
|
expect(explanations).to eq(['Marks this merge request as a draft.'])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue