Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2021-09-29 15:11:47 +00:00
parent 5f8d4d631d
commit cee701c964
48 changed files with 141 additions and 675 deletions

View File

@ -1,53 +1,5 @@
import { s__ } from '~/locale'; import { s__ } from '~/locale';
export const TrackingLabels = {
CODE_INSTRUCTION: 'code_instruction',
CONAN_INSTALLATION: 'conan_installation',
MAVEN_INSTALLATION: 'maven_installation',
NPM_INSTALLATION: 'npm_installation',
NUGET_INSTALLATION: 'nuget_installation',
PYPI_INSTALLATION: 'pypi_installation',
COMPOSER_INSTALLATION: 'composer_installation',
};
export const TrackingActions = {
INSTALLATION: 'installation',
REGISTRY_SETUP: 'registry_setup',
COPY_CONAN_COMMAND: 'copy_conan_command',
COPY_CONAN_SETUP_COMMAND: 'copy_conan_setup_command',
COPY_MAVEN_XML: 'copy_maven_xml',
COPY_MAVEN_COMMAND: 'copy_maven_command',
COPY_MAVEN_SETUP: 'copy_maven_setup_xml',
COPY_NPM_INSTALL_COMMAND: 'copy_npm_install_command',
COPY_NPM_SETUP_COMMAND: 'copy_npm_setup_command',
COPY_YARN_INSTALL_COMMAND: 'copy_yarn_install_command',
COPY_YARN_SETUP_COMMAND: 'copy_yarn_setup_command',
COPY_NUGET_INSTALL_COMMAND: 'copy_nuget_install_command',
COPY_NUGET_SETUP_COMMAND: 'copy_nuget_setup_command',
COPY_PIP_INSTALL_COMMAND: 'copy_pip_install_command',
COPY_PYPI_SETUP_COMMAND: 'copy_pypi_setup_command',
COPY_COMPOSER_REGISTRY_INCLUDE_COMMAND: 'copy_composer_registry_include_command',
COPY_COMPOSER_PACKAGE_INCLUDE_COMMAND: 'copy_composer_package_include_command',
COPY_GRADLE_INSTALL_COMMAND: 'copy_gradle_install_command',
COPY_GRADLE_ADD_TO_SOURCE_COMMAND: 'copy_gradle_add_to_source_command',
COPY_KOTLIN_INSTALL_COMMAND: 'copy_kotlin_install_command',
COPY_KOTLIN_ADD_TO_SOURCE_COMMAND: 'copy_kotlin_add_to_source_command',
};
export const NpmManager = {
NPM: 'npm',
YARN: 'yarn',
};
export const FETCH_PACKAGE_VERSIONS_ERROR = s__( export const FETCH_PACKAGE_VERSIONS_ERROR = s__(
'PackageRegistry|Unable to fetch package version information.', 'PackageRegistry|Unable to fetch package version information.',
); );

View File

@ -1,140 +1,3 @@
import { PackageType } from '../../shared/constants';
import { getPackageTypeLabel } from '../../shared/utils';
import { NpmManager } from '../constants';
export const packagePipeline = ({ packageEntity }) => { export const packagePipeline = ({ packageEntity }) => {
return packageEntity?.pipeline || null; return packageEntity?.pipeline || null;
}; };
export const packageTypeDisplay = ({ packageEntity }) => {
return getPackageTypeLabel(packageEntity.package_type);
};
export const packageIcon = ({ packageEntity }) => {
if (packageEntity.package_type === PackageType.NUGET) {
return packageEntity.nuget_metadatum?.icon_url || null;
}
return null;
};
export const conanInstallationCommand = ({ packageEntity }) => {
// eslint-disable-next-line @gitlab/require-i18n-strings
return `conan install ${packageEntity.name} --remote=gitlab`;
};
export const conanSetupCommand = ({ conanPath }) =>
// eslint-disable-next-line @gitlab/require-i18n-strings
`conan remote add gitlab ${conanPath}`;
export const mavenInstallationXml = ({ packageEntity = {} }) => {
const {
app_group: appGroup = '',
app_name: appName = '',
app_version: appVersion = '',
} = packageEntity.maven_metadatum;
return `<dependency>
<groupId>${appGroup}</groupId>
<artifactId>${appName}</artifactId>
<version>${appVersion}</version>
</dependency>`;
};
export const mavenInstallationCommand = ({ packageEntity = {} }) => {
const {
app_group: group = '',
app_name: name = '',
app_version: version = '',
} = packageEntity.maven_metadatum;
return `mvn dependency:get -Dartifact=${group}:${name}:${version}`;
};
export const mavenSetupXml = ({ mavenPath }) => `<repositories>
<repository>
<id>gitlab-maven</id>
<url>${mavenPath}</url>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>gitlab-maven</id>
<url>${mavenPath}</url>
</repository>
<snapshotRepository>
<id>gitlab-maven</id>
<url>${mavenPath}</url>
</snapshotRepository>
</distributionManagement>`;
export const npmInstallationCommand = ({ packageEntity }) => (type = NpmManager.NPM) => {
// eslint-disable-next-line @gitlab/require-i18n-strings
const instruction = type === NpmManager.NPM ? 'npm i' : 'yarn add';
return `${instruction} ${packageEntity.name}`;
};
export const npmSetupCommand = ({ packageEntity, npmPath }) => (type = NpmManager.NPM) => {
const scope = packageEntity.name.substring(0, packageEntity.name.indexOf('/'));
if (type === NpmManager.NPM) {
return `echo ${scope}:registry=${npmPath}/ >> .npmrc`;
}
return `echo \\"${scope}:registry\\" \\"${npmPath}/\\" >> .yarnrc`;
};
export const nugetInstallationCommand = ({ packageEntity }) =>
`nuget install ${packageEntity.name} -Source "GitLab"`;
export const nugetSetupCommand = ({ nugetPath }) =>
`nuget source Add -Name "GitLab" -Source "${nugetPath}" -UserName <your_username> -Password <your_token>`;
export const pypiPipCommand = ({ pypiPath, packageEntity }) =>
// eslint-disable-next-line @gitlab/require-i18n-strings
`pip install ${packageEntity.name} --extra-index-url ${pypiPath}`;
export const pypiSetupCommand = ({ pypiSetupPath }) => `[gitlab]
repository = ${pypiSetupPath}
username = __token__
password = <your personal access token>`;
export const composerRegistryInclude = ({ composerPath, composerConfigRepositoryName }) =>
// eslint-disable-next-line @gitlab/require-i18n-strings
`composer config repositories.${composerConfigRepositoryName} '{"type": "composer", "url": "${composerPath}"}'`;
export const composerPackageInclude = ({ packageEntity }) =>
// eslint-disable-next-line @gitlab/require-i18n-strings
`composer req ${[packageEntity.name]}:${packageEntity.version}`;
export const gradleGroovyInstalCommand = ({ packageEntity }) => {
const {
app_group: group = '',
app_name: name = '',
app_version: version = '',
} = packageEntity.maven_metadatum;
// eslint-disable-next-line @gitlab/require-i18n-strings
return `implementation '${group}:${name}:${version}'`;
};
export const gradleGroovyAddSourceCommand = ({ mavenPath }) =>
// eslint-disable-next-line @gitlab/require-i18n-strings
`maven {
url '${mavenPath}'
}`;
export const gradleKotlinInstalCommand = ({ packageEntity }) => {
const {
app_group: group = '',
app_name: name = '',
app_version: version = '',
} = packageEntity.maven_metadatum;
return `implementation("${group}:${name}:${version}")`;
};
export const gradleKotlinAddSourceCommand = ({ mavenPath }) => `maven("${mavenPath}")`;
export const groupExists = ({ groupListUrl }) => groupListUrl.length > 0;

