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"
|
||||
@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">
|
||||
<strong
|
||||
v-gl-tooltip
|
||||
|
|
|
@ -664,6 +664,7 @@ export const generateTreeList = files => {
|
|||
addedLines: file.added_lines,
|
||||
removedLines: file.removed_lines,
|
||||
parentPath: parent ? `${parent.path}/` : '/',
|
||||
submodule: file.submodule,
|
||||
});
|
||||
} else {
|
||||
Object.assign(entry, {
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* Used in environments table.
|
||||
*/
|
||||
|
||||
import { GlTooltipDirective, GlButton } from '@gitlab/ui';
|
||||
import { GlTooltipDirective, GlButton, GlModalDirective } from '@gitlab/ui';
|
||||
import { s__ } from '~/locale';
|
||||
import eventHub from '../event_hub';
|
||||
|
||||
|
@ -14,6 +14,7 @@ export default {
|
|||
},
|
||||
directives: {
|
||||
GlTooltip: GlTooltipDirective,
|
||||
GlModalDirective,
|
||||
},
|
||||
props: {
|
||||
environment: {
|
||||
|
@ -54,14 +55,13 @@ export default {
|
|||
<template>
|
||||
<gl-button
|
||||
v-gl-tooltip="{ id: $options.stopEnvironmentTooltipId }"
|
||||
v-gl-modal-directive="'stop-environment-modal'"
|
||||
:loading="isLoading"
|
||||
:title="title"
|
||||
:aria-label="title"
|
||||
icon="stop"
|
||||
category="primary"
|
||||
variant="danger"
|
||||
data-toggle="modal"
|
||||
data-target="#stop-environment-modal"
|
||||
@click="onClick"
|
||||
/>
|
||||
</template>
|
||||
|
|
|
@ -1,15 +1,14 @@
|
|||
<script>
|
||||
/* eslint-disable @gitlab/vue-require-i18n-strings */
|
||||
import { GlSprintf, GlTooltipDirective } from '@gitlab/ui';
|
||||
import DeprecatedModal2 from '~/vue_shared/components/deprecated_modal_2.vue';
|
||||
import { GlSprintf, GlTooltipDirective, GlModal } from '@gitlab/ui';
|
||||
import eventHub from '../event_hub';
|
||||
import { __, s__ } from '~/locale';
|
||||
|
||||
export default {
|
||||
id: 'stop-environment-modal',
|
||||
name: 'StopEnvironmentModal',
|
||||
|
||||
components: {
|
||||
GlModal: DeprecatedModal2,
|
||||
GlModal,
|
||||
GlSprintf,
|
||||
},
|
||||
|
||||
|
@ -24,6 +23,20 @@ export default {
|
|||
},
|
||||
},
|
||||
|
||||
computed: {
|
||||
primaryProps() {
|
||||
return {
|
||||
text: s__('Environments|Stop environment'),
|
||||
attributes: [{ variant: 'danger' }],
|
||||
};
|
||||
},
|
||||
cancelProps() {
|
||||
return {
|
||||
text: __('Cancel'),
|
||||
};
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
onSubmit() {
|
||||
eventHub.$emit('stopEnvironment', this.environment);
|
||||
|
@ -34,18 +47,23 @@ export default {
|
|||
|
||||
<template>
|
||||
<gl-modal
|
||||
:id="$options.id"
|
||||
:footer-primary-button-text="s__('Environments|Stop environment')"
|
||||
footer-primary-button-variant="danger"
|
||||
@submit="onSubmit"
|
||||
:modal-id="$options.id"
|
||||
:action-primary="primaryProps"
|
||||
:action-cancel="cancelProps"
|
||||
@primary="onSubmit"
|
||||
>
|
||||
<template #header>
|
||||
<h4 class="modal-title d-flex mw-100">
|
||||
Stopping
|
||||
<span v-gl-tooltip :title="environment.name" class="text-truncate ml-1 mr-1 flex-fill">
|
||||
{{ environment.name }}?
|
||||
</span>
|
||||
</h4>
|
||||
<template #modal-title>
|
||||
<gl-sprintf :message="s__('Environments|Stopping %{environmentName}')">
|
||||
<template #environmentName>
|
||||
<span
|
||||
v-gl-tooltip
|
||||
:title="environment.name"
|
||||
class="gl-text-truncate gl-ml-2 gl-mr-2 gl-flex-fill"
|
||||
>
|
||||
{{ environment.name }}?
|
||||
</span>
|
||||
</template>
|
||||
</gl-sprintf>
|
||||
</template>
|
||||
|
||||
<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="gl-ml-3 float-left">
|
||||
<span class="gl-font-weight-bold">
|
||||
{{ __('This merge request is still a work in progress.') }}
|
||||
{{ __('This merge request is still a draft.') }}
|
||||
</span>
|
||||
<span class="gl-display-block text-muted">{{
|
||||
__("Draft merge requests can't be merged.")
|
||||
|
|
|
@ -153,6 +153,7 @@ export default {
|
|||
:folder="isTree"
|
||||
:opened="file.opened"
|
||||
:size="16"
|
||||
:submodule="file.submodule"
|
||||
/>
|
||||
<gl-truncate v-if="truncateMiddle" :text="file.name" position="middle" class="gl-pr-7" />
|
||||
<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)
|
||||
end
|
||||
|
||||
def update_pages_deployment!(deployment)
|
||||
ensure_pages_metadatum.update!(pages_deployment: deployment)
|
||||
end
|
||||
|
||||
def write_repository_config(gl_full_path: full_path)
|
||||
# We'd need to keep track of project full path otherwise directory tree
|
||||
# created with hashed storage enabled cannot be usefully imported using
|
||||
|
|
|
@ -138,7 +138,7 @@ module Projects
|
|||
deployment = project.pages_deployments.create!(file: file,
|
||||
file_count: entries_count,
|
||||
file_sha256: sha256)
|
||||
project.pages_metadatum.update!(pages_deployment: deployment)
|
||||
project.update_pages_deployment!(deployment)
|
||||
end
|
||||
|
||||
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 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 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 |
|
||||
|:-------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------|
|
||||
| [**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. |
|
||||
| [**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. |
|
||||
| [**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
|
||||
|
||||
|
@ -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. |
|
||||
| [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,
|
||||
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. |
|
||||
| [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">
|
||||
<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 |
|
||||
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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">
|
||||
<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:
|
||||
|
||||
#### Projects and Groups
|
||||
#### Projects and groups
|
||||
|
||||
| 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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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>
|
||||
</div>
|
||||
|
||||
#### Merge Requests
|
||||
#### Merge requests
|
||||
|
||||
| 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. |
|
||||
| [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. |
|
||||
| [**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">
|
||||
<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 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. |
|
||||
| [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. |
|
||||
|
@ -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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
|
||||
<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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [Protected runners](ci/runners/README.md#prevent-runners-from-revealing-sensitive-information) | Select Runners to only pick jobs for protected branches and tags. |
|
||||
| [Schedule pipelines](ci/pipelines/schedules.md) | Execute pipelines on a schedule. |
|
||||
|
||||
<div align="right">
|
||||
<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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
| [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. |
|
||||
|
@ -394,8 +394,8 @@ The following documentation relates to the DevOps **Defend** stage:
|
|||
| 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. |
|
||||
| [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 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.|
|
||||
|
||||
## New to Git and GitLab?
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
stage: none
|
||||
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.'
|
||||
---
|
||||
|
||||
|
|
|
@ -411,6 +411,8 @@ job B:
|
|||
- cat vendor/hello.txt
|
||||
cache:
|
||||
key: build-cache
|
||||
paths:
|
||||
- vendor/
|
||||
```
|
||||
|
||||
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.
|
||||
|
||||
## 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
|
||||
|
||||
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.
|
||||
- **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).
|
||||
- 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
|
||||
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
|
||||
|
@ -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 the Draft: prefix from the title**, under the title box, when editing the merge
|
||||
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
|
||||
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,
|
||||
|
|
|
@ -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. |
|
||||
| `/create_merge_request <branch name>` | ✓ | | | Create a new merge request starting from the current issue. |
|
||||
| `/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`. |
|
||||
| `/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)** |
|
||||
|
@ -82,7 +83,7 @@ The following quick actions are applicable to descriptions, discussions and thre
|
|||
| `/unlock` | ✓ | ✓ | | Unlock the discussions. |
|
||||
| `/unsubscribe` | ✓ | ✓ | ✓ | Unsubscribe from notifications. |
|
||||
| `/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)). |
|
||||
|
||||
## Autocomplete characters
|
||||
|
|
|
@ -20,6 +20,7 @@ module Atlassian
|
|||
commits: commits,
|
||||
branches: branches,
|
||||
merge_requests: merge_requests,
|
||||
user_notes_count: user_notes_count(merge_requests),
|
||||
update_sequence_id: update_sequence_id
|
||||
)
|
||||
]
|
||||
|
@ -37,6 +38,14 @@ module Atlassian
|
|||
|
||||
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)
|
||||
claims = Atlassian::Jwt.build_claims(
|
||||
Atlassian::JiraConnect.app_key,
|
||||
|
|
|
@ -20,7 +20,13 @@ module Atlassian
|
|||
end
|
||||
expose :title
|
||||
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 :target_branch, as: :destinationBranch
|
||||
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]
|
||||
end
|
||||
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
|
||||
|
|
|
@ -56,21 +56,21 @@ module Gitlab
|
|||
@updates[:merge] = params[:merge_request_diff_head_sha]
|
||||
end
|
||||
|
||||
desc 'Toggle the Work In Progress status'
|
||||
desc 'Toggle the Draft status'
|
||||
explanation do
|
||||
noun = quick_action_target.to_ability_name.humanize(capitalize: false)
|
||||
if quick_action_target.work_in_progress?
|
||||
_("Unmarks this %{noun} as Work In Progress.")
|
||||
_("Unmarks this %{noun} as a draft.")
|
||||
else
|
||||
_("Marks this %{noun} as Work In Progress.")
|
||||
_("Marks this %{noun} as a draft.")
|
||||
end % { noun: noun }
|
||||
end
|
||||
execution_message do
|
||||
noun = quick_action_target.to_ability_name.humanize(capitalize: false)
|
||||
if quick_action_target.work_in_progress?
|
||||
_("Unmarked this %{noun} as Work In Progress.")
|
||||
_("Unmarked this %{noun} as a draft.")
|
||||
else
|
||||
_("Marked this %{noun} as Work In Progress.")
|
||||
_("Marked this %{noun} as a draft.")
|
||||
end % { noun: noun }
|
||||
end
|
||||
|
||||
|
@ -80,7 +80,7 @@ module Gitlab
|
|||
# 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))
|
||||
end
|
||||
command :wip do
|
||||
command :draft, :wip do
|
||||
@updates[:wip_event] = quick_action_target.work_in_progress? ? 'unwip' : 'wip'
|
||||
end
|
||||
|
||||
|
|
|
@ -527,6 +527,7 @@ module Gitlab
|
|||
key => {
|
||||
configure: usage_activity_by_stage_configure(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),
|
||||
monitor: usage_activity_by_stage_monitor(time_period),
|
||||
package: usage_activity_by_stage_package(time_period),
|
||||
|
@ -582,6 +583,11 @@ module Gitlab
|
|||
end
|
||||
# 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`
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def usage_activity_by_stage_manage(time_period)
|
||||
|
|
|
@ -10451,6 +10451,9 @@ msgstr ""
|
|||
msgid "Environments|Stopping"
|
||||
msgstr ""
|
||||
|
||||
msgid "Environments|Stopping %{environmentName}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Environments|There was an error fetching the logs. Please try again."
|
||||
msgstr ""
|
||||
|
||||
|
@ -16305,7 +16308,7 @@ msgstr ""
|
|||
msgid "Marked For Deletion At - %{deletion_time}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Marked this %{noun} as Work In Progress."
|
||||
msgid "Marked this %{noun} as a draft."
|
||||
msgstr ""
|
||||
|
||||
msgid "Marked this issue as a duplicate of %{duplicate_param}."
|
||||
|
@ -16317,7 +16320,7 @@ msgstr ""
|
|||
msgid "Marked to do as done."
|
||||
msgstr ""
|
||||
|
||||
msgid "Marks this %{noun} as Work In Progress."
|
||||
msgid "Marks this %{noun} as a draft."
|
||||
msgstr ""
|
||||
|
||||
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
|
||||
|
@ -27514,7 +27517,7 @@ msgstr ""
|
|||
msgid "This merge request is locked."
|
||||
msgstr ""
|
||||
|
||||
msgid "This merge request is still a work in progress."
|
||||
msgid "This merge request is still a draft."
|
||||
msgstr ""
|
||||
|
||||
msgid "This merge request was merged. To apply this suggestion, edit this file directly."
|
||||
|
@ -28694,10 +28697,10 @@ msgstr ""
|
|||
msgid "Unlocks the discussion."
|
||||
msgstr ""
|
||||
|
||||
msgid "Unmarked this %{noun} as Work In Progress."
|
||||
msgid "Unmarked this %{noun} as a draft."
|
||||
msgstr ""
|
||||
|
||||
msgid "Unmarks this %{noun} as Work In Progress."
|
||||
msgid "Unmarks this %{noun} as a draft."
|
||||
msgstr ""
|
||||
|
||||
msgid "Unreachable"
|
||||
|
|
|
@ -50,3 +50,4 @@ UsageData/DistinctCountByLargeForeignKey:
|
|||
- 'owner_id'
|
||||
- 'project_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
|
||||
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
|
||||
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
|
||||
# that should already be present.
|
||||
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
|
||||
|
|
|
@ -6,6 +6,7 @@ import { mockTracking, triggerEvent } from 'helpers/tracking_helper';
|
|||
|
||||
import DiffFileHeader from '~/diffs/components/diff_file_header.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 { truncateSha } from '~/lib/utils/text_utility';
|
||||
import { diffViewerModes } from '~/ide/constants';
|
||||
|
@ -207,6 +208,14 @@ describe('DiffFileHeader component', () => {
|
|||
});
|
||||
expect(findFileActions().exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('renders submodule icon', () => {
|
||||
createComponent({
|
||||
diffFile: submoduleDiffFile,
|
||||
});
|
||||
|
||||
expect(wrapper.find(FileIcon).props('submodule')).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('for any file', () => {
|
||||
|
|
|
@ -84,7 +84,7 @@ describe('Wip', () => {
|
|||
|
||||
it('should have correct elements', () => {
|
||||
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').innerText).toContain('Merge');
|
||||
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 FileRow from '~/vue_shared/components/file_row.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';
|
||||
|
||||
describe('File row component', () => {
|
||||
|
@ -151,4 +152,18 @@ describe('File row component', () => {
|
|||
|
||||
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
|
||||
|
||||
describe '#store_dev_info' do
|
||||
it "calls the API with auth headers" do
|
||||
expected_jwt = Atlassian::Jwt.encode(
|
||||
let_it_be(:project) { create_default(:project, :repository) }
|
||||
let_it_be(:merge_requests) { create_list(:merge_request, 2, :unique_branches) }
|
||||
|
||||
let(:expected_jwt) do
|
||||
Atlassian::Jwt.encode(
|
||||
Atlassian::Jwt.build_claims(
|
||||
Atlassian::JiraConnect.app_key,
|
||||
'/rest/devinfo/0.10/bulk',
|
||||
|
@ -29,7 +32,9 @@ RSpec.describe Atlassian::JiraConnect::Client do
|
|||
),
|
||||
'sample_secret'
|
||||
)
|
||||
end
|
||||
|
||||
before do
|
||||
stub_full_request('https://gitlab-test.atlassian.net/rest/devinfo/0.10/bulk', method: :post)
|
||||
.with(
|
||||
headers: {
|
||||
|
@ -37,8 +42,18 @@ RSpec.describe Atlassian::JiraConnect::Client do
|
|||
'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
|
||||
|
|
|
@ -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
|
||||
|
||||
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
|
||||
it 'returns false when it does not have a pool repository' do
|
||||
subject = create(:project, :repository)
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Ci::AppendBuildTraceService do
|
||||
let(:project) { create(:project) }
|
||||
let(:pipeline) { create(:ci_pipeline, project: project) }
|
||||
let(:build) { create(:ci_build, :running, pipeline: pipeline) }
|
||||
let_it_be(:project) { create(:project) }
|
||||
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
|
||||
let_it_be(:build) { create(:ci_build, :running, pipeline: pipeline) }
|
||||
|
||||
before do
|
||||
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)
|
||||
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
|
||||
let!(:old_deployment_from_another_project) { create(:pages_deployment) }
|
||||
let!(:old_deployment) { create(:pages_deployment, project: project) }
|
||||
|
|
|
@ -312,8 +312,8 @@ RSpec.describe QuickActions::InterpretService do
|
|||
end
|
||||
end
|
||||
|
||||
shared_examples 'wip command' do
|
||||
it 'returns wip_event: "wip" if content contains /wip' do
|
||||
shared_examples 'draft command' do
|
||||
it 'returns wip_event: "wip" if content contains /draft' do
|
||||
_, updates, _ = service.execute(content, issuable)
|
||||
|
||||
expect(updates).to eq(wip_event: 'wip')
|
||||
|
@ -322,12 +322,12 @@ RSpec.describe QuickActions::InterpretService do
|
|||
it 'returns the wip message' do
|
||||
_, _, 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
|
||||
|
||||
shared_examples 'unwip command' do
|
||||
it 'returns wip_event: "unwip" if content contains /wip' do
|
||||
shared_examples 'undraft command' do
|
||||
it 'returns wip_event: "unwip" if content contains /draft' do
|
||||
issuable.update!(title: issuable.wip_title)
|
||||
_, updates, _ = service.execute(content, issuable)
|
||||
|
||||
|
@ -338,7 +338,7 @@ RSpec.describe QuickActions::InterpretService do
|
|||
issuable.update!(title: issuable.wip_title)
|
||||
_, _, 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
|
||||
|
||||
|
@ -1026,16 +1026,26 @@ RSpec.describe QuickActions::InterpretService do
|
|||
let(:issuable) { issue }
|
||||
end
|
||||
|
||||
it_behaves_like 'wip command' do
|
||||
it_behaves_like 'draft command' do
|
||||
let(:content) { '/wip' }
|
||||
let(:issuable) { merge_request }
|
||||
end
|
||||
|
||||
it_behaves_like 'unwip command' do
|
||||
it_behaves_like 'undraft command' do
|
||||
let(:content) { '/wip' }
|
||||
let(:issuable) { merge_request }
|
||||
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
|
||||
let(:content) { '/remove_due_date' }
|
||||
let(:issuable) { merge_request }
|
||||
|
@ -1896,13 +1906,13 @@ RSpec.describe QuickActions::InterpretService do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'wip command' do
|
||||
let(:content) { '/wip' }
|
||||
describe 'draft command' do
|
||||
let(:content) { '/draft' }
|
||||
|
||||
it 'includes the new status' do
|
||||
_, 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
|
||||
|
||||
|
|
Loading…
Reference in New Issue