From 700bc01021383e85bd31f0cc3100dfe9ddc4ac09 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 5 Jun 2025 11:38:50 -0600 Subject: [PATCH 1/9] Add a special handler for the "title_regex" merge check failure The only unique part of this special handler is that it has a button to open the MR edit page. --- .../components/checks/constants.js | 1 + .../components/checks/title_regex.vue | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue diff --git a/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js b/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js index 5ef64aa7c005b2..549e8cffe9cecb 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js @@ -6,6 +6,7 @@ export const COMPONENTS = { draft_status: () => import('./draft.vue'), merge_time: () => import('./merge_time.vue'), need_rebase: () => import('./rebase.vue'), + title_regex: () => import('./title_regex.vue'), default: () => import('./message.vue'), requested_changes: () => import('ee_component/vue_merge_request_widget/components/checks/requested_changes.vue'), diff --git a/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue b/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue new file mode 100644 index 00000000000000..c76ef4f1265705 --- /dev/null +++ b/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue @@ -0,0 +1,40 @@ + + + -- GitLab From 4e7c0e54084e0ef9509eb62e75ce74346bb2ec71 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 5 Jun 2025 13:09:31 -0600 Subject: [PATCH 2/9] Remove potential trailing slash --- .../components/checks/title_regex.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue b/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue index c76ef4f1265705..9d76ffde5d8571 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue @@ -17,7 +17,10 @@ export default { }, computed: { tertiaryActionsButtons() { - const { pathname, search, hash } = document.location; + const { search, hash } = document.location; + let { pathname } = document.location; + + pathname = pathname.replace(/\/$/, ''); return [ { -- GitLab From 22ea4b2fb6014bc933928829ab7a1a258fdb90ff Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 5 Jun 2025 13:09:56 -0600 Subject: [PATCH 3/9] Parse and commit the new localization --- locale/gitlab.pot | 3 +++ 1 file changed, 3 insertions(+) diff --git a/locale/gitlab.pot b/locale/gitlab.pot index e2ea2447d0023a..158f8878c54a49 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -73729,6 +73729,9 @@ msgstr "" msgid "mrWidget|Did not close" msgstr "" +msgid "mrWidget|Edit merge request" +msgstr "" + msgid "mrWidget|Failed to load deployment statistics" msgstr "" -- GitLab From 15da195584b9e6f39c22482feb418d2d9f9b6017 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 5 Jun 2025 13:10:22 -0600 Subject: [PATCH 4/9] Add a test for the new widget specific to the title_regex merge check --- .../components/checks/title_regex_spec.js | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js diff --git a/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js b/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js new file mode 100644 index 00000000000000..b080e1eb2c1db2 --- /dev/null +++ b/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js @@ -0,0 +1,43 @@ +import { mountExtended } from 'helpers/vue_test_utils_helper'; +import MergeChecksTitleRegex from '~/vue_merge_request_widget/components/checks/title_regex.vue'; +import MergeChecksMessage from '~/vue_merge_request_widget/components/checks/message.vue'; + +describe('MergeChecksTitleRegex component', () => { + let wrapper; + + function createComponent( + propsData = { + check: { + status: 'FAILED', + identifier: 'title_regex', + }, + }, + ) { + wrapper = mountExtended(MergeChecksTitleRegex, { + propsData, + }); + } + + it('passes check down to the MergeChecksMessage', () => { + const check = { + status: 'failed', + identifier: 'title_regex', + }; + createComponent({ check }); + + expect(wrapper.findComponent(MergeChecksMessage).props('check')).toEqual(check); + }); + + it('has a link to the edit page', () => { + createComponent(); + + const editLink = wrapper.findByTestId('extension-actions-button'); + + // The new URL ends with `/edit`. + // Note that in a real scenario the URL may not - in fact - **END** with `/edit`, as + // search parameters and the hash fragment would be after the path, but in the + // test environment the base URL is very simple, so `/edit` is the last thing + // appended to it. + expect(editLink.attributes('href')).toMatch(/.*\/edit/); + }); +}); \ No newline at end of file -- GitLab From 3da6d7c0be21bb058d6c69a9f4eaa268cfcb152d Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 5 Jun 2025 13:13:49 -0600 Subject: [PATCH 5/9] Change UI text to match design in issue --- .../vue_merge_request_widget/components/checks/constants.js | 2 +- locale/gitlab.pot | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js b/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js index 549e8cffe9cecb..6bf25edc3d30cf 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/checks/constants.js @@ -40,7 +40,7 @@ export const FAILURE_REASONS = { locked_lfs_files: __('All LFS files must be unlocked.'), security_policy_violations: __('All policy rules must be satisfied.'), merge_time: __('Cannot merge until this date and time.'), - title_regex: __('The title must match the required regex.'), + title_regex: __('Merge request title must match expected format.'), }; export const ICON_NAMES = Object.freeze({ diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 158f8878c54a49..00a377d2d373ed 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -38373,6 +38373,9 @@ msgstr "" msgid "Merge request status" msgstr "" +msgid "Merge request title must match expected format." +msgstr "" + msgid "Merge request was set to auto-merge" msgstr "" @@ -62185,9 +62188,6 @@ msgstr "" msgid "The time period in seconds that the maximum requests per project limit applies to." msgstr "" -msgid "The title must match the required regex." -msgstr "" - msgid "The update action will time out after %{number_of_minutes} minutes. For big repositories, use a clone/push combination." msgstr "" -- GitLab From 9f1083641a0f910691fc064c6f6a209a404eaee5 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 5 Jun 2025 13:30:59 -0600 Subject: [PATCH 6/9] Prettier fixes to... line ending whitespace? --- .../components/checks/title_regex_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js b/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js index b080e1eb2c1db2..9710e1e4b0e950 100644 --- a/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js +++ b/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js @@ -40,4 +40,4 @@ describe('MergeChecksTitleRegex component', () => { // appended to it. expect(editLink.attributes('href')).toMatch(/.*\/edit/); }); -}); \ No newline at end of file +}); -- GitLab From 8d68b56e0823bdbb98a8a3b8913d78f25bdcebf4 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 5 Jun 2025 19:59:47 -0600 Subject: [PATCH 7/9] Update test for the correct UI text for the title_regex MR check fail --- .../vue_merge_request_widget/components/checks/message_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/frontend/vue_merge_request_widget/components/checks/message_spec.js b/spec/frontend/vue_merge_request_widget/components/checks/message_spec.js index 85e241449121be..87f2f69422a23d 100644 --- a/spec/frontend/vue_merge_request_widget/components/checks/message_spec.js +++ b/spec/frontend/vue_merge_request_widget/components/checks/message_spec.js @@ -29,7 +29,7 @@ describe('Merge request merge checks message component', () => { ${'locked_paths'} | ${'All paths must be unlocked'} ${'locked_lfs_files'} | ${'All LFS files must be unlocked.'} ${'security_policy_violations'} | ${'All policy rules must be satisfied.'} - ${'title_regex'} | ${'The title must match the required regex.'} + ${'title_regex'} | ${'Merge request title must match expected format.'} `('renders failure reason text', ({ identifier, expectedText }) => { factory({ check: { status: 'success', identifier } }); -- GitLab From 4abb507482ec836abe32be760086b3fc5746c55b Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Fri, 6 Jun 2025 11:39:20 -0600 Subject: [PATCH 8/9] Use a computed to determine the MR edit path from the widget --- .../components/checks/title_regex.vue | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue b/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue index 9d76ffde5d8571..70f3e2397b50fc 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/checks/title_regex.vue @@ -16,17 +16,19 @@ export default { }, }, computed: { - tertiaryActionsButtons() { - const { search, hash } = document.location; + mrEditPath() { let { pathname } = document.location; pathname = pathname.replace(/\/$/, ''); + return `${pathname}/edit`; + }, + tertiaryActionsButtons() { return [ { text: s__('mrWidget|Edit merge request'), category: 'default', - href: `${pathname}/edit${search}${hash}`, + href: this.mrEditPath, }, ]; }, -- GitLab From 1d8c991f021eba439ae881061f92795634e69c1c Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Fri, 6 Jun 2025 11:40:03 -0600 Subject: [PATCH 9/9] Don't try to persist the hash or search params - These are not retained when leaving the edit page anyway - Other buttons that lead to the edit page don't do it --- .../components/checks/title_regex_spec.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js b/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js index 9710e1e4b0e950..77def46c4f7b1e 100644 --- a/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js +++ b/spec/frontend/vue_merge_request_widget/components/checks/title_regex_spec.js @@ -29,15 +29,12 @@ describe('MergeChecksTitleRegex component', () => { }); it('has a link to the edit page', () => { + const editPath = `${document.location.pathname.replace(/\/$/, '')}/edit`; + createComponent(); const editLink = wrapper.findByTestId('extension-actions-button'); - // The new URL ends with `/edit`. - // Note that in a real scenario the URL may not - in fact - **END** with `/edit`, as - // search parameters and the hash fragment would be after the path, but in the - // test environment the base URL is very simple, so `/edit` is the last thing - // appended to it. - expect(editLink.attributes('href')).toMatch(/.*\/edit/); + expect(editLink.attributes('href')).toBe(editPath); }); }); -- GitLab