config.go

  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}