Skip to content

Commit b13e120

Browse files
committed
Add migrating message
Signed-off-by: Andrew Thornton <[email protected]>
1 parent 6021fbf commit b13e120

File tree

12 files changed

+120
-11
lines changed

12 files changed

+120
-11
lines changed

models/migrations/migrations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,8 @@ var migrations = []Migration{
309309
NewMigration("Add LFS columns to Mirror", addLFSMirrorColumns),
310310
// v179 -> v180
311311
NewMigration("Convert avatar url to text", convertAvatarURLToText),
312+
// v180 -> v181
313+
NewMigration("Delete orphaned IssueLabels", renameTaskErrorsToMessage),
312314
}
313315

314316
// GetCurrentDBVersion returns the current db version

models/migrations/v180.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package migrations
6+
7+
import (
8+
"fmt"
9+
10+
"code.gitea.io/gitea/modules/setting"
11+
"xorm.io/xorm"
12+
)
13+
14+
func renameTaskErrorsToMessage(x *xorm.Engine) error {
15+
type Task struct {
16+
Errors string `xorm:"TEXT"` // if task failed, saved the error reason
17+
Type int
18+
Status int `xorm:"index"`
19+
}
20+
21+
sess := x.NewSession()
22+
defer sess.Close()
23+
if err := sess.Begin(); err != nil {
24+
return err
25+
}
26+
27+
if err := sess.Sync2(new(Task)); err != nil {
28+
return fmt.Errorf("error on Sync2: %v", err)
29+
}
30+
31+
switch {
32+
case setting.Database.UseMySQL:
33+
if _, err := sess.Exec("ALTER TABLE `task` CHANGE errors message text"); err != nil {
34+
return err
35+
}
36+
case setting.Database.UseMSSQL:
37+
if _, err := sess.Exec("sp_rename 'task.errors', 'message', 'COLUMN'"); err != nil {
38+
return err
39+
}
40+
default:
41+
if _, err := sess.Exec("ALTER TABLE `task` RENAME COLUMN errors TO message"); err != nil {
42+
return err
43+
}
44+
}
45+
return sess.Commit()
46+
}

models/task.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,16 @@ type Task struct {
2929
StartTime timeutil.TimeStamp
3030
EndTime timeutil.TimeStamp
3131
PayloadContent string `xorm:"TEXT"`
32-
Errors string `xorm:"TEXT"` // if task failed, saved the error reason
32+
Message string `xorm:"TEXT"` // if task failed, saved the error reason
3333
Created timeutil.TimeStamp `xorm:"created"`
3434
}
3535

