code.gitea.io/gitea@v1.21.7/routers/private/internal_repo.go (about)

     1  // Copyright 2021 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package private
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  	"net/http"
    10  
    11  	repo_model "code.gitea.io/gitea/models/repo"
    12  	gitea_context "code.gitea.io/gitea/modules/context"
    13  	"code.gitea.io/gitea/modules/git"
    14  	"code.gitea.io/gitea/modules/log"
    15  	"code.gitea.io/gitea/modules/private"
    16  )
    17  
    18  // This file contains common functions relating to setting the Repository for the internal routes
    19  
    20  // RepoAssignment assigns the repository and gitrepository to the private context
    21  func RepoAssignment(ctx *gitea_context.PrivateContext) context.CancelFunc {
    22  	ownerName := ctx.Params(":owner")
    23  	repoName := ctx.Params(":repo")
    24  
    25  	repo := loadRepository(ctx, ownerName, repoName)
    26  	if ctx.Written() {
    27  		// Error handled in loadRepository
    28  		return nil
    29  	}
    30  
    31  	gitRepo, err := git.OpenRepository(ctx, repo.RepoPath())
    32  	if err != nil {
    33  		log.Error("Failed to open repository: %s/%s Error: %v", ownerName, repoName, err)
    34  		ctx.JSON(http.StatusInternalServerError, private.Response{
    35  			Err: fmt.Sprintf("Failed to open repository: %s/%s Error: %v", ownerName, repoName, err),
    36  		})
    37  		return nil
    38  	}
    39  
    40  	ctx.Repo = &gitea_context.Repository{
    41  		Repository: repo,
    42  		GitRepo:    gitRepo,
    43  	}
    44  
    45  	// We opened it, we should close it
    46  	cancel := func() {
    47  		// If it's been set to nil then assume someone else has closed it.
    48  		if ctx.Repo.GitRepo != nil {
    49  			ctx.Repo.GitRepo.Close()
    50  		}
    51  	}
    52  
    53  	return cancel
    54  }
    55  
    56  func loadRepository(ctx *gitea_context.PrivateContext, ownerName, repoName string) *repo_model.Repository {
    57  	repo, err := repo_model.GetRepositoryByOwnerAndName(ctx, ownerName, repoName)
    58  	if err != nil {
    59  		log.Error("Failed to get repository: %s/%s Error: %v", ownerName, repoName, err)
    60  		ctx.JSON(http.StatusInternalServerError, private.Response{
    61  			Err: fmt.Sprintf("Failed to get repository: %s/%s Error: %v", ownerName, repoName, err),
    62  		})
    63  		return nil
    64  	}
    65  	if repo.OwnerName == "" {
    66  		repo.OwnerName = ownerName
    67  	}
    68  	return repo
    69  }