From c9853e9e3a8c66c39680f2416a5a18fff562da90 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Sat, 29 Mar 2025 19:35:01 +0000 Subject: [PATCH] fix: ignore trailing slash for autogenerated name (#7307) - During the migration process, if a valid GitHub clone URL was pasted, https://github.com/yuvipanda/notebooksharing.space/, the form automatically generates an invalid Forgejo repository name that included the trailing slash. - Change the regex used to generate the name to ignore the trailing slash. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7307 Reviewed-by: Otto Reviewed-by: Gusted Co-authored-by: YuviPanda Co-committed-by: YuviPanda --- tests/e2e/repo-migrate.test.e2e.ts | 28 +++++++++++++++++++++++++++ web_src/js/features/repo-migration.js | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/e2e/repo-migrate.test.e2e.ts b/tests/e2e/repo-migrate.test.e2e.ts index 5e67f89ed1..ca20e4f4c2 100644 --- a/tests/e2e/repo-migrate.test.e2e.ts +++ b/tests/e2e/repo-migrate.test.e2e.ts @@ -7,6 +7,34 @@ import {test, save_visual, test_context} from './utils_e2e.ts'; test.use({user: 'user2'}); +test('Migration Repo Name detection', async ({page}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Flaky actionability checks on Mobile Safari'); + + await page.goto('/repo/migrate?service_type=2'); + + const form = page.locator('form'); + + // Test trailing slashes are stripped + await form.getByRole('textbox', {name: 'Migrate / Clone from URL'}).fill('https://github.com/example/test/'); + await form.getByRole('textbox', {name: 'Migrate / Clone from URL'}).blur(); + await expect(form.getByRole('textbox', {name: 'Repository Name'})).toHaveValue('test'); + + // Test trailing .git is stripped + await page.reload(); + await form.getByRole('textbox', {name: 'Migrate / Clone from URL'}).fill('https://github.com/example/test.git'); + await form.getByRole('textbox', {name: 'Migrate / Clone from URL'}).blur(); + await expect(form.getByRole('textbox', {name: 'Repository Name'})).toHaveValue('test'); + + // Test trailing .git and trailing / together is stripped + await page.reload(); + await form.getByRole('textbox', {name: 'Migrate / Clone from URL'}).fill('https://github.com/example/test.git/'); + await form.getByRole('textbox', {name: 'Migrate / Clone from URL'}).blur(); + await expect(form.getByRole('textbox', {name: 'Repository Name'})).toHaveValue('test'); + + // Save screenshot only once + await save_visual(page); +}); + test('Migration Progress Page', async ({page, browser}, workerInfo) => { test.skip(workerInfo.project.name === 'Mobile Safari', 'Flaky actionability checks on Mobile Safari'); diff --git a/web_src/js/features/repo-migration.js b/web_src/js/features/repo-migration.js index 59e282e4e7..eb2245b2ff 100644 --- a/web_src/js/features/repo-migration.js +++ b/web_src/js/features/repo-migration.js @@ -29,7 +29,7 @@ export function initRepoMigration() { cloneAddr?.addEventListener('change', () => { const repoName = document.getElementById('repo_name'); if (cloneAddr.value && !repoName?.value) { // Only modify if repo_name input is blank - repoName.value = cloneAddr.value.match(/^(.*\/)?((.+?)(\.git)?)$/)[3]; + repoName.value = cloneAddr.value.match(/^(.*\/)?((.+?)(\.git)?\/?)$/)[3]; } }); }