Some refactor for repo path (#36251)

- Use `gitrepo.IsRepositoryExist` instead of `util.IsExit` or
`util.IsDir`
- Use `gitrepo.OpenRepository` instead of `git.OpenRepository`
- Use `gitrepo.DeleteRepository` instead of `util.RemoveAll`
- Use `gitrepo.RenameRepository` instead of `util.Rename`
This commit is contained in:
Lunny Xiao 2025-12-29 10:49:54 -08:00 committed by GitHub
parent 0ad94dfc70
commit 1771569300
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 37 additions and 64 deletions

View File

@ -5,14 +5,10 @@ package v1_21
import ( import (
"context" "context"
"fmt"
"path/filepath"
"strings"
"code.gitea.io/gitea/modules/git" repo_model "code.gitea.io/gitea/models/repo"
giturl "code.gitea.io/gitea/modules/git/url" "code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"xorm.io/xorm" "xorm.io/xorm"
) )
@ -163,16 +159,13 @@ func migratePushMirrors(x *xorm.Engine) error {
} }
func getRemoteAddress(ownerName, repoName, remoteName string) (string, error) { func getRemoteAddress(ownerName, repoName, remoteName string) (string, error) {
repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(ownerName), strings.ToLower(repoName)+".git") ctx := context.Background()
if exist, _ := util.IsExist(repoPath); !exist { relativePath := repo_model.RelativePath(ownerName, repoName)
if exist, _ := gitrepo.IsRepositoryExist(ctx, repo_model.StorageRepo(relativePath)); !exist {
return "", nil return "", nil
} }
remoteURL, err := git.GetRemoteAddress(context.Background(), repoPath, remoteName)
if err != nil {
return "", fmt.Errorf("get remote %s's address of %s/%s failed: %v", remoteName, ownerName, repoName, err)
}
u, err := giturl.ParseGitURL(remoteURL) u, err := gitrepo.GitRemoteGetURL(ctx, repo_model.StorageRepo(relativePath), remoteName)
if err != nil { if err != nil {
return "", err return "", err
} }

View File

@ -6,11 +6,10 @@ package v1_9
import ( import (
"context" "context"
"fmt" "fmt"
"path/filepath"
"strings"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/gitrepo"
"xorm.io/xorm" "xorm.io/xorm"
) )
@ -34,16 +33,6 @@ func FixReleaseSha1OnReleaseTable(ctx context.Context, x *xorm.Engine) error {
Name string Name string
} }
// UserPath returns the path absolute path of user repositories.
UserPath := func(userName string) string {
return filepath.Join(setting.RepoRootPath, strings.ToLower(userName))
}
// RepoPath returns repository path by given user and repository name.
RepoPath := func(userName, repoName string) string {
return filepath.Join(UserPath(userName), strings.ToLower(repoName)+".git")
}
// Update release sha1 // Update release sha1
const batchSize = 100 const batchSize = 100
sess := x.NewSession() sess := x.NewSession()
@ -99,7 +88,7 @@ func FixReleaseSha1OnReleaseTable(ctx context.Context, x *xorm.Engine) error {
userCache[repo.OwnerID] = user userCache[repo.OwnerID] = user
} }
gitRepo, err = git.OpenRepository(ctx, RepoPath(user.Name, repo.Name)) gitRepo, err = gitrepo.OpenRepository(ctx, repo_model.StorageRepo(repo_model.RelativePath(user.Name, repo.Name)))
if err != nil { if err != nil {
return err return err
} }

View File

