RemoteClone.go 2.8 K raw
1
package main
2
3
import (
4
	"bufio"
5
	"encoding/json"
6
	"fmt"
7
	"io/ioutil"
8
	"net/http"
9
	"os"
10
	"os/exec"
11
	"strings"
12
13
	"github.com/AlecAivazis/survey/v2"
14
	"github.com/fatih/color"
15
)
16
17
func RemoteClone() error {
18
	fmt.Print("Enter the name of GitHub user or org: ")
19
20
	reader := bufio.NewReader(os.Stdin)
21
	input, err := reader.ReadString('\n')
22
	if err != nil {
23
		fmt.Println("An error occurred while reading the input. Please try again", err)
24
		return err
25
	}
26
	input = strings.TrimSuffix(input, "\n")
27
28
	apiURL := fmt.Sprintf("https://api.github.com/users/%s/repos?sort=created&per_page=100", input)
29
30
	response, err := http.Get(apiURL)
31
	if err != nil {
32
		fmt.Println("GitHub API request failed with error", err)
33
		return err
34
	}
35
	defer response.Body.Close()
36
37
	body, err := ioutil.ReadAll(response.Body)
38
	if err != nil {
39
		fmt.Println("Error reading response body:", err)
40
		return err
41
	}
42
43
	var repos []Repository
44
	err = json.Unmarshal(body, &repos)
45
	if err != nil {
46
		fmt.Println("Error unmarshalling JSON:", err)
47
		return err
48
	}
49
50
	selectedRepos := selectRemoteRepos(repos)
51
	confirmAndCloneRepos(selectedRepos)
52
53
	return nil
54
}
55
56
func selectRemoteRepos(repos []Repository) []Repository {
57
	var options []string
58
	for _, repo := range repos {
59
		options = append(options, repo.Name)
60
	}
61
62
	var selected []string
63
	prompt := &survey.MultiSelect{
64
		Message: "Select repositories to clone and initialize:",
65
		Options: options,
66
	}
67
	survey.AskOne(prompt, &selected)
68
69
	var selectedRepos []Repository
70
	for _, name := range selected {
71
		for _, repo := range repos {
72
			if repo.Name == name {
73
				selectedRepos = append(selectedRepos, repo)
74
				break
75
			}
76
		}
77
	}
78
79
	return selectedRepos
80
}
81
82
func confirmAndCloneRepos(repos []Repository) {
83
	confirm := false
84
	prompt := &survey.Confirm{
85
		Message: fmt.Sprintf("Clone and initialize %d repositories?", len(repos)),
86
	}
87
	survey.AskOne(prompt, &confirm)
88
89
	if !confirm {
90
		fmt.Println("Radicalization cancelled.")
91
		return
92
	}
93
94
	fmt.Printf("Cloning and initializing %d repositories...\n", len(repos))
95
96
	for i, repo := range repos {
97
		fmt.Printf("Processing %s (%d/%d)...\n", repo.Name, i+1, len(repos))
98
99
		// Clone the repository
100
		err := cloneRepo(repo.CloneURL, repo.Name)
101
		if err != nil {
102
			color.Red("Error cloning %s: %v\n", repo.Name, err)
103
			continue
104
		}
105
106
		// Initialize with rad
107
		err = runRadInitRemote(repo.Name, repo.Name)
108
		if err != nil {
109
			color.Red("Error initializing %s: %v\n", repo.Name, err)
110
		} else {
111
			color.Green("Cloned and initialized %s\n", repo.Name)
112
		}
113
	}
114
115
	fmt.Println("Radicalization Complete")
116
}
117
118
func cloneRepo(url, name string) error {
119
	cmd := exec.Command("git", "clone", url, name)
120
	return cmd.Run()
121
}
122
123
func runRadInitRemote(path, name string) error {
124
	cmd := exec.Command("rad", "init", "--name", name, "--description", "", "--public", "--no-confirm")
125
	cmd.Dir = path
126
	return cmd.Run()
127
}