@@ -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,64 +679,41 @@ 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
683- if ctx .Repo .Repository .Status == repo_model .RepositoryPendingTransfer {
684- repoTransfer , err := repo_model .GetPendingRepositoryTransfer (ctx , ctx .Repo .Repository )
685- if err != nil {
686- ctx .ServerError ("GetPendingRepositoryTransfer" , err )
687- return
688- }
689-
690- if err := repoTransfer .LoadAttributes (ctx ); err != nil {
691- ctx .ServerError ("LoadRecipient" , err )
692- return
693- }
694-
695- ctx .Data ["RepoTransfer" ] = repoTransfer
696- if ctx .Doer != nil {
697- ctx .Data ["CanUserAcceptOrRejectTransfer" ] = repoTransfer .CanUserAcceptOrRejectTransfer (ctx , ctx .Doer )
698- }
699- }
700-
701- // Stop at this point when the repo is empty.
702- if ctx .Repo .Repository .IsEmpty {
713+ func repoAssignmentPrepareBranches (ctx * Context , data * repoAssignmentPrepareDataStruct ) {
714+ if data .repo .IsEmpty {
703715 return
704716 }
705-
706717 branchOpts := git_model.FindBranchOptions {
707718 RepoID : ctx .Repo .Repository .ID ,
708719 IsDeletedBranch : optional .Some (false ),
@@ -724,7 +735,13 @@ func RepoAssignment(ctx *Context) {
724735 }
725736
726737 ctx .Data ["BranchesCount" ] = branchesTotal
738+ }
727739
740+ func repoAssignmentPreparePullRequests (ctx * Context , data * repoAssignmentPrepareDataStruct ) {
741+ repo := data .repo
742+ if repo .IsEmpty {
743+ return
744+ }
728745 // Pull request is allowed if this is a fork repository, and base repository accepts pull requests.
729746 if repo .BaseRepo != nil && repo .BaseRepo .AllowsPulls (ctx ) {
730747 // TODO: this (and below) "BaseRepo" var is not clear and should be removed in the future
@@ -735,7 +752,28 @@ func RepoAssignment(ctx *Context) {
735752 ctx .Data ["BaseRepo" ] = repo
736753 InitRepoPullRequestCtx (ctx , repo , repo )
737754 }
755+ }
738756
757+ func repoAssignmentPrepareRepoTransfer (ctx * Context , data * repoAssignmentPrepareDataStruct ) {
758+ if ctx .Repo .Repository .Status == repo_model .RepositoryPendingTransfer {
759+ repoTransfer , err := repo_model .GetPendingRepositoryTransfer (ctx , ctx .Repo .Repository )
760+ if err != nil {
761+ ctx .ServerError ("GetPendingRepositoryTransfer" , err )
762+ return
763+ }
764+
765+ if err := repoTransfer .LoadAttributes (ctx ); err != nil {
766+ ctx .ServerError ("LoadRecipient" , err )
767+ return
768+ }
769+
770+ ctx .Data ["RepoTransfer" ] = repoTransfer
771+ ctx .Data ["CanUserAcceptOrRejectTransfer" ] = ctx .Doer != nil && repoTransfer .CanUserAcceptOrRejectTransfer (ctx , ctx .Doer )
772+ }
773+ }
774+
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+
747811const headRefName = "HEAD"
748812
749813func getRefNameFromPath (repo * Repository , path string , isExist func (string ) bool ) string {
0 commit comments