@ -80,7 +80,12 @@ func DeleteRepository(ctx context.Context, repo Repository) error {
// RenameRepository renames a repository's name on disk // RenameRepository renames a repository's name on disk
func RenameRepository(ctx context.Context, repo, newRepo Repository) error { func RenameRepository(ctx context.Context, repo, newRepo Repository) error {
if err := util.Rename(repoPath(repo), repoPath(newRepo)); err != nil { dstDir := repoPath(newRepo)
if err := os.MkdirAll(filepath.Dir(dstDir), os.ModePerm); err != nil {
return fmt.Errorf("Failed to create dir %s: %w", filepath.Dir(dstDir), err)
}
if err := util.Rename(repoPath(repo), dstDir); err != nil {
return fmt.Errorf("rename repository directory: %w", err) return fmt.Errorf("rename repository directory: %w", err)
} }
return nil return nil
@ -116,5 +121,8 @@ func RemoveRepoFileOrDir(ctx context.Context, repo Repository, relativeFileOrDir
func CreateRepoFile(ctx context.Context, repo Repository, relativeFilePath string) (io.WriteCloser, error) { func CreateRepoFile(ctx context.Context, repo Repository, relativeFilePath string) (io.WriteCloser, error) {
absoluteFilePath := filepath.Join(repoPath(repo), relativeFilePath) absoluteFilePath := filepath.Join(repoPath(repo), relativeFilePath)
if err := os.MkdirAll(filepath.Dir(absoluteFilePath), os.ModePerm); err != nil {
return nil, err
}
return os.Create(absoluteFilePath) return os.Create(absoluteFilePath)
} }

View File

@ -8,7 +8,7 @@ import (
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/routers/api/v1/utils"
"code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/context"
repo_service "code.gitea.io/gitea/services/repository" repo_service "code.gitea.io/gitea/services/repository"
@ -99,12 +99,12 @@ func AdoptRepository(ctx *context.APIContext) {
ctx.APIErrorInternal(err) ctx.APIErrorInternal(err)
return return
} }
isDir, err := util.IsDir(repo_model.RepoPath(ctxUser.Name, repoName)) exist, err := gitrepo.IsRepositoryExist(ctx, repo_model.StorageRepo(repo_model.RelativePath(ctxUser.Name, repoName)))
if err != nil { if err != nil {
ctx.APIErrorInternal(err) ctx.APIErrorInternal(err)
return return
} }
if has || !isDir { if has || !exist {
ctx.APIErrorNotFound() ctx.APIErrorNotFound()
return return
} }
@ -161,12 +161,12 @@ func DeleteUnadoptedRepository(ctx *context.APIContext) {
ctx.APIErrorInternal(err) ctx.APIErrorInternal(err)
return return
} }
isDir, err := util.IsDir(repo_model.RepoPath(ctxUser.Name, repoName)) exist, err := gitrepo.IsRepositoryExist(ctx, repo_model.StorageRepo(repo_model.RelativePath(ctxUser.Name, repoName)))
if err != nil { if err != nil {
ctx.APIErrorInternal(err) ctx.APIErrorInternal(err)
return return
} }
if has || !isDir { if has || !exist {
ctx.APIErrorNotFound() ctx.APIErrorNotFound()
return return
} }

View File

@ -11,10 +11,10 @@ import (
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/templates" "code.gitea.io/gitea/modules/templates"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/routers/web/explore" "code.gitea.io/gitea/routers/web/explore"
"code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/context"
repo_service "code.gitea.io/gitea/services/repository" repo_service "code.gitea.io/gitea/services/repository"
@ -134,12 +134,12 @@ func AdoptOrDeleteRepository(ctx *context.Context) {
ctx.ServerError("IsRepositoryExist", err) ctx.ServerError("IsRepositoryExist", err)
return return
} }
isDir, err := util.IsDir(repo_model.RepoPath(ctxUser.Name, repoName)) exist, err := gitrepo.IsRepositoryExist(ctx, repo_model.StorageRepo(repo_model.RelativePath(ctxUser.Name, repoName)))
if err != nil { if err != nil {
ctx.ServerError("IsDir", err) ctx.ServerError("IsDir", err)
return return
} }
if has || !isDir { if has || !exist {
// Fallthrough to failure mode // Fallthrough to failure mode
} else if action == "adopt" { } else if action == "adopt" {
if _, err := repo_service.AdoptRepository(ctx, ctx.Doer, ctxUser, repo_service.CreateRepoOptions{ if _, err := repo_service.AdoptRepository(ctx, ctx.Doer, ctxUser, repo_service.CreateRepoOptions{

View File

@ -4,12 +4,9 @@
package setting package setting
import ( import (
"path/filepath"
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/context"
repo_service "code.gitea.io/gitea/services/repository" repo_service "code.gitea.io/gitea/services/repository"
) )
@ -27,7 +24,6 @@ func AdoptOrDeleteRepository(ctx *context.Context) {
action := ctx.FormString("action") action := ctx.FormString("action")
ctxUser := ctx.Doer ctxUser := ctx.Doer
root := user_model.UserPath(ctxUser.LowerName)
// check not a repo // check not a repo
has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, dir) has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, dir)
@ -36,12 +32,12 @@ func AdoptOrDeleteRepository(ctx *context.Context) {
return return
} }
isDir, err := util.IsDir(filepath.Join(root, dir+".git")) exist, err := gitrepo.IsRepositoryExist(ctx, repo_model.StorageRepo(repo_model.RelativePath(ctxUser.Name, dir)))
if err != nil { if err != nil {
ctx.ServerError("IsDir", err) ctx.ServerError("IsDir", err)
return return
} }
if has || !isDir { if has || !exist {
// Fallthrough to failure mode // Fallthrough to failure mode
} else if action == "adopt" && allowAdopt { } else if action == "adopt" && allowAdopt {
if _, err := repo_service.AdoptRepository(ctx, ctxUser, ctxUser, repo_service.CreateRepoOptions{ if _, err := repo_service.AdoptRepository(ctx, ctxUser, ctxUser, repo_service.CreateRepoOptions{

View File

@ -8,8 +8,6 @@ import (
"context" "context"
"fmt" "fmt"
"io" "io"
"os"
"path/filepath"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -589,12 +587,7 @@ func (g *GiteaLocalUploader) updateGitForPullRequest(ctx context.Context, pr *ba
} }
defer ret.Close() defer ret.Close()
pullDir := filepath.Join(g.repo.RepoPath(), "pulls") f, err := gitrepo.CreateRepoFile(ctx, g.repo, fmt.Sprintf("pulls/%d.patch", pr.Number))
if err = os.MkdirAll(pullDir, os.ModePerm); err != nil {
return err
}
f, err := os.Create(filepath.Join(pullDir, fmt.Sprintf("%d.patch", pr.Number)))
if err != nil { if err != nil {
return err return err
} }

View File

@ -23,7 +23,6 @@ import (
"code.gitea.io/gitea/modules/optional" "code.gitea.io/gitea/modules/optional"
repo_module "code.gitea.io/gitea/modules/repository" repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
notify_service "code.gitea.io/gitea/services/notify" notify_service "code.gitea.io/gitea/services/notify"
) )
@ -214,13 +213,13 @@ func DeleteUnadoptedRepository(ctx context.Context, doer, u *user_model.User, re
return err return err
} }
repoPath := repo_model.RepoPath(u.Name, repoName) relativePath := repo_model.RelativePath(u.Name, repoName)
isExist, err := util.IsExist(repoPath) exist, err := gitrepo.IsRepositoryExist(ctx, repo_model.StorageRepo(relativePath))
if err != nil { if err != nil {
log.Error("Unable to check if %s exists. Error: %v", repoPath, err) log.Error("Unable to check if %s exists. Error: %v", relativePath, err)
return err return err
} }
if !isExist { if !exist {
return repo_model.ErrRepoNotExist{ return repo_model.ErrRepoNotExist{
OwnerName: u.Name, OwnerName: u.Name,
Name: repoName, Name: repoName,
@ -236,7 +235,7 @@ func DeleteUnadoptedRepository(ctx context.Context, doer, u *user_model.User, re
} }
} }
return util.RemoveAll(repoPath) return gitrepo.DeleteRepository(ctx, repo_model.StorageRepo(relativePath))
} }
type unadoptedRepositories struct { type unadoptedRepositories struct {

View File

@ -6,7 +6,6 @@ package repository
import ( import (
"context" "context"
"fmt" "fmt"
"os"
"strings" "strings"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
@ -291,12 +290,8 @@ func transferOwnership(ctx context.Context, doer *user_model.User, newOwnerName
} }
// Rename remote repository to new path and delete local copy. // Rename remote repository to new path and delete local copy.
dir := user_model.UserPath(newOwner.Name) oldRelativePath, newRelativePath := repo_model.RelativePath(oldOwner.Name, repo.Name), repo_model.RelativePath(newOwner.Name, repo.Name)
if err := os.MkdirAll(dir, os.ModePerm); err != nil { if err := gitrepo.RenameRepository(ctx, repo_model.StorageRepo(oldRelativePath), repo_model.StorageRepo(newRelativePath)); err != nil {
return fmt.Errorf("Failed to create dir %s: %w", dir, err)
}
if err := util.Rename(repo_model.RepoPath(oldOwner.Name, repo.Name), repo_model.RepoPath(newOwner.Name, repo.Name)); err != nil {
return fmt.Errorf("rename repository directory: %w", err) return fmt.Errorf("rename repository directory: %w", err)
} }
repoRenamed = true repoRenamed = true