151 lines
4.0 KiB
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
|
||
|
}
|