Skip to content

Commit

Permalink
Support importing comment types (#22510)
Browse files Browse the repository at this point in the history
This commit adds support for specifying comment types when importing
with `gitea restore-repo`. It makes it possible to import issue changes,
such as "title changed" or "assigned user changed".

An earlier version of this pull request was made by Matti Ranta, in
https://future.projects.blender.org/blender-migration/gitea-bf/pulls/3

There are two changes with regard to Matti's original code:

1. The comment type was an `int64` in Matti's code, and is now using a
string. This makes it possible to use `comment_type: title`, which is
more reliable and future-proof than an index into an internal list in
the Gitea Go code.

2. Matti's code also had support for including labels, but in a way that
would require knowing the database ID of the labels before the import
even starts, which is impossible. This can be solved by using label
names instead of IDs; for simplicity I I left that out of this PR.
  • Loading branch information
drsybren authored Jan 19, 2023
1 parent cdf53fa commit 151b1a9
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 2 deletions.
9 changes: 9 additions & 0 deletions models/issues/comment.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,15 @@ func (t CommentType) String() string {
return commentStrings[t]
}

func AsCommentType(typeName string) CommentType {
for index, name := range commentStrings {
if typeName == name {
return CommentType(index)
}
}
return CommentTypeUnknown
}

// RoleDescriptor defines comment tag type
type RoleDescriptor int

Expand Down
7 changes: 7 additions & 0 deletions models/issues/comment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,10 @@ func TestFetchCodeComments(t *testing.T) {
assert.NoError(t, err)
assert.Len(t, res, 1)
}

func TestAsCommentType(t *testing.T) {
assert.Equal(t, issues_model.CommentTypeUnknown, issues_model.AsCommentType(""))
assert.Equal(t, issues_model.CommentTypeUnknown, issues_model.AsCommentType("nonsense"))
assert.Equal(t, issues_model.CommentTypeComment, issues_model.AsCommentType("comment"))
assert.Equal(t, issues_model.CommentTypePRUnScheduledToAutoMerge, issues_model.AsCommentType("pull_cancel_scheduled_merge"))
}
2 changes: 2 additions & 0 deletions modules/migration/comment.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ type Commentable interface {
type Comment struct {
IssueIndex int64 `yaml:"issue_index"`
Index int64
CommentType string `yaml:"comment_type"` // see `commentStrings` in models/issues/comment.go
PosterID int64 `yaml:"poster_id"`
PosterName string `yaml:"poster_name"`
PosterEmail string `yaml:"poster_email"`
Created time.Time
Updated time.Time
Content string
Reactions []*Reaction
Meta map[string]interface{} `yaml:"meta,omitempty"` // see models/issues/comment.go for fields in Comment struct
}

// GetExternalName ExternalUserMigrated interface
Expand Down
23 changes: 21 additions & 2 deletions services/migrations/gitea_uploader.go
Original file line number Diff line number Diff line change
Expand Up @@ -454,15 +454,34 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
if comment.Updated.IsZero() {
comment.Updated = comment.Created
}

if comment.CommentType == "" {
// if type field is missing, then assume a normal comment
comment.CommentType = issues_model.CommentTypeComment.String()
}
cm := issues_model.Comment{
IssueID: issue.ID,
Type: issues_model.CommentTypeComment,
Type: issues_model.AsCommentType(comment.CommentType),
Content: comment.Content,
CreatedUnix: timeutil.TimeStamp(comment.Created.Unix()),
UpdatedUnix: timeutil.TimeStamp(comment.Updated.Unix()),
}

switch cm.Type {
case issues_model.CommentTypeAssignees:
cm.AssigneeID = comment.Meta["AssigneeID"].(int64)
if comment.Meta["RemovedAssigneeID"] != nil {
cm.RemovedAssignee = true
}
case issues_model.CommentTypeChangeTitle:
if comment.Meta["OldTitle"] != nil {
cm.OldTitle = fmt.Sprintf("%s", comment.Meta["OldTitle"])
}
if comment.Meta["NewTitle"] != nil {
cm.NewTitle = fmt.Sprintf("%s", comment.Meta["NewTitle"])
}
default:
}

if err := g.remapUser(comment, &cm); err != nil {
return err
}
Expand Down

0 comments on commit 151b1a9

Please sign in to comment.