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 }