package migrations import ( "fmt" "code.gitea.io/sdk/gitea" "github.com/google/go-github/github" ) // Issue migrates a GitHub Issue to a Gitea Issue func (m *Migratory) Issue(gi *github.Issue) (*gitea.Issue, error) { if m.migratedMilestones == nil { m.migratedMilestones = make(map[int64]int64) } if m.migratedLabels == nil { m.migratedLabels = make(map[int64]int64) } // Migrate milestone if it is not already migrated milestone := int64(0) if gi.Milestone != nil { // Lookup if milestone is already migrated if migratedMilestone, ok := m.migratedMilestones[*gi.Milestone.ID]; ok { milestone = migratedMilestone } else if ms, err := m.Milestone(gi.Milestone); err != nil { return nil, err } else { milestone = ms.ID } } // Migrate labels labels, err := m.labels(gi.Labels) if err != nil { return nil, err } return m.Client.CreateIssue(m.repository.Owner.UserName, m.repository.Name, gitea.CreateIssueOption{ Title: gi.GetTitle(), Body: fmt.Sprintf("Author: @%s Posted at: %s\n\n\n%s", *gi.User.Login, gi.GetCreatedAt().Format("02.01.2006 15:04"), gi.GetBody()), Closed: *gi.State == "closed", Milestone: milestone, Labels: labels, }) } func (m *Migratory) labels(gls []github.Label) (results []int64, err error) { for _, gl := range gls { if migratedLabel, ok := m.migratedLabels[*gl.ID]; ok { results = append(results, migratedLabel) } else { var newLabel *gitea.Label if newLabel, err = m.Label(&gl); err != nil { return nil, err } m.migratedLabels[*gl.ID] = newLabel.ID results = append(results, newLabel.ID) } } return } // Label migrates a GitHub Label to a Gitea Label without caching its id func (m *Migratory) Label(gl *github.Label) (*gitea.Label, error) { return m.Client.CreateLabel(m.repository.Owner.UserName, m.repository.Name, gitea.CreateLabelOption{ Name: gl.GetName(), Color: fmt.Sprintf("#%s", gl.GetColor()), }) } // Milestone migrates a GitHub Milesteon to a Gitea Milestone and caches its id func (m *Migratory) Milestone(gm *github.Milestone) (*gitea.Milestone, error) { ms, err := m.Client.CreateMilestone(m.repository.Owner.UserName, m.repository.Name, gitea.CreateMilestoneOption{ Title: gm.GetTitle(), Description: gm.GetDescription(), Deadline: gm.DueOn, }) if err != nil { return nil, err } m.migratedMilestones[*gm.ID] = ms.ID if gm.State != nil && *gm.State != "open" { return m.Client.EditMilestone(m.repository.Owner.UserName, m.repository.Name, ms.ID, gitea.EditMilestoneOption{ State: githubStateToGiteaState(gm.State), }) } return ms, err } func githubStateToGiteaState(ghstate *string) *string { if ghstate == nil { return ghstate } switch *ghstate { case "open": fallthrough case "closed": return ghstate case "all": open := "open" return &open } return nil } // IssueComment migrates a GitHub IssueComment to a Gitea Comment func (m *Migratory) IssueComment(issue *gitea.Issue, gic *github.IssueComment) (*gitea.Comment, error) { return m.Client.CreateIssueComment(m.repository.Owner.UserName, m.repository.Name, issue.Index, gitea.CreateIssueCommentOption{ Body: fmt.Sprintf("Author: @%s Posted at: %s\n\n\n%s", *gic.User.Login, gic.GetCreatedAt().Format("02.01.2006 15:04"), gic.GetBody()), }) }