Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-10-04 00:17:57 +00:00
parent ee3948e3df
commit c8e5faa82c
31 changed files with 397 additions and 129 deletions

View File

@ -202,27 +202,31 @@ export default {
return !discussionItem.resolved || isHashTargeted(discussionItem);
};
const addDiscussion = (discussions) =>
discussions.filter(({ id }) => discussion.id !== id).concat(discussion);
const file = state.diffFiles.find((diff) => diff.file_hash === fileHash);
// a file batch might not be loaded yet when we try to add a discussion
if (!file) return;
const diffLines = file[INLINE_DIFF_LINES_KEY];
const addDiscussion = (discussions) =>
discussions.filter(({ id }) => discussion.id !== id).concat(discussion);
if (diffLines.length && positionType !== FILE_DIFF_POSITION_TYPE) {
const line = diffLines.find(isTargetLine);
// skip if none of the discussion positions matched a diff position
if (!line) return;
const discussions = addDiscussion(line.discussions || []);
const originalDiscussions = line.discussions || [];
if (originalDiscussions.includes(discussion)) return;
const discussions = addDiscussion(originalDiscussions);
Object.assign(line, {
discussions,
discussionsExpanded: line.discussionsExpanded || discussions.some(isExpandedDiscussion),
});
} else {
const originalDiscussions = file.discussions || [];
if (originalDiscussions.includes(discussion)) return;
Object.assign(discussion, { expandedOnDiff: isExpandedDiscussion(discussion) });
Object.assign(file, {
discussions: addDiscussion(file.discussions || []),
discussions: addDiscussion(originalDiscussions),
});
}
},

View File

@ -198,27 +198,31 @@ export default {
return !discussionItem.resolved || isHashTargeted(discussionItem);
};
const addDiscussion = (discussions) =>
discussions.filter(({ id }) => discussion.id !== id).concat(discussion);
const file = this.diffFiles.find((diff) => diff.file_hash === fileHash);
// a file batch might not be loaded yet when we try to add a discussion
if (!file) return;
const diffLines = file[INLINE_DIFF_LINES_KEY];
const addDiscussion = (discussions) =>
discussions.filter(({ id }) => discussion.id !== id).concat(discussion);
if (diffLines.length && positionType !== FILE_DIFF_POSITION_TYPE) {
const line = diffLines.find(isTargetLine);
// skip if none of the discussion positions matched a diff position
if (!line) return;
const discussions = addDiscussion(line.discussions || []);
const originalDiscussions = line.discussions || [];
if (originalDiscussions.includes(discussion)) return;
const discussions = addDiscussion(originalDiscussions);
Object.assign(line, {
discussions,
discussionsExpanded: line.discussionsExpanded || discussions.some(isExpandedDiscussion),
});
} else {
const originalDiscussions = file.discussions || [];
if (originalDiscussions.includes(discussion)) return;
Object.assign(discussion, { expandedOnDiff: isExpandedDiscussion(discussion) });
Object.assign(file, {
discussions: addDiscussion(file.discussions || []),
discussions: addDiscussion(originalDiscussions),
});
}
},

View File

