@@ -16,7 +16,6 @@ import (
1616 repo_model "code.gitea.io/gitea/models/repo"
1717 user_model "code.gitea.io/gitea/models/user"
1818 "code.gitea.io/gitea/modules/container"
19- "code.gitea.io/gitea/modules/git"
2019 "code.gitea.io/gitea/modules/gitrepo"
2120 "code.gitea.io/gitea/modules/log"
2221 "code.gitea.io/gitea/modules/optional"
@@ -28,6 +27,18 @@ import (
2827 "github.com/gobwas/glob"
2928)
3029
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+
3142// AdoptRepository adopts pre-existing repository files for the user/organization.
3243func AdoptRepository (ctx context.Context , doer , u * user_model.User , opts CreateRepoOptions ) (* repo_model.Repository , error ) {
3344 if ! doer .IsAdmin && ! u .CanCreateRepo () {
@@ -48,58 +59,51 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
4859 IsPrivate : opts .IsPrivate ,
4960 IsFsckEnabled : ! opts .IsMirror ,
5061 CloseIssuesViaCommitInAnyBranch : setting .Repository .DefaultCloseIssuesViaCommitsInAnyBranch ,
51- Status : opts . Status ,
62+ Status : repo_model . RepositoryBeingMigrated ,
5263 IsEmpty : ! opts .AutoInit ,
5364 }
5465
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 () {
5777 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 )
6581 }
6682 }
83+ }()
6784
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 )
8089 }
8190
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+ }
8695
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+ }
90100
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 )
102105 }
106+
103107 notify_service .AdoptRepository (ctx , doer , u , repo )
104108
105109 return repo , nil
0 commit comments