diff options
Diffstat (limited to 'bridge/launchpad/config.go')
-rw-r--r-- | bridge/launchpad/config.go | 79 |
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 +} |