Skip to content

Commit 15edd90

Browse files
committed
fix
1 parent cc19d97 commit 15edd90

5 files changed

Lines changed: 110 additions & 50 deletions

File tree

options/locale/locale_en-US.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@
223223
"error.occurred": "An error occurred",
224224
"error.report_message": "If you believe that this is a Gitea bug, please search for issues on <a href=\"%s\" target=\"_blank\">GitHub</a> or open a new issue if necessary.",
225225
"error.not_found": "The target couldn't be found.",
226+
"error.permission_denied": "Permission denied.",
226227
"error.network_error": "Network error",
227228
"startpage.app_desc": "A painless, self-hosted Git service",
228229
"startpage.install": "Easy to install",
@@ -1065,6 +1066,8 @@
10651066
"repo.transfer.accept_desc": "Transfer to \"%s\"",
10661067
"repo.transfer.reject": "Reject Transfer",
10671068
"repo.transfer.reject_desc": "Cancel transfer to \"%s\"",
1069+
"repo.transfer.is_transferring": "Transferring…",
1070+
"repo.transfer.is_transferring_prompt": "The repository is being transferred to %s",
10681071
"repo.desc.private": "Private",
10691072
"repo.desc.public": "Public",
10701073
"repo.desc.public_access": "Public Access",

