A tool to migrate GitHub Repositories to Gitea including all issues
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

117 Zeilen
3.3 KiB

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()),
})
}