A tool to migrate GitHub Repositories to Gitea including all issues
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

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