mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-01 05:36:19 +01:00
Support importing comment types (#22510)
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.
This commit is contained in:
parent
cdf53fa4a7
commit
151b1a9508
4 changed files with 39 additions and 2 deletions
|
@ -175,6 +175,15 @@ func (t CommentType) String() string {
|
||||||
return commentStrings[t]
|
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
|
// RoleDescriptor defines comment tag type
|
||||||
type RoleDescriptor int
|
type RoleDescriptor int
|
||||||
|
|
||||||
|
|
|
@ -62,3 +62,10 @@ func TestFetchCodeComments(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Len(t, res, 1)
|
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"))
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ type Commentable interface {
|
||||||
type Comment struct {
|
type Comment struct {
|
||||||
IssueIndex int64 `yaml:"issue_index"`
|
IssueIndex int64 `yaml:"issue_index"`
|
||||||
Index int64
|
Index int64
|
||||||
|
CommentType string `yaml:"comment_type"` // see `commentStrings` in models/issues/comment.go
|
||||||
PosterID int64 `yaml:"poster_id"`
|
PosterID int64 `yaml:"poster_id"`
|
||||||
PosterName string `yaml:"poster_name"`
|
PosterName string `yaml:"poster_name"`
|
||||||
PosterEmail string `yaml:"poster_email"`
|
PosterEmail string `yaml:"poster_email"`
|
||||||
|
@ -24,6 +25,7 @@ type Comment struct {
|
||||||
Updated time.Time
|
Updated time.Time
|
||||||
Content string
|
Content string
|
||||||
Reactions []*Reaction
|
Reactions []*Reaction
|
||||||
|
Meta map[string]interface{} `yaml:"meta,omitempty"` // see models/issues/comment.go for fields in Comment struct
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetExternalName ExternalUserMigrated interface
|
// GetExternalName ExternalUserMigrated interface
|
||||||
|
|
|
@ -454,15 +454,34 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
|
||||||
if comment.Updated.IsZero() {
|
if comment.Updated.IsZero() {
|
||||||
comment.Updated = comment.Created
|
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{
|
cm := issues_model.Comment{
|
||||||
IssueID: issue.ID,
|
IssueID: issue.ID,
|
||||||
Type: issues_model.CommentTypeComment,
|
Type: issues_model.AsCommentType(comment.CommentType),
|
||||||
Content: comment.Content,
|
Content: comment.Content,
|
||||||
CreatedUnix: timeutil.TimeStamp(comment.Created.Unix()),
|
CreatedUnix: timeutil.TimeStamp(comment.Created.Unix()),
|
||||||
UpdatedUnix: timeutil.TimeStamp(comment.Updated.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 {
|
if err := g.remapUser(comment, &cm); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue