Skip to content

Commit

Permalink
Move url helper to go-getter from terraform
Browse files Browse the repository at this point in the history
  • Loading branch information
Radek Simko committed Nov 13, 2015
1 parent ed87cf1 commit b195973
Show file tree
Hide file tree
Showing 9 changed files with 158 additions and 5 deletions.
2 changes: 1 addition & 1 deletion client.go
Expand Up @@ -15,7 +15,7 @@ import (
"path/filepath"
"strings"

urlhelper "github.com/hashicorp/terraform/helper/url"
urlhelper "github.com/hashicorp/go-getter/helper/url"
)

// Client is a client for downloading things.
Expand Down
2 changes: 1 addition & 1 deletion detect.go
Expand Up @@ -4,7 +4,7 @@ import (
"fmt"
"path/filepath"

"github.com/hashicorp/terraform/helper/url"
"github.com/hashicorp/go-getter/helper/url"
)

// Detector defines the interface that an invalid URL or a URL with a blank
Expand Down
2 changes: 1 addition & 1 deletion get_git.go
Expand Up @@ -8,7 +8,7 @@ import (
"os/exec"
"path/filepath"

urlhelper "github.com/hashicorp/terraform/helper/url"
urlhelper "github.com/hashicorp/go-getter/helper/url"
)

// GitGetter is a Getter implementation that will download a module from
Expand Down
2 changes: 1 addition & 1 deletion get_hg.go
Expand Up @@ -9,7 +9,7 @@ import (
"path/filepath"
"runtime"

urlhelper "github.com/hashicorp/terraform/helper/url"
urlhelper "github.com/hashicorp/go-getter/helper/url"
)

// HgGetter is a Getter implementation that will download a module from
Expand Down
14 changes: 14 additions & 0 deletions helper/url/url.go
@@ -0,0 +1,14 @@
package url

import (
"net/url"
)

// Parse parses rawURL into a URL structure.
// The rawURL may be relative or absolute.
//
// Parse is a wrapper for the Go stdlib net/url Parse function, but returns
// Windows "safe" URLs on Windows platforms.
func Parse(rawURL string) (*url.URL, error) {
return parse(rawURL)
}
88 changes: 88 additions & 0 deletions helper/url/url_test.go
@@ -0,0 +1,88 @@
package url

import (
"runtime"
"testing"
)

type parseTest struct {
rawURL string
scheme string
host string
path string
str string
err bool
}

var parseTests = []parseTest{
{
rawURL: "/foo/bar",
scheme: "",
host: "",
path: "/foo/bar",
str: "/foo/bar",
err: false,
},
{
rawURL: "file:///dir/",
scheme: "file",
host: "",
path: "/dir/",
str: "file:///dir/",
err: false,
},
}

var winParseTests = []parseTest{
{
rawURL: `C:\`,
scheme: ``,
host: ``,
path: `C:/`,
str: `C:/`,
err: false,
},
{
rawURL: `file://C:\`,
scheme: `file`,
host: ``,
path: `C:/`,
str: `file://C:/`,
err: false,
},
{
rawURL: `file:///C:\`,
scheme: `file`,
host: ``,
path: `C:/`,
str: `file://C:/`,
err: false,
},
}

func TestParse(t *testing.T) {
if runtime.GOOS == "windows" {
parseTests = append(parseTests, winParseTests...)
}
for i, pt := range parseTests {
url, err := Parse(pt.rawURL)
if err != nil && !pt.err {
t.Errorf("test %d: unexpected error: %s", i, err)
}
if err == nil && pt.err {
t.Errorf("test %d: expected an error", i)
}
if url.Scheme != pt.scheme {
t.Errorf("test %d: expected Scheme = %q, got %q", i, pt.scheme, url.Scheme)
}
if url.Host != pt.host {
t.Errorf("test %d: expected Host = %q, got %q", i, pt.host, url.Host)
}
if url.Path != pt.path {
t.Errorf("test %d: expected Path = %q, got %q", i, pt.path, url.Path)
}
if url.String() != pt.str {
t.Errorf("test %d: expected url.String() = %q, got %q", i, pt.str, url.String())
}
}
}
11 changes: 11 additions & 0 deletions helper/url/url_unix.go
@@ -0,0 +1,11 @@
// +build !windows

package url

import (
"net/url"
)

func parse(rawURL string) (*url.URL, error) {
return url.Parse(rawURL)
}
40 changes: 40 additions & 0 deletions helper/url/url_windows.go
@@ -0,0 +1,40 @@
package url

import (
"fmt"
"net/url"
"path/filepath"
"strings"
)

func parse(rawURL string) (*url.URL, error) {
// Make sure we're using "/" since URLs are "/"-based.
rawURL = filepath.ToSlash(rawURL)

u, err := url.Parse(rawURL)
if err != nil {
return nil, err
}

if len(rawURL) > 1 && rawURL[1] == ':' {
// Assume we're dealing with a drive letter file path where the drive
// letter has been parsed into the URL Scheme, and the rest of the path
// has been parsed into the URL Path without the leading ':' character.
u.Path = fmt.Sprintf("%s:%s", string(rawURL[0]), u.Path)
u.Scheme = ""
}

if len(u.Host) > 1 && u.Host[1] == ':' && strings.HasPrefix(rawURL, "file://") {
// Assume we're dealing with a drive letter file path where the drive
// letter has been parsed into the URL Host.
u.Path = fmt.Sprintf("%s%s", u.Host, u.Path)
u.Host = ""
}

// Remove leading slash for absolute file paths.
if len(u.Path) > 2 && u.Path[0] == '/' && u.Path[2] == ':' {
u.Path = u.Path[1:]
}

return u, err
}
2 changes: 1 addition & 1 deletion module_test.go
Expand Up @@ -8,8 +8,8 @@ import (
"reflect"
"testing"

urlhelper "github.com/hashicorp/go-getter/helper/url"
"github.com/hashicorp/terraform/config"
urlhelper "github.com/hashicorp/terraform/helper/url"
)

const fixtureDir = "./test-fixtures"
Expand Down

0 comments on commit b195973

Please sign in to comment.