GiteaMigrator/utils.go

151 lines
4.0 KiB
Go

package main
import (
"context"
"errors"
"fmt"
"os"
"strings"
"code.gitea.io/sdk/gitea"
"github.com/cqroot/prompt"
"github.com/google/go-github/github"
)
// fetchReposForUser fetches a list of all repositories from github for the given user
// or organization. Github by default only returns 30 repositories at a time, so this
// function will make multiple requests to github to fetch all repositories.
// The list of repositories is returned as a list of strings.
func fetchReposForUser(client *github.Client, user string, organization bool) []string {
var repos []string
var page int = 1
var per_page int = 30
for {
var repo_list []*github.Repository
var err error
if organization {
repo_list, _, err = client.Repositories.ListByOrg(context.Background(), user, &github.RepositoryListByOrgOptions{
ListOptions: github.ListOptions{
Page: page,
PerPage: per_page,
},
})
} else {
repo_list, _, err = client.Repositories.List(context.Background(), user, &github.RepositoryListOptions{
ListOptions: github.ListOptions{
Page: page,
PerPage: per_page,
},
})
}
checkErr(err)
if len(repo_list) == 0 {
break
}
for _, repo := range repo_list {
repos = append(repos, fmt.Sprintf("%s/%s", user, repo.GetName()))
}
page++
}
return repos
}
// fetchReposByType fetches a list of repositories from github for the given user based on the
// type of repository (public, private, all, etc.).
// The list of repositories is returned as a list of strings.
func fetchReposByType(client *github.Client, user string, organization bool, types []string) []string {
var repos []string
var page int = 1
var per_page int = 30
for {
repo_mega_list := make([]*github.Repository, 0)
for _, repo_type := range types {
var repo_list []*github.Repository
var err error
if organization {
repo_list, _, err = client.Repositories.ListByOrg(context.Background(), user, &github.RepositoryListByOrgOptions{
Type: repo_type,
ListOptions: github.ListOptions{
Page: page,
PerPage: per_page,
},
})
} else {
repo_list, _, err = client.Repositories.List(context.Background(), user, &github.RepositoryListOptions{
Type: repo_type,
ListOptions: github.ListOptions{
Page: page,
PerPage: per_page,
},
})
}
checkErr(err)
repo_mega_list = append(repo_mega_list, repo_list...)
}
if len(repo_mega_list) == 0 {
break
}
for _, repo := range repo_mega_list {
repos = append(repos, fmt.Sprintf("%s/%s", user, repo.GetName()))
}
page++
}
return repos
}
// buildRepoVisibilityMap builds a map of repository names to their visibility (public or private).
// The list of pairs is returned as a list of strings.
func buildRepoVisibilityMap(client *github.Client, repos []string) map[string]string {
var repo_visibility_list = make(map[string]string)
for _, repo_name := range repos {
parts := strings.Split(repo_name, "/")
repo, _, err := client.Repositories.Get(context.Background(), parts[0], parts[1])
checkErr(err)
visibility := "public"
if *repo.Private {
visibility = "private"
}
repo_visibility_list[repo_name] = visibility
}
return repo_visibility_list
}
func checkErr(err error) {
if err != nil {
if errors.Is(err, prompt.ErrUserQuit) {
fmt.Fprintln(os.Stderr, "Error:", err)
os.Exit(1)
} else {
panic(err)
}
}
}
// authenticateGithub authenticates the user with Github using their username
// and password.
// A Github client is returned.
func authenticateGithub(username string, token string) *github.Client {
ctx := context.Background()
ts := github.BasicAuthTransport{
Username: username,
Password: token,
}
client := github.NewClient(ts.Client())
_, _, err := client.Users.Get(ctx, "")
if err != nil {
fmt.Println("Error", err)
}
return client
}
func authenticateGitea(host string, user string, token string) *gitea.Client {
client, err := gitea.NewClient(host, gitea.SetBasicAuth(user, token))
checkErr(err)
_, _, err = client.GetMyUserInfo()
checkErr(err)
return client
}