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
This commit is contained in:
wxiaoguang authored and GitHub committed 2026-10-08 10:36:08 +02:00
1 parent 89ec271d9c
commit cc623c5f2f
18 files changed
+274 -724

No files matched your search

+30 -53
View File
@@ -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) {
+1 -1
View File
@@ -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