Launchpad bridge configuration from `BridgeParams` Project and URL

Amine Hilaly created

Improve Github config comments

Change summary

bridge/github/config.go    |  8 +++--
bridge/launchpad/config.go | 53 ++++++++++++++++++++++++++++++++++++---
2 files changed, 53 insertions(+), 8 deletions(-)

Detailed changes

bridge/github/config.go 🔗

@@ -42,25 +42,27 @@ func (*Github) Configure(repo repository.RepoCommon, params core.BridgeParams) (
 	var owner string
 	var project string
 
-	// getting owner and project name:
-	// first use directly params if they are both provided, else try to parse
-	// them from params URL, and finaly try getting them from terminal prompt
+	// getting owner and project name
 	if params.Owner != "" && params.Project != "" {
+		// first try to use params if they are both provided
 		owner = params.Owner
 		project = params.Project
 
 	} else if params.URL != "" {
+		// try to parse them from params URL
 		_, owner, project, err = splitURL(params.URL)
 		if err != nil {
 			return nil, err
 		}
 
 	} else {
+		// remote suggestions
 		remotes, err := repo.GetRemotes()
 		if err != nil {
 			return nil, err
 		}
 
+		// try terminal prompt
 		owner, project, err = promptURL(remotes)
 		if err != nil {
 			return nil, err

bridge/launchpad/config.go 🔗

@@ -3,7 +3,9 @@ package launchpad
 import (
 	"bufio"
 	"fmt"
+	"net/http"
 	"os"
+	"regexp"
 	"strings"
 
 	"github.com/MichaelMure/git-bug/bridge/core"
@@ -12,18 +14,43 @@ import (
 
 const keyProject = "project"
 
+var (
+	rxLaunchpadURL = regexp.MustCompile(`launchpad\.net[\/:]([^\/]*[a-z]+)`)
+)
+
 func (*Launchpad) Configure(repo repository.RepoCommon, params core.BridgeParams) (core.Configuration, error) {
 	conf := make(core.Configuration)
+	var err error
+	var project string
+
+	if params.Project != "" {
+		project = params.Project
+
+	} else if params.URL != "" {
+		// get project name from url
+		_, project, err = splitURL(params.URL)
+		if err != nil {
+			return nil, err
+		}
 
-	if params.Project == "" {
-		projectName, err := promptProjectName()
+	} else {
+		// get project name from terminal prompt
+		project, err = promptProjectName()
 		if err != nil {
 			return nil, err
 		}
+	}
 
-		conf[keyProject] = projectName
+	// verify project
+	ok, err := validateProject(project)
+	if err != nil {
+		return nil, err
+	}
+	if !ok {
+		return nil, fmt.Errorf("project doesn't exist")
 	}
 
+	conf[keyProject] = project
 	return conf, nil
 }
 
@@ -55,6 +82,22 @@ func promptProjectName() (string, error) {
 	}
 }
 
-func validateProject() (bool, error) {
-	return false, nil
+func validateProject(project string) (bool, error) {
+	url := fmt.Sprintf("%s/%s", apiRoot, project)
+
+	resp, err := http.Get(url)
+	if err != nil {
+		return false, err
+	}
+
+	return resp.StatusCode == http.StatusOK, nil
+}
+
+func splitURL(url string) (string, string, error) {
+	res := rxLaunchpadURL.FindStringSubmatch(url)
+	if res == nil {
+		return "", "", fmt.Errorf("bad Launchpad project url")
+	}
+
+	return res[0], res[1], nil
 }