Skip to content

Higher fidelity imports #21114

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions modules/migration/comment.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ type Commentable interface {
type Comment struct {
IssueIndex int64 `yaml:"issue_index"`
Index int64
CommentType int64 `yaml:"comment_type"`
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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How does the value of Meta gets updated? I can only see some code reading it, but I can not find code writing it.

If let me decide, I would use clear field names instead of the dynamic map: the field names are clearly known, the dynamic map make the code like a dynamic language which loses the static compiling time check

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is written to via custom tooling to comments.yml and used during "restore-repo" CLI command.

I used an interface because this in theory could be extended to fit each field in the comments struct and I can import that struct due to cyclical imports.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is written to via custom tooling to comments.yml and used during "restore-repo" CLI command.

Is there a related PR to show how to use it?

I used an interface because this in theory could be extended to fit each field in the comments struct and I can import that struct due to cyclical imports.

I do not think the "in theory could be extended to fit each field" could really work with a dynamic map. In the end, on the reader side, every field is still pre-defined and clearly hard-coded in code. If it is the case, why not put some pointers like: AssigneeID *uint64, OldTitle *string.

}

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

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

switch issues_model.CommentType(comment.CommentType) {
case issues_model.CommentTypeLabel:
cm.LabelID = comment.Meta["LabelID"].(int64)
// Note: if you want to add a label, you'll need to set content to value "1"
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