44package repo
55
66import (
7- "bytes "
7+ gocontext "context "
88 "errors"
99 "fmt"
1010 "net/http"
@@ -173,7 +173,7 @@ func Migrate(ctx *context.APIContext) {
173173 opts .AWSSecretAccessKey = form .AWSSecretAccessKey
174174 }
175175
176- repo , err := repo_service .CreateRepositoryDirectly (ctx , ctx .Doer , repoOwner , repo_service.CreateRepoOptions {
176+ createdRepo , err := repo_service .CreateRepositoryDirectly (ctx , ctx .Doer , repoOwner , repo_service.CreateRepoOptions {
177177 Name : opts .RepoName ,
178178 Description : opts .Description ,
179179 OriginalURL : form .CloneAddr ,
@@ -187,35 +187,33 @@ func Migrate(ctx *context.APIContext) {
187187 return
188188 }
189189
190- opts .MigrateToRepoID = repo .ID
190+ opts .MigrateToRepoID = createdRepo .ID
191191
192- defer func () {
193- if e := recover (); e != nil {
194- var buf bytes.Buffer
195- fmt .Fprintf (& buf , "Handler crashed with error: %v" , log .Stack (2 ))
196-
197- err = errors .New (buf .String ())
198- }
199-
200- if err == nil {
201- notify_service .MigrateRepository (ctx , ctx .Doer , repoOwner , repo )
202- return
203- }
204-
205- if repo != nil {
206- if errDelete := repo_service .DeleteRepositoryDirectly (ctx , repo .ID ); errDelete != nil {
207- log .Error ("DeleteRepository: %v" , errDelete )
192+ doLongTimeMigrate := func (ctx gocontext.Context , doer * user_model.User ) (migratedRepo * repo_model.Repository , retErr error ) {
193+ defer func () {
194+ if e := recover (); e != nil {
195+ log .Error ("Migration panic: %v\n %s" , e , log .Stack (2 ))
196+ if errDelete := repo_service .DeleteRepositoryDirectly (ctx , createdRepo .ID ); errDelete != nil {
197+ log .Error ("Unable to delete repo after migration panic: %v" , errDelete )
198+ }
199+ retErr = errors .New ("migration panic" )
208200 }
201+ }()
202+ migratedRepo , err := migrations .MigrateRepository (graceful .GetManager ().HammerContext (), doer , repoOwner .Name , opts , nil )
203+ if err != nil {
204+ return nil , err
209205 }
210- }()
206+ notify_service .MigrateRepository (ctx , doer , repoOwner , migratedRepo )
207+ return migratedRepo , nil
208+ }
211209
212- if repo , err = migrations .MigrateRepository (graceful .GetManager ().HammerContext (), ctx .Doer , repoOwner .Name , opts , nil ); err != nil {
210+ // don't cancel the migration even if the client goes away
211+ migratedRepo , err := doLongTimeMigrate (graceful .GetManager ().ShutdownContext (), ctx .Doer )
212+ if err != nil {
213213 handleMigrateError (ctx , repoOwner , err )
214214 return
215215 }
216-
217- log .Trace ("Repository migrated: %s/%s" , repoOwner .Name , form .RepoName )
218- ctx .JSON (http .StatusCreated , convert .ToRepo (ctx , repo , access_model.Permission {AccessMode : perm .AccessModeAdmin }))
216+ ctx .JSON (http .StatusCreated , convert .ToRepo (ctx , migratedRepo , access_model.Permission {AccessMode : perm .AccessModeAdmin }))
219217}
220218
221219func handleMigrateError (ctx * context.APIContext , repoOwner * user_model.User , err error ) {
0 commit comments