Merge pull request #3624 from hashicorp/v-go-getter

Update go-getter
This commit is contained in:
Alex Dadgar
2017-12-06 14:25:56 -08:00
committed by GitHub
7 changed files with 71 additions and 17 deletions

View File

@@ -21,8 +21,7 @@ URLs. For example: "github.com/hashicorp/go-getter" would turn into a
Git URL. Or "./foo" would turn into a file URL. These are extensible.
This library is used by [Terraform](https://terraform.io) for
downloading modules, [Otto](https://ottoproject.io) for dependencies and
Appfile imports, and [Nomad](https://nomadproject.io) for downloading
downloading modules and [Nomad](https://nomadproject.io) for downloading
binaries.
## Installation and Usage
@@ -233,6 +232,9 @@ The options below are available to all protocols:
* `checksum` - Checksum to verify the downloaded file or archive. See
the entire section on checksumming above for format and more details.
* `filename` - When in file download mode, allows specifying the name of the
downloaded file on disk. Has no effect in directory mode.
### Local Files (`file`)
None

View File

@@ -232,7 +232,18 @@ func (c *Client) Get() error {
// Destination is the base name of the URL path in "any" mode when
// a file source is detected.
if mode == ClientModeFile {
dst = filepath.Join(dst, filepath.Base(u.Path))
filename := filepath.Base(u.Path)
// Determine if we have a custom file name
if v := q.Get("filename"); v != "" {
// Delete the query parameter if we have it.
q.Del("filename")
u.RawQuery = q.Encode()
filename = v
}
dst = filepath.Join(dst, filename)
}
}

View File

@@ -18,6 +18,8 @@ import (
"os/exec"
"regexp"
"syscall"
cleanhttp "github.com/hashicorp/go-cleanhttp"
)
// Getter defines the interface that schemes must implement to download
@@ -49,8 +51,13 @@ var Getters map[string]Getter
// syntax is schema::url, example: git::https://foo.com
var forcedRegexp = regexp.MustCompile(`^([A-Za-z0-9]+)::(.+)$`)
// httpClient is the default client to be used by HttpGetters.
var httpClient = cleanhttp.DefaultClient()
func init() {
httpGetter := &HttpGetter{Netrc: true}
httpGetter := &HttpGetter{
Netrc: true,
}
Getters = map[string]Getter{
"file": new(FileGetter),

View File

@@ -180,17 +180,34 @@ func (g *GitGetter) fetchSubmodules(dst, sshKeyFile string) error {
// setupGitEnv sets up the environment for the given command. This is used to
// pass configuration data to git and ssh and enables advanced cloning methods.
func setupGitEnv(cmd *exec.Cmd, sshKeyFile string) {
var sshOpts []string
const gitSSHCommand = "GIT_SSH_COMMAND="
var sshCmd []string
// If we have an existing GIT_SSH_COMMAND, we need to append our options.
// We will also remove our old entry to make sure the behavior is the same
// with versions of Go < 1.9.
env := os.Environ()
for i, v := range env {
if strings.HasPrefix(v, gitSSHCommand) {
sshCmd = []string{v}
env[i], env[len(env)-1] = env[len(env)-1], env[i]
env = env[:len(env)-1]
break
}
}
if len(sshCmd) == 0 {
sshCmd = []string{gitSSHCommand + "ssh"}
}
if sshKeyFile != "" {
// We have an SSH key temp file configured, tell ssh about this.
sshOpts = append(sshOpts, "-i", sshKeyFile)
sshCmd = append(sshCmd, "-i", sshKeyFile)
}
cmd.Env = append(os.Environ(),
// Set the ssh command to use for clones.
"GIT_SSH_COMMAND=ssh "+strings.Join(sshOpts, " "),
)
env = append(env, strings.Join(sshCmd, " "))
cmd.Env = env
}
// checkGitVersion is used to check the version of git installed on the system

View File

@@ -36,6 +36,10 @@ type HttpGetter struct {
// Netrc, if true, will lookup and use auth information found
// in the user's netrc file if available.
Netrc bool
// Client is the http.Client to use for Get requests.
// This defaults to a cleanhttp.DefaultClient if left unset.
Client *http.Client
}
func (g *HttpGetter) ClientMode(u *url.URL) (ClientMode, error) {
@@ -57,13 +61,17 @@ func (g *HttpGetter) Get(dst string, u *url.URL) error {
}
}
if g.Client == nil {
g.Client = httpClient
}
// Add terraform-get to the parameter.
q := u.Query()
q.Add("terraform-get", "1")
u.RawQuery = q.Encode()
// Get the URL
resp, err := http.Get(u.String())
resp, err := g.Client.Get(u.String())
if err != nil {
return err
}
@@ -105,7 +113,11 @@ func (g *HttpGetter) GetFile(dst string, u *url.URL) error {
}
}
resp, err := http.Get(u.String())
if g.Client == nil {
g.Client = httpClient
}
resp, err := g.Client.Get(u.String())
if err != nil {
return err
}

View File

@@ -49,6 +49,11 @@ func SubdirGlob(dst, subDir string) (string, error) {
if err != nil {
return "", err
}
if len(matches) == 0 {
return "", fmt.Errorf("subdir %q not found", subDir)
}
if len(matches) > 1 {
return "", fmt.Errorf("subdir %q matches multiple paths", subDir)
}

10
vendor/vendor.json vendored
View File

@@ -757,16 +757,16 @@
"revisionTime": "2017-06-02T22:43:19Z"
},
{
"checksumSHA1": "aYYfKsxwxF3pz3YqKlmDVxGMrnM=",
"checksumSHA1": "wCKbbnwvVEoKAE5TWunloLhErm4=",
"path": "github.com/hashicorp/go-getter",
"revision": "80eb888f740e980f6585273d48582c74b3a34f88",
"revisionTime": "2017-09-05T20:52:06Z"
"revision": "994f50a6f071b07cfbea9eca9618c9674091ca51",
"revisionTime": "2017-12-04T19:28:26Z"
},
{
"checksumSHA1": "9J+kDr29yDrwsdu2ULzewmqGjpA=",
"path": "github.com/hashicorp/go-getter/helper/url",
"revision": "80eb888f740e980f6585273d48582c74b3a34f88",
"revisionTime": "2017-09-05T20:52:06Z"
"revision": "994f50a6f071b07cfbea9eca9618c9674091ca51",
"revisionTime": "2017-12-04T19:28:26Z"
},
{
"checksumSHA1": "miVF4/7JP0lRwZvFJGKwZWk7aAQ=",