// Copyright 2021 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
// Package private includes all internal routes. The package name internal is ideal but Golang is not allowed, so we use private as package name instead.
package private
import (
"context"
"fmt"
"net/http"
repo_model "code.gitea.io/gitea/models/repo"
gitea_context "code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
)
// __________
// \______ \ ____ ______ ____
// | _// __ \\____ \ / _ \
// | | \ ___/| |_> > <_> )
// |____|_ /\___ > __/ \____/
// \/ \/|__|
// _____ .__ __
// / _ \ ______ _____|__| ____ ____ _____ ____ _____/ |_
// / /_\ \ / ___// ___/ |/ ___\ / \ / \_/ __ \ / \ __\
// / | \\___ \ \___ \| / /_/ > | \ Y Y \ ___/| | \ |
// \____|__ /____ >____ >__\___ /|___| /__|_| /\___ >___| /__|
// \/ \/ \/ /_____/ \/ \/ \/ \/
// This file contains common functions relating to setting the Repository for the
// internal routes
// RepoAssignment assigns the repository and gitrepository to the private context
func RepoAssignment ( ctx * gitea_context . PrivateContext ) context . CancelFunc {
ownerName := ctx . Params ( ":owner" )
repoName := ctx . Params ( ":repo" )
repo := loadRepository ( ctx , ownerName , repoName )
if ctx . Written ( ) {
// Error handled in loadRepository
return nil
}
gitRepo , err := git . OpenRepository ( ctx , repo . RepoPath ( ) )
if err != nil {
log . Error ( "Failed to open repository: %s/%s Error: %v" , ownerName , repoName , err )
ctx . JSON ( http . StatusInternalServerError , map [ string ] interface { } {
"Err" : fmt . Sprintf ( "Failed to open repository: %s/%s Error: %v" , ownerName , repoName , err ) ,
} )
return nil
}
ctx . Repo = & gitea_context . Repository {
Repository : repo ,
GitRepo : gitRepo ,
}
// We opened it, we should close it
cancel := func ( ) {
// If it's been set to nil then assume someone else has closed it.
if ctx . Repo . GitRepo != nil {
ctx . Repo . GitRepo . Close ( )
}
}
return cancel
}
func loadRepository ( ctx * gitea_context . PrivateContext , ownerName , repoName string ) * repo_model . Repository {
repo , err := repo_model . GetRepositoryByOwnerAndName ( ctx , ownerName , repoName )
if err != nil {
log . Error ( "Failed to get repository: %s/%s Error: %v" , ownerName , repoName , err )
ctx . JSON ( http . StatusInternalServerError , map [ string ] interface { } {
"Err" : fmt . Sprintf ( "Failed to get repository: %s/%s Error: %v" , ownerName , repoName , err ) ,
} )
return nil
}
if repo . OwnerName == "" {
repo . OwnerName = ownerName
}
return repo
}