Skip to content

Commit 9c673d0

Browse files
authoredMar 14, 2025
Add abstraction layer to check if the repository exists on disk (go-gitea#33874)
Extract from go-gitea#28966 This PR uses `gitrepo.IsRepositoryExist` instead of `util.IsExist` to detect whether the repository exist in disk. This will move `RepoPath` detail behind of package `gitrepo` to make it easier to do possible changes where storing the repositories. No code change
1 parent 1e72480 commit 9c673d0

File tree

6 files changed

+45
-47
lines changed

6 files changed

+45
-47
lines changed
 

‎modules/gitrepo/gitrepo.go

+5
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,8 @@ func RepositoryFromRequestContextOrOpen(ctx reqctx.RequestContext, repo Reposito
6969
ctx.SetContextValue(ck, gitRepo)
7070
return gitRepo, nil
7171
}
72+
73+
// IsRepositoryExist returns true if the repository directory exists in the disk
74+
func IsRepositoryExist(ctx context.Context, repo Repository) (bool, error) {
75+
return util.IsExist(repoPath(repo))
76+
}

‎modules/repository/init.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
issues_model "code.gitea.io/gitea/models/issues"
1414
repo_model "code.gitea.io/gitea/models/repo"
1515
"code.gitea.io/gitea/modules/git"
16+
"code.gitea.io/gitea/modules/gitrepo"
1617
"code.gitea.io/gitea/modules/label"
1718
"code.gitea.io/gitea/modules/log"
1819
"code.gitea.io/gitea/modules/options"
@@ -120,25 +121,24 @@ func LoadRepoConfig() error {
120121
return nil
121122
}
122123

123-
func CheckInitRepository(ctx context.Context, owner, name, objectFormatName string) (err error) {
124+
func CheckInitRepository(ctx context.Context, repo *repo_model.Repository) (err error) {
124125
// Somehow the directory could exist.
125-
repoPath := repo_model.RepoPath(owner, name)
126-
isExist, err := util.IsExist(repoPath)
126+
isExist, err := gitrepo.IsRepositoryExist(ctx, repo)
127127
if err != nil {
128-
log.Error("Unable to check if %s exists. Error: %v", repoPath, err)
128+
log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err)
129129
return err
130130
}
131131
if isExist {
132132
return repo_model.ErrRepoFilesAlreadyExist{
133-
Uname: owner,
134-
Name: name,
133+
Uname: repo.OwnerName,
134+
Name: repo.Name,
135135
}
136136
}
137137

138138
// Init git bare new repository.
139-
if err = git.InitRepository(ctx, repoPath, true, objectFormatName); err != nil {
139+
if err = git.InitRepository(ctx, repo.RepoPath(), true, repo.ObjectFormatName); err != nil {
140140
return fmt.Errorf("git.InitRepository: %w", err)
141-
} else if err = CreateDelegateHooks(repoPath); err != nil {
141+
} else if err = CreateDelegateHooks(repo.RepoPath()); err != nil {
142142
return fmt.Errorf("createDelegateHooks: %w", err)
143143
}
144144
return nil

‎services/repository/adopt.go

+9-11
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,10 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
5252
IsEmpty: !opts.AutoInit,
5353
}
5454

55-
repoPath := repo_model.RepoPath(u.Name, repo.Name)
56-
5755
if err := db.WithTx(ctx, func(ctx context.Context) error {
58-
isExist, err := util.IsExist(repoPath)
56+
isExist, err := gitrepo.IsRepositoryExist(ctx, repo)
5957
if err != nil {
60-
log.Error("Unable to check if %s exists. Error: %v", repoPath, err)
58+
log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err)
6159
return err
6260
}
6361
if !isExist {
@@ -82,7 +80,7 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
8280
}
8381

8482
if err := func() error {
85-
if err := adoptRepository(ctx, repoPath, repo, opts.DefaultBranch); err != nil {
83+
if err := adoptRepository(ctx, repo, opts.DefaultBranch); err != nil {
8684
return fmt.Errorf("adoptRepository: %w", err)
8785
}
8886

@@ -91,7 +89,7 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
9189
}
9290

9391
if stdout, _, err := git.NewCommand("update-server-info").
94-
RunStdString(ctx, &git.RunOpts{Dir: repoPath}); err != nil {
92+
RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()}); err != nil {
9593
log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
9694
return fmt.Errorf("CreateRepository(git update-server-info): %w", err)
9795
}
@@ -107,17 +105,17 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
107105
return repo, nil
108106
}
109107

110-
func adoptRepository(ctx context.Context, repoPath string, repo *repo_model.Repository, defaultBranch string) (err error) {
111-
isExist, err := util.IsExist(repoPath)
108+
func adoptRepository(ctx context.Context, repo *repo_model.Repository, defaultBranch string) (err error) {
109+
isExist, err := gitrepo.IsRepositoryExist(ctx, repo)
112110
if err != nil {
113-
log.Error("Unable to check if %s exists. Error: %v", repoPath, err)
111+
log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err)
114112
return err
115113
}
116114
if !isExist {
117-
return fmt.Errorf("adoptRepository: path does not already exist: %s", repoPath)
115+
return fmt.Errorf("adoptRepository: path does not already exist: %s", repo.FullName())
118116
}
119117

120-
if err := repo_module.CreateDelegateHooks(repoPath); err != nil {
118+
if err := repo_module.CreateDelegateHooks(repo.RepoPath()); err != nil {
121119
return fmt.Errorf("createDelegateHooks: %w", err)
122120
}
123121

‎services/repository/create.go

+16-18
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ type CreateRepoOptions struct {
5252
ObjectFormatName string
5353
}
5454

55-
func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, repoPath string, opts CreateRepoOptions) error {
55+
func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir string, opts CreateRepoOptions) error {
5656
commitTimeStr := time.Now().Format(time.RFC3339)
5757
authorSig := repo.Owner.NewGitSig()
5858

@@ -67,7 +67,7 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir,
6767
)
6868

6969
// Clone to temporary path and do the init commit.
70-
if stdout, _, err := git.NewCommand("clone").AddDynamicArguments(repoPath, tmpDir).
70+
if stdout, _, err := git.NewCommand("clone").AddDynamicArguments(repo.RepoPath(), tmpDir).
7171
RunStdString(ctx, &git.RunOpts{Dir: "", Env: env}); err != nil {
7272
log.Error("Failed to clone from %v into %s: stdout: %s\nError: %v", repo, tmpDir, stdout, err)
7373
return fmt.Errorf("git clone: %w", err)
@@ -139,24 +139,24 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir,
139139
}
140140

141141
// InitRepository initializes README and .gitignore if needed.
142-
func initRepository(ctx context.Context, repoPath string, u *user_model.User, repo *repo_model.Repository, opts CreateRepoOptions) (err error) {
143-
if err = repo_module.CheckInitRepository(ctx, repo.OwnerName, repo.Name, opts.ObjectFormatName); err != nil {
142+
func initRepository(ctx context.Context, u *user_model.User, repo *repo_model.Repository, opts CreateRepoOptions) (err error) {
143+
if err = repo_module.CheckInitRepository(ctx, repo); err != nil {
144144
return err
145145
}
146146

147147
// Initialize repository according to user's choice.
148148
if opts.AutoInit {
149149
tmpDir, err := os.MkdirTemp(os.TempDir(), "gitea-"+repo.Name)
150150
if err != nil {
151-
return fmt.Errorf("Failed to create temp dir for repository %s: %w", repo.RepoPath(), err)
151+
return fmt.Errorf("Failed to create temp dir for repository %s: %w", repo.FullName(), err)
152152
}
153153
defer func() {
154154
if err := util.RemoveAll(tmpDir); err != nil {
155155
log.Warn("Unable to remove temporary directory: %s: Error: %v", tmpDir, err)
156156
}
157157
}()
158158

159-
if err = prepareRepoCommit(ctx, repo, tmpDir, repoPath, opts); err != nil {
159+
if err = prepareRepoCommit(ctx, repo, tmpDir, opts); err != nil {
160160
return fmt.Errorf("prepareRepoCommit: %w", err)
161161
}
162162

@@ -256,10 +256,9 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
256256
return nil
257257
}
258258

259-
repoPath := repo_model.RepoPath(u.Name, repo.Name)
260-
isExist, err := util.IsExist(repoPath)
259+
isExist, err := gitrepo.IsRepositoryExist(ctx, repo)
261260
if err != nil {
262-
log.Error("Unable to check if %s exists. Error: %v", repoPath, err)
261+
log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err)
263262
return err
264263
}
265264
if isExist {
@@ -270,15 +269,15 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
270269
//
271270
// Previously Gitea would just delete and start afresh - this was naughty.
272271
// So we will now fail and delegate to other functionality to adopt or delete
273-
log.Error("Files already exist in %s and we are not going to adopt or delete.", repoPath)
272+
log.Error("Files already exist in %s and we are not going to adopt or delete.", repo.FullName())
274273
return repo_model.ErrRepoFilesAlreadyExist{
275274
Uname: u.Name,
276275
Name: repo.Name,
277276
}
278277
}
279278

280-
if err = initRepository(ctx, repoPath, doer, repo, opts); err != nil {
281-
if err2 := util.RemoveAll(repoPath); err2 != nil {
279+
if err = initRepository(ctx, doer, repo, opts); err != nil {
280+
if err2 := util.RemoveAll(repo.RepoPath()); err2 != nil {
282281
log.Error("initRepository: %v", err)
283282
return fmt.Errorf(
284283
"delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2)
@@ -300,7 +299,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
300299
}
301300

302301
if stdout, _, err := git.NewCommand("update-server-info").
303-
RunStdString(ctx, &git.RunOpts{Dir: repoPath}); err != nil {
302+
RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()}); err != nil {
304303
log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
305304
rollbackRepo = repo
306305
rollbackRepo.OwnerID = u.ID
@@ -312,7 +311,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
312311
if len(opts.License) > 0 {
313312
licenses = append(licenses, opts.License)
314313

315-
stdout, _, err := git.NewCommand("rev-parse", "HEAD").RunStdString(ctx, &git.RunOpts{Dir: repoPath})
314+
stdout, _, err := git.NewCommand("rev-parse", "HEAD").RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()})
316315
if err != nil {
317316
log.Error("CreateRepository(git rev-parse HEAD) in %v: Stdout: %s\nError: %v", repo, stdout, err)
318317
rollbackRepo = repo
@@ -353,14 +352,13 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re
353352
}
354353
}
355354

356-
repoPath := repo_model.RepoPath(u.Name, repo.Name)
357-
isExist, err := util.IsExist(repoPath)
355+
isExist, err := gitrepo.IsRepositoryExist(ctx, repo)
358356
if err != nil {
359-
log.Error("Unable to check if %s exists. Error: %v", repoPath, err)
357+
log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err)
360358
return err
361359
}
362360
if !overwriteOrAdopt && isExist {
363-
log.Error("Files already exist in %s and we are not going to adopt or delete.", repoPath)
361+
log.Error("Files already exist in %s and we are not going to adopt or delete.", repo.FullName())
364362
return repo_model.ErrRepoFilesAlreadyExist{
365363
Uname: u.Name,
366364
Name: repo.Name,

‎services/repository/fork.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -110,15 +110,13 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork
110110
return
111111
}
112112

113-
repoPath := repo_model.RepoPath(owner.Name, repo.Name)
114-
115-
if exists, _ := util.IsExist(repoPath); !exists {
113+
if exists, _ := gitrepo.IsRepositoryExist(ctx, repo); !exists {
116114
return
117115
}
118116

119117
// As the transaction will be failed and hence database changes will be destroyed we only need
120118
// to delete the related repository on the filesystem
121-
if errDelete := util.RemoveAll(repoPath); errDelete != nil {
119+
if errDelete := util.RemoveAll(repo.RepoPath()); errDelete != nil {
122120
log.Error("Failed to remove fork repo")
123121
}
124122
}

‎services/repository/generate.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r
258258
func generateGitContent(ctx context.Context, repo, templateRepo, generateRepo *repo_model.Repository) (err error) {
259259
tmpDir, err := os.MkdirTemp(os.TempDir(), "gitea-"+repo.Name)
260260
if err != nil {
261-
return fmt.Errorf("Failed to create temp dir for repository %s: %w", repo.RepoPath(), err)
261+
return fmt.Errorf("Failed to create temp dir for repository %s: %w", repo.FullName(), err)
262262
}
263263

264264
defer func() {
@@ -350,10 +350,9 @@ func generateRepository(ctx context.Context, doer, owner *user_model.User, templ
350350
return nil, err
351351
}
352352

353-
repoPath := generateRepo.RepoPath()
354-
isExist, err := util.IsExist(repoPath)
353+
isExist, err := gitrepo.IsRepositoryExist(ctx, generateRepo)
355354
if err != nil {
356-
log.Error("Unable to check if %s exists. Error: %v", repoPath, err)
355+
log.Error("Unable to check if %s exists. Error: %v", generateRepo.FullName(), err)
357356
return nil, err
358357
}
359358
if isExist {
@@ -363,7 +362,7 @@ func generateRepository(ctx context.Context, doer, owner *user_model.User, templ
363362
}
364363
}
365364

366-
if err = repo_module.CheckInitRepository(ctx, owner.Name, generateRepo.Name, generateRepo.ObjectFormatName); err != nil {
365+
if err = repo_module.CheckInitRepository(ctx, generateRepo); err != nil {
367366
return generateRepo, err
368367
}
369368

@@ -372,7 +371,7 @@ func generateRepository(ctx context.Context, doer, owner *user_model.User, templ
372371
}
373372

374373
if stdout, _, err := git.NewCommand("update-server-info").
375-
RunStdString(ctx, &git.RunOpts{Dir: repoPath}); err != nil {
374+
RunStdString(ctx, &git.RunOpts{Dir: generateRepo.RepoPath()}); err != nil {
376375
log.Error("GenerateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", generateRepo, stdout, err)
377376
return generateRepo, fmt.Errorf("error in GenerateRepository(git update-server-info): %w", err)
378377
}

0 commit comments

Comments
 (0)
Please sign in to comment.