@@ -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 \n Error: %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\n Error: %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\n Error: %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\n Error: %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
0 commit comments