-
Notifications
You must be signed in to change notification settings - Fork 0
/
fork.go
70 lines (62 loc) · 1.72 KB
/
fork.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package pork
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"strings"
"github.com/katoozi/go-devops-tools/nap"
"github.com/spf13/cobra"
)
// ForkResponse is github response schema
type ForkResponse struct {
CloneURL string `json:"clone_url"`
FullName string `json:"full_name"`
}
// ForkCmd is a command that will fork given repo on github
var ForkCmd = &cobra.Command{
Use: "fork",
Short: "fork a repo on Github",
Run: func(cmd *cobra.Command, args []string) {
if len(args) <= 0 {
log.Fatalln("You must provide repo")
}
if err := ForkRepo(args[0]); err != nil {
log.Fatalln("error when forking repo: ", err)
}
},
}
// ForkRepo will fork repo
func ForkRepo(repo string) error {
values := strings.Split(repo, "/")
if len(values) != 2 {
return fmt.Errorf("Github repo must be in this format => owner/project")
}
return GitHubAPI().Call("fork", map[string]string{
"owner": values[0],
"repo": values[1],
}, nil)
}
// GetForkResource will set the rest api options for fork command
func GetForkResource() *nap.RestResource {
forkRouter := nap.NewRouter()
forkRouter.RegisterFunc(202, ForkSuccess)
forkRouter.RegisterFunc(401, func(_ *http.Response, _ interface{}) error {
return fmt.Errorf("You must set Authentication token")
})
fork := nap.NewResource("/repos/{{.owner}}/{{.repo}}/forks", "POST", forkRouter)
return fork
}
// ForkSuccess will handle the succes request of fork command
func ForkSuccess(resp *http.Response, _ interface{}) error {
defer resp.Body.Close()
content, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
respContent := ForkResponse{}
json.Unmarshal(content, &respContent)
fmt.Printf("Forked to repository: %s\n", respContent.FullName)
return nil
}