View File

@ -1,10 +0,0 @@
import { TrackingActions } from './constants';
export const trackInstallationTabChange = {
methods: {
trackInstallationTabChange(tabIndex) {
const action = tabIndex === 0 ? TrackingActions.INSTALLATION : TrackingActions.REGISTRY_SETUP;
this.track(action, { label: this.trackingLabel });
},
},
};

View File

@ -10,6 +10,8 @@ export const loadViewer = (type) => {
return () => import(/* webpackChunkName: 'blob_download_viewer' */ './download_viewer.vue'); return () => import(/* webpackChunkName: 'blob_download_viewer' */ './download_viewer.vue');
case 'image': case 'image':
return () => import(/* webpackChunkName: 'blob_image_viewer' */ './image_viewer.vue'); return () => import(/* webpackChunkName: 'blob_image_viewer' */ './image_viewer.vue');
case 'video':
return () => import(/* webpackChunkName: 'blob_video_viewer' */ './video_viewer.vue');
default: default:
return null; return null;
} }
@ -31,5 +33,8 @@ export const viewerProps = (type, blob) => {
url: blob.rawPath, url: blob.rawPath,
alt: blob.name, alt: blob.name,
}, },
video: {
url: blob.rawPath,
},
}[type]; }[type];
}; };

View File

@ -0,0 +1,15 @@
<script>
export default {
props: {
url: {
type: String,
required: true,
},
},
};
</script>
<template>
<div class="gl-text-center gl-p-7 gl-bg-gray-50">
<video :src="url" controls data-testid="video" class="gl-max-w-full"></video>
</div>
</template>

View File

@ -46,6 +46,8 @@ export default {
return true; return true;
}, },
statusIconName() { statusIconName() {
if (this.isLoadingSummary) return null;
return this.statusIcon(this.collapsedData); return this.statusIcon(this.collapsedData);
}, },
}, },

View File

