aboutsummaryrefslogtreecommitdiffstats
path: root/bridge/launchpad/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'bridge/launchpad/config.go')
-rw-r--r--bridge/launchpad/config.go79
1 files changed, 74 insertions, 5 deletions
diff --git a/bridge/launchpad/config.go b/bridge/launchpad/config.go
index 11a465be..d8efea46 100644
--- a/bridge/launchpad/config.go
+++ b/bridge/launchpad/config.go
@@ -2,26 +2,65 @@ package launchpad
import (
"bufio"
+ "errors"
"fmt"
+ "net/http"
"os"
+ "regexp"
"strings"
+ "time"
"github.com/MichaelMure/git-bug/bridge/core"
"github.com/MichaelMure/git-bug/repository"
)
-const keyProject = "project"
+var ErrBadProjectURL = errors.New("bad Launchpad project URL")
+
+const (
+ keyProject = "project"
+ defaultTimeout = 60 * time.Second
+)
+
+func (*Launchpad) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) {
+ if params.Token != "" {
+ fmt.Println("warning: --token is ineffective for a Launchpad bridge")
+ }
+ if params.Owner != "" {
+ fmt.Println("warning: --owner is ineffective for a Launchpad bridge")
+ }
-func (*Launchpad) Configure(repo repository.RepoCommon) (core.Configuration, error) {
conf := make(core.Configuration)
+ var err error
+ var project string
+
+ if params.Project != "" {
+ project = params.Project
- projectName, err := promptProjectName()
+ } else if params.URL != "" {
+ // get project name from url
+ project, err = splitURL(params.URL)
+ if err != nil {
+ return nil, err
+ }
+
+ } else {
+ // get project name from terminal prompt
+ project, err = promptProjectName()
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ // verify project
+ ok, err := validateProject(project)
if err != nil {
return nil, err
}
+ if !ok {
+ return nil, fmt.Errorf("project doesn't exist")
+ }
- conf[keyProject] = projectName
-
+ conf[keyProject] = project
return conf, nil
}
@@ -52,3 +91,33 @@ func promptProjectName() (string, error) {
return line, nil
}
}
+
+func validateProject(project string) (bool, error) {
+ url := fmt.Sprintf("%s/%s", apiRoot, project)
+
+ client := &http.Client{
+ Timeout: defaultTimeout,
+ }
+
+ resp, err := client.Get(url)
+ if err != nil {
+ return false, err
+ }
+
+ return resp.StatusCode == http.StatusOK, nil
+}
+
+// extract project name from url
+func splitURL(url string) (string, error) {
+ re, err := regexp.Compile(`launchpad\.net[\/:]([^\/]*[a-z]+)`)
+ if err != nil {
+ panic("regexp compile:" + err.Error())
+ }
+
+ res := re.FindStringSubmatch(url)
+ if res == nil {
+ return "", ErrBadProjectURL
+ }
+
+ return res[1], nil
+}