Skip to content

Commit eb8884c

Browse files
committed
Fix creating repository
1 parent 96069bf commit eb8884c

File tree

2 files changed

+73
-75
lines changed

2 files changed

+73
-75
lines changed

services/repository/create.go

Lines changed: 71 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -247,98 +247,96 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt
247247

248248
needsUpdateStatus := opts.Status != repo_model.RepositoryReady
249249

250-
if err := db.WithTx(ctx, func(ctx context.Context) error {
250+
// 1 - create the repository database operations first
251+
err := db.WithTx(ctx, func(ctx context.Context) error {
251252
return CreateRepositoryInDB(ctx, doer, u, repo, false, false)
252-
}); err != nil {
253+
})
254+
if err != nil {
253255
return nil, err
254256
}
255257

256-
if err := db.WithTx(ctx, func(ctx context.Context) error {
257-
// No need for init mirror.
258-
if opts.IsMirror {
259-
return nil
260-
}
261-
262-
isExist, err := gitrepo.IsRepositoryExist(ctx, repo)
258+
// last - clean up if something goes wrong
259+
// WARNING: Don't override all later err with local variables
260+
defer func() {
263261
if err != nil {
264-
log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err)
265-
return err
266-
}
267-
if isExist {
268-
// repo already exists - We have two or three options.
269-
// 1. We fail stating that the directory exists
270-
// 2. We create the db repository to go with this data and adopt the git repo
271-
// 3. We delete it and start afresh
272-
//
273-
// Previously Gitea would just delete and start afresh - this was naughty.
274-
// So we will now fail and delegate to other functionality to adopt or delete
275-
log.Error("Files already exist in %s and we are not going to adopt or delete.", repo.FullName())
276-
return repo_model.ErrRepoFilesAlreadyExist{
277-
Uname: u.Name,
278-
Name: repo.Name,
262+
if errDelete := DeleteRepositoryDirectly(ctx, doer, repo.ID); errDelete != nil {
263+
log.Error("Rollback deleteRepository: %v", errDelete)
264+
// add system notice
265+
if err := system_model.CreateRepositoryNotice("DeleteRepositoryDirectly failed when create repository: %v", errDelete); err != nil {
266+
log.Error("CreateRepositoryNotice: %v", err)
267+
}
279268
}
280269
}
270+
}()
281271

282-
if err = initRepository(ctx, doer, repo, opts); err != nil {
283-
if err2 := gitrepo.DeleteRepository(ctx, repo); err2 != nil {
284-
log.Error("initRepository: %v", err)
285-
return fmt.Errorf(
286-
"delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2)
287-
}
288-
return fmt.Errorf("initRepository: %w", err)
289-
}
272+
// No need for init mirror.
273+
if opts.IsMirror {
274+
return repo, nil
275+
}
290276

291-
// Initialize Issue Labels if selected
292-
if len(opts.IssueLabels) > 0 {
293-
if err = repo_module.InitializeLabels(ctx, repo.ID, opts.IssueLabels, false); err != nil {
294-
return fmt.Errorf("InitializeLabels: %w", err)
295-
}
277+
var isExist bool
278+
isExist, err = gitrepo.IsRepositoryExist(ctx, repo)
279+
if err != nil {
280+
log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err)
281+
return nil, err
282+
}
283+
if isExist {
284+
// repo already exists in disk - We have two or three options.
285+
// 1. We fail stating that the directory exists
286+
// 2. We create the db repository to go with this data and adopt the git repo
287+
// 3. We delete it and start afresh
288+
//
289+
// Previously Gitea would just delete and start afresh - this was naughty.
290+
// So we will now fail and delegate to other functionality to adopt or delete
291+
log.Error("Files already exist in %s and we are not going to adopt or delete.", repo.FullName())
292+
return nil, repo_model.ErrRepoFilesAlreadyExist{
293+
Uname: u.Name,
294+
Name: repo.Name,
296295
}
296+
}
297297

298-
if err := repo_module.CheckDaemonExportOK(ctx, repo); err != nil {
299-
return fmt.Errorf("checkDaemonExportOK: %w", err)
300-
}
298+
if err = initRepository(ctx, doer, repo, opts); err != nil {
299+
return nil, fmt.Errorf("initRepository: %w", err)
300+
}
301301

302-
if stdout, _, err := git.NewCommand("update-server-info").
303-
RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()}); err != nil {
304-
log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
305-
return fmt.Errorf("CreateRepository(git update-server-info): %w", err)
302+
// Initialize Issue Labels if selected
303+
if len(opts.IssueLabels) > 0 {
304+
if err = repo_module.InitializeLabels(ctx, repo.ID, opts.IssueLabels, false); err != nil {
305+
return nil, fmt.Errorf("InitializeLabels: %w", err)
306306
}
307+
}
307308

308-
if needsUpdateStatus {
309-
repo.Status = repo_model.RepositoryReady
310-
if err = repo_model.UpdateRepositoryCols(ctx, repo, "status"); err != nil {
311-
return fmt.Errorf("UpdateRepositoryCols: %w", err)
312-
}
309+
if err = repo_module.CheckDaemonExportOK(ctx, repo); err != nil {
310+
return nil, fmt.Errorf("checkDaemonExportOK: %w", err)
311+
}
312+
313+
var stdout string
314+
if stdout, _, err = git.NewCommand("update-server-info").
315+
RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()}); err != nil {
316+
log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
317+
return nil, fmt.Errorf("CreateRepository(git update-server-info): %w", err)
318+
}
319+
320+
if needsUpdateStatus {
321+
repo.Status = repo_model.RepositoryReady
322+
if err = repo_model.UpdateRepositoryCols(ctx, repo, "status"); err != nil {
323+
return nil, fmt.Errorf("UpdateRepositoryCols: %w", err)
313324
}
325+
}
314326

315-
// update licenses
316-
var licenses []string
317-
if len(opts.License) > 0 {
318-
licenses = append(licenses, opts.License)
327+
// update licenses
328+
var licenses []string
329+
if len(opts.License) > 0 {
330+
licenses = append(licenses, opts.License)
319331

320-
stdout, _, err := git.NewCommand("rev-parse", "HEAD").RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()})
321-
if err != nil {
322-
log.Error("CreateRepository(git rev-parse HEAD) in %v: Stdout: %s\nError: %v", repo, stdout, err)
323-
return fmt.Errorf("CreateRepository(git rev-parse HEAD): %w", err)
324-
}
325-
if err := repo_model.UpdateRepoLicenses(ctx, repo, stdout, licenses); err != nil {
326-
return err
327-
}
332+
stdout, _, err = git.NewCommand("rev-parse", "HEAD").RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()})
333+
if err != nil {
334+
log.Error("CreateRepository(git rev-parse HEAD) in %v: Stdout: %s\nError: %v", repo, stdout, err)
335+
return nil, fmt.Errorf("CreateRepository(git rev-parse HEAD): %w", err)
328336
}
329-
return nil
330-
}); err != nil {
331-
if repo != nil {
332-
if errDelete := DeleteRepositoryDirectly(ctx, doer, repo.ID); errDelete != nil {
333-
log.Error("Rollback deleteRepository: %v", errDelete)
334-
// add system notice
335-
if err := system_model.CreateRepositoryNotice("DeleteRepositoryDirectly failed when create repository: %v", errDelete); err != nil {
336-
log.Error("CreateRepositoryNotice: %v", err)
337-
}
338-
}
337+
if err = repo_model.UpdateRepoLicenses(ctx, repo, stdout, licenses); err != nil {
338+
return nil, err
339339
}
340-
341-
return nil, err
342340
}
343341

344342
return repo, nil

services/repository/create_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
func TestCreateRepositoryDirectly(t *testing.T) {
2222
assert.NoError(t, unittest.PrepareTestDatabase())
2323

24-
// a successful generate from template
24+
// a successful creating repository
2525
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
2626

2727
createdRepo, err := CreateRepositoryDirectly(git.DefaultContext, user2, user2, CreateRepoOptions{
@@ -39,7 +39,7 @@ func TestCreateRepositoryDirectly(t *testing.T) {
3939
err = DeleteRepositoryDirectly(db.DefaultContext, user2, createdRepo.ID)
4040
assert.NoError(t, err)
4141

42-
// a failed generate because a timeout
42+
// a failed creating because a timeout
4343
ctx, cancel := context.WithTimeout(db.DefaultContext, 1*time.Millisecond)
4444
defer cancel()
4545
createdRepo2, err := CreateRepositoryDirectly(ctx, user2, user2, CreateRepoOptions{

0 commit comments

Comments
 (0)