Skip to content

Commit 55cc649

Browse files
authored
Add abstraction layer to delete repository from disk (#33879)
Extract from #28966 Follow #33874
1 parent a0e0a30 commit 55cc649

File tree

6 files changed

+37
-11
lines changed

6 files changed

+37
-11
lines changed

modules/gitrepo/gitrepo.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package gitrepo
55

66
import (
77
"context"
8+
"fmt"
89
"io"
910
"path/filepath"
1011
"strings"
@@ -20,8 +21,12 @@ type Repository interface {
2021
GetOwnerName() string
2122
}
2223

24+
func absPath(owner, name string) string {
25+
return filepath.Join(setting.RepoRootPath, strings.ToLower(owner), strings.ToLower(name)+".git")
26+
}
27+
2328
func repoPath(repo Repository) string {
24-
return filepath.Join(setting.RepoRootPath, strings.ToLower(repo.GetOwnerName()), strings.ToLower(repo.GetName())+".git")
29+
return absPath(repo.GetOwnerName(), repo.GetName())
2530
}
2631

2732
func wikiPath(repo Repository) string {
@@ -74,3 +79,17 @@ func RepositoryFromRequestContextOrOpen(ctx reqctx.RequestContext, repo Reposito
7479
func IsRepositoryExist(ctx context.Context, repo Repository) (bool, error) {
7580
return util.IsExist(repoPath(repo))
7681
}
82+
83+
// DeleteRepository deletes the repository directory from the disk
84+
func DeleteRepository(ctx context.Context, repo Repository) error {
85+
return util.RemoveAll(repoPath(repo))
86+
}
87+
88+
// RenameRepository renames a repository's name on disk
89+
func RenameRepository(ctx context.Context, repo Repository, newName string) error {
90+
newRepoPath := absPath(repo.GetOwnerName(), newName)
91+
if err := util.Rename(repoPath(repo), newRepoPath); err != nil {
92+
return fmt.Errorf("rename repository directory: %w", err)
93+
}
94+
return nil
95+
}

routers/web/repo/blame.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"strconv"
1212
"strings"
1313

14+
repo_model "code.gitea.io/gitea/models/repo"
1415
user_model "code.gitea.io/gitea/models/user"
1516
"code.gitea.io/gitea/modules/charset"
1617
"code.gitea.io/gitea/modules/git"
@@ -105,7 +106,7 @@ func RefBlame(ctx *context.Context) {
105106

106107
bypassBlameIgnore, _ := strconv.ParseBool(ctx.FormString("bypass-blame-ignore"))
107108

108-
result, err := performBlame(ctx, ctx.Repo.Repository.RepoPath(), ctx.Repo.Commit, fileName, bypassBlameIgnore)
109+
result, err := performBlame(ctx, ctx.Repo.Repository, ctx.Repo.Commit, fileName, bypassBlameIgnore)
109110
if err != nil {
110111
ctx.NotFound(err)
111112
return
@@ -130,10 +131,10 @@ type blameResult struct {
130131
FaultyIgnoreRevsFile bool
131132
}
132133

133-
func performBlame(ctx *context.Context, repoPath string, commit *git.Commit, file string, bypassBlameIgnore bool) (*blameResult, error) {
134+
func performBlame(ctx *context.Context, repo *repo_model.Repository, commit *git.Commit, file string, bypassBlameIgnore bool) (*blameResult, error) {
134135
objectFormat := ctx.Repo.GetObjectFormat()
135136

136-
blameReader, err := git.CreateBlameReader(ctx, objectFormat, repoPath, commit, file, bypassBlameIgnore)
137+
blameReader, err := git.CreateBlameReader(ctx, objectFormat, repo.RepoPath(), commit, file, bypassBlameIgnore)
137138
if err != nil {
138139
return nil, err
139140
}
@@ -149,7 +150,7 @@ func performBlame(ctx *context.Context, repoPath string, commit *git.Commit, fil
149150
if len(r.Parts) == 0 && r.UsesIgnoreRevs {
150151
// try again without ignored revs
151152

152-
blameReader, err = git.CreateBlameReader(ctx, objectFormat, repoPath, commit, file, true)
153+
blameReader, err = git.CreateBlameReader(ctx, objectFormat, repo.RepoPath(), commit, file, true)
153154
if err != nil {
154155
return nil, err
155156
}

services/repository/create.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
277277
}
278278

279279
if err = initRepository(ctx, doer, repo, opts); err != nil {
280-
if err2 := util.RemoveAll(repo.RepoPath()); err2 != nil {
280+
if err2 := gitrepo.DeleteRepository(ctx, repo); err2 != nil {
281281
log.Error("initRepository: %v", err)
282282
return fmt.Errorf(
283283
"delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2)

services/repository/delete.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
user_model "code.gitea.io/gitea/models/user"
2424
"code.gitea.io/gitea/models/webhook"
2525
actions_module "code.gitea.io/gitea/modules/actions"
26+
"code.gitea.io/gitea/modules/gitrepo"
2627
"code.gitea.io/gitea/modules/lfs"
2728
"code.gitea.io/gitea/modules/log"
2829
"code.gitea.io/gitea/modules/storage"
@@ -289,8 +290,13 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID
289290
// we delete the file but the database rollback, the repository will be broken.
290291

291292
// Remove repository files.
292-
repoPath := repo.RepoPath()
293-
system_model.RemoveAllWithNotice(ctx, "Delete repository files", repoPath)
293+
if err := gitrepo.DeleteRepository(ctx, repo); err != nil {
294+
desc := fmt.Sprintf("Delete repository files [%s]: %v", repo.FullName(), err)
295+
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
296+
if err = system_model.CreateNotice(db.DefaultContext, system_model.NoticeRepository, desc); err != nil {
297+
log.Error("CreateRepositoryNotice: %v", err)
298+
}
299+
}
294300

295301
// Remove wiki files
296302
if repo.HasWiki() {

services/repository/fork.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork
116116

117117
// As the transaction will be failed and hence database changes will be destroyed we only need
118118
// to delete the related repository on the filesystem
119-
if errDelete := util.RemoveAll(repo.RepoPath()); errDelete != nil {
119+
if errDelete := gitrepo.DeleteRepository(ctx, repo); errDelete != nil {
120120
log.Error("Failed to remove fork repo")
121121
}
122122
}

services/repository/transfer.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
project_model "code.gitea.io/gitea/models/project"
1818
repo_model "code.gitea.io/gitea/models/repo"
1919
user_model "code.gitea.io/gitea/models/user"
20+
"code.gitea.io/gitea/modules/gitrepo"
2021
"code.gitea.io/gitea/modules/globallock"
2122
"code.gitea.io/gitea/modules/log"
2223
"code.gitea.io/gitea/modules/util"
@@ -335,8 +336,7 @@ func changeRepositoryName(ctx context.Context, repo *repo_model.Repository, newR
335336
}
336337
}
337338

338-
newRepoPath := repo_model.RepoPath(repo.Owner.Name, newRepoName)
339-
if err = util.Rename(repo.RepoPath(), newRepoPath); err != nil {
339+
if err = gitrepo.RenameRepository(ctx, repo, newRepoName); err != nil {
340340
return fmt.Errorf("rename repository directory: %w", err)
341341
}
342342

0 commit comments

Comments
 (0)