1package launchpad
2
3import (
4 "errors"
5 "fmt"
6 "net/http"
7 "regexp"
8
9 "github.com/MichaelMure/git-bug/bridge/core"
10 "github.com/MichaelMure/git-bug/cache"
11 "github.com/MichaelMure/git-bug/input"
12)
13
14var ErrBadProjectURL = errors.New("bad Launchpad project URL")
15
16func (l *Launchpad) Configure(repo *cache.RepoCache, params core.BridgeParams) (core.Configuration, error) {
17 if params.TokenRaw != "" {
18 fmt.Println("warning: token params are ineffective for a Launchpad bridge")
19 }
20 if params.Owner != "" {
21 fmt.Println("warning: --owner is ineffective for a Launchpad bridge")
22 }
23 if params.BaseURL != "" {
24 fmt.Println("warning: --base-url is ineffective for a Launchpad bridge")
25 }
26
27 conf := make(core.Configuration)
28 var err error
29 var project string
30
31 switch {
32 case params.Project != "":
33 project = params.Project
34 case params.URL != "":
35 // get project name from url
36 project, err = splitURL(params.URL)
37 default:
38 // get project name from terminal prompt
39 project, err = input.Prompt("Launchpad project name", "project name", input.Required)
40 }
41
42 if err != nil {
43 return nil, err
44 }
45
46 // verify project
47 ok, err := validateProject(project)
48 if err != nil {
49 return nil, err
50 }
51 if !ok {
52 return nil, fmt.Errorf("project doesn't exist")
53 }
54
55 conf[core.ConfigKeyTarget] = target
56 conf[keyProject] = project
57
58 err = l.ValidateConfig(conf)
59 if err != nil {
60 return nil, err
61 }
62
63 return conf, nil
64}
65
66func (*Launchpad) ValidateConfig(conf core.Configuration) error {
67 if v, ok := conf[core.ConfigKeyTarget]; !ok {
68 return fmt.Errorf("missing %s key", core.ConfigKeyTarget)
69 } else if v != target {
70 return fmt.Errorf("unexpected target name: %v", v)
71 }
72
73 if _, ok := conf[keyProject]; !ok {
74 return fmt.Errorf("missing %s key", keyProject)
75 }
76
77 return nil
78}
79
80func validateProject(project string) (bool, error) {
81 url := fmt.Sprintf("%s/%s", apiRoot, project)
82
83 client := &http.Client{
84 Timeout: defaultTimeout,
85 }
86
87 resp, err := client.Get(url)
88 if err != nil {
89 return false, err
90 }
91
92 return resp.StatusCode == http.StatusOK, nil
93}
94
95// extract project name from url
96func splitURL(url string) (string, error) {
97 re, err := regexp.Compile(`launchpad\.net[\/:]([^\/]*[a-z]+)`)
98 if err != nil {
99 panic("regexp compile:" + err.Error())
100 }
101
102 res := re.FindStringSubmatch(url)
103 if res == nil {
104 return "", ErrBadProjectURL
105 }
106
107 return res[1], nil
108}