routers/web/repo/repo.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,18 +302,15 @@ func CreatePost(ctx *context.Context) {
302302
func handleActionError(ctx *context.Context, err error) {
303303
switch {
304304
case errors.Is(err, user_model.ErrBlockedUser):
305-
ctx.Flash.Error(ctx.Tr("repo.action.blocked_user"))
305+
ctx.JSONError(ctx.Tr("repo.action.blocked_user"))
306306
case repo_service.IsRepositoryLimitReached(err):
307307
limit := err.(repo_service.LimitReachedError).Limit
308-
ctx.Flash.Error(ctx.TrN(limit, "repo.form.reach_limit_of_creation_1", "repo.form.reach_limit_of_creation_n", limit))
308+
ctx.JSONError(ctx.TrN(limit, "repo.form.reach_limit_of_creation_1", "repo.form.reach_limit_of_creation_n", limit))
309309
case errors.Is(err, util.ErrPermissionDenied):
310-
ctx.HTTPError(http.StatusNotFound)
311-
return
310+
ctx.JSONError(ctx.Tr("error.permission_denied"))
312311
default:
313312
ctx.ServerError(fmt.Sprintf("Action (%s)", ctx.PathParam("action")), err)
314-
return
315313
}
316-
ctx.Redirect(ctx.Repo.Repository.Link())
317314
}
318315

319316
// RedirectDownload return a file based on the following infos:

routers/web/repo/transfer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func acceptTransfer(ctx *context.Context) {
1212
err := repo_service.AcceptTransferOwnership(ctx, ctx.Repo.Repository, ctx.Doer)
1313
if err == nil {
1414
ctx.Flash.Success(ctx.Tr("repo.settings.transfer.success"))
15-
ctx.Redirect(ctx.Repo.Repository.Link())
15+
ctx.JSONRedirect(ctx.Repo.Repository.Link())
1616
return
1717
}
1818
handleActionError(ctx, err)
@@ -22,7 +22,7 @@ func rejectTransfer(ctx *context.Context) {
2222
err := repo_service.RejectRepositoryTransfer(ctx, ctx.Repo.Repository, ctx.Doer)
2323
if err == nil {
2424
ctx.Flash.Success(ctx.Tr("repo.settings.transfer.rejected"))
25-
ctx.Redirect(ctx.Repo.Repository.Link())
25+
ctx.JSONRedirect(ctx.Repo.Repository.Link())
2626
return
2727
}
2828
handleActionError(ctx, err)

services/context/repo.go

Lines changed: 92 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -411,8 +411,9 @@ func RedirectToRepo(ctx *Base, redirectRepoID int64) {
411411
ctx.Redirect(path.Join(setting.AppSubURL, redirectPath), http.StatusMovedPermanently)
412412
}
413413

414-
func repoAssignment(ctx *Context, repo *repo_model.Repository) {
414+
func repoAssignmentLegacy(ctx *Context, data *repoAssignmentPrepareDataStruct) {
415415
var err error
416+
repo := data.repo
416417
if err = repo.LoadOwner(ctx); err != nil {
417418
ctx.ServerError("LoadOwner", err)
418419
return
@@ -459,13 +460,26 @@ func InitRepoPullRequestCtx(ctx *Context, base, head *repo_model.Repository) {
459460
ctx.Data["PullRequestCtx"] = ctx.Repo.PullRequestCtx
460461
}
461462

462-
// RepoAssignment returns a middleware to handle repository assignment
463-
func RepoAssignment(ctx *Context) {
463+
type repoAssignmentPrepareDataStruct struct {
464+
ownerName string
465+
repoName string
466+
isHomeOrSettings bool
467+
repo *repo_model.Repository
468+
}
469+
470+
func repoAssignmentPreCheck(ctx *Context) {
464471
if ctx.Data["Repository"] != nil {
465472
setting.PanicInDevOrTesting("RepoAssignment should not be executed twice")
466473
}
474+
if ctx.Repo.GitRepo != nil {
475+
setting.PanicInDevOrTesting("RepoAssignment: GitRepo should be nil")
476+
_ = ctx.Repo.GitRepo.Close()
477+
ctx.Repo.GitRepo = nil
478+
}
479+
}
467480

468-
var err error
481+
func repoAssignmentPrepareData(ctx *Context) *repoAssignmentPrepareDataStruct {
482+
// HINT: here it doesn't handle ".wiki" extension, it is handled in repoAssignmentAutoRedirectWiki, need to be refactored in the future
469483
userName := ctx.PathParam("username")
470484
repoName := ctx.PathParam("reponame")
471485
repoName = strings.TrimSuffix(repoName, ".git")
@@ -475,6 +489,21 @@ func RepoAssignment(ctx *Context) {
475489
repoName = strings.TrimSuffix(repoName, ".atom")
476490
}
477491

492+
isHomeOrSettings := ctx.Link == ctx.Repo.RepoLink ||
493+
ctx.Link == ctx.Repo.RepoLink+"/settings" ||
494+
strings.HasPrefix(ctx.Link, ctx.Repo.RepoLink+"/settings/") ||
495+
ctx.Link == ctx.Repo.RepoLink+"/-/migrate/status"
496+
497+
return &repoAssignmentPrepareDataStruct{
498+
ownerName: userName,
499+
repoName: repoName,
500+
isHomeOrSettings: isHomeOrSettings,
501+
}
502+
}
503+
504+
func repoAssignmentPrepareOwner(ctx *Context, data *repoAssignmentPrepareDataStruct) {
505+
var err error
506+
userName := data.ownerName
478507
// Check if the user is the same as the repository owner
479508
if ctx.IsSigned && strings.EqualFold(ctx.Doer.LowerName, userName) {
480509
ctx.Repo.Owner = ctx.Doer
@@ -504,7 +533,10 @@ func RepoAssignment(ctx *Context) {
504533
}
505534
ctx.ContextUser = ctx.Repo.Owner
506535
ctx.Data["ContextUser"] = ctx.ContextUser
536+
}
507537

538+
func repoAssignmentAutoRedirectWiki(ctx *Context, data *repoAssignmentPrepareDataStruct) {
539+
userName, repoName := data.ownerName, data.repoName
508540
// redirect link to wiki
509541
if strings.HasSuffix(repoName, ".wiki") {
510542
// ctx.Req.URL.Path does not have the preceding appSubURL - any redirect must have this added
@@ -524,7 +556,10 @@ func RepoAssignment(ctx *Context) {
524556
ctx.Redirect(path.Join(setting.AppSubURL, redirectPath))
525557
return
526558
}
559+
}
527560

561+
func repoAssignmentPrepareRepo(ctx *Context, data *repoAssignmentPrepareDataStruct) {
562+
repoName := data.repoName
528563
// Get repository.
529564
repo, err := repo_model.GetRepositoryByName(ctx, ctx.Repo.Owner.ID, repoName)
530565
if err != nil {
@@ -547,12 +582,11 @@ func RepoAssignment(ctx *Context) {
547582
return
548583
}
549584
repo.Owner = ctx.Repo.Owner
585+
data.repo = repo
586+
}
550587

551-
repoAssignment(ctx, repo)
552-
if ctx.Written() {
553-
return
554-
}
555-
588+
func repoAssignmentPrepareTemplateData(ctx *Context, data *repoAssignmentPrepareDataStruct) {
589+
repo := data.repo
556590
ctx.Repo.RepoLink = repo.Link()
557591
ctx.Data["RepoLink"] = ctx.Repo.RepoLink
558592
ctx.Data["FeedURL"] = ctx.Repo.RepoLink
@@ -645,41 +679,38 @@ func RepoAssignment(ctx *Context) {
645679
return
646680
}
647681
}
682+
}
648683

649-
isHomeOrSettings := ctx.Link == ctx.Repo.RepoLink ||
650-
ctx.Link == ctx.Repo.RepoLink+"/settings" ||
651-
strings.HasPrefix(ctx.Link, ctx.Repo.RepoLink+"/settings/") ||
652-
ctx.Link == ctx.Repo.RepoLink+"/-/migrate/status"
653-
684+
func repoAssignmentAutoRedirectNotRead(ctx *Context, data *repoAssignmentPrepareDataStruct) {
654685
// Disable everything when the repo is being created
655686
if ctx.Repo.Repository.IsBeingCreated() || ctx.Repo.Repository.IsBroken() {
656-
if !isHomeOrSettings {
687+
if !data.isHomeOrSettings {
657688
ctx.Redirect(ctx.Repo.RepoLink)
658689
}
659690
return
660691
}
692+
}
661693

662-
if ctx.Repo.GitRepo != nil {
663-
setting.PanicInDevOrTesting("RepoAssignment: GitRepo should be nil")
664-
_ = ctx.Repo.GitRepo.Close()
665-
ctx.Repo.GitRepo = nil
666-
}
667-
694+
func repoAssignmentPrepareGitRepo(ctx *Context, data *repoAssignmentPrepareDataStruct) {
695+
var err error
696+
repo := data.repo
668697
ctx.Repo.GitRepo, err = gitrepo.RepositoryFromRequestContextOrOpen(ctx, repo)
669698
if err != nil {
670699
if strings.Contains(err.Error(), "repository does not exist") || strings.Contains(err.Error(), "no such file or directory") {
671700
log.Error("Repository %-v has a broken repository on the file system: %s Error: %v", ctx.Repo.Repository, ctx.Repo.Repository.RelativePath(), err)
672701
ctx.Repo.Repository.MarkAsBrokenEmpty()
673702
// Only allow access to base of repo or settings
674-
if !isHomeOrSettings {
703+
if !data.isHomeOrSettings {
675704
ctx.Redirect(ctx.Repo.RepoLink)
676705
}
677706
return
678707
}
679708
ctx.ServerError("RepoAssignment Invalid repo "+repo.FullName(), err)
680709
return
681710
}
711+
}
682712

713+
func repoAssignmentPrepareRepoTransfer(ctx *Context, data *repoAssignmentPrepareDataStruct) {
683714
if ctx.Repo.Repository.Status == repo_model.RepositoryPendingTransfer {
684715
repoTransfer, err := repo_model.GetPendingRepositoryTransfer(ctx, ctx.Repo.Repository)
685716
if err != nil {
@@ -693,16 +724,14 @@ func RepoAssignment(ctx *Context) {
693724
}
694725

695726
ctx.Data["RepoTransfer"] = repoTransfer
696-
if ctx.Doer != nil {
697-
ctx.Data["CanUserAcceptOrRejectTransfer"] = repoTransfer.CanUserAcceptOrRejectTransfer(ctx, ctx.Doer)
698-
}
727+
ctx.Data["CanUserAcceptOrRejectTransfer"] = ctx.Doer != nil && repoTransfer.CanUserAcceptOrRejectTransfer(ctx, ctx.Doer)
699728
}
729+
}
700730

701-
// Stop at this point when the repo is empty.
702-
if ctx.Repo.Repository.IsEmpty {
731+
func repoAssignmentPrepareBranches(ctx *Context, data *repoAssignmentPrepareDataStruct) {
732+
if data.repo.IsEmpty {
703733
return
704734
}
705-
706735
branchOpts := git_model.FindBranchOptions{
707736
RepoID: ctx.Repo.Repository.ID,
708737
IsDeletedBranch: optional.Some(false),
@@ -724,7 +753,13 @@ func RepoAssignment(ctx *Context) {
724753
}
725754

726755
ctx.Data["BranchesCount"] = branchesTotal
756+
}
727757

758+
func repoAssignmentPreparePullRequests(ctx *Context, data *repoAssignmentPrepareDataStruct) {
759+
repo := data.repo
760+
if repo.IsEmpty {
761+
return
762+
}
728763
// Pull request is allowed if this is a fork repository, and base repository accepts pull requests.
729764
if repo.BaseRepo != nil && repo.BaseRepo.AllowsPulls(ctx) {
730765
// TODO: this (and below) "BaseRepo" var is not clear and should be removed in the future
@@ -735,7 +770,10 @@ func RepoAssignment(ctx *Context) {
735770
ctx.Data["BaseRepo"] = repo
736771
InitRepoPullRequestCtx(ctx, repo, repo)
737772
}
773+
}
738774

775+
func repoAssignmentHandleGoGet(ctx *Context, data *repoAssignmentPrepareDataStruct) {
776+
repo := data.repo
739777
if ctx.FormString("go-get") == "1" {
740778
ctx.Data["GoGetImport"] = ComposeGoGetImport(ctx, repo.Owner.Name, repo.Name)
741779
fullURLPrefix := repo.HTMLURL() + "/src/branch/" + util.PathEscapeSegments(ctx.Repo.BranchName)
@@ -744,6 +782,32 @@ func RepoAssignment(ctx *Context) {
744782
}
745783
}
746784

785+
// RepoAssignment returns a middleware to handle repository assignment
786+
func RepoAssignment(ctx *Context) {
787+
repoAssignmentPreCheck(ctx)
788+
789+
prepareData := repoAssignmentPrepareData(ctx)
790+
funcs := []func(ctx *Context, data *repoAssignmentPrepareDataStruct){
791+
repoAssignmentPrepareOwner,
792+
repoAssignmentAutoRedirectWiki,
793+
repoAssignmentPrepareRepo,
794+
repoAssignmentLegacy,
795+
repoAssignmentPrepareTemplateData,
796+
repoAssignmentAutoRedirectNotRead,
797+
repoAssignmentPrepareGitRepo,
798+
repoAssignmentPrepareRepoTransfer,
799+
repoAssignmentPrepareBranches,
800+
repoAssignmentPreparePullRequests,
801+
repoAssignmentHandleGoGet,
802+
}
803+
for _, f := range funcs {
804+
f(ctx, prepareData)
805+
if ctx.Written() {
806+
return
807+
}
808+
}
809+
}
810+
747811
const headRefName = "HEAD"
748812

749813
func getRefNameFromPath(repo *Repository, path string, isExist func(string) bool) string {

templates/repo/header.tmpl

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,16 @@
4040
{{if not (or .IsBeingCreated .IsBroken)}}
4141
<div class="flex-text-block tw-flex-wrap">
4242
{{if $.CanUserAcceptOrRejectTransfer}}
43-
<form method="post" action="{{$.RepoLink}}/action/accept_transfer">
44-
<div class="flex-text-inline" data-tooltip-content="{{ctx.Locale.Tr "repo.transfer.accept_desc" $.RepoTransfer.Recipient.DisplayName}}">
45-
<button type="submit" class="ui compact small basic button primary ok small">
46-
{{ctx.Locale.Tr "repo.transfer.accept"}}
47-
</button>
48-
</div>
49-
</form>
50-
<form method="post" action="{{$.RepoLink}}/action/reject_transfer">
51-
<div class="flex-text-inline" data-tooltip-content="{{ctx.Locale.Tr "repo.transfer.reject_desc" $.RepoTransfer.Recipient.DisplayName}}">
52-
<button type="submit" class="ui compact small basic button red ok small">
53-
{{ctx.Locale.Tr "repo.transfer.reject"}}
54-
</button>
55-
</div>
56-
</form>
43+
<button type="submit" class="ui compact small basic primary button link-action" data-url="{{$.RepoLink}}/action/accept_transfer"
44+
data-tooltip-content="{{ctx.Locale.Tr "repo.transfer.accept_desc" $.RepoTransfer.Recipient.GetDisplayName}}"
45+
>{{ctx.Locale.Tr "repo.transfer.accept"}}</button>
46+
<button type="submit" class="ui compact small basic red button link-action" data-url="{{$.RepoLink}}/action/reject_transfer"
47+
data-tooltip-content="{{ctx.Locale.Tr "repo.transfer.reject_desc" $.RepoTransfer.Recipient.GetDisplayName}}"
48+
>{{ctx.Locale.Tr "repo.transfer.reject"}}</button>
49+
{{else if $.RepoTransfer}}
50+
<div data-tooltip-content="{{ctx.Locale.Tr "repo.transfer.is_transferring_prompt" $.RepoTransfer.Recipient.GetDisplayName}}">
51+
<a class="ui compact small basic red button disabled">{{ctx.Locale.Tr "repo.transfer.is_transferring"}}</a>
52+
</div>
5753
{{end}}
5854
{{if $.EnableFeed}}
5955
{{/* An extra div-element is not necessary here, as this button does not secretly contain two buttons. */}}

0 commit comments

Comments
 (0)