diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-22 12:09:26 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-22 12:09:26 +0300 |
commit | 2b0b59094ad207c5e608537d398c822970930b19 (patch) | |
tree | b4e1a937b7ff53d3f465fd82bd854c9607b9717f | |
parent | b06ba604b8d1b40758ebbda5008fe3294d0f2a2a (diff) |
Add latest changes from gitlab-org/gitlab@master
28 files changed, 153 insertions, 76 deletions
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 02e450f7691..87d8838e8ed 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -5091c327992b8c85dcc859788c4cafb83a13f9f3 +ccf2c4c167fc08550f8b92200b512cae75f19993 diff --git a/app/assets/javascripts/issuable/components/issuable_header_warnings.vue b/app/assets/javascripts/issuable/components/issuable_header_warnings.vue index 0e58f3793bc..82930cc0e9a 100644 --- a/app/assets/javascripts/issuable/components/issuable_header_warnings.vue +++ b/app/assets/javascripts/issuable/components/issuable_header_warnings.vue @@ -2,7 +2,7 @@ import { GlIcon, GlTooltipDirective } from '@gitlab/ui'; import { mapGetters } from 'vuex'; import { sprintf, __ } from '~/locale'; -import { TYPE_ISSUE, WorkspaceType } from '~/issues/constants'; +import { TYPE_ISSUE, WORKSPACE_PROJECT } from '~/issues/constants'; import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue'; @@ -13,7 +13,7 @@ const NoteableTypeText = { export default { TYPE_ISSUE, - WorkspaceType, + WORKSPACE_PROJECT, components: { GlIcon, ConfidentialityBadge, @@ -60,7 +60,7 @@ export default { <confidentiality-badge v-if="isConfidential" data-testid="confidential" - :workspace-type="$options.WorkspaceType.project" + :workspace-type="$options.WORKSPACE_PROJECT" :issuable-type="$options.TYPE_ISSUE" /> <template v-for="meta in warningIconsMeta"> diff --git a/app/assets/javascripts/issuable/issuable_label_selector.js b/app/assets/javascripts/issuable/issuable_label_selector.js index ad8bbf04d6f..b74873e5e79 100644 --- a/app/assets/javascripts/issuable/issuable_label_selector.js +++ b/app/assets/javascripts/issuable/issuable_label_selector.js @@ -5,7 +5,7 @@ import { DropdownVariant, LabelType, } from '~/sidebar/components/labels/labels_select_widget/constants'; -import { WorkspaceType } from '~/issues/constants'; +import { WORKSPACE_PROJECT } from '~/issues/constants'; import IssuableLabelSelector from '~/vue_shared/issuable/create/components/issuable_label_selector.vue'; Vue.use(VueApollo); @@ -47,7 +47,7 @@ export default () => { labelsFilterBasePath, labelsManagePath, variant: DropdownVariant.Embedded, - workspaceType: WorkspaceType.project, + workspaceType: WORKSPACE_PROJECT, }, render(createElement) { return createElement(IssuableLabelSelector); diff --git a/app/assets/javascripts/issues/constants.js b/app/assets/javascripts/issues/constants.js index 9f8b876a629..52e012c1e6c 100644 --- a/app/assets/javascripts/issues/constants.js +++ b/app/assets/javascripts/issues/constants.js @@ -10,6 +10,9 @@ export const TYPE_EPIC = 'epic'; export const TYPE_INCIDENT = 'incident'; export const TYPE_ISSUE = 'issue'; +export const WORKSPACE_GROUP = 'group'; +export const WORKSPACE_PROJECT = 'project'; + export const IssuableStatusText = { [STATUS_CLOSED]: __('Closed'), [STATUS_OPEN]: __('Open'), @@ -30,8 +33,3 @@ export const IssueType = { Incident: 'incident', TestCase: 'test_case', }; - -export const WorkspaceType = { - project: 'project', - group: 'group', -}; diff --git a/app/assets/javascripts/issues/show/components/app.vue b/app/assets/javascripts/issues/show/components/app.vue index ffa6607a355..0be11c5c537 100644 --- a/app/assets/javascripts/issues/show/components/app.vue +++ b/app/assets/javascripts/issues/show/components/app.vue @@ -8,7 +8,7 @@ import { TYPE_EPIC, TYPE_INCIDENT, TYPE_ISSUE, - WorkspaceType, + WORKSPACE_PROJECT, } from '~/issues/constants'; import Poll from '~/lib/utils/poll'; import { visitUrl } from '~/lib/utils/url_utility'; @@ -26,7 +26,7 @@ import PinnedLinks from './pinned_links.vue'; import TitleComponent from './title.vue'; export default { - WorkspaceType, + WORKSPACE_PROJECT, components: { GlIcon, GlBadge, @@ -534,7 +534,7 @@ export default { <confidentiality-badge v-if="isConfidential" data-testid="confidential" - :workspace-type="$options.WorkspaceType.project" + :workspace-type="$options.WORKSPACE_PROJECT" :issuable-type="issuableType" /> <span diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue index 1eeb725d5c9..196a86a931a 100644 --- a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue +++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue @@ -1,7 +1,7 @@ <script> import { GlIcon, GlAlert, GlTooltipDirective } from '@gitlab/ui'; import { __ } from '~/locale'; -import { TYPE_EPIC, WorkspaceType } from '~/issues/constants'; +import { TYPE_EPIC, WORKSPACE_GROUP, WORKSPACE_PROJECT } from '~/issues/constants'; import { confidentialityInfoText } from '~/vue_shared/constants'; export default { @@ -25,7 +25,7 @@ export default { computed: { confidentialBodyText() { return confidentialityInfoText( - this.issuableType === TYPE_EPIC ? WorkspaceType.group : WorkspaceType.project, + this.issuableType === TYPE_EPIC ? WORKSPACE_GROUP : WORKSPACE_PROJECT, this.issuableType, ); }, diff --git a/app/assets/javascripts/sidebar/components/milestone/milestone_dropdown.vue b/app/assets/javascripts/sidebar/components/milestone/milestone_dropdown.vue index 8072154cd28..69ed881a1e6 100644 --- a/app/assets/javascripts/sidebar/components/milestone/milestone_dropdown.vue +++ b/app/assets/javascripts/sidebar/components/milestone/milestone_dropdown.vue @@ -2,7 +2,7 @@ import { GlDropdownItem } from '@gitlab/ui'; import { TYPENAME_MILESTONE } from '~/graphql_shared/constants'; import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils'; -import { IssuableType, TYPE_ISSUE, WorkspaceType } from '~/issues/constants'; +import { IssuableType, TYPE_ISSUE, WORKSPACE_GROUP, WORKSPACE_PROJECT } from '~/issues/constants'; import { __ } from '~/locale'; import { IssuableAttributeType } from '../../constants'; import SidebarDropdown from '../sidebar_dropdown.vue'; @@ -64,7 +64,7 @@ export default { type: String, required: true, validator(value) { - return [WorkspaceType.group, WorkspaceType.project].includes(value); + return [WORKSPACE_GROUP, WORKSPACE_PROJECT].includes(value); }, }, }, diff --git a/app/assets/javascripts/sidebar/components/sidebar_dropdown.vue b/app/assets/javascripts/sidebar/components/sidebar_dropdown.vue index d68e4974ea4..6c0038aae1f 100644 --- a/app/assets/javascripts/sidebar/components/sidebar_dropdown.vue +++ b/app/assets/javascripts/sidebar/components/sidebar_dropdown.vue @@ -8,7 +8,13 @@ import { GlSearchBoxByType, } from '@gitlab/ui'; import { kebabCase, snakeCase } from 'lodash'; -import { IssuableType, TYPE_EPIC, TYPE_ISSUE, WorkspaceType } from '~/issues/constants'; +import { + IssuableType, + TYPE_EPIC, + TYPE_ISSUE, + WORKSPACE_GROUP, + WORKSPACE_PROJECT, +} from '~/issues/constants'; import { __ } from '~/locale'; import { defaultEpicSort, @@ -76,9 +82,9 @@ export default { workspaceType: { type: String, required: false, - default: WorkspaceType.project, + default: WORKSPACE_PROJECT, validator(value) { - return [WorkspaceType.group, WorkspaceType.project].includes(value); + return [WORKSPACE_GROUP, WORKSPACE_PROJECT].includes(value); }, }, }, diff --git a/app/assets/javascripts/sidebar/constants.js b/app/assets/javascripts/sidebar/constants.js index c9a50696fe5..499e58de19e 100644 --- a/app/assets/javascripts/sidebar/constants.js +++ b/app/assets/javascripts/sidebar/constants.js @@ -3,7 +3,13 @@ import { s__, __, sprintf } from '~/locale'; import updateIssueLabelsMutation from '~/boards/graphql/issue_set_labels.mutation.graphql'; import userSearchQuery from '~/graphql_shared/queries/users_search.query.graphql'; import userSearchWithMRPermissionsQuery from '~/graphql_shared/queries/users_search_with_mr_permissions.graphql'; -import { IssuableType, TYPE_EPIC, TYPE_ISSUE, WorkspaceType } from '~/issues/constants'; +import { + IssuableType, + TYPE_EPIC, + TYPE_ISSUE, + WORKSPACE_GROUP, + WORKSPACE_PROJECT, +} from '~/issues/constants'; import updateAlertAssigneesMutation from '~/vue_shared/alert_details/graphql/mutations/alert_set_assignees.mutation.graphql'; import updateTestCaseLabelsMutation from './components/labels/labels_select_widget/graphql/update_test_case_labels.mutation.graphql'; import epicLabelsQuery from './components/labels/labels_select_widget/graphql/epic_labels.query.graphql'; @@ -128,10 +134,10 @@ export const referenceQueries = { }; export const workspaceLabelsQueries = { - [WorkspaceType.project]: { + [WORKSPACE_PROJECT]: { query: projectLabelsQuery, }, - [WorkspaceType.group]: { + [WORKSPACE_GROUP]: { query: groupLabelsQuery, }, }; @@ -249,14 +255,14 @@ export const issuableMilestoneQueries = { export const milestonesQueries = { [TYPE_ISSUE]: { query: { - [WorkspaceType.group]: groupMilestonesQuery, - [WorkspaceType.project]: projectMilestonesQuery, + [WORKSPACE_GROUP]: groupMilestonesQuery, + [WORKSPACE_PROJECT]: projectMilestonesQuery, }, }, [IssuableType.MergeRequest]: { query: { - [WorkspaceType.group]: groupMilestonesQuery, - [WorkspaceType.project]: projectMilestonesQuery, + [WORKSPACE_GROUP]: groupMilestonesQuery, + [WORKSPACE_PROJECT]: projectMilestonesQuery, }, }, }; diff --git a/app/assets/javascripts/vue_shared/constants.js b/app/assets/javascripts/vue_shared/constants.js index fd151751372..1463f37171c 100644 --- a/app/assets/javascripts/vue_shared/constants.js +++ b/app/assets/javascripts/vue_shared/constants.js @@ -1,5 +1,5 @@ import { __, n__, sprintf } from '~/locale'; -import { TYPE_ISSUE, WorkspaceType } from '~/issues/constants'; +import { TYPE_ISSUE, WORKSPACE_PROJECT } from '~/issues/constants'; const INTERVALS = { minute: 'minute', @@ -87,7 +87,7 @@ export const confidentialityInfoText = (workspaceType, issuableType) => 'Only %{workspaceType} members with %{permissions} can view or be notified about this %{issuableType}.', ), { - workspaceType: workspaceType === WorkspaceType.project ? __('project') : __('group'), + workspaceType: workspaceType === WORKSPACE_PROJECT ? __('project') : __('group'), issuableType: issuableType === TYPE_ISSUE ? __('issue') : __('epic'), permissions: issuableType === TYPE_ISSUE diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 485ca3a3850..700ee6a346e 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -451,7 +451,12 @@ class MergeRequest < ApplicationRecord def self.total_time_to_merge join_metrics - .merge(MergeRequest::Metrics.with_valid_time_to_merge) + .where( + # Replicating the scope MergeRequest::Metrics.with_valid_time_to_merge + MergeRequest::Metrics.arel_table[:merged_at].gt( + MergeRequest::Metrics.arel_table[:created_at] + ) + ) .pick(MergeRequest::Metrics.time_to_merge_expression) end diff --git a/config/application.rb b/config/application.rb index a1ed5fbd58a..a9008e387cf 100644 --- a/config/application.rb +++ b/config/application.rb @@ -268,6 +268,7 @@ module Gitlab config.assets.precompile << "page_bundles/branches.css" config.assets.precompile << "page_bundles/build.css" config.assets.precompile << "page_bundles/ci_status.css" + config.assets.precompile << "page_bundles/ci_cd_settings.css" config.assets.precompile << "page_bundles/cluster_agents.css" config.assets.precompile << "page_bundles/clusters.css" config.assets.precompile << "page_bundles/cycle_analytics.css" diff --git a/config/metrics/counts_28d/20230217215050_ci_internal_pipelines.yml b/config/metrics/counts_28d/20230217215050_ci_internal_pipelines.yml new file mode 100644 index 00000000000..8c482d8fe49 --- /dev/null +++ b/config/metrics/counts_28d/20230217215050_ci_internal_pipelines.yml @@ -0,0 +1,23 @@ +--- +key_path: counts_monthly.ci_internal_pipelines +description: Total monthly (28D) pipelines in Gitlab repositories for all project and project types +product_section: ops +product_stage: verify +product_group: pipeline_execution +product_category: continuous_integration +value_type: number +status: active +milestone: "15.10" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/112370 +time_frame: 28d +data_source: database +data_category: optional +instrumentation_class: CountCiInternalPipelinesMetric +performance_indicator_type: [] +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate diff --git a/db/post_migrate/20230218145930_add_index_users_on_updated_at.rb b/db/post_migrate/20230218145930_add_index_users_on_updated_at.rb new file mode 100644 index 00000000000..229c3e1babd --- /dev/null +++ b/db/post_migrate/20230218145930_add_index_users_on_updated_at.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class AddIndexUsersOnUpdatedAt < Gitlab::Database::Migration[2.1] + TABLE_NAME = 'users' + INDEX_NAME = 'index_users_on_updated_at' + + disable_ddl_transaction! + + def up + add_concurrent_index TABLE_NAME, :updated_at, name: INDEX_NAME + end + + def down + remove_concurrent_index_by_name TABLE_NAME, INDEX_NAME + end +end diff --git a/db/post_migrate/20230218145940_add_index_namespaces_on_updated_at.rb b/db/post_migrate/20230218145940_add_index_namespaces_on_updated_at.rb new file mode 100644 index 00000000000..cbad26fb142 --- /dev/null +++ b/db/post_migrate/20230218145940_add_index_namespaces_on_updated_at.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class AddIndexNamespacesOnUpdatedAt < Gitlab::Database::Migration[2.1] + TABLE_NAME = 'namespaces' + INDEX_NAME = 'index_namespaces_on_updated_at' + + disable_ddl_transaction! + + def up + add_concurrent_index TABLE_NAME, :updated_at, name: INDEX_NAME + end + + def down + remove_concurrent_index_by_name TABLE_NAME, INDEX_NAME + end +end diff --git a/db/schema_migrations/20230218145930 b/db/schema_migrations/20230218145930 new file mode 100644 index 00000000000..17e1cb01703 --- /dev/null +++ b/db/schema_migrations/20230218145930 @@ -0,0 +1 @@ +63c47c7a879d54b4773f672ce8b771b3d416d44740b4a56c2cc05d4486daffab
\ No newline at end of file diff --git a/db/schema_migrations/20230218145940 b/db/schema_migrations/20230218145940 new file mode 100644 index 00000000000..0017b48bd5c --- /dev/null +++ b/db/schema_migrations/20230218145940 @@ -0,0 +1 @@ +3e3fcc5b0f186e722dbd2fe7b89cd1d32c59830bc66e7efb3fe1513f9fa2ba03
\ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index a732006ceb8..d91ddadf7b1 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -30861,6 +30861,8 @@ CREATE INDEX index_namespaces_on_type_and_id ON namespaces USING btree (type, id CREATE INDEX index_namespaces_on_type_and_visibility_and_parent_id ON namespaces USING btree (id) WHERE (((type)::text = 'Group'::text) AND (parent_id IS NULL) AND (visibility_level <> 20)); +CREATE INDEX index_namespaces_on_updated_at ON namespaces USING btree (updated_at); + CREATE INDEX index_namespaces_public_groups_name_id ON namespaces USING btree (name, id) WHERE (((type)::text = 'Group'::text) AND (visibility_level = 20)); CREATE INDEX index_namespaces_storage_limit_exclusions_on_namespace_id ON namespaces_storage_limit_exclusions USING btree (namespace_id); @@ -32035,6 +32037,8 @@ CREATE INDEX index_users_on_unconfirmed_email ON users USING btree (unconfirmed_ CREATE UNIQUE INDEX index_users_on_unlock_token ON users USING btree (unlock_token); +CREATE INDEX index_users_on_updated_at ON users USING btree (updated_at); + CREATE INDEX index_users_on_user_type_and_id ON users USING btree (user_type, id); CREATE INDEX index_users_on_username ON users USING btree (username); diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md index 90da47f7995..3a00260770e 100644 --- a/doc/user/project/quick_actions.md +++ b/doc/user/project/quick_actions.md @@ -69,7 +69,7 @@ threads. Some quick actions might not be available to all subscription tiers. | `/copy_metadata <!merge_request>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Copy labels and milestone from another merge request in the project. | | `/copy_metadata <#issue>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Copy labels and milestone from another issue in the project. | | `/create_merge_request <branch name>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Create a new merge request starting from the current issue. | -| `/done` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Mark to do as done. | +| `/done` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Mark to-do item as done. | | `/draft` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Set the [draft status](merge_requests/drafts.md). Use for toggling the draft status ([deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92654) in GitLab 15.4.) | | `/due <date>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Set due date. Examples of valid `<date>` include `in 2 days`, `this Friday` and `December 31st`. See [Chronic](https://gitlab.com/gitlab-org/ruby/gems/gitlab-chronic#examples) for more examples. | | `/duplicate <#issue>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Close this issue. Mark as a duplicate of, and related to, issue `<#issue>`. | diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 7ca8f915895..0070bb1f5a3 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -39289,6 +39289,9 @@ msgstr "" msgid "Select labels" msgstr "" +msgid "Select labels (optional)" +msgstr "" + msgid "Select merge moment" msgstr "" diff --git a/qa/qa/resource/members.rb b/qa/qa/resource/members.rb index adb5acc77f1..7f31808d2ff 100644 --- a/qa/qa/resource/members.rb +++ b/qa/qa/resource/members.rb @@ -31,14 +31,10 @@ module QA parse_body(api_get_from("#{api_members_path}/all")) end - def find_direct_member(username) + def find_member(username) list_members.find { |member| member[:username] == username } end - def find_direct_or_inherited_member(username) - list_all_members.find { |member| member[:username] == username } - end - def invite_group(group, access_level = AccessLevel::GUEST) Support::Retrier.retry_until do QA::Runtime::Logger.info(%(Sharing #{self.class.name} with #{group.name})) diff --git a/qa/qa/specs/features/api/1_manage/user_inherited_access_spec.rb b/qa/qa/specs/features/api/1_manage/user_inherited_access_spec.rb index af78b112be4..124b6c9cd44 100644 --- a/qa/qa/specs/features/api/1_manage/user_inherited_access_spec.rb +++ b/qa/qa/specs/features/api/1_manage/user_inherited_access_spec.rb @@ -39,11 +39,6 @@ module QA before do parent_group.add_member(parent_group_user) - - # Due to the async nature of project authorization refreshes, - # we wait to confirm the user has been added as a member and - # their access level has been updated before proceeding with the test - wait_for_membership_update(parent_group_user, sub_group_project, Resource::Members::AccessLevel::DEVELOPER) end it( @@ -182,16 +177,6 @@ module QA sub_group_user.remove_via_api! end end - - private - - def wait_for_membership_update(user, project, access_level) - Support::Retrier.retry_until(sleep_interval: 1, message: 'Waiting for user membership to be updated') do - found_member = project.reload!.find_direct_or_inherited_member(user.username) - - found_member && found_member.fetch(:access_level) == access_level - end - end end end end diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/group_member_access_request_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/group_member_access_request_spec.rb index 62f596c8915..3a84646977f 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/group/group_member_access_request_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/group/group_member_access_request_spec.rb @@ -65,7 +65,7 @@ module QA it 'adds user to the group', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386792' do - found_member = group.reload!.find_direct_member(user.username) + found_member = group.reload!.find_member(user.username) expect(found_member).not_to be_nil expect(found_member.fetch(:access_level)) @@ -82,7 +82,7 @@ module QA it 'does not add user to the group', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386793' do - found_member = group.reload!.find_direct_member(user.username) + found_member = group.reload!.find_member(user.username) expect(found_member).to be_nil end diff --git a/spec/frontend/sidebar/components/milestone/milestone_dropdown_spec.js b/spec/frontend/sidebar/components/milestone/milestone_dropdown_spec.js index b492753867b..8a0db1715f3 100644 --- a/spec/frontend/sidebar/components/milestone/milestone_dropdown_spec.js +++ b/spec/frontend/sidebar/components/milestone/milestone_dropdown_spec.js @@ -1,7 +1,7 @@ import { shallowMount } from '@vue/test-utils'; import { nextTick } from 'vue'; import { getIdFromGraphQLId } from '~/graphql_shared/utils'; -import { TYPE_ISSUE, WorkspaceType } from '~/issues/constants'; +import { TYPE_ISSUE, WORKSPACE_PROJECT } from '~/issues/constants'; import { __ } from '~/locale'; import MilestoneDropdown from '~/sidebar/components/milestone/milestone_dropdown.vue'; import SidebarDropdown from '~/sidebar/components/sidebar_dropdown.vue'; @@ -12,7 +12,7 @@ describe('MilestoneDropdown component', () => { const propsData = { attrWorkspacePath: 'full/path', issuableType: TYPE_ISSUE, - workspaceType: WorkspaceType.project, + workspaceType: WORKSPACE_PROJECT, }; const findHiddenInput = () => wrapper.find('input'); diff --git a/spec/frontend/vue_shared/components/confidentiality_badge_spec.js b/spec/frontend/vue_shared/components/confidentiality_badge_spec.js index 3f7ec156c19..7f9e87bd0aa 100644 --- a/spec/frontend/vue_shared/components/confidentiality_badge_spec.js +++ b/spec/frontend/vue_shared/components/confidentiality_badge_spec.js @@ -1,14 +1,11 @@ import { GlBadge } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; -import { WorkspaceType, TYPE_ISSUE, TYPE_EPIC } from '~/issues/constants'; +import { TYPE_ISSUE, TYPE_EPIC, WORKSPACE_GROUP, WORKSPACE_PROJECT } from '~/issues/constants'; import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue'; -const createComponent = ({ - workspaceType = WorkspaceType.project, - issuableType = TYPE_ISSUE, -} = {}) => +const createComponent = ({ workspaceType = WORKSPACE_PROJECT, issuableType = TYPE_ISSUE } = {}) => shallowMount(ConfidentialityBadge, { propsData: { workspaceType, @@ -28,9 +25,9 @@ describe('ConfidentialityBadge', () => { }); it.each` - workspaceType | issuableType | expectedTooltip - ${WorkspaceType.project} | ${TYPE_ISSUE} | ${'Only project members with at least the Reporter role, the author, and assignees can view or be notified about this issue.'} - ${WorkspaceType.group} | ${TYPE_EPIC} | ${'Only group members with at least the Reporter role can view or be notified about this epic.'} + workspaceType | issuableType | expectedTooltip + ${WORKSPACE_PROJECT} | ${TYPE_ISSUE} | ${'Only project members with at least the Reporter role, the author, and assignees can view or be notified about this issue.'} + ${WORKSPACE_GROUP} | ${TYPE_EPIC} | ${'Only group members with at least the Reporter role can view or be notified about this epic.'} `( 'should render gl-badge with correct tooltip when workspaceType is $workspaceType and issuableType is $issuableType', ({ workspaceType, issuableType, expectedTooltip }) => { diff --git a/spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js b/spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js index 76b6efa15b6..5dddb1eca8f 100644 --- a/spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js +++ b/spec/frontend/vue_shared/issuable/create/components/issuable_label_selector_spec.js @@ -10,7 +10,7 @@ import { DropdownVariant, LabelType, } from '~/sidebar/components/labels/labels_select_widget/constants'; -import { WorkspaceType } from '~/issues/constants'; +import { WORKSPACE_PROJECT } from '~/issues/constants'; import { __ } from '~/locale'; const allowLabelRemove = true; @@ -22,7 +22,7 @@ const initialLabels = []; const issuableType = 'issue'; const labelType = LabelType.project; const variant = DropdownVariant.Embedded; -const workspaceType = WorkspaceType.project; +const workspaceType = WORKSPACE_PROJECT; describe('IssuableLabelSelector', () => { let wrapper; diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_internal_pipelines_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_internal_pipelines_metric_spec.rb index afd8fccd56c..21d4e7690a1 100644 --- a/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_internal_pipelines_metric_spec.rb +++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_internal_pipelines_metric_spec.rb @@ -4,25 +4,27 @@ require 'spec_helper' RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountCiInternalPipelinesMetric, feature_category: :service_ping do - let_it_be(:ci_pipeline_1) { create(:ci_pipeline, source: :external) } - let_it_be(:ci_pipeline_2) { create(:ci_pipeline, source: :push) } - - let(:expected_value) { 1 } - let(:expected_query) do - 'SELECT COUNT("ci_pipelines"."id") FROM "ci_pipelines" ' \ - 'WHERE ("ci_pipelines"."source" IN (1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15) ' \ - 'OR "ci_pipelines"."source" IS NULL)' - end + let_it_be(:ci_pipeline_1) { create(:ci_pipeline, source: :external, created_at: 3.days.ago) } + let_it_be(:ci_pipeline_2) { create(:ci_pipeline, source: :push, created_at: 3.days.ago) } + let_it_be(:old_pipeline) { create(:ci_pipeline, source: :push, created_at: 2.months.ago) } + let_it_be(:expected_value) { 2 } it_behaves_like 'a correct instrumented metric value', { time_frame: 'all', data_source: 'database' } + context 'for monthly counts' do + let_it_be(:expected_value) { 1 } + + it_behaves_like 'a correct instrumented metric value', { time_frame: '28d', data_source: 'database' } + end + context 'on Gitlab.com' do before do allow(Gitlab).to receive(:com?).and_return(true) end - let(:expected_value) { -1 } + let_it_be(:expected_value) { -1 } it_behaves_like 'a correct instrumented metric value', { time_frame: 'all', data_source: 'database' } + it_behaves_like 'a correct instrumented metric value', { time_frame: '28d', data_source: 'database' } end end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 2e2355ba710..d31fe8d2382 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -760,6 +760,23 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev end end + context 'when scoped with :merged_before and :merged_after' do + before do + mr2.metrics.update!(merged_at: mr1.metrics.merged_at - 1.week) + mr3.metrics.update!(merged_at: mr1.metrics.merged_at + 1.week) + end + + it 'excludes merge requests outside of the date range' do + expect( + project.merge_requests.merge( + MergeRequest::Metrics + .merged_before(mr1.metrics.merged_at + 1.day) + .merged_after(mr1.metrics.merged_at - 1.day) + ).total_time_to_merge + ).to be_within(1).of(expected_total_time([mr1])) + end + end + def expected_total_time(mrs) mrs = mrs.reject { |mr| mr.merged_at.nil? } mrs.reduce(0.0) do |sum, mr| |