@@ -16,7 +16,6 @@ import (
16
16
repo_model "code.gitea.io/gitea/models/repo"
17
17
user_model "code.gitea.io/gitea/models/user"
18
18
"code.gitea.io/gitea/modules/container"
19
- "code.gitea.io/gitea/modules/git"
20
19
"code.gitea.io/gitea/modules/gitrepo"
21
20
"code.gitea.io/gitea/modules/log"
22
21
"code.gitea.io/gitea/modules/optional"
@@ -28,6 +27,18 @@ import (
28
27
"github.com/gobwas/glob"
29
28
)
30
29
30
+ func deleteFailedAdoptRepository (repoID int64 ) error {
31
+ return db .WithTx (db .DefaultContext , func (ctx context.Context ) error {
32
+ if err := deleteDBRepository (ctx , repoID ); err != nil {
33
+ return fmt .Errorf ("deleteDBRepository: %w" , err )
34
+ }
35
+ if err := git_model .DeleteRepoBranches (ctx , repoID ); err != nil {
36
+ return fmt .Errorf ("deleteRepoBranches: %w" , err )
37
+ }
38
+ return repo_model .DeleteRepoReleases (ctx , repoID )
39
+ })
40
+ }
41
+
31
42
// AdoptRepository adopts pre-existing repository files for the user/organization.
32
43
func AdoptRepository (ctx context.Context , doer , u * user_model.User , opts CreateRepoOptions ) (* repo_model.Repository , error ) {
33
44
if ! doer .IsAdmin && ! u .CanCreateRepo () {
@@ -48,58 +59,51 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
48
59
IsPrivate : opts .IsPrivate ,
49
60
IsFsckEnabled : ! opts .IsMirror ,
50
61
CloseIssuesViaCommitInAnyBranch : setting .Repository .DefaultCloseIssuesViaCommitsInAnyBranch ,
51
- Status : opts . Status ,
62
+ Status : repo_model . RepositoryBeingMigrated ,
52
63
IsEmpty : ! opts .AutoInit ,
53
64
}
54
65
55
- if err := db .WithTx (ctx , func (ctx context.Context ) error {
56
- isExist , err := gitrepo .IsRepositoryExist (ctx , repo )
66
+ // 1 - create the repository database operations first
67
+ err := db .WithTx (ctx , func (ctx context.Context ) error {
68
+ return createRepositoryInDB (ctx , doer , u , repo , false )
69
+ })
70
+ if err != nil {
71
+ return nil , err
72
+ }
73
+
74
+ // last - clean up if something goes wrong
75
+ // WARNING: Don't override all later err with local variables
76
+ defer func () {
57
77
if err != nil {
58
- log .Error ("Unable to check if %s exists. Error: %v" , repo .FullName (), err )
59
- return err
60
- }
61
- if ! isExist {
62
- return repo_model.ErrRepoNotExist {
63
- OwnerName : u .Name ,
64
- Name : repo .Name ,
78
+ // we can not use the ctx because it maybe canceled or timeout
79
+ if errDel := deleteFailedAdoptRepository (repo .ID ); errDel != nil {
80
+ log .Error ("Failed to delete repository %s that could not be adopted: %v" , repo .FullName (), errDel )
65
81
}
66
82
}
83
+ }()
67
84
68
- if err := CreateRepositoryByExample (ctx , doer , u , repo , true , false ); err != nil {
69
- return err
70
- }
71
-
72
- // Re-fetch the repository from database before updating it (else it would
73
- // override changes that were done earlier with sql)
74
- if repo , err = repo_model .GetRepositoryByID (ctx , repo .ID ); err != nil {
75
- return fmt .Errorf ("getRepositoryByID: %w" , err )
76
- }
77
- return nil
78
- }); err != nil {
79
- return nil , err
85
+ // Re-fetch the repository from database before updating it (else it would
86
+ // override changes that were done earlier with sql)
87
+ if repo , err = repo_model .GetRepositoryByID (ctx , repo .ID ); err != nil {
88
+ return nil , fmt .Errorf ("getRepositoryByID: %w" , err )
80
89
}
81
90
82
- if err := func () error {
83
- if err : = adoptRepository (ctx , repo , opts .DefaultBranch ); err != nil {
84
- return fmt .Errorf ("adoptRepository: %w" , err )
85
- }
91
+ // 2 - adopt the repository from disk
92
+ if err = adoptRepository (ctx , repo , opts .DefaultBranch ); err != nil {
93
+ return nil , fmt .Errorf ("adoptRepository: %w" , err )
94
+ }
86
95
87
- if err := repo_module .CheckDaemonExportOK (ctx , repo ); err != nil {
88
- return fmt .Errorf ("checkDaemonExportOK: %w" , err )
89
- }
96
+ // 3 - Update the git repository
97
+ if err = updateGitRepoAfterCreate (ctx , repo ); err != nil {
98
+ return nil , fmt .Errorf ("updateGitRepoAfterCreate: %w" , err )
99
+ }
90
100
91
- if stdout , _ , err := git .NewCommand ("update-server-info" ).
92
- RunStdString (ctx , & git.RunOpts {Dir : repo .RepoPath ()}); err != nil {
93
- log .Error ("CreateRepository(git update-server-info) in %v: Stdout: %s\n Error: %v" , repo , stdout , err )
94
- return fmt .Errorf ("CreateRepository(git update-server-info): %w" , err )
95
- }
96
- return nil
97
- }(); err != nil {
98
- if errDel := DeleteRepository (ctx , doer , repo , false /* no notify */ ); errDel != nil {
99
- log .Error ("Failed to delete repository %s that could not be adopted: %v" , repo .FullName (), errDel )
100
- }
101
- return nil , err
101
+ // 4 - update repository status
102
+ repo .Status = repo_model .RepositoryReady
103
+ if err = repo_model .UpdateRepositoryCols (ctx , repo , "status" ); err != nil {
104
+ return nil , fmt .Errorf ("UpdateRepositoryCols: %w" , err )
102
105
}
106
+
103
107
notify_service .AdoptRepository (ctx , doer , u , repo )
104
108
105
109
return repo , nil
0 commit comments