diff options
27 files changed, 143 insertions, 47 deletions
diff --git a/.gitlab/ci/cng/main.gitlab-ci.yml b/.gitlab/ci/cng/main.gitlab-ci.yml index 325b06d59cd..bee502e3b0b 100644 --- a/.gitlab/ci/cng/main.gitlab-ci.yml +++ b/.gitlab/ci/cng/main.gitlab-ci.yml @@ -9,7 +9,7 @@ stages: include: - local: .gitlab/ci/global.gitlab-ci.yml -review-build-cng-env: +.review-build-cng-env: image: ${GITLAB_DEPENDENCY_PROXY_ADDRESS}ruby:${RUBY_VERSION}-alpine3.16 stage: prepare needs: @@ -34,7 +34,7 @@ review-build-cng-env: expire_in: 7 days when: always -review-build-cng: +.review-build-cng: stage: prepare inherit: variables: false diff --git a/.gitlab/ci/release-environments/main.gitlab-ci.yml b/.gitlab/ci/release-environments/main.gitlab-ci.yml index 7eb67509301..ff15673d48d 100644 --- a/.gitlab/ci/release-environments/main.gitlab-ci.yml +++ b/.gitlab/ci/release-environments/main.gitlab-ci.yml @@ -3,9 +3,13 @@ include: - local: .gitlab/ci/cng/main.gitlab-ci.yml review-build-cng-env: + extends: + - .review-build-cng-env allow_failure: true review-build-cng: + extends: + - .review-build-cng needs: ["review-build-cng-env"] variables: IMAGE_TAG_EXT: "-${CI_COMMIT_SHORT_SHA}" diff --git a/.gitlab/ci/review-apps/main.gitlab-ci.yml b/.gitlab/ci/review-apps/main.gitlab-ci.yml index c5f56076ce7..9955c2cf27a 100644 --- a/.gitlab/ci/review-apps/main.gitlab-ci.yml +++ b/.gitlab/ci/review-apps/main.gitlab-ci.yml @@ -30,11 +30,14 @@ dont-interrupt-me: review-build-cng-env: extends: + - .review-build-cng-env - .default-retry - .review:rules:review-build-cng review-build-cng: - extends: .review:rules:review-build-cng + extends: + - .review-build-cng + - .review:rules:review-build-cng needs: ["review-build-cng-env"] .review-workflow-base: diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue index a3f58cc3323..c8a4f32d5a7 100644 --- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue +++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue @@ -81,7 +81,6 @@ export default { extraAttrs: { class: 'gl-text-red-500!', 'data-testid': 'single-delete-button', - 'data-qa-selector': 'tag_delete_button', }, action: () => { this.$emit('delete'); @@ -143,7 +142,6 @@ export default { <div v-gl-tooltip="{ title: tag.name }" data-testid="name" - data-qa-selector="tag_name_content" class="gl-text-overflow-ellipsis gl-overflow-hidden gl-white-space-nowrap" :class="mobileClasses" > @@ -201,7 +199,6 @@ export default { placement="right" :class="{ 'gl-opacity-0 gl-pointer-events-none': disabled }" data-testid="additional-actions" - data-qa-selector="more_actions_menu" :items="items" /> </template> diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue index f6f816f435c..d7043626446 100644 --- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue +++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue @@ -133,7 +133,6 @@ export default { ref="imageName" class="gl-text-body gl-font-weight-bold" data-testid="details-link" - data-qa-selector="registry_image_content" :to="{ name: 'details', params: { id } }" > {{ imageName }} diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue b/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue index 87a2eb362d5..98cc92222b4 100644 --- a/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue +++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue @@ -215,7 +215,7 @@ export default { </template> </gl-form-input-group> <template #description> - <span data-qa-selector="dependency_proxy_count" data-testid="proxy-count"> + <span data-testid="proxy-count"> <gl-sprintf :message="$options.i18n.blobCountAndSize"> <template #count>{{ group.dependencyProxyBlobCount }}</template> <template #size>{{ group.dependencyProxyTotalSize }}</template> diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/shared/package_list_row.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/shared/package_list_row.vue index cc52235eaf3..c92208abfc3 100644 --- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/shared/package_list_row.vue +++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/shared/package_list_row.vue @@ -84,7 +84,7 @@ export default { <gl-link :href="packageLink" class="gl-text-body gl-min-w-0" - data-qa-selector="package_link" + data-testid="details-link" :disabled="disabledRow" > <gl-truncate :text="packageEntity.name" /> diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue index c690e8fac43..bca43d0b20a 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue @@ -135,7 +135,6 @@ export default { :class="errorPackageStyle" class="gl-text-body gl-min-w-0" data-testid="details-link" - data-qa-selector="package_link" :to="{ name: 'details', params: { id: packageId } }" > <gl-truncate :text="packageEntity.name" /> diff --git a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue index d96418571e1..d1982464eb9 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue @@ -221,7 +221,7 @@ export default { attributes: { variant: 'danger', category: 'primary', - 'data-qa-selector': 'delete_modal_button', + 'data-testid': 'delete-modal-button', }, }, fileDeletePrimaryAction: { @@ -254,7 +254,6 @@ export default { v-gl-modal="'delete-modal'" variant="danger" category="primary" - data-qa-selector="delete_button" data-testid="delete-package" > {{ __('Delete') }} @@ -264,7 +263,7 @@ export default { <gl-tabs> <gl-tab :title="__('Detail')"> - <div data-qa-selector="package_information_content"> + <div data-testid="package-information-content"> <package-history :package-entity="packageEntity" :project-name="projectName" /> <installation-commands :package-entity="packageEntity" /> diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 78b722be7d7..42871dcc56f 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -143,6 +143,16 @@ module CommitsHelper end end + def local_committed_date(commit, user) + server_timezone = Time.zone + user_timezone = user.timezone if user + user_timezone = ActiveSupport::TimeZone.new(user_timezone) if user_timezone + + timezone = user_timezone || server_timezone + + commit.committed_date.in_time_zone(timezone).to_date + end + def cherry_pick_projects_data(project) [project, project.forked_from_project].compact.map do |project| { diff --git a/app/views/projects/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml index a0f47f375f7..8df6bfdd697 100644 --- a/app/views/projects/commits/_commits.html.haml +++ b/app/views/projects/commits/_commits.html.haml @@ -7,7 +7,7 @@ - context_commits = @context_commits&.map { |commit| commit.present(current_user: current_user) } - hidden = @hidden_commit_count -- commits.chunk { |c| c.committed_date.in_time_zone.to_date }.each do |day, daily_commits| +- commits.chunk { |commit| local_committed_date(commit, current_user) }.each do |day, daily_commits| %li.js-commit-header.gl-py-2.gl-border-b{ data: { day: day } } %span.day.font-weight-bold= l(day, format: '%b %d, %Y') diff --git a/config/feature_flags/development/advanced_search_decrease_indexing_timeout.yml b/config/feature_flags/development/advanced_search_decrease_indexing_timeout.yml index a1eb407ed32..bb6b4914b9e 100644 --- a/config/feature_flags/development/advanced_search_decrease_indexing_timeout.yml +++ b/config/feature_flags/development/advanced_search_decrease_indexing_timeout.yml @@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/391570 milestone: '15.9' type: development group: group::global search -default_enabled: false +default_enabled: true diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 7e0a50a01ae..c7966e3b138 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -24149,7 +24149,8 @@ Represents a vulnerability. | <a id="vulnerabilitydismissedby"></a>`dismissedBy` | [`UserCore`](#usercore) | User that dismissed the vulnerability. | | <a id="vulnerabilityexternalissuelinks"></a>`externalIssueLinks` | [`VulnerabilityExternalIssueLinkConnection!`](#vulnerabilityexternalissuelinkconnection) | List of external issue links related to the vulnerability. (see [Connections](#connections)) | | <a id="vulnerabilityfalsepositive"></a>`falsePositive` | [`Boolean`](#boolean) | Indicates whether the vulnerability is a false positive. | -| <a id="vulnerabilityhassolutions"></a>`hasSolutions` | [`Boolean`](#boolean) | Indicates whether there is a solution available for this vulnerability. | +| <a id="vulnerabilityhasremediations"></a>`hasRemediations` | [`Boolean`](#boolean) | Indicates whether there is a remediation available for this vulnerability. | +| <a id="vulnerabilityhassolutions"></a>`hasSolutions` **{warning-solid}** | [`Boolean`](#boolean) | **Deprecated** in 16.3. Use `hasRemediations`. | | <a id="vulnerabilityid"></a>`id` | [`ID!`](#id) | GraphQL ID of the vulnerability. | | <a id="vulnerabilityidentifiers"></a>`identifiers` | [`[VulnerabilityIdentifier!]!`](#vulnerabilityidentifier) | Identifiers of the vulnerability. | | <a id="vulnerabilitylinks"></a>`links` | [`[VulnerabilityLink!]!`](#vulnerabilitylink) | List of links associated with the vulnerability. | diff --git a/doc/development/feature_flags/index.md b/doc/development/feature_flags/index.md index d9eb29a7b7f..7c3b6ff439f 100644 --- a/doc/development/feature_flags/index.md +++ b/doc/development/feature_flags/index.md @@ -231,6 +231,20 @@ the feature flag is set to enabled. If the feature contains any database migrati NOTE: To create a feature flag that is only used in EE, add the `--ee` flag: `bin/feature-flag --ee` +### Naming new flags + +When choosing a name for a new feature flag, consider the following guidelines: + +- A long, descriptive name is better than a short but confusing one. +- Write the name in snake case (`my_cool_feature_flag`). +- Avoid using `disable` in the name to avoid having to think (or [document](../documentation/feature_flags.md)) + with double negatives. Consider starting the name with `hide_`, `remove_`, or `disallow_`. + + In software engineering this problem is known as + ["negative names for boolean variables"](https://www.serendipidata.com/posts/naming-guidelines-for-boolean-variables). + But we can't forbid negative words altogether, to be able to introduce flags as + [disabled by default](#feature-flags-in-gitlab-development), use them to remove a feature by moving it behind a flag, or to [selectively disable a flag by actor](controls.md#selectively-disable-by-actor). + ### Risk of a broken master (main) branch WARNING: diff --git a/doc/update/index.md b/doc/update/index.md index d49333b1567..8760dbbd406 100644 --- a/doc/update/index.md +++ b/doc/update/index.md @@ -16,7 +16,7 @@ The [maintenance policy documentation](../policy/maintenance.md) has additional information about upgrading, including: - How to interpret GitLab product versioning. -- Recommendations on the what release to run. +- Recommendations on what release to run. - How we use patch and security patch releases. - When we backport code changes. diff --git a/lib/gitlab/github_import.rb b/lib/gitlab/github_import.rb index 24e77363e1b..3b19b9d16d2 100644 --- a/lib/gitlab/github_import.rb +++ b/lib/gitlab/github_import.rb @@ -16,7 +16,7 @@ module Gitlab } if token_pool - ClientPool.new(token_pool: token_pool, **options) + ClientPool.new(token_pool: token_pool.append(token_to_use), **options) else Client.new(token_to_use, **options) end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 3bfce5e0273..14c88b24cfb 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -19771,6 +19771,9 @@ msgstr "" msgid "For more information, see the File Hooks documentation." msgstr "" +msgid "For the GitLab Team to keep your subscription data up to date, this is a reminder to report your license usage on a monthly basis, or at the cadence set in your agreement with GitLab. This allows us to simplify the billing process for overages and renewals. To report your usage data, export your license usage file and email it to %{renewal_service_email}. If you need an updated license, GitLab will send the license to the email address registered in the %{customers_dot}, and you can upload this license to your instance." +msgstr "" + msgid "For the next few releases, you can go to your avatar at any time to turn the new navigation on and off." msgstr "" @@ -33270,9 +33273,6 @@ msgstr "" msgid "People without permission will never get a notification." msgstr "" -msgid "Per your subscription agreement with GitLab, you must report your license usage data on a monthly basis. GitLab uses this data to keep your subscription up to date. To report your license usage data, export your license usage file and email it to %{renewal_service_email}. If you need an updated license, GitLab will send the license to the email address registered in the %{customers_dot}, and you can upload this license to your instance." -msgstr "" - msgid "Percent rollout must be an integer number between 0 and 100" msgstr "" diff --git a/qa/qa/page/group/dependency_proxy.rb b/qa/qa/page/group/dependency_proxy.rb index fa37e8eac83..1c06ea061e0 100644 --- a/qa/qa/page/group/dependency_proxy.rb +++ b/qa/qa/page/group/dependency_proxy.rb @@ -5,11 +5,11 @@ module QA module Group class DependencyProxy < QA::Page::Base view 'app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue' do - element :dependency_proxy_count + element :proxy_count end def has_blob_count?(blob_text) - has_element?(:dependency_proxy_count, text: blob_text) + has_element?(:proxy_count, text: blob_text) end end end diff --git a/qa/qa/page/project/packages/index.rb b/qa/qa/page/project/packages/index.rb index e58ffba3cd5..eaa708373bb 100644 --- a/qa/qa/page/project/packages/index.rb +++ b/qa/qa/page/project/packages/index.rb @@ -6,27 +6,27 @@ module QA module Packages class Index < QA::Page::Base view 'app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue' do - element :package_link + element :details_link end view 'app/assets/javascripts/packages_and_registries/infrastructure_registry/shared/package_list_row.vue' do - element :package_link + element :details_link end def click_package(name) - click_element(:package_link, text: name) + click_element(:details_link, text: name) end def has_package?(name) - has_element?(:package_link, text: name, wait: 20) + has_element?(:details_link, text: name, wait: 20) end def has_module?(name) - has_element?(:package_link, text: name, wait: 20) + has_element?(:details_link, text: name, wait: 20) end def has_no_package?(name) - has_no_element?(:package_link, text: name) + has_no_element?(:details_link, text: name) end end end diff --git a/qa/qa/page/project/packages/show.rb b/qa/qa/page/project/packages/show.rb index 5ba9ad7df40..b1a98aa7c43 100644 --- a/qa/qa/page/project/packages/show.rb +++ b/qa/qa/page/project/packages/show.rb @@ -6,7 +6,7 @@ module QA module Packages class Show < QA::Page::Base view 'app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue' do - element :delete_button + element :delete_package element :delete_modal_button element :package_information_content end @@ -16,7 +16,7 @@ module QA end def click_delete - click_element(:delete_button) + click_element(:delete_package) wait_for_animated_element(:delete_modal_button) click_element(:delete_modal_button) end diff --git a/qa/qa/page/project/registry/show.rb b/qa/qa/page/project/registry/show.rb index 95850f34962..3fca3764a0e 100644 --- a/qa/qa/page/project/registry/show.rb +++ b/qa/qa/page/project/registry/show.rb @@ -6,34 +6,34 @@ module QA module Registry class Show < QA::Page::Base view 'app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue' do - element :registry_image_content + element :details_link end view 'app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue' do - element :more_actions_menu - element :tag_delete_button - element :tag_name_content + element :additional_actions + element :single_delete_button + element :name end def has_registry_repository?(name) - find_element(:registry_image_content, text: name) + find_element(:details_link, text: name) end def click_on_image(name) - click_element(:registry_image_content, text: name) + click_element(:details_link, text: name) end def has_tag?(tag_name) - has_element?(:tag_name_content, text: tag_name) + has_element?(:name, text: tag_name) end def has_no_tag?(tag_name) - has_no_element?(:tag_name_content, text: tag_name) + has_no_element?(:name, text: tag_name) end def click_delete - click_element(:more_actions_menu) - click_element(:tag_delete_button) + click_element(:additional_actions) + click_element(:single_delete_button) find_button('Delete').click end end diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js index d4b69d3e8e8..09e2c35d449 100644 --- a/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js +++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js @@ -318,7 +318,6 @@ describe('tags list row', () => { expect(findDeleteButton().props('item').extraAttrs).toMatchObject({ class: 'gl-text-red-500!', 'data-testid': 'single-delete-button', - 'data-qa-selector': 'tag_delete_button', }); expect(findDeleteButton().text()).toBe(REMOVE_TAG_BUTTON_TITLE); diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/shared/__snapshots__/package_list_row_spec.js.snap b/spec/frontend/packages_and_registries/infrastructure_registry/components/shared/__snapshots__/package_list_row_spec.js.snap index 08e2de6c18f..250b33cbb14 100644 --- a/spec/frontend/packages_and_registries/infrastructure_registry/components/shared/__snapshots__/package_list_row_spec.js.snap +++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/shared/__snapshots__/package_list_row_spec.js.snap @@ -24,7 +24,7 @@ exports[`packages_list_row renders 1`] = ` > <gl-link-stub class="gl-text-body gl-min-w-0" - data-qa-selector="package_link" + data-testid="details-link" href="foo" > <gl-truncate-stub diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap index 0443fb85dc9..7a488a74dcb 100644 --- a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap +++ b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap @@ -32,7 +32,6 @@ exports[`packages_list_row renders 1`] = ` <router-link-stub ariacurrentvalue="page" class="gl-text-body gl-min-w-0" - data-qa-selector="package_link" data-testid="details-link" event="click" tag="a" diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb index ff4a312f1b5..49adba22ebe 100644 --- a/spec/helpers/commits_helper_spec.rb +++ b/spec/helpers/commits_helper_spec.rb @@ -357,4 +357,46 @@ RSpec.describe CommitsHelper do it { is_expected.to eq(expected_path) } end + + describe '#local_committed_date' do + let(:commit) { build(:commit, committed_date: time) } + let(:user) { build(:user) } + let(:time) { Time.find_zone('UTC').parse('2023-01-01') } + + subject { helper.local_committed_date(commit, user).to_s } + + it { is_expected.to eq('2023-01-01') } + + context 'when user has a custom timezone' do + let(:user) { build(:user, timezone: 'America/Mexico_City') } + + it 'selects timezone of the user' do + is_expected.to eq('2022-12-31') + end + end + + context "when user doesn't have a preferred timezone" do + let(:user) { build(:user, timezone: nil) } + + it 'uses system timezone' do + is_expected.to eq('2023-01-01') + end + end + + context 'when user timezone is not supported' do + let(:user) { build(:user, timezone: 'unknown') } + + it 'uses system timezone' do + is_expected.to eq('2023-01-01') + end + end + + context 'when user is missing' do + let(:user) { nil } + + it 'uses system timezone' do + is_expected.to eq('2023-01-01') + end + end + end end diff --git a/spec/lib/gitlab/github_import_spec.rb b/spec/lib/gitlab/github_import_spec.rb index c4ed4b09f04..898bc40ec1f 100644 --- a/spec/lib/gitlab/github_import_spec.rb +++ b/spec/lib/gitlab/github_import_spec.rb @@ -61,7 +61,7 @@ RSpec.describe Gitlab::GithubImport, feature_category: :importers do expect(described_class::ClientPool) .to receive(:new) - .with(token_pool: %w[foo bar], host: nil, parallel: true, per_page: 100) + .with(token_pool: %w[foo bar 123], host: nil, parallel: true, per_page: 100) described_class.new_client_for(project) end diff --git a/spec/views/projects/commits/show.html.haml_spec.rb b/spec/views/projects/commits/show.html.haml_spec.rb index e5e9906a798..9393ba046dc 100644 --- a/spec/views/projects/commits/show.html.haml_spec.rb +++ b/spec/views/projects/commits/show.html.haml_spec.rb @@ -3,8 +3,10 @@ require 'spec_helper' RSpec.describe 'projects/commits/show.html.haml' do - let(:project) { create(:project, :repository) } - let(:commits) { [project.commit] } + let_it_be(:project) { create(:project, :repository) } + + let(:commits) { [commit] } + let(:commit) { project.commit } let(:path) { 'path/to/doc.md' } before do @@ -32,4 +34,32 @@ RSpec.describe 'projects/commits/show.html.haml' do expect(rendered).to have_link(href: "#{project_commits_path(project, path)}?format=atom") end end + + context 'commits date headers' do + let(:user) { build(:user, timezone: timezone) } + let(:committed_date) { Time.find_zone('UTC').parse('2023-01-01') } + + before do + allow(view).to receive(:current_user).and_return(user) + allow(commit).to receive(:committed_date).and_return(committed_date) + + render + end + + context 'when timezone is UTC' do + let(:timezone) { 'UTC' } + + it "renders commit date header in user's timezone" do + expect(rendered).to include('data-day="2023-01-01"') + end + end + + context 'when timezone is UTC-6' do + let(:timezone) { 'America/Mexico_City' } + + it "renders commit date header in user's timezone" do + expect(rendered).to include('data-day="2022-12-31"') + end + end + end end |