55package repo
66
77import (
8- "bytes"
9- "errors"
108 "fmt"
119 "net/http"
1210 "strings"
@@ -19,18 +17,16 @@ import (
1917 user_model "code.gitea.io/gitea/models/user"
2018 "code.gitea.io/gitea/modules/context"
2119 "code.gitea.io/gitea/modules/convert"
22- "code.gitea.io/gitea/modules/graceful"
2320 "code.gitea.io/gitea/modules/lfs"
2421 "code.gitea.io/gitea/modules/log"
2522 base "code.gitea.io/gitea/modules/migration"
26- "code.gitea.io/gitea/modules/notification"
27- repo_module "code.gitea.io/gitea/modules/repository"
2823 "code.gitea.io/gitea/modules/setting"
2924 api "code.gitea.io/gitea/modules/structs"
3025 "code.gitea.io/gitea/modules/util"
3126 "code.gitea.io/gitea/modules/web"
3227 "code.gitea.io/gitea/services/forms"
3328 "code.gitea.io/gitea/services/migrations"
29+ "code.gitea.io/gitea/services/task"
3430)
3531
3632// Migrate migrate remote git repository to gitea
@@ -142,6 +138,7 @@ func Migrate(ctx *context.APIContext) {
142138 CloneAddr : remoteAddr ,
143139 RepoName : form .RepoName ,
144140 Description : form .Description ,
141+ OriginalURL : form .CloneAddr ,
145142 Private : form .Private || setting .Repository .ForcePrivate ,
146143 Mirror : form .Mirror ,
147144 LFS : form .LFS ,
@@ -150,7 +147,7 @@ func Migrate(ctx *context.APIContext) {
150147 AuthPassword : form .AuthPassword ,
151148 AuthToken : form .AuthToken ,
152149 Wiki : form .Wiki ,
153- Issues : form .Issues ,
150+ Issues : form .Issues || form . PullRequests ,
154151 Milestones : form .Milestones ,
155152 Labels : form .Labels ,
156153 Comments : true ,
@@ -168,63 +165,33 @@ func Migrate(ctx *context.APIContext) {
168165 opts .Releases = false
169166 }
170167
171- repo , err := repo_module .CreateRepository (ctx .Doer , repoOwner , models.CreateRepoOptions {
172- Name : opts .RepoName ,
173- Description : opts .Description ,
174- OriginalURL : form .CloneAddr ,
175- GitServiceType : gitServiceType ,
176- IsPrivate : opts .Private ,
177- IsMirror : opts .Mirror ,
178- Status : repo_model .RepositoryBeingMigrated ,
179- })
180- if err != nil {
181- handleMigrateError (ctx , repoOwner , remoteAddr , err )
168+ if err = repo_model .CheckCreateRepository (ctx .Doer , repoOwner , opts .RepoName , false ); err != nil {
169+ handleMigrateError (ctx , repoOwner , & opts , err )
182170 return
183171 }
184172
185- opts .MigrateToRepoID = repo .ID
186-
187- defer func () {
188- if e := recover (); e != nil {
189- var buf bytes.Buffer
190- fmt .Fprintf (& buf , "Handler crashed with error: %v" , log .Stack (2 ))
191-
192- err = errors .New (buf .String ())
193- }
194-
195- if err == nil {
196- notification .NotifyMigrateRepository (ctx .Doer , repoOwner , repo )
197- return
198- }
199-
200- if repo != nil {
201- if errDelete := models .DeleteRepository (ctx .Doer , repoOwner .ID , repo .ID ); errDelete != nil {
202- log .Error ("DeleteRepository: %v" , errDelete )
203- }
204- }
205- }()
206-
207- if repo , err = migrations .MigrateRepository (graceful .GetManager ().HammerContext (), ctx .Doer , repoOwner .Name , opts , nil ); err != nil {
208- handleMigrateError (ctx , repoOwner , remoteAddr , err )
173+ repo , err := task .MigrateRepository (ctx .Doer , repoOwner , opts )
174+ if err == nil {
175+ log .Trace ("Repository migrated: %s/%s" , repoOwner .Name , form .RepoName )
176+ ctx .JSON (http .StatusCreated , convert .ToRepo (repo , perm .AccessModeAdmin ))
209177 return
210178 }
211179
212- log .Trace ("Repository migrated: %s/%s" , repoOwner .Name , form .RepoName )
213- ctx .JSON (http .StatusCreated , convert .ToRepo (repo , perm .AccessModeAdmin ))
180+ handleMigrateError (ctx , repoOwner , & opts , err )
214181}
215182
216- func handleMigrateError (ctx * context.APIContext , repoOwner * user_model.User , remoteAddr string , err error ) {
183+ func handleMigrateError (ctx * context.APIContext , repoOwner * user_model.User , migrationOpts * migrations. MigrateOptions , err error ) {
217184 switch {
218- case repo_model .IsErrRepoAlreadyExist (err ):
219- ctx .Error (http .StatusConflict , "" , "The repository with the same name already exists." )
220- case repo_model .IsErrRepoFilesAlreadyExist (err ):
221- ctx .Error (http .StatusConflict , "" , "Files already exist for this repository. Adopt them or delete them." )
222185 case migrations .IsRateLimitError (err ):
223186 ctx .Error (http .StatusUnprocessableEntity , "" , "Remote visit addressed rate limitation." )
224187 case migrations .IsTwoFactorAuthError (err ):
225188 ctx .Error (http .StatusUnprocessableEntity , "" , "Remote visit required two factors authentication." )
226189 case repo_model .IsErrReachLimitOfRepo (err ):
227190 ctx .Error (http .StatusUnprocessableEntity , "" , fmt .Sprintf ("You have already reached your limit of %d repositories." , repoOwner .MaxCreationLimit ()))
191+ case repo_model .IsErrRepoAlreadyExist (err ):
192+ ctx .Error (http .StatusConflict , "" , "The repository with the same name already exists." )
193+ case repo_model .IsErrRepoFilesAlreadyExist (err ):
194+ ctx .Error (http .StatusConflict , "" , "Files already exist for this repository. Adopt them or delete them." )
228195 case db .IsErrNameReserved (err ):
229196 ctx .Error (http .StatusUnprocessableEntity , "" , fmt .Sprintf ("The username '%s' is reserved." , err .(db.ErrNameReserved ).Name ))
230197 case db .IsErrNameCharsNotAllowed (err ):
@@ -270,3 +237,36 @@ func handleRemoteAddrError(ctx *context.APIContext, err error) {
270237 ctx .Error (http .StatusInternalServerError , "ParseRemoteAddr" , err )
271238 }
272239}
240+
241+ // GetMigratingTask returns the migrating task by repo's id
242+ func GetMigratingTask (ctx * context.APIContext ) {
243+ // swagger:operation GET /repos/migrate/status task
244+ // ---
245+ // summary: Get the migration status of a repository by its id
246+ // produces:
247+ // - application/json
248+ // parameters:
249+ // - name: repo_id
250+ // in: query
251+ // description: repository id
252+ // type: int64
253+ // responses:
254+ // "200":
255+ // "$ref": "#/responses/"
256+ // "404":
257+ // "$ref": "#/response/"
258+ t , err := models .GetMigratingTask (ctx .FormInt64 ("repo_id" ))
259+
260+ if err != nil {
261+ ctx .JSON (http .StatusNotFound , err )
262+ return
263+ }
264+
265+ ctx .JSON (200 , map [string ]interface {}{
266+ "status" : t .Status ,
267+ "err" : t .Message ,
268+ "repo-id" : t .RepoID ,
269+ "start" : t .StartTime ,
270+ "end" : t .EndTime ,
271+ })
272+ }
0 commit comments