36+
// TranslatableMessage represents JSON struct that can be translated with a Locale
37+
type TranslatableMessage struct {
38+
Format string
39+
Args []interface{} `json:"omitempty"`
40+
}
41+
3642
// LoadRepo loads repository of the task
3743
func (task *Task) LoadRepo() error {
3844
return task.loadRepo(x)

modules/migrations/dump.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,9 @@ func DumpRepository(ctx context.Context, baseDir, ownerName string, opts base.Mi
555555
return err
556556
}
557557

558-
if err := migrateRepository(downloader, uploader, opts); err != nil {
558+
if err := migrateRepository(downloader, uploader, opts, func(format string, args ...interface{}) {
559+
560+
}); err != nil {
559561
if err1 := uploader.Rollback(); err1 != nil {
560562
log.Error("rollback failed: %v", err1)
561563
}
@@ -620,7 +622,9 @@ func RestoreRepository(ctx context.Context, baseDir string, ownerName, repoName
620622
}
621623
updateOptionsUnits(&migrateOpts, units)
622624

623-
if err = migrateRepository(downloader, uploader, migrateOpts); err != nil {
625+
if err = migrateRepository(downloader, uploader, migrateOpts, func(format string, args ...interface{}) {
626+
627+
}); err != nil {
624628
if err1 := uploader.Rollback(); err1 != nil {
625629
log.Error("rollback failed: %v", err1)
626630
}

modules/migrations/gitea_uploader_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ func TestGiteaUploadRepo(t *testing.T) {
4747
PullRequests: true,
4848
Private: true,
4949
Mirror: false,
50+
}, func(format string, args ...interface{}) {
51+
5052
})
5153
assert.NoError(t, err)
5254

modules/migrations/migrate.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func IsMigrateURLAllowed(remoteURL string, doer *models.User) error {
9999
}
100100

101101
// MigrateRepository migrate repository according MigrateOptions
102-
func MigrateRepository(ctx context.Context, doer *models.User, ownerName string, opts base.MigrateOptions) (*models.Repository, error) {
102+
func MigrateRepository(ctx context.Context, doer *models.User, ownerName string, opts base.MigrateOptions, messenger func(string, ...interface{})) (*models.Repository, error) {
103103
err := IsMigrateURLAllowed(opts.CloneAddr, doer)
104104
if err != nil {
105105
return nil, err
@@ -118,7 +118,7 @@ func MigrateRepository(ctx context.Context, doer *models.User, ownerName string,
118118
var uploader = NewGiteaLocalUploader(ctx, doer, ownerName, opts.RepoName)
119119
uploader.gitServiceType = opts.GitServiceType
120120

121-
if err := migrateRepository(downloader, uploader, opts); err != nil {
121+
if err := migrateRepository(downloader, uploader, opts, messenger); err != nil {
122122
if err1 := uploader.Rollback(); err1 != nil {
123123
log.Error("rollback failed: %v", err1)
124124
}
@@ -167,7 +167,7 @@ func newDownloader(ctx context.Context, ownerName string, opts base.MigrateOptio
167167
// migrateRepository will download information and then upload it to Uploader, this is a simple
168168
// process for small repository. For a big repository, save all the data to disk
169169
// before upload is better
170-
func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts base.MigrateOptions) error {
170+
func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts base.MigrateOptions, messenger func(string, ...interface{})) error {
171171
repo, err := downloader.GetRepoInfo()
172172
if err != nil {
173173
if !base.IsErrNotSupported(err) {
@@ -185,12 +185,14 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
185185
}
186186

187187
log.Trace("migrating git data")
188+
messenger("repo.migrate.migrating_git")
188189
if err = uploader.CreateRepo(repo, opts); err != nil {
189190
return err
190191
}
191192
defer uploader.Close()
192193

193194
log.Trace("migrating topics")
195+
messenger("repo.migrate.migrating_topics")
194196
topics, err := downloader.GetTopics()
195197
if err != nil {
196198
if !base.IsErrNotSupported(err) {
@@ -206,6 +208,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
206208

207209
if opts.Milestones {
208210
log.Trace("migrating milestones")
211+
messenger("repo.migrate.migrating_milestones")
209212
milestones, err := downloader.GetMilestones()
210213
if err != nil {
211214
if !base.IsErrNotSupported(err) {
@@ -229,6 +232,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
229232

230233
if opts.Labels {
231234
log.Trace("migrating labels")
235+
messenger("repo.migrate.migrating_labels")
232236
labels, err := downloader.GetLabels()
233237
if err != nil {
234238
if !base.IsErrNotSupported(err) {
@@ -252,6 +256,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
252256

253257
if opts.Releases {
254258
log.Trace("migrating releases")
259+
messenger("repo.migrate.migrating_releases")
255260
releases, err := downloader.GetReleases()
256261
if err != nil {
257262
if !base.IsErrNotSupported(err) {
@@ -285,6 +290,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
285290

286291
if opts.Issues {
287292
log.Trace("migrating issues and comments")
293+
messenger("repo.migrate.migrating_issues")
288294
var issueBatchSize = uploader.MaxBatchInsertSize("issue")
289295

290296
for i := 1; ; i++ {
@@ -339,6 +345,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
339345

340346
if opts.PullRequests {
341347
log.Trace("migrating pull requests and comments")
348+
messenger("repo.migrate.migrating_pulls")
342349
var prBatchSize = uploader.MaxBatchInsertSize("pullrequest")
343350
for i := 1; ; i++ {
344351
prs, isEnd, err := downloader.GetPullRequests(i, prBatchSize)

modules/task/migrate.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"code.gitea.io/gitea/modules/structs"
2121
"code.gitea.io/gitea/modules/timeutil"
2222
"code.gitea.io/gitea/modules/util"
23+
jsoniter "github.com/json-iterator/go"
2324
)
2425

2526
func handleCreateError(owner *models.User, err error) error {
@@ -56,7 +57,7 @@ func runMigrateTask(t *models.Task) (err error) {
5657

5758
t.EndTime = timeutil.TimeStampNow()
5859
t.Status = structs.TaskStatusFailed
59-
t.Errors = err.Error()
60+
t.Message = err.Error()
6061
t.RepoID = 0
6162
if err := t.UpdateCols("status", "errors", "repo_id", "end_time"); err != nil {
6263
log.Error("Task UpdateCols failed: %v", err)
@@ -106,7 +107,16 @@ func runMigrateTask(t *models.Task) (err error) {
106107
return
107108
}
108109

109-
repo, err = migrations.MigrateRepository(ctx, t.Doer, t.Owner.Name, *opts)
110+
repo, err = migrations.MigrateRepository(ctx, t.Doer, t.Owner.Name, *opts, func(format string, args ...interface{}) {
111+
message := models.TranslatableMessage{
112+
Format: format,
113+
Args: args,
114+
}
115+
json := jsoniter.ConfigCompatibleWithStandardLibrary
116+
bs, _ := json.Marshal(message)
117+
t.Message = string(bs)
118+
_ = t.UpdateCols("message")
119+
})
110120
if err == nil {
111121
log.Trace("Repository migrated [%d]: %s/%s", repo.ID, t.Owner.Name, repo.Name)
112122
return

options/locale/locale_en-US.ini

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,11 +818,19 @@ migrated_from_fake = Migrated From %[1]s
818818
migrate.migrate = Migrate From %s
819819
migrate.migrating = Migrating from <b>%s</b> ...
820820
migrate.migrating_failed = Migrating from <b>%s</b> failed.
821+
migrate.migrating_failed.error = Error: %s
821822
migrate.github.description = Migrating data from Github.com or Github Enterprise.
822823
migrate.git.description = Migrating or Mirroring git data from Git services
823824
migrate.gitlab.description = Migrating data from GitLab.com or Self-Hosted gitlab server.
824825
migrate.gitea.description = Migrating data from Gitea.com or Self-Hosted Gitea server.
825826
migrate.gogs.description = Migrating data from notabug.org or other Self-Hosted Gogs server.
827+
migrate.migrating_git = Migrating Git Data
828+
migrate.migrating_topics = Migrating Topics
829+
migrate.migrating_milestones = Migrating Milestones
830+
migrate.migrating_labels = Migrating Labels
831+
migrate.migrating_releases = Migrating Releases
832+
migrate.migrating_issues = Migrating Issues
833+
migrate.migrating_pulls = Migrating Pull Requests
826834

827835
mirror_from = mirror of
828836
forked_from = forked from

routers/api/v1/repo/migrate.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,9 @@ func Migrate(ctx *context.APIContext) {
199199
}
200200
}()
201201

202-
if _, err = migrations.MigrateRepository(graceful.GetManager().HammerContext(), ctx.User, repoOwner.Name, opts); err != nil {
202+
if _, err = migrations.MigrateRepository(graceful.GetManager().HammerContext(), ctx.User, repoOwner.Name, opts, func(format string, args ...interface{}) {
203+
204+
}); err != nil {
203205
handleMigrateError(ctx, repoOwner, remoteAddr, err)
204206
return
205207
}

routers/user/task.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"code.gitea.io/gitea/models"
1111
"code.gitea.io/gitea/modules/context"
12+
jsoniter "github.com/json-iterator/go"
1213
)
1314

1415
// TaskStatus returns task's status
@@ -21,9 +22,24 @@ func TaskStatus(ctx *context.Context) {
2122
return
2223
}
2324

25+
message := task.Message
26+
27+
if task.Message != "" && task.Message[0] == '{' {
28+
// assume message is actually a translatable string
29+
json := jsoniter.ConfigCompatibleWithStandardLibrary
30+
var translatableMessage models.TranslatableMessage
31+
if err := json.Unmarshal([]byte(message), &translatableMessage); err != nil {
32+
translatableMessage = models.TranslatableMessage{
33+
Format: "migrate.migrating_failed.error",
34+
Args: []interface{}{task.Message},
35+
}
36+
}
37+
message = ctx.Tr(translatableMessage.Format, translatableMessage.Args...)
38+
}
39+
2440
ctx.JSON(http.StatusOK, map[string]interface{}{
2541
"status": task.Status,
26-
"err": task.Errors,
42+
"message": message,
2743
"repo-id": task.RepoID,
2844
"repo-name": opts.RepoName,
2945
"start": task.StartTime,

templates/repo/migrate/migrating.tmpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<div class="sixteen wide center aligned centered column">
2323
<div id="repo_migrating_progress">
2424
<p>{{.i18n.Tr "repo.migrate.migrating" .CloneAddr | Safe}}</p>
25+
<p id="repo_migrating_progress_message"></p>
2526
</div>
2627
<div id="repo_migrating_failed" hidden>
2728
<p>{{.i18n.Tr "repo.migrate.migrating_failed" .CloneAddr | Safe}}</p>

web_src/js/index.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ function initRepoStatusChecker() {
202202
const migrating = $('#repo_migrating');
203203
$('#repo_migrating_failed').hide();
204204
$('#repo_migrating_failed_image').hide();
205+
$('#repo_migrating_progress_message').hide();
205206
if (migrating) {
206207
const task = migrating.attr('task');
207208
if (typeof task === 'undefined') {
@@ -223,9 +224,13 @@ function initRepoStatusChecker() {
223224
$('#repo_migrating').hide();
224225
$('#repo_migrating_failed').show();
225226
$('#repo_migrating_failed_image').show();
226-
$('#repo_migrating_failed_error').text(xhr.responseJSON.err);
227+
$('#repo_migrating_failed_error').text(xhr.responseJSON.message);
227228
return;
228229
}
230+
if (xhr.responseJSON.message) {
231+
$('#repo_migrating_progress_message').show();
232+
$('#repo_migrating_progress_message').text(xhr.responseJSON.message);
233+
}
229234
setTimeout(() => {
230235
initRepoStatusChecker();
231236
}, 2000);

0 commit comments

Comments
 (0)