@ -3,6 +3,8 @@ import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
import { __, sprintf } from '~/locale';
import { renderMarkdown } from '~/notes/utils';
import SafeHtml from '~/vue_shared/directives/safe_html';
import { sha256 } from '~/lib/utils/text_utility';
import { InternalEvents } from '~/tracking';
import { executeAndPresentQuery } from '../../core';
import Counter from '../../utils/counter';
@ -17,6 +19,7 @@ export default {
directives: {
SafeHtml,
},
mixins: [InternalEvents.mixin()],
props: {
query: {
required: true,
@ -62,6 +65,7 @@ export default {
try {
this.presenterComponent = await executeAndPresentQuery(this.query);
this.trackRender();
} catch (error) {
this.handleQueryError(error.message);
} finally {
@ -78,6 +82,13 @@ export default {
this.error = {};
},
renderMarkdown,
async trackRender() {
try {
this.trackEvent('render_glql_block', { label: await sha256(this.query) });
} catch (e) {
// ignore any tracking errors
}
},
},
safeHtmlConfig: { ALLOWED_TAGS: ['code'] },
i18n: {

View File

@ -592,3 +592,10 @@ export const wildcardMatch = (str, pattern) => {
const regex = new RegExp(`^${escapedPattern.replace(/\\\*/g, '.*')}$`);
return regex.test(lowerStr);
};
export const sha256 = async (str) => {
const data = new TextEncoder().encode(str);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
};

View File

@ -0,0 +1,21 @@
---
description: GLQL blocks rendered
internal_events: true
action: render_glql_block
identifiers:
- project
- namespace
- user
additional_properties:
label:
description: SHA256 of the GLQL block content
product_group: knowledge
milestone: '17.5'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167165
distributions:
- ce
- ee
tiers:
- free
- premium
- ultimate

View File

@ -0,0 +1,22 @@
---
key_path: redis_hll_counters.count_distinct_label_from_render_glql_block_monthly
description: Monthly count of unique GLQL blocks rendered
product_group: knowledge
performance_indicator_type: []
value_type: number
status: active
milestone: '17.5'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167165
time_frame: 28d
data_source: internal_events
data_category: optional
distribution:
- ce
- ee
tier:
- free
- premium
- ultimate
events:
- name: render_glql_block
unique: label

View File

@ -0,0 +1,22 @@
---
key_path: redis_hll_counters.count_distinct_user_id_from_render_glql_block_monthly
description: Monthly count of unique users who rendered GLQL blocks
product_group: knowledge
performance_indicator_type: []
value_type: number
status: active
milestone: '17.5'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167165
time_frame: 28d
data_source: internal_events
data_category: optional
distribution:
- ce
- ee
tier:
- free
- premium
- ultimate
events:
- name: render_glql_block
unique: user.id

View File

@ -0,0 +1,22 @@
---
key_path: redis_hll_counters.count_distinct_label_from_render_glql_block_weekly
description: Weekly count of unique GLQL blocks rendered
product_group: knowledge
performance_indicator_type: []
value_type: number
status: active
milestone: '17.5'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167165
time_frame: 7d
data_source: internal_events
data_category: optional
distribution:
- ce
- ee
tier:
- free
- premium
- ultimate
events:
- name: render_glql_block
unique: label

View File

@ -0,0 +1,22 @@
---
key_path: redis_hll_counters.count_distinct_user_id_from_render_glql_block_weekly
description: Weekly count of unique users who rendered GLQL blocks
product_group: knowledge
performance_indicator_type: []
value_type: number
status: active
milestone: '17.5'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/167165
time_frame: 7d
data_source: internal_events
data_category: optional
distribution:
- ce
- ee
tier:
- free
- premium
- ultimate
events:
- name: render_glql_block
unique: user.id

View File

@ -128,7 +128,6 @@ Here is an example snippet to add to `/etc/fstab`:
10.1.0.1:/var/opt/gitlab/gitlab-rails/uploads /var/opt/gitlab/gitlab-rails/uploads nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,_netdev,lookupcache=positive 0 2
10.1.0.1:/var/opt/gitlab/gitlab-rails/shared /var/opt/gitlab/gitlab-rails/shared nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,_netdev,lookupcache=positive 0 2
10.1.0.1:/var/opt/gitlab/gitlab-ci/builds /var/opt/gitlab/gitlab-ci/builds nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,_netdev,lookupcache=positive 0 2
10.1.0.1:/var/opt/gitlab/git-data /var/opt/gitlab/git-data nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,_netdev,lookupcache=positive 0 2
```
You can view information and options set for each of the mounted NFS file
@ -208,7 +207,6 @@ restore of backups without manually moving existing data.
mountpoint
└── gitlab-data
├── builds
├── git-data
├── shared
└── uploads
```
@ -220,7 +218,6 @@ Mount `/gitlab-nfs` then use the following Linux package
configuration to move each data location to a subdirectory:
```ruby
git_data_dirs({"default" => { "path" => "/gitlab-nfs/gitlab-data/git-data"} })
gitlab_rails['uploads_directory'] = '/gitlab-nfs/gitlab-data/uploads'
gitlab_rails['shared_path'] = '/gitlab-nfs/gitlab-data/shared'
gitlab_ci['builds_directory'] = '/gitlab-nfs/gitlab-data/builds'
@ -242,7 +239,6 @@ NFS mount point is `/gitlab-nfs`. Then, add the following bind mounts in
`/etc/fstab`:
```shell
/gitlab-nfs/gitlab-data/git-data /var/opt/gitlab/git-data none bind 0 0
/gitlab-nfs/gitlab-data/.ssh /var/opt/gitlab/.ssh none bind 0 0
/gitlab-nfs/gitlab-data/uploads /var/opt/gitlab/gitlab-rails/uploads none bind 0 0
/gitlab-nfs/gitlab-data/shared /var/opt/gitlab/gitlab-rails/shared none bind 0 0
@ -255,9 +251,9 @@ are empty before attempting a restore. Read more about the
### Multiple NFS mounts
When using default Linux package configuration, you need to share 4 data locations
When using default Linux package configuration, you need to share 3 data locations
between all GitLab cluster nodes. No other locations should be shared. The
following are the 4 locations need to be shared:
following are the 3 locations need to be shared:
| Location | Description | Default configuration |
| -------- | ----------- | --------------------- |

View File

@ -963,6 +963,17 @@ The following procedure includes steps to back up and edit the
`gitlab-secrets.json` file. This file contains secrets that control
database encryption. Proceed with caution.
1. Optionally, to enable [access control](#access-control), add the following to `/etc/gitlab/gitlab.rb` and [reconfigure the **GitLab server**](../restart_gitlab.md#reconfigure-a-linux-package-installation):
```ruby
gitlab_pages['access_control'] = true
```
WARNING:
If you plan to use GitLab Pages with access control, you must enable it on the first GitLab server before copying `gitlab-secrets.json`.
Enabling access control generates a new OAuth application, and information about it propagates to `gitlab-secrets.json`. If it's not done
in the correct order, you may face issues with access control.
1. Create a backup of the secrets file on the **GitLab server**:
```shell
@ -975,12 +986,6 @@ database encryption. Proceed with caution.
pages_external_url "http://<pages_server_URL>"
```
1. Optionally, to enable [access control](#access-control), add the following to `/etc/gitlab/gitlab.rb`:
```ruby
gitlab_pages['access_control'] = true
```
1. Set up object storage by either:
- [Configuring the object storage and migrating GitLab Pages data to it](#object-storage-settings), or
- [Configuring network storage](#enable-pages-network-storage-in-multi-node-environments).

View File

@ -482,7 +482,9 @@ DETAILS:
WARNING:
The Epics REST API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/460668) in GitLab 17.0
and is planned for removal in v5 of the API. Use the [Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
and is planned for removal in v5 of the API.
In GitLab 17.4 or later, if your administrator [enabled the new look for epics](../user/group/epics/epic_work_items.md), use the
[Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
This change is a breaking change.
### List group epic discussion items

View File

@ -12,7 +12,9 @@ DETAILS:
WARNING:
The Epics REST API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/460668) in GitLab 17.0
and is planned for removal in v5 of the API. Use the [Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
and is planned for removal in v5 of the API.
In GitLab 17.4 or later, if your administrator [enabled the new look for epics](../user/group/epics/epic_work_items.md), use the
[Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
This change is a breaking change.
Every API call to the epic issues API endpoint must be authenticated.

View File

@ -12,7 +12,9 @@ DETAILS:
WARNING:
The Epics REST API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/460668) in GitLab 17.0
and is planned for removal in v5 of the API. Use the [Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
and is planned for removal in v5 of the API.
In GitLab 17.4 or later, if your administrator [enabled the new look for epics](../user/group/epics/epic_work_items.md), use the
[Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
This change is a breaking change.
Manages parent-child [epic relationships](../user/group/epics/manage_epics.md#multi-level-child-epics).

View File

@ -12,7 +12,9 @@ DETAILS:
WARNING:
The Epics REST API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/460668) in GitLab 17.0
and is planned for removal in v5 of the API. Use the [Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
and is planned for removal in v5 of the API.
In GitLab 17.4 or later, if your administrator [enabled the new look for epics](../user/group/epics/epic_work_items.md), use the
[Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
This change is a breaking change.
Every API call to epic must be authenticated.

View File

@ -17,21 +17,21 @@ DETAILS:
See [User contribution events](../user/profile/contributions_calendar.md#user-contribution-events) for available types for the `action` parameter.
These options are in lowercase.
### Target Types
### Target types
> - Support for epics [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13056) in GitLab 17.3.
> - Support for epics [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13056) in GitLab 17.3. Your administrator must have [enabled the new look for epics](../user/group/epics/epic_work_items.md).
Available target types for the `target_type` parameter are:
- `epic`
- `issue`
- `milestone`
- `merge_request`
- `epic`. Your administrator must have [enabled the new look for epics](../user/group/epics/epic_work_items.md).
- `issue`.
- `milestone`.
- `merge_request`.
- `note` - Some notes on merge requests may be of the type `DiscussionNote`, instead of `Note`.
`DiscussionNote` items are [not available using the API](discussions.md#understand-note-types-in-the-api).
- `project`
- `snippet`
- `user`
- `project`.
- `snippet`.
- `user`.
These options are in lowercase.
Some epic features like child items, linked items, start dates, due dates, and health statuses are not available using the API.

View File

@ -15,7 +15,9 @@ DETAILS:
WARNING:
The Epics REST API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/460668) in GitLab 17.0
and is planned for removal in v5 of the API. Use the [Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
and is planned for removal in v5 of the API.
In GitLab 17.4 or later, if your administrator [enabled the new look for epics](../user/group/epics/epic_work_items.md), use the
[Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
This change is a breaking change.
If the Related Epics feature is not available in your GitLab plan, a `403` status code is returned.

View File

@ -482,7 +482,9 @@ DETAILS:
WARNING:
The Epics REST API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/460668) in GitLab 17.0
and is planned for removal in v5 of the API. Use the [Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
and is planned for removal in v5 of the API.
In GitLab 17.4 or later, if your administrator [enabled the new look for epics](../user/group/epics/epic_work_items.md), use the
[Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
This change is a breaking change.
### List all epic notes

View File

@ -107,7 +107,9 @@ DETAILS:
WARNING:
The Epics REST API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/460668) in GitLab 17.0
and is planned for removal in v5 of the API. Use the [Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
and is planned for removal in v5 of the API.
In GitLab 17.4 or later, if your administrator [enabled the new look for epics](../user/group/epics/epic_work_items.md), use the
[Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
This change is a breaking change.
### List group epic label events

View File

@ -224,7 +224,9 @@ Example response:
WARNING:
The Epics REST API was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/460668) in GitLab 17.0
and is planned for removal in v5 of the API. Use the [Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
and is planned for removal in v5 of the API.
In GitLab 17.4 or later, if your administrator [enabled the new look for epics](../user/group/epics/epic_work_items.md), use the
[Work Items API](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/work_items/) instead.
This change is a breaking change.
### List group epic state events

View File

@ -26,7 +26,7 @@ Use Pipeline execution policies to enforce CI/CD jobs for all applicable project
The YAML file with pipeline execution policies consists of an array of objects matching pipeline execution
policy schema nested under the `pipeline_execution_policy` key. You can configure a maximum of five
policies under the `pipeline_execution_policy` key. Any other policies configured after
policies under the `pipeline_execution_policy` key per security policy project. Any other policies configured after
the first five are not applied.
When you save a new policy, GitLab validates its contents against [this JSON schema](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/validators/json_schemas/security_orchestration_policy.json).

View File

@ -179,11 +179,6 @@ You can group by:
- Tool
- OWASP top 10 2017
WARNING:
Support for grouping by OWASP top 10 2017 was
[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/458835) in GitLab 17.0 and is planned for
removal in 17.6. Support for grouping by OWASP top 10 2021 is proposed in [issue 440182](https://gitlab.com/gitlab-org/gitlab/-/issues/440182) for GitLab 17.5.
### Group vulnerabilities
Group vulnerabilities on the vulnerability report page to more efficiently triage them.

View File

@ -11,14 +11,14 @@ DETAILS:
**Offering:** GitLab.com, Self-managed, GitLab Dedicated
> - Time tracking for tasks [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/438577) in GitLab 17.0.
> - Time tracking for epics [introduced](https://gitlab.com/groups/gitlab-org/-/epics/12396) in GitLab 17.5.
> - Time tracking for epics [introduced](https://gitlab.com/groups/gitlab-org/-/epics/12396) in GitLab 17.5. Your administrator must have [enabled the new look for epics](../group/epics/epic_work_items.md).
You can estimate and track the time you spend on an item, such as:
- [Epic](../group/epics/index.md)
- [Issue](issues/index.md)
- [Task](../tasks.md)
- [Merge request](merge_requests/index.md)
- [Epic](../group/epics/index.md). Your administrator must have [enabled the new look for epics](../group/epics/epic_work_items.md).
- [Issue](issues/index.md).
- [Task](../tasks.md).
- [Merge request](merge_requests/index.md).
Then you can [view a report](#view-an-items-time-tracking-report) that shows totals over time.

View File

@ -20298,88 +20298,70 @@ msgstr ""
msgid "DuoFreeAccessEndingBanner|Starting %{date}, all GitLab Duo features, including Duo Chat, %{link_start}require a paid add-on subscription.%{link_end} To ensure uninterrupted access to Code Suggestions and Chat, buy Duo Pro and assign seats to your users. Or, for Duo Enterprise options, contact Sales."
msgstr ""
msgid "DuoProDiscover|Accelerate your path to market"
msgid "DuoProDiscover|A single platform integrates the best AI model for each use case across the entire development workflow."
msgstr ""
msgid "DuoProDiscover|Access Chat from the GitLab UI or your preferred IDE."
msgid "DuoProDiscover|Automate mundane tasks"
msgstr ""
msgid "DuoProDiscover|Adopt AI with guardrails"
msgid "DuoProDiscover|Boost productivity with smart code assistance"
msgstr ""
msgid "DuoProDiscover|Automates repetitive tasks and helps catch bugs early."
msgid "DuoProDiscover|Boost team collaboration"
msgstr ""
msgid "DuoProDiscover|Automatically generate lines of code, including full functions, from single and multi-line comments as well as comment blocks."
msgid "DuoProDiscover|Catch bugs early in the workflow by generating tests for the selected content."
msgstr ""
msgid "DuoProDiscover|Automatically generate new lines of code from a few typed characters."
msgid "DuoProDiscover|GitLab Duo Chat"
msgstr ""
msgid "DuoProDiscover|Available in 15 languages, including C++, C#, Go, Java, JavaScript, Python, PHP, Ruby, Rust, Scala, Kotlin, and TypeScript. And you can use your favorite IDE — VS Code, Visual Studio, JetBrains' suite of IDEs, and Neovim are all supported."
msgid "DuoProDiscover|GitLab Duo Code Suggestions"
msgstr ""
msgid "DuoProDiscover|Chat from any location"
msgstr ""
msgid "DuoProDiscover|Code Explanation"
msgstr ""
msgid "DuoProDiscover|Code Refactoring"
msgstr ""
msgid "DuoProDiscover|Code Suggestions"
msgstr ""
msgid "DuoProDiscover|Code completion"
msgstr ""
msgid "DuoProDiscover|Code generation"
msgstr ""
msgid "DuoProDiscover|Committed to transparent AI"
msgstr ""
msgid "DuoProDiscover|Develop and deploy secure software faster with AI in every phase of the software development lifecycle — from planning and code creation to testing, security, and monitoring."
msgstr ""
msgid "DuoProDiscover|For organizations and teams to trust AI, it must be transparent. GitLab's %{link_start}AI Transparency Center%{link_end} details how we uphold ethics and transparency in our AI-powered features."
msgstr ""
msgid "DuoProDiscover|Give your developers a single platform that integrates the best AI model for each use case across the entire workflow, from understanding code to fixing security vulnerabilities."
msgstr ""
msgid "DuoProDiscover|Helps you understand code by explaining it in natural language."
msgid "DuoProDiscover|GitLab Duo Test generation"
msgstr ""
msgid "DuoProDiscover|Improve developer experience"
msgstr ""
msgid "DuoProDiscover|Language and IDE support"
msgid "DuoProDiscover|Maintain control over the data that's sent to an external large language model (LLM) service. Your organization's proprietary data or code are never used to train external AI models."
msgstr ""
msgid "DuoProDiscover|Launch Demo"
msgid "DuoProDiscover|Modernize code faster"
msgstr ""
msgid "DuoProDiscover|Read documentation"
msgid "DuoProDiscover|Privacy-first AI"
msgstr ""
msgid "DuoProDiscover|Real-time guidance"
msgstr ""
msgid "DuoProDiscover|Refactor code into modern languages with AI-powered GitLab Duo"
msgstr ""
msgid "DuoProDiscover|Ship software faster and more securely with AI integrated into your entire DevSecOps lifecycle."
msgstr ""
msgid "DuoProDiscover|Test Generation"
msgid "DuoProDiscover|Streamline communication, facilitate knowledge sharing, and improve project management."
msgstr ""
msgid "DuoProDiscover|What's new in GitLab Duo Chat"
msgid "DuoProDiscover|Streamline the refactoring process with AI-powered recommendations to optimize code structure and improve readability."
msgstr ""
msgid "DuoProDiscover|Why GitLab Duo?"
msgid "DuoProDiscover|The GitLab %{link_start}AI Transparency Center%{link_end} details how we uphold ethics and transparency in our AI-powered features."
msgstr ""
msgid "DuoProDiscover|With GitLab Duo, you control which users, projects, and groups can use AI-powered capabilities. Also, your organization's proprietary code and data aren't used to train AI models."
msgid "DuoProDiscover|Transparent AI"
msgstr ""
msgid "DuoProDiscover|Work to improve existing code quality."
msgid "DuoProDiscover|Use Chat to get up to speed on the status of projects, and quickly learn about GitLab, directly in your IDE or web interface."
msgstr ""
msgid "DuoProDiscover|Why GitLab Duo Pro?"
msgstr ""
msgid "DuoProDiscover|Write secure code faster and save time with Code Suggestions in more than 20 languages, available in your favorite IDE."
msgstr ""
msgid "DuoProTrial|Activate my trial"

View File

@ -273,6 +273,7 @@
"chalk": "^2.4.1",
"chokidar": "^3.5.3",
"commander": "^2.20.3",
"crypto": "^1.0.1",
"custom-jquery-matchers": "^2.1.0",
"eslint": "8.57.1",
"eslint-import-resolver-jest": "3.0.2",

View File

@ -0,0 +1,9 @@
import crypto from 'crypto';
export const stubCrypto = () => {
Object.defineProperty(global.self, 'crypto', {
value: {
subtle: crypto.webcrypto.subtle,
},
});
};

View File

@ -834,6 +834,65 @@ describe('DiffsStoreMutations', () => {
expect(state.diffFiles[0][INLINE_DIFF_LINES_KEY][0].discussionsExpanded).toBe(true);
});
it('should keep expanded state when re-adding existing discussions', () => {
const diffPosition = {
base_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
head_sha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
new_line: null,
new_path: '500-lines-4.txt',
old_line: 5,
old_path: '500-lines-4.txt',
start_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
};
const state = {
latestDiff: true,
diffFiles: [
{
file_hash: 'ABC',
discussions: [],
[INLINE_DIFF_LINES_KEY]: [
{
line_code: 'ABC_1',
discussions: [],
},
],
},
],
};
const discussion = {
id: 1,
line_code: 'ABC_2',
line_codes: ['ABC_1'],
diff_discussion: true,
resolvable: true,
original_position: {},
position: {},
positions: [diffPosition],
diff_file: {
file_hash: state.diffFiles[0].file_hash,
},
};
const diffPositionByLineCode = {
ABC_1: diffPosition,
};
mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
discussion,
diffPositionByLineCode,
});
mutations[types.SET_EXPAND_ALL_DIFF_DISCUSSIONS](state, false);
mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
discussion,
diffPositionByLineCode,
});
expect(state.diffFiles[0][INLINE_DIFF_LINES_KEY][0].discussionsExpanded).toBe(false);
});
});
});

View File

@ -822,6 +822,65 @@ describe('DiffsStoreMutations', () => {
expect(store.diffFiles[0][INLINE_DIFF_LINES_KEY][0].discussionsExpanded).toBe(true);
});
it('should keep expanded state when re-adding existing discussions', () => {
const diffPosition = {
base_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
head_sha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
new_line: null,
new_path: '500-lines-4.txt',
old_line: 5,
old_path: '500-lines-4.txt',
start_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
};
store.$patch({
latestDiff: true,
diffFiles: [
{
file_hash: 'ABC',
discussions: [],
[INLINE_DIFF_LINES_KEY]: [
{
line_code: 'ABC_1',
discussions: [],
},
],
},
],
});
const discussion = {
id: 1,
line_code: 'ABC_2',
line_codes: ['ABC_1'],
diff_discussion: true,
resolvable: true,
original_position: {},
position: {},
positions: [diffPosition],
diff_file: {
file_hash: store.diffFiles[0].file_hash,
},
};
const diffPositionByLineCode = {
ABC_1: diffPosition,
};
store[types.SET_LINE_DISCUSSIONS_FOR_FILE]({
discussion,
diffPositionByLineCode,
});
store[types.SET_EXPAND_ALL_DIFF_DISCUSSIONS](false);
store[types.SET_LINE_DISCUSSIONS_FOR_FILE]({
discussion,
diffPositionByLineCode,
});
expect(store.diffFiles[0][INLINE_DIFF_LINES_KEY][0].discussionsExpanded).toBe(false);
});
});
});

View File

@ -2,6 +2,8 @@ import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
import { nextTick } from 'vue';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { useMockInternalEventsTracking } from 'helpers/tracking_internal_events_helper';
import { stubCrypto } from 'helpers/crypto';
import GlqlFacade from '~/glql/components/common/facade.vue';
import { executeAndPresentQuery } from '~/glql/core';
import Counter from '~/glql/utils/counter';
@ -10,6 +12,8 @@ jest.mock('~/glql/core');
describe('GlqlFacade', () => {
let wrapper;
const { bindInternalEventDocument } = useMockInternalEventsTracking();
const createComponent = (props = {}) => {
wrapper = mountExtended(GlqlFacade, {
propsData: {
@ -19,6 +23,8 @@ describe('GlqlFacade', () => {
});
};
beforeEach(stubCrypto);
it('renders the query in a code block', () => {
createComponent();
expect(wrapper.find('code').text()).toBe('assignee = "foo"');
@ -41,13 +47,28 @@ describe('GlqlFacade', () => {
expect(wrapper.emitted()).toHaveProperty('loaded');
});
it('renders presenter component after successful query execution', async () => {
describe('when the query is successful', () => {
const MockComponent = { render: (h) => h('div') };
executeAndPresentQuery.mockResolvedValue(MockComponent);
createComponent();
await waitForPromises();
expect(wrapper.findComponent(MockComponent).exists()).toBe(true);
beforeEach(async () => {
executeAndPresentQuery.mockResolvedValue(MockComponent);
createComponent();
await waitForPromises();
});
it('renders presenter component after successful query execution', () => {
expect(wrapper.findComponent(MockComponent).exists()).toBe(true);
});
it('tracks GLQL render event', () => {
const { trackEventSpy } = bindInternalEventDocument(wrapper.element);
expect(trackEventSpy).toHaveBeenCalledWith(
'render_glql_block',
{ label: '2962e3a32ad4bbe0d402e183b60ba858fe907e125df39f3221a01162959531b8' },
undefined,
);
});
});
describe('when the query results in an error', () => {

View File

@ -1,4 +1,5 @@
import * as textUtils from '~/lib/utils/text_utility';
import { stubCrypto } from 'helpers/crypto';
describe('text_utility', () => {
describe('addDelimiter', () => {
@ -458,4 +459,13 @@ describe('text_utility', () => {
expect(textUtils.wildcardMatch(str, pattern)).toBe(result);
});
});
describe('sha256', () => {
beforeEach(stubCrypto);
it('returns a sha256 hash', async () => {
const hash = await textUtils.sha256('How vexingly quick daft zebras jump!');
expect(hash).toBe('3f7282eed1c3cef3efc993275e9b9cc0cfe85927450d6b0e5d73a2c59663232e');
});
});
});

View File

@ -5255,6 +5255,11 @@ crypto-browserify@^3.11.0:
randombytes "^2.0.0"
randomfill "^1.0.3"
crypto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037"
integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==
css-functions-list@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea"
@ -13135,16 +13140,7 @@ string-length@^4.0.1:
char-regex "^1.0.2"
strip-ansi "^6.0.0"
"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@ -13197,7 +13193,7 @@ string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@ -13211,13 +13207,6 @@ strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^7.0.1, strip-ansi@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
@ -14909,7 +14898,7 @@ worker-loader@^3.0.8:
loader-utils "^2.0.0"
schema-utils "^3.0.0"
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@ -14927,15 +14916,6 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"