1package launchpad
2
3import (
4 "bufio"
5 "fmt"
6 "net/http"
7 "os"
8 "regexp"
9 "strings"
10
11 "github.com/MichaelMure/git-bug/bridge/core"
12 "github.com/MichaelMure/git-bug/repository"
13)
14
15const keyProject = "project"
16
17var (
18 rxLaunchpadURL = regexp.MustCompile(`launchpad\.net[\/:]([^\/]*[a-z]+)`)
19)
20
21func (*Launchpad) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) {
22 conf := make(core.Configuration)
23 var err error
24 var project string
25
26 if params.Project != "" {
27 project = params.Project
28
29 } else if params.URL != "" {
30 // get project name from url
31 _, project, err = splitURL(params.URL)
32 if err != nil {
33 return nil, err
34 }
35
36 } else {
37 // get project name from terminal prompt
38 project, err = promptProjectName()
39 if err != nil {
40 return nil, err
41 }
42 }
43
44 // verify project
45 ok, err := validateProject(project)
46 if err != nil {
47 return nil, err
48 }
49 if !ok {
50 return nil, fmt.Errorf("project doesn't exist")
51 }
52
53 conf[keyProject] = project
54 return conf, nil
55}
56
57func (*Launchpad) ValidateConfig(conf core.Configuration) error {
58 if _, ok := conf[keyProject]; !ok {
59 return fmt.Errorf("missing %s key", keyProject)
60 }
61
62 return nil
63}
64
65func promptProjectName() (string, error) {
66 for {
67 fmt.Print("Launchpad project name: ")
68
69 line, err := bufio.NewReader(os.Stdin).ReadString('\n')
70 if err != nil {
71 return "", err
72 }
73
74 line = strings.TrimRight(line, "\n")
75
76 if line == "" {
77 fmt.Println("Project name is empty")
78 continue
79 }
80
81 return line, nil
82 }
83}
84
85func validateProject(project string) (bool, error) {
86 url := fmt.Sprintf("%s/%s", apiRoot, project)
87
88 resp, err := http.Get(url)
89 if err != nil {
90 return false, err
91 }
92
93 return resp.StatusCode == http.StatusOK, nil
94}
95
96func splitURL(url string) (string, string, error) {
97 res := rxLaunchpadURL.FindStringSubmatch(url)
98 if res == nil {
99 return "", "", fmt.Errorf("bad Launchpad project url")
100 }
101
102 return res[0], res[1], nil
103}