Skip to content
This repository was archived by the owner on Sep 18, 2024. It is now read-only.

Commit fadd24d

Browse files
pulltheflower泽华
andauthored
Modify migrate repo API (#4)
Co-authored-by: 泽华 <[email protected]>
1 parent 862d3b9 commit fadd24d

File tree

5 files changed

+65
-46
lines changed

5 files changed

+65
-46
lines changed

routers/api/v1/api.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,9 @@ func Routes() *web.Route {
10371037
// requires repo scope
10381038
m.Combo("/repositories/{id}", reqToken(), tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository)).Get(repo.GetByID)
10391039

1040+
m.Group("user", func() {
1041+
m.Get("/task/{id}", user.TaskStatus)
1042+
})
10401043
// Repos (requires repo scope)
10411044
m.Group("/repos", func() {
10421045
m.Get("/search", repo.Search)

routers/api/v1/repo/migrate.go

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,17 @@
44
package repo
55

66
import (
7-
"bytes"
8-
"errors"
97
"fmt"
108
"net/http"
119
"strings"
1210

1311
"code.gitea.io/gitea/models"
1412
"code.gitea.io/gitea/models/db"
1513
"code.gitea.io/gitea/models/organization"
16-
"code.gitea.io/gitea/models/perm"
17-
access_model "code.gitea.io/gitea/models/perm/access"
1814
repo_model "code.gitea.io/gitea/models/repo"
1915
user_model "code.gitea.io/gitea/models/user"
2016
"code.gitea.io/gitea/modules/context"
21-
"code.gitea.io/gitea/modules/graceful"
2217
"code.gitea.io/gitea/modules/lfs"
23-
"code.gitea.io/gitea/modules/log"
2418
base "code.gitea.io/gitea/modules/migration"
2519
"code.gitea.io/gitea/modules/setting"
2620
api "code.gitea.io/gitea/modules/structs"
@@ -29,8 +23,7 @@ import (
2923
"code.gitea.io/gitea/services/convert"
3024
"code.gitea.io/gitea/services/forms"
3125
"code.gitea.io/gitea/services/migrations"
32-
notify_service "code.gitea.io/gitea/services/notify"
33-
repo_service "code.gitea.io/gitea/services/repository"
26+
"code.gitea.io/gitea/services/task"
3427
)
3528

3629
// Migrate migrate remote git repository to gitea
@@ -170,49 +163,19 @@ func Migrate(ctx *context.APIContext) {
170163
opts.Releases = false
171164
}
172165

173-
repo, err := repo_service.CreateRepositoryDirectly(ctx, ctx.Doer, repoOwner, repo_service.CreateRepoOptions{
174-
Name: opts.RepoName,
175-
Description: opts.Description,
176-
OriginalURL: form.CloneAddr,
177-
GitServiceType: gitServiceType,
178-
IsPrivate: opts.Private,
179-
IsMirror: opts.Mirror,
180-
Status: repo_model.RepositoryBeingMigrated,
181-
})
166+
err = repo_model.CheckCreateRepository(ctx, ctx.Doer, repoOwner, opts.RepoName, false)
182167
if err != nil {
183168
handleMigrateError(ctx, repoOwner, remoteAddr, err)
184169
return
185170
}
186171

187-
opts.MigrateToRepoID = repo.ID
188-
189-
defer func() {
190-
if e := recover(); e != nil {
191-
var buf bytes.Buffer
192-
fmt.Fprintf(&buf, "Handler crashed with error: %v", log.Stack(2))
193-
194-
err = errors.New(buf.String())
195-
}
196-
197-
if err == nil {
198-
notify_service.MigrateRepository(ctx, ctx.Doer, repoOwner, repo)
199-
return
200-
}
201-
202-
if repo != nil {
203-
if errDelete := repo_service.DeleteRepositoryDirectly(ctx, ctx.Doer, repo.ID); errDelete != nil {
204-
log.Error("DeleteRepository: %v", errDelete)
205-
}
206-
}
207-
}()
208-
209-
if repo, err = migrations.MigrateRepository(graceful.GetManager().HammerContext(), ctx.Doer, repoOwner.Name, opts, nil); err != nil {
172+
task, err := task.MigrateRepository(ctx, ctx.Doer, repoOwner, opts)
173+
if err != nil {
210174
handleMigrateError(ctx, repoOwner, remoteAddr, err)
211175
return
212176
}
213177

214-
log.Trace("Repository migrated: %s/%s", repoOwner.Name, form.RepoName)
215-
ctx.JSON(http.StatusCreated, convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm.AccessModeAdmin}))
178+
ctx.JSON(http.StatusCreated, task)
216179
}
217180

218181
func handleMigrateError(ctx *context.APIContext, repoOwner *user_model.User, remoteAddr string, err error) {

routers/api/v1/user/task.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright 2020 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package user
5+
6+
import (
7+
"net/http"
8+
"strconv"
9+
10+
admin_model "code.gitea.io/gitea/models/admin"
11+
"code.gitea.io/gitea/modules/context"
12+
"code.gitea.io/gitea/modules/json"
13+
)
14+
15+
// TaskStatus returns task's status
16+
func TaskStatus(ctx *context.APIContext) {
17+
task, opts, err := admin_model.GetMigratingTaskByID(ctx, ctx.ParamsInt64(":id"), ctx.Doer.ID)
18+
if err != nil {
19+
if admin_model.IsErrTaskDoesNotExist(err) {
20+
ctx.JSON(http.StatusNotFound, map[string]any{
21+
"error": "task `" + strconv.FormatInt(ctx.ParamsInt64(":id"), 10) + "` does not exist",
22+
})
23+
return
24+
}
25+
ctx.JSON(http.StatusInternalServerError, map[string]any{
26+
"err": err,
27+
})
28+
return
29+
}
30+
31+
message := task.Message
32+
33+
if task.Message != "" && task.Message[0] == '{' {
34+
// assume message is actually a translatable string
35+
var translatableMessage admin_model.TranslatableMessage
36+
if err := json.Unmarshal([]byte(message), &translatableMessage); err != nil {
37+
translatableMessage = admin_model.TranslatableMessage{
38+
Format: "migrate.migrating_failed.error",
39+
Args: []any{task.Message},
40+
}
41+
}
42+
message = ctx.Tr(translatableMessage.Format, translatableMessage.Args...)
43+
}
44+
45+
ctx.JSON(http.StatusOK, map[string]any{
46+
"status": task.Status,
47+
"message": message,
48+
"repo-id": task.RepoID,
49+
"repo-name": opts.RepoName,
50+
"start": task.StartTime,
51+
"end": task.EndTime,
52+
})
53+
}

routers/web/repo/migrate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ func MigratePost(ctx *context.Context) {
238238
return
239239
}
240240

241-
err = task.MigrateRepository(ctx, ctx.Doer, ctxUser, opts)
241+
_, err = task.MigrateRepository(ctx, ctx.Doer, ctxUser, opts)
242242
if err == nil {
243243
ctx.Redirect(ctxUser.HomeLink() + "/" + url.PathEscape(opts.RepoName))
244244
return

services/task/task.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ func handler(items ...*admin_model.Task) []*admin_model.Task {
5757
}
5858

5959
// MigrateRepository add migration repository to task
60-
func MigrateRepository(ctx context.Context, doer, u *user_model.User, opts base.MigrateOptions) error {
60+
func MigrateRepository(ctx context.Context, doer, u *user_model.User, opts base.MigrateOptions) (*admin_model.Task, error) {
6161
task, err := CreateMigrateTask(ctx, doer, u, opts)
6262
if err != nil {
63-
return err
63+
return nil, err
6464
}
6565

66-
return taskQueue.Push(task)
66+
return task, taskQueue.Push(task)
6767
}
6868

6969
// CreateMigrateTask creates a migrate task

0 commit comments

Comments
 (0)