vendor: update go-getter

This commit is contained in:
Mitchell Hashimoto 2016-08-24 16:48:59 -07:00
parent f1f20a3a58
commit 997f2b332b
No known key found for this signature in database
GPG Key ID: 744E147AA52F5B0A
8 changed files with 146 additions and 25 deletions

View File

@ -1,10 +0,0 @@
sudo: false
language: go
go:
- 1.5
branches:
only:
- master

View File

@ -102,6 +102,23 @@ In the absense of a forced protocol, detectors may be run on the URL, transformi
the protocol anyways. The above example would've used the Git protocol either the protocol anyways. The above example would've used the Git protocol either
way since the Git detector would've detected it was a GitHub URL. way since the Git detector would've detected it was a GitHub URL.
### Protocol-Specific Options
Each protocol can support protocol-specific options to configure that
protocol. For example, the `git` protocol supports specifying a `ref`
query parameter that tells it what ref to checkout for that Git
repository.
The options are specified as query parameters on the URL (or URL-like string)
given to go-getter. Using the Git example above, the URL below is a valid
input to go-getter:
github.com/hashicorp/go-getter?ref=abcd1234
The protocol-specific options are documented below the URL format
section. But because they are part of the URL, we point it out here so
you know they exist.
### Checksumming ### Checksumming
For file downloads of any protocol, go-getter can automatically verify For file downloads of any protocol, go-getter can automatically verify
@ -163,3 +180,68 @@ And finally, you can disable archiving completely:
You can combine unarchiving with the other features of go-getter such You can combine unarchiving with the other features of go-getter such
as checksumming. The special `archive` query parameter will be removed as checksumming. The special `archive` query parameter will be removed
from the URL before going to the final protocol downloader. from the URL before going to the final protocol downloader.
## Protocol-Specific Options
This section documents the protocol-specific options that can be specified
for go-getter. These options should be appended to the input as normal query
parameters. Depending on the usage of go-getter, applications may provide
alternate ways of inputting options. For example, [Nomad](https://www.nomadproject.io)
provides a nice options block for specifying options rather than in the URL.
## General (All Protocols)
The options below are available to all protocols:
* `archive` - The archive format to use to unarchive this file, or "" (empty
string) to disable unarchiving. For more details, see the complete section
on archive support above.
* `checksum` - Checksum to verify the downloaded file or archive. See
the entire section on checksumming above for format and more details.
### Local Files (`file`)
None
### Git (`git`)
* `ref` - The Git ref to checkout. This is a ref, so it can point to
a commit SHA, a branch name, etc. If it is a named ref such as a branch
name, go-getter will update it to the latest on each get.
### Mercurial (`hg`)
* `rev` - The Mercurial revision to checkout.
### HTTP (`http`)
None
### S3 (`s3`)
S3 takes various access configurations in the URL. Note that it will also
read these from standard AWS environment variables if they're set. If
the query parameters are present, these take priority.
* `aws_access_key_id` - AWS access key.
* `aws_access_key_secret` - AWS access key secret.
* `aws_access_token` - AWS access token if this is being used.
#### Using IAM Instance Profiles with S3
If you use go-getter and want to use an EC2 IAM Instance Profile to avoid
using credentials, then just omit these and the profile, if available will
be used automatically.
#### S3 Bucket Examples
S3 has several addressing schemes used to reference your bucket. These are
listed here: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro
Some examples for these addressing schemes:
- s3::https://s3.amazonaws.com/bucket/foo
- s3::https://s3-eu-west-1.amazonaws.com/bucket/foo
- bucket.s3.amazonaws.com/foo
- bucket.s3-eu-west-1.amazonaws.com/foo/bar

View File

@ -8,6 +8,7 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"reflect" "reflect"
"runtime"
"sort" "sort"
"strings" "strings"
"testing" "testing"
@ -69,9 +70,16 @@ func TestDecompressor(t *testing.T, d Decompressor, cases []TestDecompressCase)
return return
} }
// Convert expected for windows
expected := tc.DirList
if runtime.GOOS == "windows" {
for i, v := range expected {
expected[i] = strings.Replace(v, "/", "\\", -1)
}
}
// Directory, check for the correct contents // Directory, check for the correct contents
actual := testListDir(t, dst) actual := testListDir(t, dst)
expected := tc.DirList
if !reflect.DeepEqual(actual, expected) { if !reflect.DeepEqual(actual, expected) {
t.Fatalf("bad %s\n\n%#v\n\n%#v", tc.Input, actual, expected) t.Fatalf("bad %s\n\n%#v\n\n%#v", tc.Input, actual, expected)
} }

