mirror of
https://github.com/go-gitea/gitea.git
synced 2025-04-22 09:28:45 +03:00
Add abstraction layer to delete repository from disk (#33879)
Extract from #28966 Follow #33874
This commit is contained in:
@ -5,6 +5,7 @@ package gitrepo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@ -20,8 +21,12 @@ type Repository interface {
|
|||||||
GetOwnerName() string
|
GetOwnerName() string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func absPath(owner, name string) string {
|
||||||
|
return filepath.Join(setting.RepoRootPath, strings.ToLower(owner), strings.ToLower(name)+".git")
|
||||||
|
}
|
||||||
|
|
||||||
func repoPath(repo Repository) string {
|
func repoPath(repo Repository) string {
|
||||||
return filepath.Join(setting.RepoRootPath, strings.ToLower(repo.GetOwnerName()), strings.ToLower(repo.GetName())+".git")
|
return absPath(repo.GetOwnerName(), repo.GetName())
|
||||||
}
|
}
|
||||||
|
|
||||||
func wikiPath(repo Repository) string {
|
func wikiPath(repo Repository) string {
|
||||||
@ -74,3 +79,17 @@ func RepositoryFromRequestContextOrOpen(ctx reqctx.RequestContext, repo Reposito
|
|||||||
func IsRepositoryExist(ctx context.Context, repo Repository) (bool, error) {
|
func IsRepositoryExist(ctx context.Context, repo Repository) (bool, error) {
|
||||||
return util.IsExist(repoPath(repo))
|
return util.IsExist(repoPath(repo))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeleteRepository deletes the repository directory from the disk
|
||||||
|
func DeleteRepository(ctx context.Context, repo Repository) error {
|
||||||
|
return util.RemoveAll(repoPath(repo))
|
||||||
|
}
|
||||||
|
|
||||||
|
// RenameRepository renames a repository's name on disk
|
||||||
|
func RenameRepository(ctx context.Context, repo Repository, newName string) error {
|
||||||
|
newRepoPath := absPath(repo.GetOwnerName(), newName)
|
||||||
|
if err := util.Rename(repoPath(repo), newRepoPath); err != nil {
|
||||||
|
return fmt.Errorf("rename repository directory: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
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/charset"
|
"code.gitea.io/gitea/modules/charset"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
@ -105,7 +106,7 @@ func RefBlame(ctx *context.Context) {
|
|||||||
|
|
||||||
bypassBlameIgnore, _ := strconv.ParseBool(ctx.FormString("bypass-blame-ignore"))
|
bypassBlameIgnore, _ := strconv.ParseBool(ctx.FormString("bypass-blame-ignore"))
|
||||||
|
|
||||||
result, err := performBlame(ctx, ctx.Repo.Repository.RepoPath(), ctx.Repo.Commit, fileName, bypassBlameIgnore)
|
result, err := performBlame(ctx, ctx.Repo.Repository, ctx.Repo.Commit, fileName, bypassBlameIgnore)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.NotFound(err)
|
ctx.NotFound(err)
|
||||||
return
|
return
|
||||||
@ -130,10 +131,10 @@ type blameResult struct {
|
|||||||
FaultyIgnoreRevsFile bool
|
FaultyIgnoreRevsFile bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func performBlame(ctx *context.Context, repoPath string, commit *git.Commit, file string, bypassBlameIgnore bool) (*blameResult, error) {
|
func performBlame(ctx *context.Context, repo *repo_model.Repository, commit *git.Commit, file string, bypassBlameIgnore bool) (*blameResult, error) {
|
||||||
objectFormat := ctx.Repo.GetObjectFormat()
|
objectFormat := ctx.Repo.GetObjectFormat()
|
||||||
|
|
||||||
blameReader, err := git.CreateBlameReader(ctx, objectFormat, repoPath, commit, file, bypassBlameIgnore)
|
blameReader, err := git.CreateBlameReader(ctx, objectFormat, repo.RepoPath(), commit, file, bypassBlameIgnore)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -149,7 +150,7 @@ func performBlame(ctx *context.Context, repoPath string, commit *git.Commit, fil
|
|||||||
if len(r.Parts) == 0 && r.UsesIgnoreRevs {
|
if len(r.Parts) == 0 && r.UsesIgnoreRevs {
|
||||||
// try again without ignored revs
|
// try again without ignored revs
|
||||||
|
|
||||||
blameReader, err = git.CreateBlameReader(ctx, objectFormat, repoPath, commit, file, true)
|
blameReader, err = git.CreateBlameReader(ctx, objectFormat, repo.RepoPath(), commit, file, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -277,7 +277,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err = initRepository(ctx, doer, repo, opts); err != nil {
|
if err = initRepository(ctx, doer, repo, opts); err != nil {
|
||||||
if err2 := util.RemoveAll(repo.RepoPath()); err2 != nil {
|
if err2 := gitrepo.DeleteRepository(ctx, repo); err2 != nil {
|
||||||
log.Error("initRepository: %v", err)
|
log.Error("initRepository: %v", err)
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2)
|
"delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2)
|
||||||
|
@ -23,6 +23,7 @@ import (
|
|||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/models/webhook"
|
"code.gitea.io/gitea/models/webhook"
|
||||||
actions_module "code.gitea.io/gitea/modules/actions"
|
actions_module "code.gitea.io/gitea/modules/actions"
|
||||||
|
"code.gitea.io/gitea/modules/gitrepo"
|
||||||
"code.gitea.io/gitea/modules/lfs"
|
"code.gitea.io/gitea/modules/lfs"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/storage"
|
"code.gitea.io/gitea/modules/storage"
|
||||||
@ -289,8 +290,13 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID
|
|||||||
// we delete the file but the database rollback, the repository will be broken.
|
// we delete the file but the database rollback, the repository will be broken.
|
||||||
|
|
||||||
// Remove repository files.
|
// Remove repository files.
|
||||||
repoPath := repo.RepoPath()
|
if err := gitrepo.DeleteRepository(ctx, repo); err != nil {
|
||||||
system_model.RemoveAllWithNotice(ctx, "Delete repository files", repoPath)
|
desc := fmt.Sprintf("Delete repository files [%s]: %v", repo.FullName(), err)
|
||||||
|
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
|
||||||
|
if err = system_model.CreateNotice(db.DefaultContext, system_model.NoticeRepository, desc); err != nil {
|
||||||
|
log.Error("CreateRepositoryNotice: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Remove wiki files
|
// Remove wiki files
|
||||||
if repo.HasWiki() {
|
if repo.HasWiki() {
|
||||||
|
@ -116,7 +116,7 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork
|
|||||||
|
|
||||||
// As the transaction will be failed and hence database changes will be destroyed we only need
|
// As the transaction will be failed and hence database changes will be destroyed we only need
|
||||||
// to delete the related repository on the filesystem
|
// to delete the related repository on the filesystem
|
||||||
if errDelete := util.RemoveAll(repo.RepoPath()); errDelete != nil {
|
if errDelete := gitrepo.DeleteRepository(ctx, repo); errDelete != nil {
|
||||||
log.Error("Failed to remove fork repo")
|
log.Error("Failed to remove fork repo")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ import (
|
|||||||
project_model "code.gitea.io/gitea/models/project"
|
project_model "code.gitea.io/gitea/models/project"
|
||||||
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/globallock"
|
"code.gitea.io/gitea/modules/globallock"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/util"
|
"code.gitea.io/gitea/modules/util"
|
||||||
@ -335,8 +336,7 @@ func changeRepositoryName(ctx context.Context, repo *repo_model.Repository, newR
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
newRepoPath := repo_model.RepoPath(repo.Owner.Name, newRepoName)
|
if err = gitrepo.RenameRepository(ctx, repo, newRepoName); err != nil {
|
||||||
if err = util.Rename(repo.RepoPath(), newRepoPath); err != nil {
|
|
||||||
return fmt.Errorf("rename repository directory: %w", err)
|
return fmt.Errorf("rename repository directory: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user