From cc623c5f2ffad2c961a4c6f531b6f83708a2c21a Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 8 Oct 2026 16:36:08 +0800 Subject: [PATCH] refactor: clean up git migration forms (#39672) Only extracted shared code, removed unnecessary code, and use form-fetch-action to replace RenderWithErrDeprecated, slightly refactored JS to use data-global-init Nothing else is changed, although there are still many problems. Written by AI Diff with hiding spaces: https://github.com/go-gitea/gitea/pull/39672/changes?w=1 --- routers/web/repo/migrate.go | 83 ++++++---------- routers/web/web.go | 2 +- templates/repo/migrate/codebase.tmpl | 82 +++------------- templates/repo/migrate/codecommit.tmpl | 84 ++++------------ templates/repo/migrate/common-init.tmpl | 2 + .../repo/migrate/common-migrated-repo.tmpl | 51 ++++++++++ .../{options.tmpl => common-options.tmpl} | 8 +- templates/repo/migrate/git.tmpl | 74 +++------------ templates/repo/migrate/gitbucket.tmpl | 86 ++++------------- templates/repo/migrate/gitea.tmpl | 81 +++------------- templates/repo/migrate/github.tmpl | 81 +++------------- templates/repo/migrate/gitlab.tmpl | 81 +++------------- templates/repo/migrate/gogs.tmpl | 90 +++--------------- templates/repo/migrate/onedev.tmpl | 82 +++------------- templates/repo/settings/options.tmpl | 4 +- tests/integration/migrate_test.go | 4 +- tests/integration/repo_migrate_test.go | 8 +- web_src/js/features/repo-migration.ts | 95 +++++++++---------- 18 files changed, 274 insertions(+), 724 deletions(-) create mode 100644 templates/repo/migrate/common-init.tmpl create mode 100644 templates/repo/migrate/common-migrated-repo.tmpl rename templates/repo/migrate/{options.tmpl => common-options.tmpl} (73%) diff --git a/routers/web/repo/migrate.go b/routers/web/repo/migrate.go index 7ccc288d528..8b0d0e31788 100644 --- a/routers/web/repo/migrate.go +++ b/routers/web/repo/migrate.go @@ -22,7 +22,6 @@ import ( "gitea.dev/modules/structs" "gitea.dev/modules/templates" "gitea.dev/modules/util" - "gitea.dev/modules/web" "gitea.dev/services/context" "gitea.dev/services/forms" "gitea.dev/services/migrations" @@ -54,14 +53,7 @@ func Migrate(ctx *context.Context) { } ctx.Data["private"] = getRepoPrivate(ctx) - ctx.Data["mirror"] = ctx.FormString("mirror") == "1" - ctx.Data["lfs"] = ctx.FormString("lfs") == "1" - ctx.Data["wiki"] = ctx.FormString("wiki") == "1" - ctx.Data["milestones"] = ctx.FormString("milestones") == "1" - ctx.Data["labels"] = ctx.FormString("labels") == "1" - ctx.Data["issues"] = ctx.FormString("issues") == "1" - ctx.Data["pull_requests"] = ctx.FormString("pull_requests") == "1" - ctx.Data["releases"] = ctx.FormString("releases") == "1" + ctx.Data["mirror"] = ctx.FormBool("mirror") // from "gogs#2037": "new mirror" button on org's home page ctxUser := checkContextUser(ctx, ctx.FormInt64("org")) if ctx.Written() { @@ -72,7 +64,7 @@ func Migrate(ctx *context.Context) { ctx.HTML(http.StatusOK, templates.TplName("repo/migrate/"+serviceType.Name())) } -func handleMigrateError(ctx *context.Context, owner *user_model.User, err error, name string, tpl templates.TplName, form *forms.MigrateRepoForm) { +func handleMigrateError(ctx *context.Context, owner *user_model.User, err error) { if setting.Repository.DisableMigrations { ctx.HTTPError(http.StatusForbidden, "MigrateError: the site administrator has disabled migrations") return @@ -84,67 +76,65 @@ func handleMigrateError(ctx *context.Context, owner *user_model.User, err error, case repo_model.IsErrReachLimitOfRepo(err): maxCreationLimit := owner.MaxCreationLimit() msg := ctx.TrN(maxCreationLimit, "repo.form.reach_limit_of_creation_1", "repo.form.reach_limit_of_creation_n", maxCreationLimit) - ctx.RenderWithErrDeprecated(msg, tpl, form) + ctx.JSONError(msg) case repo_model.IsErrRepoAlreadyExist(err): - ctx.Data["Err_RepoName"] = true - ctx.RenderWithErrDeprecated(ctx.Tr("form.repo_name_been_taken"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("form.repo_name_been_taken"), "repo_name") case repo_model.IsErrRepoFilesAlreadyExist(err): - ctx.Data["Err_RepoName"] = true switch { case ctx.IsUserSiteAdmin() || (setting.Repository.AllowAdoptionOfUnadoptedRepositories && setting.Repository.AllowDeleteOfUnadoptedRepositories): - ctx.RenderWithErrDeprecated(ctx.Tr("form.repository_files_already_exist.adopt_or_delete"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("form.repository_files_already_exist.adopt_or_delete"), "repo_name") case setting.Repository.AllowAdoptionOfUnadoptedRepositories: - ctx.RenderWithErrDeprecated(ctx.Tr("form.repository_files_already_exist.adopt"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("form.repository_files_already_exist.adopt"), "repo_name") case setting.Repository.AllowDeleteOfUnadoptedRepositories: - ctx.RenderWithErrDeprecated(ctx.Tr("form.repository_files_already_exist.delete"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("form.repository_files_already_exist.delete"), "repo_name") default: - ctx.RenderWithErrDeprecated(ctx.Tr("form.repository_files_already_exist"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("form.repository_files_already_exist"), "repo_name") } case errors.As(err, &errNameReserved): - ctx.Data["Err_RepoName"] = true - ctx.RenderWithErrDeprecated(ctx.Tr("repo.form.name_reserved", errNameReserved.Name), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("repo.form.name_reserved", errNameReserved.Name), "repo_name") case errors.As(err, &errNamePatternNotAllowed): - ctx.Data["Err_RepoName"] = true - ctx.RenderWithErrDeprecated(ctx.Tr("repo.form.name_pattern_not_allowed", errNamePatternNotAllowed.Pattern), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("repo.form.name_pattern_not_allowed", errNamePatternNotAllowed.Pattern), "repo_name") default: err = util.SanitizeErrorCredentialURLs(err) if _, fromGit := gitcmd.ErrorAsStderr(err); fromGit { - ctx.Data["Err_CloneAddr"] = true - ctx.RenderWithErrDeprecated(ctx.Tr("repo.migrate.failed", err.Error()), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("repo.migrate.failed", err.Error()), "clone_addr") } else { - ctx.ServerError(name, err) + ctx.JSONErrorAuto(err) } } } -func handleMigrateRemoteAddrError(ctx *context.Context, err error, tpl templates.TplName, form *forms.MigrateRepoForm) { +func handleMigrateRemoteAddrError(ctx *context.Context, err error, field string) { if addrErr, ok := err.(*git.ErrInvalidCloneAddr); ok { switch { case addrErr.IsProtocolInvalid: - ctx.RenderWithErrDeprecated(ctx.Tr("repo.mirror_address_protocol_invalid"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("repo.mirror_address_protocol_invalid"), field) case addrErr.IsURLError: - ctx.RenderWithErrDeprecated(ctx.Tr("form.url_error", addrErr.Host), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("form.url_error", addrErr.Host), field) case addrErr.IsPermissionDenied: if addrErr.LocalPath { - ctx.RenderWithErrDeprecated(ctx.Tr("repo.migrate.permission_denied"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("repo.migrate.permission_denied"), field) } else { - ctx.RenderWithErrDeprecated(ctx.Tr("repo.migrate.permission_denied_blocked"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("repo.migrate.permission_denied_blocked"), field) } case addrErr.IsInvalidPath: - ctx.RenderWithErrDeprecated(ctx.Tr("repo.migrate.invalid_local_path"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("repo.migrate.invalid_local_path"), field) default: log.Error("Error whilst updating url: %v", err) - ctx.RenderWithErrDeprecated(ctx.Tr("form.url_error", "unknown"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("form.url_error", "unknown"), field) } } else { log.Error("Error whilst updating url: %v", err) - ctx.RenderWithErrDeprecated(ctx.Tr("form.url_error", "unknown"), tpl, form) + ctx.JSONErrorWithField(ctx.Tr("form.url_error", "unknown"), field) } } // MigratePost response for migrating from external git repository func MigratePost(ctx *context.Context) { - form := web.GetForm[*forms.MigrateRepoForm](ctx) + form := context.GetFetchActionForm[*forms.MigrateRepoForm](ctx) + if form == nil { + return + } if setting.Repository.DisableMigrations { ctx.HTTPError(http.StatusForbidden, "MigratePost: the site administrator has disabled migrations") return @@ -155,28 +145,17 @@ func MigratePost(ctx *context.Context) { return } - setMigrationContextData(ctx, form.Service) - ctxUser := checkContextUser(ctx, form.UID) if ctx.Written() { return } - ctx.Data["ContextUser"] = ctxUser - - tpl := templates.TplName("repo/migrate/" + form.Service.Name()) - - if ctx.HasError() { - ctx.HTML(http.StatusOK, tpl) - return - } remoteAddr, err := git.ParseRemoteAddr(form.CloneAddr, form.AuthUsername, form.AuthPassword) if err == nil { err = migrations.IsMigrateURLAllowed(remoteAddr, ctx.Doer) } if err != nil { - ctx.Data["Err_CloneAddr"] = true - handleMigrateRemoteAddrError(ctx, err, tpl, form) + handleMigrateRemoteAddrError(ctx, err, "clone_addr") return } @@ -185,14 +164,12 @@ func MigratePost(ctx *context.Context) { if form.LFS && len(form.LFSEndpoint) > 0 { ep := lfs.DetermineEndpoint("", form.LFSEndpoint) if ep == nil { - ctx.Data["Err_LFSEndpoint"] = true - ctx.RenderWithErrDeprecated(ctx.Tr("repo.migrate.invalid_lfs_endpoint"), tpl, &form) + ctx.JSONErrorWithField(ctx.Tr("repo.migrate.invalid_lfs_endpoint"), "lfs_endpoint") return } err = migrations.IsMigrateURLAllowed(ep.String(), ctx.Doer) if err != nil { - ctx.Data["Err_LFSEndpoint"] = true - handleMigrateRemoteAddrError(ctx, err, tpl, form) + handleMigrateRemoteAddrError(ctx, err, "lfs_endpoint") return } } @@ -233,17 +210,17 @@ func MigratePost(ctx *context.Context) { err = repo_service.CheckCreateRepository(ctx, ctx.Doer, ctxUser, opts.RepoName, false) if err != nil { - handleMigrateError(ctx, ctxUser, err, "MigratePost", tpl, form) + handleMigrateError(ctx, ctxUser, err) return } err = task.MigrateRepository(ctx, ctx.Doer, ctxUser, opts) if err == nil { - ctx.Redirect(ctxUser.HomeLink() + "/" + url.PathEscape(opts.RepoName)) + ctx.JSONRedirect(ctxUser.HomeLink() + "/" + url.PathEscape(opts.RepoName)) return } - handleMigrateError(ctx, ctxUser, err, "MigratePost", tpl, form) + handleMigrateError(ctx, ctxUser, err) } func setMigrationContextData(ctx *context.Context, serviceType structs.GitServiceType) { diff --git a/routers/web/web.go b/routers/web/web.go index b1dfec9aea7..fa65209d8d1 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1092,7 +1092,7 @@ func registerWebRoutes(m *web.Router, webAuth *AuthMiddleware) { m.Get("/create", repo.Create) m.Post("/create", web.Bind[*forms.CreateRepoForm](), repo.CreatePost) m.Get("/migrate", repo.Migrate) - m.Post("/migrate", web.Bind[*forms.MigrateRepoForm](), repo.MigratePost) + m.Post("/migrate", repo.MigratePost) m.Get("/search", repo.SearchRepo) }, reqSignIn) // end "/repo": create, migrate, search diff --git a/templates/repo/migrate/codebase.tmpl b/templates/repo/migrate/codebase.tmpl index 1efcd50da7b..0ce6c59ef47 100644 --- a/templates/repo/migrate/codebase.tmpl +++ b/templates/repo/migrate/codebase.tmpl @@ -6,50 +6,48 @@
{{template "base/alert" .}} -
- {{template "base/disable_form_autofill"}} + + {{template "repo/migrate/common-init" (dict "ServiceType" .service)}} - - -
- - +
+ + {{ctx.Locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{ctx.Locale.Tr "repo.migrate.clone_local_path"}}{{end}}
- - + +
- - + +
- {{template "repo/migrate/options" .}} + {{template "repo/migrate/common-options" .}}
- +
- +
- +
- +
@@ -57,57 +55,7 @@
-
- - -
- -
- - -
-
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
-
-
- - -
- -
- - -
+ {{template "repo/migrate/common-migrated-repo"}}
diff --git a/templates/repo/migrate/codecommit.tmpl b/templates/repo/migrate/codecommit.tmpl index 3a3de1ef2cf..382c73c699c 100644 --- a/templates/repo/migrate/codecommit.tmpl +++ b/templates/repo/migrate/codecommit.tmpl @@ -6,41 +6,39 @@
{{template "base/alert" .}} -
- {{template "base/disable_form_autofill"}} + + {{template "repo/migrate/common-init" (dict "ServiceType" .service)}} - - -
- - +
+ + {{ctx.Locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{ctx.Locale.Tr "repo.migrate.clone_local_path"}}{{end}}
- - + +
- - + +
- - + +
- - + +
{{if not .DisableNewPullMirrors}}
- +
@@ -50,7 +48,7 @@
- +
@@ -58,57 +56,7 @@
-
- - -
- -
- - -
-
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
-
-
- - -
- -
- - -
+ {{template "repo/migrate/common-migrated-repo"}}
diff --git a/templates/repo/migrate/common-init.tmpl b/templates/repo/migrate/common-init.tmpl new file mode 100644 index 00000000000..fb7e15b4aed --- /dev/null +++ b/templates/repo/migrate/common-init.tmpl @@ -0,0 +1,2 @@ +{{template "base/disable_form_autofill"}} + diff --git a/templates/repo/migrate/common-migrated-repo.tmpl b/templates/repo/migrate/common-migrated-repo.tmpl new file mode 100644 index 00000000000..a59248e7722 --- /dev/null +++ b/templates/repo/migrate/common-migrated-repo.tmpl @@ -0,0 +1,51 @@ +
+ + +
+ +
+ + +
+
+ +
+ {{if ctx.RootData.IsForcedPrivate}} + + + {{else}} + + + {{end}} +
+
+
+ + +
+ +
+ + +
diff --git a/templates/repo/migrate/options.tmpl b/templates/repo/migrate/common-options.tmpl similarity index 73% rename from templates/repo/migrate/options.tmpl rename to templates/repo/migrate/common-options.tmpl index 8a46e5769b5..2025bf72bed 100644 --- a/templates/repo/migrate/options.tmpl +++ b/templates/repo/migrate/common-options.tmpl @@ -2,7 +2,7 @@
- +
@@ -11,16 +11,16 @@
- +
({{ctx.Locale.Tr "repo.settings.advanced_settings"}})
{{ctx.Locale.Tr "repo.migrate_options_lfs_endpoint.description" "https://github.com/git-lfs/git-lfs/blob/main/docs/api/server-discovery.md#server-discovery"}}{{if .ContextUser.CanImportLocal}} {{ctx.Locale.Tr "repo.migrate_options_lfs_endpoint.description.local"}}{{end}} -
+
- +
{{end}} diff --git a/templates/repo/migrate/git.tmpl b/templates/repo/migrate/git.tmpl index a16cbb1157b..54befe80ddd 100644 --- a/templates/repo/migrate/git.tmpl +++ b/templates/repo/migrate/git.tmpl @@ -6,82 +6,30 @@
{{template "base/alert" .}} -
- {{template "base/disable_form_autofill"}} + + {{template "repo/migrate/common-init" (dict "ServiceType" .service)}} - - -
- - +
+ + {{ctx.Locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{ctx.Locale.Tr "repo.migrate.clone_local_path"}}{{end}}
- - + +
- - + +
- {{template "repo/migrate/options" .}} + {{template "repo/migrate/common-options" .}}
-
- - -
- -
- - -
-
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
-
-
- - -
- -
- - -
+ {{template "repo/migrate/common-migrated-repo"}}
diff --git a/templates/repo/migrate/gitbucket.tmpl b/templates/repo/migrate/gitbucket.tmpl index 162ed85f5a5..8370c1a6ec3 100644 --- a/templates/repo/migrate/gitbucket.tmpl +++ b/templates/repo/migrate/gitbucket.tmpl @@ -6,34 +6,32 @@
{{template "base/alert" .}} -
- {{template "base/disable_form_autofill"}} + + {{template "repo/migrate/common-init" (dict "ServiceType" .service)}} - - -
- - +
+ + {{ctx.Locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{ctx.Locale.Tr "repo.migrate.clone_local_path"}}{{end}}
- - + +
- - + +
- {{template "repo/migrate/options" .}} + {{template "repo/migrate/common-options" .}}
- +
@@ -43,29 +41,29 @@
- +
- +
- +
- +
- +
@@ -73,57 +71,7 @@
-
- - -
- -
- - -
-
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
-
-
- - -
- -
- - -
+ {{template "repo/migrate/common-migrated-repo"}}
diff --git a/templates/repo/migrate/gitea.tmpl b/templates/repo/migrate/gitea.tmpl index 8791f5138b3..05e7d016136 100644 --- a/templates/repo/migrate/gitea.tmpl +++ b/templates/repo/migrate/gitea.tmpl @@ -6,30 +6,29 @@
{{template "base/alert" .}} -
+ + {{template "repo/migrate/common-init" (dict "ServiceType" .service)}} - - -
- - +
+ + {{ctx.Locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{ctx.Locale.Tr "repo.migrate.clone_local_path"}}{{end}}
- - + + {{svg "octicon-question"}}
- {{template "repo/migrate/options" .}} + {{template "repo/migrate/common-options" .}}
- +
@@ -39,29 +38,29 @@
- +
- +
- +
- +
- +
@@ -69,57 +68,7 @@
-
- - -
- -
- - -
-
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
-
-
- - -
- -
- - -
+ {{template "repo/migrate/common-migrated-repo"}}
diff --git a/templates/repo/migrate/github.tmpl b/templates/repo/migrate/github.tmpl index 1c6c7bad787..fc89df0664a 100644 --- a/templates/repo/migrate/github.tmpl +++ b/templates/repo/migrate/github.tmpl @@ -6,33 +6,32 @@
{{template "base/alert" .}} -
+ + {{template "repo/migrate/common-init" (dict "ServiceType" .service)}} - - -
- - +
+ + {{ctx.Locale.Tr "repo.migrate.clone_address_desc"}}
- - + + {{svg "octicon-question"}} {{ctx.Locale.Tr "repo.migrate.github_token_desc"}}
- {{template "repo/migrate/options" .}} + {{template "repo/migrate/common-options" .}}
- +
@@ -41,29 +40,29 @@
- +
- +
- +
- +
- +
@@ -71,57 +70,7 @@
-
- - -
- -
- - -
-
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
-
-
- - -
- -
- - -
+ {{template "repo/migrate/common-migrated-repo"}}
diff --git a/templates/repo/migrate/gitlab.tmpl b/templates/repo/migrate/gitlab.tmpl index 1e798898cd7..305275a9d05 100644 --- a/templates/repo/migrate/gitlab.tmpl +++ b/templates/repo/migrate/gitlab.tmpl @@ -6,30 +6,29 @@
{{template "base/alert" .}} -
+ + {{template "repo/migrate/common-init" (dict "ServiceType" .service)}} - - -
- - +
+ + {{ctx.Locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{ctx.Locale.Tr "repo.migrate.clone_local_path"}}{{end}}
- - + + {{svg "octicon-question"}}
- {{template "repo/migrate/options" .}} + {{template "repo/migrate/common-options" .}}
- +
@@ -38,29 +37,29 @@
- +
- +
- +
- +
- +
@@ -68,57 +67,7 @@
-
- - -
- -
- - -
-
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
-
-
- - -
- -
- - -
+ {{template "repo/migrate/common-migrated-repo"}}
diff --git a/templates/repo/migrate/gogs.tmpl b/templates/repo/migrate/gogs.tmpl index ecabf75bc89..797c322a639 100644 --- a/templates/repo/migrate/gogs.tmpl +++ b/templates/repo/migrate/gogs.tmpl @@ -6,30 +6,29 @@
{{template "base/alert" .}} -
+ + {{template "repo/migrate/common-init" (dict "ServiceType" .service)}} - - -
- - +
+ + {{ctx.Locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{ctx.Locale.Tr "repo.migrate.clone_local_path"}}{{end}}
- - + +
- {{template "repo/migrate/options" .}} + {{template "repo/migrate/common-options" .}}
- +
@@ -39,89 +38,26 @@
- +
- +
- +
- {{/* Gogs do not support it -
- -
- - -
-
- - -
-
- */}}
-
- - -
- -
- - -
-
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
-
-
- - -
- -
- - -
+ {{template "repo/migrate/common-migrated-repo"}}
diff --git a/templates/repo/migrate/onedev.tmpl b/templates/repo/migrate/onedev.tmpl index 351b4622d1a..25d6a369d25 100644 --- a/templates/repo/migrate/onedev.tmpl +++ b/templates/repo/migrate/onedev.tmpl @@ -6,51 +6,49 @@
{{template "base/alert" .}} -
- {{template "base/disable_form_autofill"}} + + {{template "repo/migrate/common-init" (dict "ServiceType" .service)}} - - -
- - +
+ + {{ctx.Locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{ctx.Locale.Tr "repo.migrate.clone_local_path"}}{{end}}
- - + +
- - + +
- {{template "repo/migrate/options" .}} + {{template "repo/migrate/common-options" .}}
- +
- +
- +
- +
@@ -58,57 +56,7 @@
-
- - -
- -
- - -
-
- -
- {{if .IsForcedPrivate}} - - - {{else}} - - - {{end}} -
-
-
- - -
- -
- - -
+ {{template "repo/migrate/common-migrated-repo"}}
diff --git a/templates/repo/settings/options.tmpl b/templates/repo/settings/options.tmpl index dcdd519fa51..1756e247561 100644 --- a/templates/repo/settings/options.tmpl +++ b/templates/repo/settings/options.tmpl @@ -161,11 +161,11 @@
- +
- +

{{ctx.Locale.Tr "repo.mirror_password_help"}}

diff --git a/tests/integration/migrate_test.go b/tests/integration/migrate_test.go index 50390cc7faa..a5f330e2f7f 100644 --- a/tests/integration/migrate_test.go +++ b/tests/integration/migrate_test.go @@ -94,9 +94,9 @@ func TestMigrateGiteaForm(t *testing.T) { "description": "", "uid": strconv.FormatInt(repoOwner.ID, 10), }) - resp = session.MakeRequest(t, req, http.StatusSeeOther) + resp = session.MakeRequest(t, req, http.StatusOK) // Step 5: a redirection displays the migrated repository - loc := resp.Header().Get("Location") + loc := *test.ParseJSONRedirect(resp.Body.Bytes()).Redirect assert.Equal(t, fmt.Sprintf("/%s/%s", ownerName, migratedRepoName), loc) // Step 6: check the repo was created unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName}) diff --git a/tests/integration/repo_migrate_test.go b/tests/integration/repo_migrate_test.go index c6ba0669b0c..8f42704a20a 100644 --- a/tests/integration/repo_migrate_test.go +++ b/tests/integration/repo_migrate_test.go @@ -10,6 +10,7 @@ import ( "testing" "gitea.dev/modules/structs" + "gitea.dev/modules/test" "gitea.dev/tests" "github.com/stretchr/testify/assert" @@ -23,7 +24,7 @@ func testRepoMigrate(t testing.TB, session *TestSession, cloneAddr, repoName str link, exists := htmlDoc.doc.Find("form.ui.form").Attr("action") assert.True(t, exists, "The template has changed") - uid, exists := htmlDoc.doc.Find("#uid").Attr("value") + uid, exists := htmlDoc.doc.Find(`input[name="uid"]`).Attr("value") assert.True(t, exists, "The template has changed") req = NewRequestWithValues(t, "POST", link, map[string]string{ @@ -32,7 +33,7 @@ func testRepoMigrate(t testing.TB, session *TestSession, cloneAddr, repoName str "repo_name": repoName, "service": fmt.Sprintf("%d", structs.PlainGitService), }) - resp = session.MakeRequest(t, req, http.StatusSeeOther) + resp = session.MakeRequest(t, req, http.StatusOK) return resp } @@ -40,5 +41,6 @@ func testRepoMigrate(t testing.TB, session *TestSession, cloneAddr, repoName str func TestRepoMigrate(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user2") - testRepoMigrate(t, session, "https://github.com/go-gitea/test_repo.git", "git") + resp := testRepoMigrate(t, session, "https://github.com/go-gitea/test_repo.git", "git") + assert.Equal(t, "/user2/git", *test.ParseJSONRedirect(resp.Body.Bytes()).Redirect) } diff --git a/web_src/js/features/repo-migration.ts b/web_src/js/features/repo-migration.ts index 7376ff7fa4f..311d9136793 100644 --- a/web_src/js/features/repo-migration.ts +++ b/web_src/js/features/repo-migration.ts @@ -1,33 +1,35 @@ import {hideElem, showElem, toggleElem} from '../utils/dom.ts'; import {sanitizeRepoName} from './repo-common.ts'; +import {registerGlobalInitFunc} from '../modules/observer.ts'; -const service = document.querySelector('#service_type'); -const user = document.querySelector('#auth_username'); -const pass = document.querySelector('#auth_password'); -const token = document.querySelector('#auth_token'); -const mirror = document.querySelector('#mirror'); -const lfs = document.querySelector('#lfs'); -const lfsSettings = document.querySelector('#lfs_settings')!; -const lfsEndpoint = document.querySelector('#lfs_endpoint')!; -const items = document.querySelectorAll('#migrate_items input[type=checkbox]'); +export const initRepoMigration = () => registerGlobalInitFunc('initGitMigrateForm', (el: HTMLElement) => { + const elForm = el.closest('form')!; + const service = elForm.querySelector('input[name="service"]')!; + const user = elForm.querySelector('input[name="auth_username"]'); + const pass = elForm.querySelector('input[name="auth_password"]'); + const token = elForm.querySelector('input[name="auth_token"]'); + const mirror = elForm.querySelector('input[name="mirror"]'); + const lfs = elForm.querySelector('input[name="lfs"]'); + const lfsSettings = elForm.querySelector('#lfs_settings'); + const lfsEndpoint = elForm.querySelector('#lfs_endpoint'); + const items = elForm.querySelectorAll('#migrate_items input[type=checkbox]'); -export function initRepoMigration() { - checkAuth(); + checkItems(Number(service.value) !== 1); // 1 = plain git service setLFSSettingsVisibility(); - user?.addEventListener('input', () => {checkItems(false)}); - pass?.addEventListener('input', () => {checkItems(false)}); - token?.addEventListener('input', () => {checkItems(true)}); - mirror?.addEventListener('change', () => {checkItems(true)}); - document.querySelector('#lfs_settings_show')?.addEventListener('click', (e) => { + user?.addEventListener('input', () => checkItems(false)); + pass?.addEventListener('input', () => checkItems(false)); + token?.addEventListener('input', () => checkItems(true)); + mirror?.addEventListener('change', () => checkItems(true)); + elForm.querySelector('#lfs_settings_show')?.addEventListener('click', (e) => { e.preventDefault(); e.stopPropagation(); - showElem(lfsEndpoint); + showElem(lfsEndpoint!); }); lfs?.addEventListener('change', setLFSSettingsVisibility); - const elCloneAddr = document.querySelector('#clone_addr'); - const elRepoName = document.querySelector('#repo_name'); + const elCloneAddr = elForm.querySelector('input[name="clone_addr"]'); + const elRepoName = elForm.querySelector('input[name="repo_name"]'); if (elCloneAddr && elRepoName) { let repoNameChanged = false; elRepoName.addEventListener('input', () => {repoNameChanged = true}); @@ -43,38 +45,31 @@ export function initRepoMigration() { elRepoName.value = sanitizeRepoName(repoNameFromUrl); }); } -} -function checkAuth() { - if (!service) return; - const serviceType = Number(service.value); - - checkItems(serviceType !== 1); -} - -function checkItems(tokenAuth: boolean) { - let enableItems: boolean; - if (tokenAuth) { - enableItems = token?.value !== ''; - } else { - enableItems = user?.value !== '' || pass?.value !== ''; - } - if (enableItems && Number(service?.value) > 1) { - if (mirror?.checked) { - for (const item of items) { - item.disabled = item.name !== 'wiki'; - } - return; + function checkItems(tokenAuth: boolean) { + let enableItems: boolean; + if (tokenAuth) { + enableItems = token?.value !== ''; + } else { + enableItems = user?.value !== '' || pass?.value !== ''; + } + if (enableItems && Number(service?.value) > 1) { + if (mirror?.checked) { + for (const item of items) { + item.disabled = item.name !== 'wiki'; + } + return; + } + for (const item of items) item.disabled = false; + } else { + for (const item of items) item.disabled = true; } - for (const item of items) item.disabled = false; - } else { - for (const item of items) item.disabled = true; } -} -function setLFSSettingsVisibility() { - if (!lfs) return; - const visible = lfs.checked; - toggleElem(lfsSettings, visible); - hideElem(lfsEndpoint); -} + function setLFSSettingsVisibility() { + if (!lfs) return; + const visible = lfs.checked; + toggleElem(lfsSettings!, visible); + hideElem(lfsEndpoint!); + } +});