diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml index ac4763103b24f6d2edc44e7c22c0f6d37b9849c0..ef66c8aeb2e1c1cb1afa5de0dc30ad22767bbe88 100644 --- a/.gitlab/ci/rules.gitlab-ci.yml +++ b/.gitlab/ci/rules.gitlab-ci.yml @@ -405,6 +405,7 @@ - <<: *if-security-merge-request changes: *code-backstage-patterns - <<: *if-merge-request-title-as-if-foss + - <<: *if-merge-request-title-run-all-rspec - <<: *if-merge-request changes: *ci-patterns @@ -483,6 +484,7 @@ - <<: *if-security-merge-request changes: *code-qa-patterns - <<: *if-merge-request-title-as-if-foss + - <<: *if-merge-request-title-run-all-rspec - <<: *if-merge-request changes: *ci-patterns @@ -700,6 +702,7 @@ changes: *db-patterns - <<: *if-merge-request-title-as-if-foss changes: *db-patterns + - <<: *if-merge-request-title-run-all-rspec - <<: *if-merge-request changes: *ci-patterns @@ -716,6 +719,7 @@ changes: *db-patterns - <<: *if-merge-request-title-as-if-foss changes: *db-patterns + - <<: *if-merge-request-title-run-all-rspec .rails:rules:as-if-foss-unit: rules: @@ -725,6 +729,7 @@ changes: *backend-patterns - <<: *if-merge-request-title-as-if-foss changes: *backend-patterns + - <<: *if-merge-request-title-run-all-rspec - <<: *if-merge-request changes: *ci-patterns @@ -741,6 +746,7 @@ changes: *backend-patterns - <<: *if-merge-request-title-as-if-foss changes: *backend-patterns + - <<: *if-merge-request-title-run-all-rspec .rails:rules:as-if-foss-integration: rules: @@ -750,6 +756,7 @@ changes: *backend-patterns - <<: *if-merge-request-title-as-if-foss changes: *backend-patterns + - <<: *if-merge-request-title-run-all-rspec - <<: *if-merge-request changes: *ci-patterns @@ -766,6 +773,7 @@ changes: *backend-patterns - <<: *if-merge-request-title-as-if-foss changes: *backend-patterns + - <<: *if-merge-request-title-run-all-rspec .rails:rules:as-if-foss-system: rules: @@ -775,6 +783,7 @@ changes: *code-backstage-patterns - <<: *if-merge-request-title-as-if-foss changes: *code-backstage-patterns + - <<: *if-merge-request-title-run-all-rspec - <<: *if-merge-request changes: *ci-patterns @@ -791,6 +800,7 @@ changes: *code-backstage-patterns - <<: *if-merge-request-title-as-if-foss changes: *code-backstage-patterns + - <<: *if-merge-request-title-run-all-rspec .rails:rules:ee-and-foss-db-library-code: rules: diff --git a/app/views/dashboard/projects/_projects.html.haml b/app/views/dashboard/projects/_projects.html.haml index 5122164dbcba7f0dbf7591d669b179fd8647c85b..06ef89e0b572ad4e97deacd24ead14c2747cd5d7 100644 --- a/app/views/dashboard/projects/_projects.html.haml +++ b/app/views/dashboard/projects/_projects.html.haml @@ -1 +1 @@ -= render 'shared/projects/list', projects: @projects, pipeline_status: Feature.enabled?(:dashboard_pipeline_status, default_enabled: true), user: current_user += render 'shared/projects/list', projects: @projects, pipeline_status: true, user: current_user diff --git a/app/views/projects/runners/_runner.html.haml b/app/views/projects/runners/_runner.html.haml index 41159df1435e02800de55b588be6761b2ebdd9bb..7f5acbbe890af273095d4dfe8a847a0bacc69076 100644 --- a/app/views/projects/runners/_runner.html.haml +++ b/app/views/projects/runners/_runner.html.haml @@ -40,5 +40,5 @@ - if runner.tags.present? %p - runner.tags.map(&:name).sort.each do |tag| - %span.badge.badge-primary + %span.badge.gl-badge.sm.badge-pill.badge-primary = tag diff --git a/changelogs/unreleased/209061-remove-dashboard-pipeline-status-ff.yml b/changelogs/unreleased/209061-remove-dashboard-pipeline-status-ff.yml new file mode 100644 index 0000000000000000000000000000000000000000..5abe0575a0ff1f1cf9aba5e4609cfc524449be5b --- /dev/null +++ b/changelogs/unreleased/209061-remove-dashboard-pipeline-status-ff.yml @@ -0,0 +1,5 @@ +--- +title: Remove dashboard_pipeline_status feature flag +merge_request: 55472 +author: +type: other diff --git a/changelogs/unreleased/gl-badge-runners.yml b/changelogs/unreleased/gl-badge-runners.yml new file mode 100644 index 0000000000000000000000000000000000000000..9b5724012641c71315c93276b46eadfd3ebd5c89 --- /dev/null +++ b/changelogs/unreleased/gl-badge-runners.yml @@ -0,0 +1,5 @@ +--- +title: Apply new GitLab UI for badge in runners list +merge_request: 54766 +author: Yogi (@yo) +type: changed diff --git a/changelogs/unreleased/sfang-do-not-show-token-name.yml b/changelogs/unreleased/sfang-do-not-show-token-name.yml new file mode 100644 index 0000000000000000000000000000000000000000..d4c337a87041b472d11903bacc906fcfd4e063fa --- /dev/null +++ b/changelogs/unreleased/sfang-do-not-show-token-name.yml @@ -0,0 +1,5 @@ +--- +title: Do not expose user name if user is project bot +merge_request: 54022 +author: +type: changed diff --git a/config/feature_flags/development/dashboard_pipeline_status.yml b/config/feature_flags/development/dashboard_pipeline_status.yml deleted file mode 100644 index f24ba5983a80f302c10fc2b1862b60be4477d1dd..0000000000000000000000000000000000000000 --- a/config/feature_flags/development/dashboard_pipeline_status.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: dashboard_pipeline_status -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22029 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/209061 -milestone: '12.7' -type: development -group: group::continuous integration -default_enabled: true diff --git a/ee/app/assets/javascripts/groups/settings/compliance_frameworks/components/delete_modal.vue b/ee/app/assets/javascripts/groups/settings/compliance_frameworks/components/delete_modal.vue index 9410d5f825539713df0c2ff2d0c354bbc9d058ae..6982e1d79aa3b42eece6292a7be12f20a7fd45ac 100644 --- a/ee/app/assets/javascripts/groups/settings/compliance_frameworks/components/delete_modal.vue +++ b/ee/app/assets/javascripts/groups/settings/compliance_frameworks/components/delete_modal.vue @@ -37,13 +37,14 @@ export default { this.reportDeleting(); try { + const { id } = this; const { data: { destroyComplianceFramework }, } = await this.$apollo.mutate({ mutation: deleteComplianceFrameworkMutation, variables: { input: { - id: this.id, + id, }, }, awaitRefetchQueries: true, @@ -62,7 +63,7 @@ export default { if (error) { this.reportError(new Error(error)); } else { - this.reportSuccess(); + this.reportSuccess(id); } } catch (error) { this.reportError(error); @@ -75,8 +76,8 @@ export default { Sentry.captureException(error); this.$emit('error'); }, - reportSuccess() { - this.$emit('delete'); + reportSuccess(id) { + this.$emit('delete', id); }, show() { this.$refs.modal.show(); diff --git a/ee/app/assets/javascripts/groups/settings/compliance_frameworks/components/list.vue b/ee/app/assets/javascripts/groups/settings/compliance_frameworks/components/list.vue index 009fffdd576db882421fda4882b075febe55eb41..4e611aeca4d862f67818292cb64c4927c3af14d4 100644 --- a/ee/app/assets/javascripts/groups/settings/compliance_frameworks/components/list.vue +++ b/ee/app/assets/javascripts/groups/settings/compliance_frameworks/components/list.vue @@ -39,7 +39,7 @@ export default { data() { return { markedForDeletion: {}, - deletingFramework: null, + deletingFrameworksIds: [], complianceFrameworks: [], error: '', message: '', @@ -70,7 +70,7 @@ export default { }, computed: { isLoading() { - return this.$apollo.loading && !this.deletingFramework; + return this.$apollo.loading && this.deletingFrameworksIds.length === 0; }, hasLoaded() { return !this.isLoading && !this.error; @@ -105,15 +105,18 @@ export default { onError() { this.error = this.$options.i18n.deleteError; }, - onDelete() { + onDelete(id) { this.message = this.$options.i18n.deleteMessage; - this.deletingFramework = null; + const idx = this.deletingFrameworksIds.indexOf(id); + if (idx > -1) { + this.deletingFrameworksIds.splice(idx, 1); + } }, onDeleting() { - this.deletingFramework = this.markedForDeletion; + this.deletingFrameworksIds.push(this.markedForDeletion.id); }, - isDeleting(framework) { - return this.deletingFramework === framework; + isDeleting(id) { + return this.deletingFrameworksIds.includes(id); }, }, i18n: { @@ -153,7 +156,7 @@ export default { v-for="framework in complianceFrameworks" :key="framework.parsedId" :framework="framework" - :loading="isDeleting(framework)" + :loading="isDeleting(framework.id)" @delete="markForDeletion" /> </gl-tab> diff --git a/ee/spec/frontend/groups/settings/compliance_frameworks/components/delete_modal_spec.js b/ee/spec/frontend/groups/settings/compliance_frameworks/components/delete_modal_spec.js index cb5178e75ec3319869204792ab74784f3cd86091..6288fe4c0b465b4a077424d20d66f63ed73abee7 100644 --- a/ee/spec/frontend/groups/settings/compliance_frameworks/components/delete_modal_spec.js +++ b/ee/spec/frontend/groups/settings/compliance_frameworks/components/delete_modal_spec.js @@ -117,7 +117,7 @@ describe('DeleteModal', () => { await waitForPromises(); - expect(wrapper.emitted('delete')).toHaveLength(1); + expect(wrapper.emitted('delete')[0]).toEqual([frameworkFoundResponse.id]); }); it('emits "error" event and reports to Sentry when there is a network error', async () => { diff --git a/ee/spec/frontend/groups/settings/compliance_frameworks/components/list_spec.js b/ee/spec/frontend/groups/settings/compliance_frameworks/components/list_spec.js index 112e386fc54bfb83b1c6dea2802deacbd21b2230..54f91013057f15a051e2cf39e8d0cdfb9750d688 100644 --- a/ee/spec/frontend/groups/settings/compliance_frameworks/components/list_spec.js +++ b/ee/spec/frontend/groups/settings/compliance_frameworks/components/list_spec.js @@ -213,13 +213,18 @@ describe('List', () => { expect(findDeleteModal().vm.show).toHaveBeenCalled(); }); - describe('and the item is being deleted', () => { + describe('and multiple items are being deleted', () => { beforeEach(() => { - findDeleteModal().vm.$emit('deleting'); + findListItems().wrappers.forEach((listItem) => { + listItem.vm.$emit('delete', listItem.props('framework')); + findDeleteModal().vm.$emit('deleting'); + }); }); - it('sets "loading" to true on the marked list item', () => { - expect(findListItem().props('loading')).toBe(true); + it('sets "loading" to true on the deleting list items', () => { + expect(findListItems().wrappers.every((listItem) => listItem.props('loading'))).toBe( + true, + ); }); describe('and an error occurred', () => { @@ -238,10 +243,14 @@ describe('List', () => { describe('and the item was successfully deleted', () => { beforeEach(async () => { - findDeleteModal().vm.$emit('delete'); + findDeleteModal().vm.$emit('delete', framework.id); await waitForPromises(); }); + it('sets "loading" to false on the deleted list item', () => { + expect(findListItem().props('loading')).toBe(false); + }); + it('shows the alert for the success message', () => { expect(findAlert().props('dismissible')).toBe(true); expect(findAlert().props('variant')).toBe('info'); diff --git a/lib/api/entities/user_safe.rb b/lib/api/entities/user_safe.rb index feb01767fd6cf5be8bac1647b9b55441729062e4..2b7c14cba6e26c32a64c235d22d4fdd41bf4aca5 100644 --- a/lib/api/entities/user_safe.rb +++ b/lib/api/entities/user_safe.rb @@ -3,7 +3,8 @@ module API module Entities class UserSafe < Grape::Entity - expose :id, :name, :username + expose :id, :username + expose :name, unless: ->(user) { user.project_bot? && !options[:current_user].admin?} end end end diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb index 8705c22c41a6681c5abda53f943f9911759b8bfa..d7330b5267b7666594278d37815167b7b90c5c9c 100644 --- a/spec/features/dashboard/projects_spec.rb +++ b/spec/features/dashboard/projects_spec.rb @@ -198,14 +198,6 @@ it_behaves_like 'hidden pipeline status' end - context 'when dashboard_pipeline_status is disabled' do - before do - stub_feature_flags(dashboard_pipeline_status: false) - end - - it_behaves_like 'hidden pipeline status' - end - context "when last_pipeline is missing" do before do project.last_pipeline.delete diff --git a/spec/features/projects/members/list_spec.rb b/spec/features/projects/members/list_spec.rb index f1fc3927b0374097d899b6a4f2ad495bd1139dc9..3cc3c763e29c6865e90a414c5b196a4bbe7dd285 100644 --- a/spec/features/projects/members/list_spec.rb +++ b/spec/features/projects/members/list_spec.rb @@ -127,7 +127,7 @@ it 'does not show form used to change roles and "Expiration date" or the remove user button' do visit_members_page - page.within find_member_row(project_bot) do + page.within find_username_row(project_bot) do expect(page).not_to have_button('Maintainer') expect(page).to have_field('Expiration date', disabled: true) expect(page).not_to have_button('Remove member') diff --git a/spec/lib/api/entities/user_spec.rb b/spec/lib/api/entities/user_spec.rb index e35deeb6263feb4b16ce2a92f6313d3d34ca0359..0deaf47697707efbce42f94d75dacf67cf00456a 100644 --- a/spec/lib/api/entities/user_spec.rb +++ b/spec/lib/api/entities/user_spec.rb @@ -35,4 +35,22 @@ expect(subject[:bot]).to eq(true) end end + + context 'with project bot user' do + let(:user) { create(:user, :project_bot) } + + context 'when the requester is not an admin' do + it 'does not expose project bot user name' do + expect(subject).not_to include(:name) + end + end + + context 'when the requester is an admin' do + let(:current_user) { create(:user, :admin) } + + it 'exposes project bot user name' do + expect(subject).to include(:name) + end + end + end end diff --git a/spec/support/helpers/features/members_table_helpers.rb b/spec/support/helpers/features/members_table_helpers.rb index 4a0e218ed3e0f6b43aaf8d7f15a0ac810371f7ae..80fd4bcf07acb7d9cda33082372f0bbad0d74523 100644 --- a/spec/support/helpers/features/members_table_helpers.rb +++ b/spec/support/helpers/features/members_table_helpers.rb @@ -41,6 +41,10 @@ def find_member_row(user) find_row(user.name) end + def find_username_row(user) + find_row(user.username) + end + def find_invited_member_row(email) find_row(email) end