View File

@ -46,7 +46,7 @@ func (d *ZipDecompressor) Decompress(dst, src string, dir bool) error {
} }
if f.FileInfo().IsDir() { if f.FileInfo().IsDir() {
if dir { if !dir {
return fmt.Errorf("expected a single file: %s", src) return fmt.Errorf("expected a single file: %s", src)
} }
@ -58,6 +58,15 @@ func (d *ZipDecompressor) Decompress(dst, src string, dir bool) error {
continue continue
} }
// Create the enclosing directories if we must. ZIP files aren't
// required to contain entries for just the directories so this
// can happen.
if dir {
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
return err
}
}
// Open the file for reading // Open the file for reading
srcF, err := f.Open() srcF, err := f.Open()
if err != nil { if err != nil {

View File

@ -11,8 +11,13 @@ import (
) )
func (g *FileGetter) Get(dst string, u *url.URL) error { func (g *FileGetter) Get(dst string, u *url.URL) error {
path := u.Path
if u.RawPath != "" {
path = u.RawPath
}
// The source path must exist and be a directory to be usable. // The source path must exist and be a directory to be usable.
if fi, err := os.Stat(u.Path); err != nil { if fi, err := os.Stat(path); err != nil {
return fmt.Errorf("source path error: %s", err) return fmt.Errorf("source path error: %s", err)
} else if !fi.IsDir() { } else if !fi.IsDir() {
return fmt.Errorf("source path must be a directory") return fmt.Errorf("source path must be a directory")
@ -41,12 +46,17 @@ func (g *FileGetter) Get(dst string, u *url.URL) error {
return err return err
} }
return os.Symlink(u.Path, dst) return os.Symlink(path, dst)
} }
func (g *FileGetter) GetFile(dst string, u *url.URL) error { func (g *FileGetter) GetFile(dst string, u *url.URL) error {
path := u.Path
if u.RawPath != "" {
path = u.RawPath
}
// The source path must exist and be a directory to be usable. // The source path must exist and be a directory to be usable.
if fi, err := os.Stat(u.Path); err != nil { if fi, err := os.Stat(path); err != nil {
return fmt.Errorf("source path error: %s", err) return fmt.Errorf("source path error: %s", err)
} else if fi.IsDir() { } else if fi.IsDir() {
return fmt.Errorf("source path must be a file") return fmt.Errorf("source path must be a file")
@ -72,11 +82,11 @@ func (g *FileGetter) GetFile(dst string, u *url.URL) error {
// If we're not copying, just symlink and we're done // If we're not copying, just symlink and we're done
if !g.Copy { if !g.Copy {
return os.Symlink(u.Path, dst) return os.Symlink(path, dst)
} }
// Copy // Copy
srcF, err := os.Open(u.Path) srcF, err := os.Open(path)
if err != nil { if err != nil {
return err return err
} }

View File

@ -13,8 +13,13 @@ import (
) )
func (g *FileGetter) Get(dst string, u *url.URL) error { func (g *FileGetter) Get(dst string, u *url.URL) error {
path := u.Path
if u.RawPath != "" {
path = u.RawPath
}
// The source path must exist and be a directory to be usable. // The source path must exist and be a directory to be usable.
if fi, err := os.Stat(u.Path); err != nil { if fi, err := os.Stat(path); err != nil {
return fmt.Errorf("source path error: %s", err) return fmt.Errorf("source path error: %s", err)
} else if !fi.IsDir() { } else if !fi.IsDir() {
return fmt.Errorf("source path must be a directory") return fmt.Errorf("source path must be a directory")
@ -43,7 +48,7 @@ func (g *FileGetter) Get(dst string, u *url.URL) error {
return err return err
} }
sourcePath := toBackslash(u.Path) sourcePath := toBackslash(path)
// Use mklink to create a junction point // Use mklink to create a junction point
output, err := exec.Command("cmd", "/c", "mklink", "/J", dst, sourcePath).CombinedOutput() output, err := exec.Command("cmd", "/c", "mklink", "/J", dst, sourcePath).CombinedOutput()
@ -55,8 +60,13 @@ func (g *FileGetter) Get(dst string, u *url.URL) error {
} }
func (g *FileGetter) GetFile(dst string, u *url.URL) error { func (g *FileGetter) GetFile(dst string, u *url.URL) error {
path := u.Path
if u.RawPath != "" {
path = u.RawPath
}
// The source path must exist and be a directory to be usable. // The source path must exist and be a directory to be usable.
if fi, err := os.Stat(u.Path); err != nil { if fi, err := os.Stat(path); err != nil {
return fmt.Errorf("source path error: %s", err) return fmt.Errorf("source path error: %s", err)
} else if fi.IsDir() { } else if fi.IsDir() {
return fmt.Errorf("source path must be a file") return fmt.Errorf("source path must be a file")
@ -82,11 +92,11 @@ func (g *FileGetter) GetFile(dst string, u *url.URL) error {
// If we're not copying, just symlink and we're done // If we're not copying, just symlink and we're done
if !g.Copy { if !g.Copy {
return os.Symlink(u.Path, dst) return os.Symlink(path, dst)
} }
// Copy // Copy
srcF, err := os.Open(u.Path) srcF, err := os.Open(path)
if err != nil { if err != nil {
return err return err
} }

View File

@ -7,11 +7,11 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"time"
"github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds" "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
"github.com/aws/aws-sdk-go/aws/ec2metadata"
"github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3"
) )
@ -138,11 +138,21 @@ func (g *S3Getter) getObject(client *s3.S3, dst, bucket, key, version string) er
func (g *S3Getter) getAWSConfig(region string, creds *credentials.Credentials) *aws.Config { func (g *S3Getter) getAWSConfig(region string, creds *credentials.Credentials) *aws.Config {
conf := &aws.Config{} conf := &aws.Config{}
if creds == nil { if creds == nil {
// Grab the metadata URL
metadataURL := os.Getenv("AWS_METADATA_URL")
if metadataURL == "" {
metadataURL = "http://169.254.169.254:80/latest"
}
creds = credentials.NewChainCredentials( creds = credentials.NewChainCredentials(
[]credentials.Provider{ []credentials.Provider{
&credentials.EnvProvider{}, &credentials.EnvProvider{},
&credentials.SharedCredentialsProvider{Filename: "", Profile: ""}, &credentials.SharedCredentialsProvider{Filename: "", Profile: ""},
&ec2rolecreds.EC2RoleProvider{ExpiryWindow: 5 * time.Minute}, &ec2rolecreds.EC2RoleProvider{
Client: ec2metadata.New(session.New(&aws.Config{
Endpoint: aws.String(metadataURL),
})),
},
}) })
} }

4
vendor/vendor.json vendored
View File

@ -1116,8 +1116,10 @@
"revision": "875fb671b3ddc66f8e2f0acc33829c8cb989a38d" "revision": "875fb671b3ddc66f8e2f0acc33829c8cb989a38d"
}, },
{ {
"checksumSHA1": "MN8EmPozxjt3pyOCYfsO5Pon8V0=",
"path": "github.com/hashicorp/go-getter", "path": "github.com/hashicorp/go-getter",
"revision": "2822987a64e0df1236ac29dd277ddf79f4871f9a" "revision": "a186869fff81d32bcb4e98c88c7c7d82880271ba",
"revisionTime": "2016-08-24T23:43:04Z"
}, },
{ {
"path": "github.com/hashicorp/go-getter/helper/url", "path": "github.com/hashicorp/go-getter/helper/url",