@ -19,7 +19,8 @@ export default {
}, },
iconName: { iconName: {
type: String, type: String,
required: true, required: false,
default: null,
}, },
}, },
computed: { computed: {

View File

@ -194,8 +194,7 @@ class IssuableFinder
def use_cte_for_search? def use_cte_for_search?
strong_memoize(:use_cte_for_search) do strong_memoize(:use_cte_for_search) do
next false unless search next false unless search
# Only simple unsorted & simple sorts can use CTE next false unless default_or_simple_sort?
next false if params[:sort].present? && !params[:sort].in?(klass.simple_sorts.keys)
attempt_group_search_optimizations? || attempt_project_search_optimizations? attempt_group_search_optimizations? || attempt_project_search_optimizations?
end end
@ -244,6 +243,10 @@ class IssuableFinder
klass.all klass.all
end end
def default_or_simple_sort?
params[:sort].blank? || params[:sort].to_s.in?(klass.simple_sorts.keys)
end
def attempt_group_search_optimizations? def attempt_group_search_optimizations?
params[:attempt_group_search_optimizations] params[:attempt_group_search_optimizations]
end end

View File

@ -1427,7 +1427,7 @@
:urgency: :high :urgency: :high
:resource_boundary: :unknown :resource_boundary: :unknown
:weight: 3 :weight: 3
:idempotent: :idempotent: true
:tags: [] :tags: []
- :name: pipeline_cache:expire_pipeline_cache - :name: pipeline_cache:expire_pipeline_cache
:worker_name: ExpirePipelineCacheWorker :worker_name: ExpirePipelineCacheWorker

View File

@ -10,11 +10,9 @@ class ExpireJobCacheWorker # rubocop:disable Scalability/IdempotentWorker
queue_namespace :pipeline_cache queue_namespace :pipeline_cache
urgency :high urgency :high
# This worker should be idempotent, but we're switching to data_consistency
# :sticky and there is an ongoing incompatibility, so it needs to be disabled for deduplicate :until_executing, including_scheduled: true
# now. The following line can be uncommented and this comment removed once idempotent!
# https://gitlab.com/gitlab-org/gitlab/-/issues/325291 is resolved.
# idempotent!
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def perform(job_id) def perform(job_id)

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -1,8 +0,0 @@
---
redirect_to: 'index.md'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -214,7 +214,7 @@ If you use GitLab SaaS, you have several channels with which to get support and
To get assistance for GitLab SaaS: To get assistance for GitLab SaaS:
- Access [GitLab Docs](../README.md) for self-service support. - Access [GitLab Docs](../index.md) for self-service support.
- Join the [GitLab Forum](https://forum.gitlab.com/) for community support. - Join the [GitLab Forum](https://forum.gitlab.com/) for community support.
- Gather [your subscription information](https://about.gitlab.com/support/#for-self-managed-users) before submitting a ticket. - Gather [your subscription information](https://about.gitlab.com/support/#for-self-managed-users) before submitting a ticket.
- Submit a support ticket for: - Submit a support ticket for:

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -18,7 +18,7 @@ posted back to the channel can significantly augment your team's workflow.
## How GitLab ChatOps works ## How GitLab ChatOps works
GitLab ChatOps is built upon [GitLab CI/CD](../README.md) and GitLab ChatOps is built upon [GitLab CI/CD](../index.md) and
[Slack Slash Commands](../../user/project/integrations/slack_slash_commands.md). [Slack Slash Commands](../../user/project/integrations/slack_slash_commands.md).
ChatOps provides a `run` action for [slash commands](../../integration/slash_commands.md) ChatOps provides a `run` action for [slash commands](../../integration/slash_commands.md)
with the following arguments: with the following arguments:

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -7,7 +7,7 @@ type: tutorial
# Running Composer and npm scripts with deployment via SCP in GitLab CI/CD **(FREE)** # Running Composer and npm scripts with deployment via SCP in GitLab CI/CD **(FREE)**
This guide covers the building of dependencies of a PHP project while compiling assets via an npm script using [GitLab CI/CD](../../README.md). This guide covers the building of dependencies of a PHP project while compiling assets via an npm script using [GitLab CI/CD](../../index.md).
While it is possible to create your own image with custom PHP and Node.js versions, for brevity we use an existing [Docker image](https://hub.docker.com/r/tetraweb/php/) that contains both PHP and Node.js installed. While it is possible to create your own image with custom PHP and Node.js versions, for brevity we use an existing [Docker image](https://hub.docker.com/r/tetraweb/php/) that contains both PHP and Node.js installed.

View File

@ -33,7 +33,7 @@ to write such end-to-end tests, and how to set up GitLab CI/CD to automatically
against your new code, on a branch-by-branch basis. For the scope of this article, we will walk you against your new code, on a branch-by-branch basis. For the scope of this article, we will walk you
through the process of setting up GitLab CI/CD for end-to-end testing JavaScript-based applications through the process of setting up GitLab CI/CD for end-to-end testing JavaScript-based applications
with WebdriverIO, but the general strategy should carry over to other languages. with WebdriverIO, but the general strategy should carry over to other languages.
We assume you are familiar with GitLab, [GitLab CI/CD](../../README.md), [Review Apps](../../review_apps/index.md), and running your app locally, e.g., on `localhost:8000`. We assume you are familiar with GitLab, [GitLab CI/CD](../../index.md), [Review Apps](../../review_apps/index.md), and running your app locally, e.g., on `localhost:8000`.
## What to test ## What to test

View File

@ -9,7 +9,7 @@ type: index
# GitLab CI/CD Examples **(FREE)** # GitLab CI/CD Examples **(FREE)**
This page contains links to a variety of examples that can help you understand how to This page contains links to a variety of examples that can help you understand how to
implement [GitLab CI/CD](../README.md) for your specific use case. implement [GitLab CI/CD](../index.md) for your specific use case.
Examples are available in several forms. As a collection of: Examples are available in several forms. As a collection of:

View File

@ -17,7 +17,7 @@ date: 2017-08-31
GitLab features our applications with Continuous Integration, and it is possible to easily deploy the new code changes to the production server whenever we want. GitLab features our applications with Continuous Integration, and it is possible to easily deploy the new code changes to the production server whenever we want.
In this tutorial, we'll show you how to initialize a [Laravel](https://laravel.com) application and set up our [Envoy](https://laravel.com/docs/master/envoy) tasks, then we'll jump into see how to test and deploy it with [GitLab CI/CD](../README.md) via [Continuous Delivery](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/). In this tutorial, we'll show you how to initialize a [Laravel](https://laravel.com) application and set up our [Envoy](https://laravel.com/docs/master/envoy) tasks, then we'll jump into see how to test and deploy it with [GitLab CI/CD](../index.md) via [Continuous Delivery](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/).
We assume you have a basic experience with Laravel, Linux servers, We assume you have a basic experience with Laravel, Linux servers,
and you know how to use GitLab. and you know how to use GitLab.
@ -394,7 +394,7 @@ We have our app ready on GitLab, and we also can deploy it manually.
But let's take a step forward to do it automatically with [Continuous Delivery](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#continuous-delivery) method. But let's take a step forward to do it automatically with [Continuous Delivery](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#continuous-delivery) method.
We need to check every commit with a set of automated tests to become aware of issues at the earliest, and then, we can deploy to the target environment if we are happy with the result of the tests. We need to check every commit with a set of automated tests to become aware of issues at the earliest, and then, we can deploy to the target environment if we are happy with the result of the tests.
[GitLab CI/CD](../../README.md) allows us to use [Docker](https://www.docker.com) engine to handle the process of testing and deploying our app. [GitLab CI/CD](../../index.md) allows us to use [Docker](https://www.docker.com) engine to handle the process of testing and deploying our app.
In case you're not familiar with Docker, refer to [Set up automated builds](https://docs.docker.com/get-started/). In case you're not familiar with Docker, refer to [Set up automated builds](https://docs.docker.com/get-started/).
To be able to build, test, and deploy our app with GitLab CI/CD, we need to prepare our work environment. To be able to build, test, and deploy our app with GitLab CI/CD, we need to prepare our work environment.

View File

@ -111,7 +111,7 @@ GitLab CI/CD features, grouped by DevOps stage, include:
## GitLab CI/CD examples ## GitLab CI/CD examples
See the [CI/CD examples](examples/README.md) page for example project code and tutorials for See the [CI/CD examples](examples/index.md) page for example project code and tutorials for
using GitLab CI/CD with various: using GitLab CI/CD with various:
- App frameworks - App frameworks

View File

@ -7,7 +7,7 @@ type: reference
# Pipeline efficiency **(FREE)** # Pipeline efficiency **(FREE)**
[CI/CD Pipelines](index.md) are the fundamental building blocks for [GitLab CI/CD](../README.md). [CI/CD Pipelines](index.md) are the fundamental building blocks for [GitLab CI/CD](../index.md).
Making pipelines more efficient helps you save developer time, which: Making pipelines more efficient helps you save developer time, which:
- Speeds up your DevOps processes - Speeds up your DevOps processes

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -10,7 +10,7 @@ type: reference
This document lists the configuration options for your GitLab `.gitlab-ci.yml` file. This document lists the configuration options for your GitLab `.gitlab-ci.yml` file.
- For a quick introduction to GitLab CI/CD, follow the [quick start guide](../quick_start/index.md). - For a quick introduction to GitLab CI/CD, follow the [quick start guide](../quick_start/index.md).
- For a collection of examples, see [GitLab CI/CD Examples](../examples/README.md). - For a collection of examples, see [GitLab CI/CD Examples](../examples/index.md).
- To view a large `.gitlab-ci.yml` file used in an enterprise, see the [`.gitlab-ci.yml` file for `gitlab`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml). - To view a large `.gitlab-ci.yml` file used in an enterprise, see the [`.gitlab-ci.yml` file for `gitlab`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
When you are editing your `.gitlab-ci.yml` file, you can validate it with the When you are editing your `.gitlab-ci.yml` file, you can validate it with the

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -99,7 +99,7 @@ The process involves the following:
- Primary Reviewer. Review by a [code reviewer](https://about.gitlab.com/handbook/engineering/projects/) - Primary Reviewer. Review by a [code reviewer](https://about.gitlab.com/handbook/engineering/projects/)
or other appropriate colleague to confirm accuracy, clarity, and completeness. This can be skipped or other appropriate colleague to confirm accuracy, clarity, and completeness. This can be skipped
for minor fixes without substantive content changes. for minor fixes without substantive content changes.
- Technical Writer (Optional). If not completed for a merge request prior to merging, must be scheduled - Technical Writer (Optional). If not completed for a merge request before merging, must be scheduled
post-merge. Schedule post-merge reviews only if an urgent merge is required. To request a: post-merge. Schedule post-merge reviews only if an urgent merge is required. To request a:
- Pre-merge review, assign the Technical Writer listed for the applicable - Pre-merge review, assign the Technical Writer listed for the applicable
[DevOps stage group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments). [DevOps stage group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments).
@ -111,7 +111,7 @@ The process involves the following:
- Ensure the appropriate labels are applied, including any required to pick a merge request into - Ensure the appropriate labels are applied, including any required to pick a merge request into
a release. a release.
- Ensure that, if there has not been a Technical Writer review completed or scheduled, they - Ensure that, if there has not been a Technical Writer review completed or scheduled, they
[create the required issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Doc%20Review), assign to the Technical Writer of the given stage group, [create the required issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Doc%20Review), assign it to the Technical Writer of the given stage group,
and link it from the merge request. and link it from the merge request.
The process is reflected in the **Documentation** The process is reflected in the **Documentation**
@ -130,10 +130,10 @@ immediately after merge by the developer or maintainer. For this,
create an issue using the [Doc Review description template](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Doc%20Review) create an issue using the [Doc Review description template](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Doc%20Review)
and link to it from the merged merge request that introduced the documentation change. and link to it from the merged merge request that introduced the documentation change.
Circumstances where a regular pre-merge Technical Writer review might be skipped include: Circumstances, where a regular pre-merge Technical Writer review might be skipped, include:
- There is a short amount of time left before the milestone release. If there are less than three days - There is a short amount of time left before the milestone release. If less than three
remaining, seek a post-merge review and ping the writer via Slack to ensure the review is days are remaining, seek a post-merge review and ping the writer via Slack to ensure the review is
completed as soon as possible. completed as soon as possible.
- The size of the change is small and you have a high degree of confidence - The size of the change is small and you have a high degree of confidence
that early users of the feature (for example, GitLab.com users) can easily that early users of the feature (for example, GitLab.com users) can easily
@ -156,15 +156,15 @@ Remember:
Ensure the following if skipping an initial Technical Writer review: Ensure the following if skipping an initial Technical Writer review:
- That [product badges](styleguide/index.md#product-tier-badges) are applied. - [Product badges](styleguide/index.md#product-tier-badges) are applied.
- That the GitLab [version](styleguide/index.md#gitlab-versions) that - The GitLab [version](styleguide/index.md#gitlab-versions) that
introduced the feature has been included. introduced the feature is included.
- That changes to headings don't affect in-app hyperlinks. - Changes to headings don't affect in-app hyperlinks.
- Specific [user permissions](../../user/permissions.md) are documented. - Specific [user permissions](../../user/permissions.md) are documented.
- That new documents are linked from higher-level indexes, for discoverability. - New documents are linked from higher-level indexes, for discoverability.
- Style guide is followed: - The style guide is followed:
- For [directories and files](styleguide/index.md#work-with-directories-and-files). - For [directories and files](styleguide/index.md#work-with-directories-and-files).
- For [images](styleguide/index.md#images). - For [images](styleguide/index.md#images).
Merge requests that change the location of documentation must always be reviewed by a Technical Merge requests that change the location of documentation must always be reviewed by a Technical
Writer prior to merging. Writer before merging.

View File

@ -18,7 +18,7 @@ the [Handbook](https://about.gitlab.com/handbook/).
For information on using GitLab to work on your own software projects, see the For information on using GitLab to work on your own software projects, see the
[GitLab user documentation](../user/index.md). [GitLab user documentation](../user/index.md).
For information on working with the GitLab APIs, see the [API documentation](../api/README.md). For information on working with the GitLab APIs, see the [API documentation](../api/index.md).
For information about how to install, configure, update, and upgrade your own For information about how to install, configure, update, and upgrade your own
GitLab instance, see the [administration documentation](../administration/index.md). GitLab instance, see the [administration documentation](../administration/index.md).

View File

@ -108,7 +108,7 @@ There are many ways to integrate with GitLab, including:
| Topic | Description | | Topic | Description |
|:-------------------------------------------|:------------| |:-------------------------------------------|:------------|
| [GitLab REST API](api/README.md) | Integrate with GitLab using our REST API. | | [GitLab REST API](api/index.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. |
| [Integrations](integration/index.md) | Integrations with third-party products. | | [Integrations](integration/index.md) | Integrations with third-party products. |

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -1,9 +0,0 @@
---
redirect_to: 'index.md'
remove_date: '2021-09-28'
---
This document was moved to [another location](index.md).
<!-- This redirect file can be deleted after 2021-09-28. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->

View File

@ -59,21 +59,21 @@ The following table lists project permissions available for each role:
| [Application security](application_security/index.md):<br>View [threats list](application_security/threat_monitoring/index.md#threat-monitoring) **(ULTIMATE)** | | | ✓ | ✓ | ✓ | | [Application security](application_security/index.md):<br>View [threats list](application_security/threat_monitoring/index.md#threat-monitoring) **(ULTIMATE)** | | | ✓ | ✓ | ✓ |
| [Application security](application_security/index.md):<br>Create a [CVE ID Request](application_security/cve_id_request.md) **(FREE SAAS)** | | | | ✓ | ✓ | | [Application security](application_security/index.md):<br>Create a [CVE ID Request](application_security/cve_id_request.md) **(FREE SAAS)** | | | | ✓ | ✓ |
| [Application security](application_security/index.md):<br>Create or assign [security policy project](application_security/policies/index.md) **(ULTIMATE)** | | | | | ✓ | | [Application security](application_security/index.md):<br>Create or assign [security policy project](application_security/policies/index.md) **(ULTIMATE)** | | | | | ✓ |
| [CI/CD](../ci/README.md):<br>Download and browse job artifacts | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Download and browse job artifacts | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>View a job log | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>View a job log | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>View list of jobs | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>View list of jobs | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>View [environments](../ci/environments/index.md) | | ✓ | ✓ | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>View [environments](../ci/environments/index.md) | | ✓ | ✓ | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Cancel and retry jobs | | | ✓ | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Cancel and retry jobs | | | ✓ | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Create new [environments](../ci/environments/index.md) | | | ✓ | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Create new [environments](../ci/environments/index.md) | | | ✓ | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Run CI/CD pipeline against a protected branch | | | ✓ (*5*) | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Run CI/CD pipeline against a protected branch | | | ✓ (*5*) | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Stop [environments](../ci/environments/index.md) | | | ✓ | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Stop [environments](../ci/environments/index.md) | | | ✓ | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>View a job with [debug logging](../ci/variables/index.md#debug-logging) | | | ✓ | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>View a job with [debug logging](../ci/variables/index.md#debug-logging) | | | ✓ | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Manage CI/CD variables | | | | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Manage CI/CD variables | | | | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Manage job triggers | | | | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Manage job triggers | | | | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Manage runners | | | | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Manage runners | | | | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Run Web IDE's Interactive Web Terminals **(ULTIMATE ONLY)** | | | | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Run Web IDE's Interactive Web Terminals **(ULTIMATE ONLY)** | | | | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Use [environment terminals](../ci/environments/index.md#web-terminals) | | | | ✓ | ✓ | | [CI/CD](../ci/index.md):<br>Use [environment terminals](../ci/environments/index.md#web-terminals) | | | | ✓ | ✓ |
| [CI/CD](../ci/README.md):<br>Delete pipelines | | | | | ✓ | | [CI/CD](../ci/index.md):<br>Delete pipelines | | | | | ✓ |
| [Clusters](project/clusters/index.md):<br>View pod logs | | | ✓ | ✓ | ✓ | | [Clusters](project/clusters/index.md):<br>View pod logs | | | ✓ | ✓ | ✓ |
| [Clusters](project/clusters/index.md):<br>Manage clusters | | | | ✓ | ✓ | | [Clusters](project/clusters/index.md):<br>Manage clusters | | | | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete cleanup policies | | | ✓ | ✓ | ✓ | | [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete cleanup policies | | | ✓ | ✓ | ✓ |

View File

@ -57,7 +57,7 @@ to install Cilium in your Kubernetes cluster.
``` ```
1. Merge or push these changes to the default branch of your cluster management project, 1. Merge or push these changes to the default branch of your cluster management project,
and [GitLab CI/CD](../../../../../ci/README.md) will automatically install Cilium. and [GitLab CI/CD](../../../../../ci/index.md) will automatically install Cilium.
WARNING: WARNING:
Installation and removal of the Cilium requires a **manual** Installation and removal of the Cilium requires a **manual**

View File

@ -165,7 +165,7 @@ To push a new project:
As project creation permissions can have many factors, contact your As project creation permissions can have many factors, contact your
GitLab administrator if you're unsure. GitLab administrator if you're unsure.
1. If you want to push using SSH, ensure you have [created a SSH key](../../ssh/README.md) and 1. If you want to push using SSH, ensure you have [created a SSH key](../../ssh/index.md) and
[added it to your GitLab account](../../ssh/index.md#add-an-ssh-key-to-your-gitlab-account). [added it to your GitLab account](../../ssh/index.md#add-an-ssh-key-to-your-gitlab-account).
1. Push with one of the following methods. Replace `gitlab.example.com` with the 1. Push with one of the following methods. Replace `gitlab.example.com` with the
domain name of the machine that hosts your Git repository, `namespace` with the name of domain name of the machine that hosts your Git repository, `namespace` with the name of

View File

@ -1,20 +0,0 @@
# frozen_string_literal: true
require 'logger'
desc "GitLab | Packages | Build composer cache"
namespace :gitlab do
namespace :packages do
task build_composer_cache: :environment do
logger = Logger.new($stdout)
logger.info('Starting to build composer cache files')
::Packages::Package.composer.find_in_batches do |packages|
packages.group_by { |pkg| [pkg.project_id, pkg.name] }.each do |(project_id, name), packages|
logger.info("Building cache for #{project_id} -> #{name}")
Gitlab::Composer::Cache.new(project: packages.first.project, name: name).execute
end
end
end
end
end

View File

@ -67,7 +67,7 @@ fi
# Do not use 'README.md', instead use 'index.md' # Do not use 'README.md', instead use 'index.md'
# Number of 'README.md's as of 2021-08-17 # Number of 'README.md's as of 2021-08-17
NUMBER_READMES=13 NUMBER_READMES=0
FIND_READMES=$(find doc/ -name "README.md" | wc -l) FIND_READMES=$(find doc/ -name "README.md" | wc -l)
echo '=> Checking for new README.md files...' echo '=> Checking for new README.md files...'
echo echo

View File

@ -2,7 +2,7 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe 'CI Lint', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297782' do RSpec.describe 'CI Lint', :js do
include Spec::Support::Helpers::Features::SourceEditorSpecHelpers include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }

View File

@ -1199,6 +1199,14 @@ RSpec.describe IssuesFinder do
end end
end end
context 'when a non-simple sort is given' do
let(:params) { { search: 'foo', attempt_project_search_optimizations: true, sort: 'popularity' } }
it 'returns false' do
expect(finder.use_cte_for_search?).to be_falsey
end
end
context 'when all conditions are met' do context 'when all conditions are met' do
context "uses group search optimization" do context "uses group search optimization" do
let(:params) { { search: 'foo', attempt_group_search_optimizations: true } } let(:params) { { search: 'foo', attempt_group_search_optimizations: true } }
@ -1217,6 +1225,24 @@ RSpec.describe IssuesFinder do
expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/) expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/)
end end
end end
context 'with simple sort' do
let(:params) { { search: 'foo', attempt_project_search_optimizations: true, sort: 'updated_desc' } }
it 'returns true' do
expect(finder.use_cte_for_search?).to be_truthy
expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/)
end
end
context 'with simple sort as a symbol' do
let(:params) { { search: 'foo', attempt_project_search_optimizations: true, sort: :updated_desc } }
it 'returns true' do
expect(finder.use_cte_for_search?).to be_truthy
expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/)
end
end
end end
end end

View File

@ -1,54 +1,15 @@
import { NpmManager } from '~/packages/details/constants'; import { packagePipeline } from '~/packages/details/store/getters';
import { import {
conanInstallationCommand,
conanSetupCommand,
packagePipeline,
packageTypeDisplay,
packageIcon,
mavenInstallationXml,
mavenInstallationCommand,
mavenSetupXml,
npmInstallationCommand,
npmSetupCommand,
nugetInstallationCommand,
nugetSetupCommand,
pypiPipCommand,
pypiSetupCommand,
composerRegistryInclude,
composerPackageInclude,
groupExists,
gradleGroovyInstalCommand,
gradleGroovyAddSourceCommand,
gradleKotlinInstalCommand,
gradleKotlinAddSourceCommand,
} from '~/packages/details/store/getters';
import {
conanPackage,
npmPackage, npmPackage,
nugetPackage,
mockPipelineInfo, mockPipelineInfo,
mavenPackage as packageWithoutBuildInfo, mavenPackage as packageWithoutBuildInfo,
pypiPackage,
rubygemsPackage,
} from '../../mock_data'; } from '../../mock_data';
import {
generateMavenCommand,
generateXmlCodeBlock,
generateMavenSetupXml,
registryUrl,
pypiSetupCommandStr,
} from '../mock_data';
describe('Getters PackageDetails Store', () => { describe('Getters PackageDetails Store', () => {
let state; let state;
const defaultState = { const defaultState = {
packageEntity: packageWithoutBuildInfo, packageEntity: packageWithoutBuildInfo,
conanPath: registryUrl,
mavenPath: registryUrl,
npmPath: registryUrl,
nugetPath: registryUrl,
pypiPath: registryUrl,
}; };
const setupState = (testState = {}) => { const setupState = (testState = {}) => {
@ -58,28 +19,6 @@ describe('Getters PackageDetails Store', () => {
}; };
}; };
const conanInstallationCommandStr = `conan install ${conanPackage.name} --remote=gitlab`;
const conanSetupCommandStr = `conan remote add gitlab ${registryUrl}`;
const mavenCommandStr = generateMavenCommand(packageWithoutBuildInfo.maven_metadatum);
const mavenInstallationXmlBlock = generateXmlCodeBlock(packageWithoutBuildInfo.maven_metadatum);
const mavenSetupXmlBlock = generateMavenSetupXml();
const npmInstallStr = `npm i ${npmPackage.name}`;
const npmSetupStr = `echo @Test:registry=${registryUrl}/ >> .npmrc`;
const yarnInstallStr = `yarn add ${npmPackage.name}`;
const yarnSetupStr = `echo \\"@Test:registry\\" \\"${registryUrl}/\\" >> .yarnrc`;
const nugetInstallationCommandStr = `nuget install ${nugetPackage.name} -Source "GitLab"`;
const nugetSetupCommandStr = `nuget source Add -Name "GitLab" -Source "${registryUrl}" -UserName <your_username> -Password <your_token>`;
const pypiPipCommandStr = `pip install ${pypiPackage.name} --extra-index-url ${registryUrl}`;
const composerRegistryIncludeStr =
'composer config repositories.gitlab.com/123 \'{"type": "composer", "url": "foo"}\'';
const composerPackageIncludeStr = `composer req ${[packageWithoutBuildInfo.name]}:${
packageWithoutBuildInfo.version
}`;
describe('packagePipeline', () => { describe('packagePipeline', () => {
it('should return the pipeline info when pipeline exists', () => { it('should return the pipeline info when pipeline exists', () => {
setupState({ setupState({
@ -93,203 +32,9 @@ describe('Getters PackageDetails Store', () => {
}); });
it('should return null when build_info does not exist', () => { it('should return null when build_info does not exist', () => {
setupState(); setupState({ pipeline: undefined });
expect(packagePipeline(state)).toBe(null); expect(packagePipeline(state)).toBe(null);
}); });
}); });
describe('packageTypeDisplay', () => {
describe.each`
packageEntity | expectedResult
${conanPackage} | ${'Conan'}
${packageWithoutBuildInfo} | ${'Maven'}
${npmPackage} | ${'npm'}
${nugetPackage} | ${'NuGet'}
${pypiPackage} | ${'PyPI'}
${rubygemsPackage} | ${'RubyGems'}
`(`package type`, ({ packageEntity, expectedResult }) => {
beforeEach(() => setupState({ packageEntity }));
it(`${packageEntity.package_type} should show as ${expectedResult}`, () => {
expect(packageTypeDisplay(state)).toBe(expectedResult);
});
});
});
describe('packageIcon', () => {
describe('nuget packages', () => {
it('should return nuget package icon', () => {
setupState({ packageEntity: nugetPackage });
expect(packageIcon(state)).toBe(nugetPackage.nuget_metadatum.icon_url);
});
it('should return null when nuget package does not have an icon', () => {
setupState({ packageEntity: { ...nugetPackage, nuget_metadatum: {} } });
expect(packageIcon(state)).toBe(null);
});
});
it('should not find icons for other package types', () => {
setupState({ packageEntity: npmPackage });
expect(packageIcon(state)).toBe(null);
});
});
describe('conan string getters', () => {
it('gets the correct conanInstallationCommand', () => {
setupState({ packageEntity: conanPackage });
expect(conanInstallationCommand(state)).toBe(conanInstallationCommandStr);
});
it('gets the correct conanSetupCommand', () => {
setupState({ packageEntity: conanPackage });
expect(conanSetupCommand(state)).toBe(conanSetupCommandStr);
});
});
describe('maven string getters', () => {
it('gets the correct mavenInstallationXml', () => {
setupState();
expect(mavenInstallationXml(state)).toBe(mavenInstallationXmlBlock);
});
it('gets the correct mavenInstallationCommand', () => {
setupState();
expect(mavenInstallationCommand(state)).toBe(mavenCommandStr);
});
it('gets the correct mavenSetupXml', () => {
setupState();
expect(mavenSetupXml(state)).toBe(mavenSetupXmlBlock);
});
});
describe('npm string getters', () => {
it('gets the correct npmInstallationCommand for npm', () => {
setupState({ packageEntity: npmPackage });
expect(npmInstallationCommand(state)(NpmManager.NPM)).toBe(npmInstallStr);
});
it('gets the correct npmSetupCommand for npm', () => {
setupState({ packageEntity: npmPackage });
expect(npmSetupCommand(state)(NpmManager.NPM)).toBe(npmSetupStr);
});
it('gets the correct npmInstallationCommand for Yarn', () => {
setupState({ packageEntity: npmPackage });
expect(npmInstallationCommand(state)(NpmManager.YARN)).toBe(yarnInstallStr);
});
it('gets the correct npmSetupCommand for Yarn', () => {
setupState({ packageEntity: npmPackage });
expect(npmSetupCommand(state)(NpmManager.YARN)).toBe(yarnSetupStr);
});
});
describe('nuget string getters', () => {
it('gets the correct nugetInstallationCommand', () => {
setupState({ packageEntity: nugetPackage });
expect(nugetInstallationCommand(state)).toBe(nugetInstallationCommandStr);
});
it('gets the correct nugetSetupCommand', () => {
setupState({ packageEntity: nugetPackage });
expect(nugetSetupCommand(state)).toBe(nugetSetupCommandStr);
});
});
describe('pypi string getters', () => {
it('gets the correct pypiPipCommand', () => {
setupState({ packageEntity: pypiPackage });
expect(pypiPipCommand(state)).toBe(pypiPipCommandStr);
});
it('gets the correct pypiSetupCommand', () => {
setupState({ pypiSetupPath: 'foo' });
expect(pypiSetupCommand(state)).toBe(pypiSetupCommandStr);
});
});
describe('composer string getters', () => {
it('gets the correct composerRegistryInclude command', () => {
setupState({ composerPath: 'foo', composerConfigRepositoryName: 'gitlab.com/123' });
expect(composerRegistryInclude(state)).toBe(composerRegistryIncludeStr);
});
it('gets the correct composerPackageInclude command', () => {
setupState();
expect(composerPackageInclude(state)).toBe(composerPackageIncludeStr);
});
});
describe('gradle groovy string getters', () => {
it('gets the correct gradleGroovyInstalCommand', () => {
setupState();
expect(gradleGroovyInstalCommand(state)).toMatchInlineSnapshot(
`"implementation 'com.test.app:test-app:1.0-SNAPSHOT'"`,
);
});
it('gets the correct gradleGroovyAddSourceCommand', () => {
setupState();
expect(gradleGroovyAddSourceCommand(state)).toMatchInlineSnapshot(`
"maven {
url 'foo/registry'
}"
`);
});
});
describe('gradle kotlin string getters', () => {
it('gets the correct gradleKotlinInstalCommand', () => {
setupState();
expect(gradleKotlinInstalCommand(state)).toMatchInlineSnapshot(
`"implementation(\\"com.test.app:test-app:1.0-SNAPSHOT\\")"`,
);
});
it('gets the correct gradleKotlinAddSourceCommand', () => {
setupState();
expect(gradleKotlinAddSourceCommand(state)).toMatchInlineSnapshot(
`"maven(\\"foo/registry\\")"`,
);
});
});
describe('check if group', () => {
it('is set', () => {
setupState({ groupListUrl: '/groups/composer/-/packages' });
expect(groupExists(state)).toBe(true);
});
it('is not set', () => {
setupState({ groupListUrl: '' });
expect(groupExists(state)).toBe(false);
});
});
}); });

View File

@ -0,0 +1,22 @@
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import VideoViewer from '~/repository/components/blob_viewers/video_viewer.vue';
describe('Video Viewer', () => {
let wrapper;
const propsData = { url: 'some/video.mp4' };
const createComponent = () => {
wrapper = shallowMountExtended(VideoViewer, { propsData });
};
const findVideo = () => wrapper.findByTestId('video');
it('renders a Video element', () => {
createComponent();
expect(findVideo().exists()).toBe(true);
expect(findVideo().attributes('src')).toBe(propsData.url);
expect(findVideo().attributes('controls')).not.toBeUndefined();
});
});

View File

@ -10,7 +10,10 @@ import axios from '~/lib/utils/axios_utils';
import { setFaviconOverlay } from '~/lib/utils/favicon'; import { setFaviconOverlay } from '~/lib/utils/favicon';
import notify from '~/lib/utils/notify'; import notify from '~/lib/utils/notify';
import SmartInterval from '~/smart_interval'; import SmartInterval from '~/smart_interval';
import { registerExtension } from '~/vue_merge_request_widget/components/extensions'; import {
registerExtension,
registeredExtensions,
} from '~/vue_merge_request_widget/components/extensions';
import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants'; import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants';
import eventHub from '~/vue_merge_request_widget/event_hub'; import eventHub from '~/vue_merge_request_widget/event_hub';
import MrWidgetOptions from '~/vue_merge_request_widget/mr_widget_options.vue'; import MrWidgetOptions from '~/vue_merge_request_widget/mr_widget_options.vue';
@ -886,20 +889,22 @@ describe('MrWidgetOptions', () => {
describe('mock extension', () => { describe('mock extension', () => {
beforeEach(() => { beforeEach(() => {
registerExtension(testExtension);
createComponent(); createComponent();
}); });
it('renders collapsed data', async () => { afterEach(() => {
registerExtension(testExtension); registeredExtensions.extensions = [];
});
it('renders collapsed data', async () => {
await waitForPromises(); await waitForPromises();
expect(wrapper.text()).toContain('Test extension summary count: 1'); expect(wrapper.text()).toContain('Test extension summary count: 1');
}); });
it('renders full data', async () => { it('renders full data', async () => {
registerExtension(testExtension);
await waitForPromises(); await waitForPromises();
wrapper wrapper

View File

@ -1,3 +1,5 @@
import { EXTENSION_ICONS } from '~/vue_merge_request_widget/constants';
export default { export default {
name: 'WidgetTestExtension', name: 'WidgetTestExtension',
props: ['targetProjectFullPath'], props: ['targetProjectFullPath'],
@ -6,7 +8,7 @@ export default {
return `Test extension summary count: ${count} & ${targetProjectFullPath}`; return `Test extension summary count: ${count} & ${targetProjectFullPath}`;
}, },
statusIcon({ count }) { statusIcon({ count }) {
return count > 0 ? 'warning' : 'success'; return count > 0 ? EXTENSION_ICONS.warning : EXTENSION_ICONS.success;
}, },
}, },
methods: { methods: {

View File

@ -1,29 +0,0 @@
# frozen_string_literal: true
require 'rake_helper'
RSpec.describe 'gitlab:packages:build_composer_cache namespace rake task', :silence_stdout do
let_it_be(:package_name) { 'sample-project' }
let_it_be(:package_name2) { 'sample-project2' }
let_it_be(:json) { { 'name' => package_name } }
let_it_be(:json2) { { 'name' => package_name2 } }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json.to_json }, group: group) }
let_it_be(:project2) { create(:project, :custom_repo, files: { 'composer.json' => json2.to_json }, group: group) }
let!(:package) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '1.0.0', json: json) }
let!(:package2) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '2.0.0', json: json) }
let!(:package3) { create(:composer_package, :with_metadatum, project: project2, name: package_name2, version: '3.0.0', json: json2) }
before :all do
Rake.application.rake_require 'tasks/gitlab/packages/composer'
end
subject do
run_rake_task("gitlab:packages:build_composer_cache")
end
it 'generates the cache files' do
expect { subject }.to change { Packages::Composer::CacheFile.count }.by(2)
end
end

View File

@ -13,6 +13,8 @@ RSpec.describe ExpireJobCacheWorker do
let(:job_args) { job.id } let(:job_args) { job.id }
it_behaves_like 'an idempotent worker'
it_behaves_like 'worker with data consistency', it_behaves_like 'worker with data consistency',
described_class, described_class,
data_consistency: :delayed data_consistency: :delayed