├── .github └── workflows │ └── tests.yml ├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── apis ├── apis.go ├── github.go ├── github_test.go ├── gitlab.go └── gitlab_test.go ├── config └── config.go ├── debug └── debug.go ├── go.mod ├── go.sum ├── main.go ├── parser ├── parser.go ├── parser_e2e_test.go ├── parser_offline_test.go ├── parser_online_test.go └── parser_test.go ├── testdata ├── buffalo_expected.txt ├── buffalo_modules.txt ├── concourse_expected.txt ├── concourse_modules.txt ├── ctop_expected.txt ├── ctop_modules.txt ├── go-btfs_expected.txt ├── go-btfs_modules.txt ├── minio_expected.txt ├── minio_modules.txt ├── thanos_expected.txt ├── thanos_modules.txt ├── vault_expected.txt └── vault_modules.txt └── tuple ├── discovery.go ├── resolver.go ├── resolver_test.go ├── source.go ├── tuple.go └── tuple_test.go /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | on: [push, pull_request] 2 | name: Tests 3 | jobs: 4 | test: 5 | strategy: 6 | matrix: 7 | go-version: [1.17.x, 1.18.x] 8 | os: [ubuntu-latest] 9 | runs-on: ${{ matrix.os }} 10 | steps: 11 | - uses: actions/setup-go@v3 12 | with: 13 | go-version: ${{ matrix.go-version }} 14 | - uses: actions/checkout@v3 15 | - run: go test -tags=online,e2e ./... 16 | env: 17 | M2T_GITHUB: ${{ secrets.M2T_GITHUB }} 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | modules2tuple 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2019-2020, modules2tuple Authors 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: build 2 | 3 | build: 4 | @go build 5 | 6 | test: 7 | @if [ -z "$$M2T_GITHUB" ]; then \ 8 | echo "*** Please set M2T_GITHUB=:"; \ 9 | exit 1; \ 10 | fi 11 | go test -v -tags=online,e2e ./... 12 | 13 | install: 14 | @go install 15 | 16 | clean: 17 | @go clean 18 | 19 | .PHONY: all build test install 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## modules2tuple 2 | 3 | Helper tool for generating GH_TUPLE and GL_TUPLE from vendor/modules.txt. 4 | 5 | ![Tests](https://github.com/dmgk/modules2tuple/actions/workflows/tests.yml/badge.svg) 6 | 7 | #### Installation 8 | 9 | As a FreeBSD binary package: 10 | 11 | pkg install modules2tuple 12 | 13 | or from ports: 14 | 15 | make -C /usr/ports/devel/modules2tuple install clean 16 | 17 | To install latest dev version directly from GitHub: 18 | 19 | go install github.com/dmgk/modules2tuple/v2 20 | 21 | #### Usage 22 | 23 | modules2tuple [options] modules.txt 24 | 25 | Options: 26 | -offline disable all network access (env M2T_OFFLINE, default false) 27 | -debug print debug info (env M2T_DEBUG, default false) 28 | -v show version 29 | 30 | Usage: 31 | Vendor package dependencies and then run modules2tuple with vendor/modules.txt: 32 | 33 | $ go mod vendor 34 | $ modules2tuple vendor/modules.txt 35 | 36 | When running in offline mode: 37 | - mirrors are looked up using static list and some may not be resolved 38 | - milti-module repos and version suffixes ("/v2") are not automatically handled 39 | - Github tags for modules ("v1.2.3" vs "api/v1.2.3") are not automatically resolved 40 | - Gitlab commit IDs are not resolved to the full 40-char IDs 41 | -------------------------------------------------------------------------------- /apis/apis.go: -------------------------------------------------------------------------------- 1 | package apis 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "io/ioutil" 7 | "net/http" 8 | ) 9 | 10 | var errNotFound = errors.New("not found") 11 | 12 | func get(url, username, token string) ([]byte, error) { 13 | req, err := http.NewRequest("GET", url, nil) 14 | if err != nil { 15 | return nil, err 16 | } 17 | 18 | if username != "" && token != "" { 19 | req.SetBasicAuth(username, token) 20 | } 21 | 22 | resp, err := http.DefaultClient.Do(req) 23 | if err != nil { 24 | return nil, fmt.Errorf("apis.get %s: %v", url, err) 25 | } 26 | defer resp.Body.Close() 27 | 28 | switch resp.StatusCode { 29 | case http.StatusOK: 30 | body, err := ioutil.ReadAll(resp.Body) 31 | if err != nil { 32 | return nil, fmt.Errorf("apis.get %s: %v", url, err) 33 | } 34 | return body, nil 35 | case http.StatusNotFound: 36 | return nil, errNotFound 37 | default: 38 | body, _ := ioutil.ReadAll(resp.Body) 39 | return nil, fmt.Errorf("apis.get %s: %d, body: %v", url, resp.StatusCode, string(body)) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /apis/github.go: -------------------------------------------------------------------------------- 1 | package apis 2 | 3 | import ( 4 | "encoding/json" 5 | "errors" 6 | "fmt" 7 | "net/url" 8 | "path/filepath" 9 | "strings" 10 | 11 | "github.com/dmgk/modules2tuple/v2/config" 12 | ) 13 | 14 | type GithubCommit struct { 15 | SHA string `json:"sha"` 16 | } 17 | 18 | type GithubRef struct { 19 | Ref string `json:"ref"` 20 | } 21 | 22 | var githubRateLimitError = fmt.Sprintf(`Github API rate limit exceeded. Please either: 23 | - set %s environment variable to your Github "username:personal_access_token" 24 | to let modules2tuple call Github API using basic authentication. 25 | To create a new token, navigate to https://github.com/settings/tokens/new 26 | (leave all checkboxes unchecked, modules2tuple doesn't need any access to your account) 27 | - set %s=1 or pass "-offline" flag to module2tuple to disable network access`, 28 | config.GithubCredentialsKey, config.OfflineKey) 29 | 30 | func GithubGetCommit(account, project, tag string) (string, error) { 31 | url := fmt.Sprintf("https://api.github.com/repos/%s/%s/commits/%s", url.PathEscape(account), url.PathEscape(project), tag) 32 | 33 | resp, err := get(url, config.GithubUsername, config.GithubToken) 34 | if err != nil { 35 | if strings.Contains(err.Error(), "API rate limit exceeded") { 36 | return "", errors.New(githubRateLimitError) 37 | } 38 | return "", fmt.Errorf("error getting commit %s for %s/%s: %v", tag, account, project, err) 39 | } 40 | 41 | var res GithubCommit 42 | if err := json.Unmarshal(resp, &res); err != nil { 43 | return "", fmt.Errorf("error unmarshalling: %v, resp: %v", err, string(resp)) 44 | } 45 | 46 | return res.SHA, nil 47 | } 48 | 49 | func GithubHasTag(account, project, tag string) (bool, error) { 50 | url := fmt.Sprintf("https://api.github.com/repos/%s/%s/git/refs/tags/%s", url.PathEscape(account), url.PathEscape(project), tag) 51 | 52 | resp, err := get(url, config.GithubUsername, config.GithubToken) 53 | if err != nil { 54 | if err == errNotFound { 55 | return false, nil 56 | } 57 | if strings.Contains(err.Error(), "API rate limit exceeded") { 58 | return false, errors.New(githubRateLimitError) 59 | } 60 | return false, fmt.Errorf("error getting refs for %s/%s: %v", account, project, err) 61 | } 62 | 63 | var ref GithubRef 64 | if err := json.Unmarshal(resp, &ref); err != nil { 65 | switch err := err.(type) { 66 | case *json.UnmarshalTypeError: 67 | // type mismatch during unmarshal, tag was incomplete and the API returned an array 68 | return false, nil 69 | default: 70 | return false, fmt.Errorf("error unmarshalling: %v, resp: %v", err, string(resp)) 71 | } 72 | } 73 | 74 | return true, nil 75 | } 76 | 77 | func GithubListTags(account, project, prefix string) ([]string, error) { 78 | url := fmt.Sprintf("https://api.github.com/repos/%s/%s/git/refs/tags/%s", url.PathEscape(account), url.PathEscape(project), url.PathEscape(prefix)) 79 | 80 | resp, err := get(url, config.GithubUsername, config.GithubToken) 81 | if err != nil { 82 | if strings.Contains(err.Error(), "API rate limit exceeded") { 83 | return nil, errors.New(githubRateLimitError) 84 | } 85 | return nil, fmt.Errorf("error getting refs for %s/%s: %v", account, project, err) 86 | } 87 | 88 | var refs []GithubRef 89 | if err := json.Unmarshal(resp, &refs); err != nil { 90 | return nil, fmt.Errorf("error unmarshalling: %v, resp: %v", err, string(resp)) 91 | } 92 | 93 | var res []string 94 | for _, r := range refs { 95 | res = append(res, r.Ref) 96 | } 97 | 98 | return res, nil 99 | } 100 | 101 | func GithubLookupTag(account, project, path, tag string) (string, error) { 102 | hasTag, err := GithubHasTag(account, project, tag) 103 | if err != nil { 104 | return "", err 105 | } 106 | 107 | // tag was found as-is 108 | if hasTag { 109 | return tag, nil 110 | } 111 | 112 | // tag was not found, try to look it up 113 | allTags, err := GithubListTags(account, project, path) 114 | if err != nil { 115 | return "", err 116 | } 117 | 118 | // Github API returns tags sorted by creation time, earliest first. 119 | // Iterate through them in reverse order to find the most recent matching tag. 120 | for i := len(allTags) - 1; i >= 0; i-- { 121 | if strings.HasSuffix(allTags[i], filepath.Join(path, tag)) { 122 | return strings.TrimPrefix(allTags[i], "refs/tags/"), nil 123 | } 124 | } 125 | 126 | return "", fmt.Errorf("tag %v doesn't seem to exist in %s/%s", tag, account, project) 127 | } 128 | 129 | func GithubHasContentsAtPath(account, project, path, tag string) (bool, error) { 130 | url := fmt.Sprintf("https://api.github.com/repos/%s/%s/contents/%s?ref=%s", url.PathEscape(account), url.PathEscape(project), path, tag) 131 | 132 | // Ignore response, we care only about errors 133 | _, err := get(url, config.GithubUsername, config.GithubToken) 134 | if err != nil && err != errNotFound { 135 | return false, err 136 | } 137 | return err == nil, nil 138 | } 139 | -------------------------------------------------------------------------------- /apis/github_test.go: -------------------------------------------------------------------------------- 1 | //go:build online 2 | // +build online 3 | 4 | package apis 5 | 6 | import "testing" 7 | 8 | func TestGithubGetCommit(t *testing.T) { 9 | examples := []struct { 10 | account, project, ref, hash string 11 | }{ 12 | {"dmgk", "modules2tuple", "v1.9.0", "fc09878b93db35aafc74311f7ea6684ac08a3b83"}, 13 | {"dmgk", "modules2tuple", "a0cdb416ca2c", "a0cdb416ca2cbf6d3dad67a97f4fdcfac954503e"}, 14 | } 15 | 16 | for i, x := range examples { 17 | hash, err := GithubGetCommit(x.account, x.project, x.ref) 18 | if err != nil { 19 | t.Fatal(err) 20 | } 21 | if x.hash != hash { 22 | t.Errorf("expected commit hash %s, got %s (example %d)", x.hash, hash, i) 23 | } 24 | } 25 | } 26 | 27 | func TestGithubLookupTag(t *testing.T) { 28 | examples := []struct { 29 | account, project, packageSuffix, given, expected string 30 | }{ 31 | // tag exists as-is 32 | {"hashicorp", "vault", "", "v1.3.4", "v1.3.4"}, 33 | // tag exists but with prefix 34 | {"hashicorp", "vault", "api", "v1.0.4", "api/v1.0.4"}, 35 | {"hashicorp", "vault", "sdk", "v0.1.13", "sdk/v0.1.13"}, 36 | // this repo has earlier mathing tag "codec/codecgen/v1.1.7" 37 | {"ugorji", "go", "", "v1.1.7", "v1.1.7"}, 38 | } 39 | 40 | for i, x := range examples { 41 | tag, err := GithubLookupTag(x.account, x.project, x.packageSuffix, x.given) 42 | if err != nil { 43 | t.Fatal(err) 44 | } 45 | if x.expected != tag { 46 | t.Errorf("expected tag %s, got %s (example %d)", x.expected, tag, i) 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /apis/gitlab.go: -------------------------------------------------------------------------------- 1 | package apis 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "net/url" 7 | ) 8 | 9 | type GitlabCommit struct { 10 | SHA string `json:"id"` 11 | } 12 | 13 | func GitlabGetCommit(site, account, project, commit string) (string, error) { 14 | if site == "" { 15 | site = "https://gitlab.com" 16 | } 17 | projectID := url.PathEscape(fmt.Sprintf("%s/%s", account, project)) 18 | url := fmt.Sprintf("%s/api/v4/projects/%s/repository/commits/%s", site, projectID, commit) 19 | 20 | resp, err := get(url, "", "") 21 | if err != nil { 22 | return "", fmt.Errorf("error getting commit %s for %s/%s: %v", commit, account, project, err) 23 | } 24 | 25 | var res GitlabCommit 26 | if err := json.Unmarshal(resp, &res); err != nil { 27 | return "", fmt.Errorf("error unmarshalling: %v, resp: %v", err, string(resp)) 28 | } 29 | 30 | return res.SHA, nil 31 | } 32 | -------------------------------------------------------------------------------- /apis/gitlab_test.go: -------------------------------------------------------------------------------- 1 | //go:build online 2 | // +build online 3 | 4 | package apis 5 | 6 | import "testing" 7 | 8 | func TestGitlabGetCommit(t *testing.T) { 9 | examples := []struct { 10 | site, account, project, ref, sha string 11 | }{ 12 | {"https://gitlab.com", "gitlab-org", "gitaly-proto", "v1.32.0", "f4db5d05d437abe1154d7308ca044d3577b5ccba"}, 13 | {"https://gitlab.com", "gitlab-org", "labkit", "0c3fc7cdd57c", "0c3fc7cdd57c57da5ab474aa72b6640d2bdc9ebb"}, 14 | } 15 | 16 | for i, x := range examples { 17 | sha, err := GitlabGetCommit(x.site, x.account, x.project, x.ref) 18 | if err != nil { 19 | t.Fatal(err) 20 | } 21 | if x.sha != sha { 22 | t.Errorf("expected commit hash %s, got %s (example %d)", x.sha, sha, i) 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "os" 5 | "strings" 6 | ) 7 | 8 | const ( 9 | GithubCredentialsKey = "M2T_GITHUB" 10 | OfflineKey = "M2T_OFFLINE" 11 | DebugKey = "M2T_DEBUG" 12 | ) 13 | 14 | var ( 15 | GithubToken string 16 | GithubUsername string 17 | Offline bool 18 | Debug bool 19 | ShowVersion bool 20 | ) 21 | 22 | func init() { 23 | Offline = os.Getenv(OfflineKey) != "" 24 | Debug = os.Getenv(DebugKey) != "" 25 | 26 | githubCredentials := os.Getenv(GithubCredentialsKey) 27 | if githubCredentials != "" { 28 | parts := strings.Split(githubCredentials, ":") 29 | if len(parts) == 2 { 30 | GithubUsername = parts[0] 31 | GithubToken = parts[1] 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /debug/debug.go: -------------------------------------------------------------------------------- 1 | package debug 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/dmgk/modules2tuple/v2/config" 8 | ) 9 | 10 | func Print(v ...interface{}) { 11 | if config.Debug { 12 | fmt.Fprint(os.Stderr, v...) 13 | } 14 | } 15 | 16 | func Printf(format string, v ...interface{}) { 17 | if config.Debug { 18 | fmt.Fprintf(os.Stderr, format, v...) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/dmgk/modules2tuple/v2 2 | 3 | go 1.18 4 | 5 | require github.com/sergi/go-diff v1.1.0 6 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 2 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 3 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 4 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 5 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 6 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 7 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 8 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 9 | github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= 10 | github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= 11 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 12 | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 13 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 14 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 15 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 16 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 17 | gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= 18 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 19 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "fmt" 6 | "html/template" 7 | "os" 8 | "path" 9 | 10 | "github.com/dmgk/modules2tuple/v2/config" 11 | "github.com/dmgk/modules2tuple/v2/parser" 12 | ) 13 | 14 | var version = "devel" 15 | 16 | func main() { 17 | if config.ShowVersion { 18 | fmt.Fprintln(os.Stderr, version) 19 | os.Exit(0) 20 | } 21 | 22 | args := flag.Args() 23 | 24 | if len(args) == 0 { 25 | flag.Usage() 26 | os.Exit(1) 27 | } 28 | 29 | res, err := parser.Load(args[0]) 30 | if err != nil { 31 | fmt.Fprintln(os.Stderr, err) 32 | os.Exit(1) 33 | } 34 | fmt.Println(res) 35 | } 36 | 37 | var usageTemplate = template.Must(template.New("Usage").Parse(`usage: {{.basename}} [options] modules.txt 38 | 39 | Options: 40 | -offline disable all network access (env M2T_OFFLINE, default {{.offline}}) 41 | -debug print debug info (env M2T_DEBUG, default {{.debug}}) 42 | -v show version 43 | 44 | Usage: 45 | Vendor package dependencies and then run {{.basename}} with vendor/modules.txt: 46 | 47 | $ go mod vendor 48 | $ {{.basename}} vendor/modules.txt 49 | 50 | When running in offline mode: 51 | - mirrors are looked up using static list and some may not be resolved 52 | - milti-module repos and version suffixes ("/v2") are not automatically handled 53 | - Github tags for modules ("v1.2.3" vs "api/v1.2.3") are not automatically resolved 54 | - Gitlab commit IDs are not resolved to the full 40-char IDs 55 | `)) 56 | 57 | func init() { 58 | basename := path.Base(os.Args[0]) 59 | 60 | flag.BoolVar(&config.Offline, "offline", config.Offline, "") 61 | flag.BoolVar(&config.Debug, "debug", config.Debug, "") 62 | flag.BoolVar(&config.ShowVersion, "v", false, "") 63 | 64 | flag.Usage = func() { 65 | err := usageTemplate.Execute(os.Stderr, map[string]interface{}{ 66 | "basename": basename, 67 | "offline": config.Offline, 68 | "debug": config.Debug, 69 | }) 70 | if err != nil { 71 | panic(err) 72 | } 73 | 74 | } 75 | 76 | flag.Parse() 77 | } 78 | -------------------------------------------------------------------------------- /parser/parser.go: -------------------------------------------------------------------------------- 1 | package parser 2 | 3 | import ( 4 | "bufio" 5 | "bytes" 6 | "fmt" 7 | "io" 8 | "os" 9 | "runtime" 10 | "sort" 11 | "strings" 12 | "sync" 13 | 14 | "github.com/dmgk/modules2tuple/v2/tuple" 15 | ) 16 | 17 | // Load parses tuples from vendor/modules.txt at path. 18 | func Load(path string) (*Result, error) { 19 | f, err := os.Open(path) 20 | if err != nil { 21 | return nil, err 22 | } 23 | defer f.Close() 24 | 25 | return Read(f) 26 | } 27 | 28 | // Read parses tuples from modules.txt contents provided as io.Reader. 29 | func Read(r io.Reader) (*Result, error) { 30 | ch := make(chan interface{}) 31 | 32 | go func() { 33 | defer close(ch) 34 | 35 | const specPrefix = "# " 36 | 37 | scanner := bufio.NewScanner(r) 38 | sem := make(chan int, runtime.NumCPU()) 39 | // sem := make(chan int, 1) 40 | var wg sync.WaitGroup 41 | 42 | for scanner.Scan() { 43 | line := scanner.Text() 44 | if strings.HasPrefix(line, specPrefix) { 45 | sem <- 1 46 | wg.Add(1) 47 | go func() { 48 | defer func() { 49 | <-sem 50 | wg.Done() 51 | }() 52 | t, err := tuple.Parse(strings.TrimPrefix(line, specPrefix)) 53 | if err != nil { 54 | ch <- err 55 | return 56 | } 57 | err = t.Fix() 58 | if err != nil { 59 | ch <- err 60 | return 61 | } 62 | ch <- t 63 | }() 64 | } 65 | } 66 | wg.Wait() 67 | }() 68 | 69 | res := &Result{} 70 | 71 | for v := range ch { 72 | if t, ok := v.(*tuple.Tuple); ok { 73 | res.AddTuple(t) 74 | } else if err, ok := v.(error); ok { 75 | res.AddError(err) 76 | } else { 77 | panic("unknown value type") 78 | } 79 | } 80 | 81 | res.Fix() 82 | return res, nil 83 | } 84 | 85 | type Result struct { 86 | tuples tuple.Slice 87 | errSource []error 88 | errOther []error 89 | } 90 | 91 | func (r *Result) AddTuple(t *tuple.Tuple) { 92 | r.tuples = append(r.tuples, t) 93 | } 94 | 95 | func (r *Result) AddError(err error) { 96 | switch err := err.(type) { 97 | case tuple.SourceError: 98 | r.errSource = append(r.errSource, err) 99 | default: 100 | r.errOther = append(r.errOther, err) 101 | } 102 | } 103 | 104 | func (r *Result) Fix() { 105 | if err := r.tuples.Fix(); err != nil { 106 | r.AddError(err) 107 | } 108 | } 109 | 110 | type errSlice []error 111 | 112 | func (errs errSlice) String() string { 113 | var lines []string 114 | for _, err := range errs { 115 | lines = append(lines, fmt.Sprintf("\t\t#\t%s", err)) 116 | } 117 | return strings.Join(lines, "\n") 118 | } 119 | 120 | func (r *Result) String() string { 121 | var lines []string 122 | 123 | if len(r.tuples) > 0 { 124 | var b bytes.Buffer 125 | b.WriteString(r.tuples.String()) 126 | lines = append(lines, b.String()) 127 | } 128 | 129 | if len(r.errSource) > 0 { 130 | var b bytes.Buffer 131 | b.WriteString("\t\t# Mirrors for the following packages are not currently known, please look them up and handle these tuples manually:\n") 132 | sort.Slice(r.errSource, func(i, j int) bool { 133 | return r.errSource[i].Error() < r.errSource[j].Error() 134 | }) 135 | b.WriteString(errSlice(r.errSource).String()) 136 | lines = append(lines, b.String()) 137 | } 138 | 139 | if len(r.errOther) > 0 { 140 | var b bytes.Buffer 141 | b.WriteString("\t\t# Errors found during processing:\n") 142 | b.WriteString(errSlice(r.errOther).String()) 143 | lines = append(lines, b.String()) 144 | } 145 | 146 | links := r.tuples.Links() 147 | if len(links) > 0 { 148 | lines = append(lines, links.String()) 149 | } 150 | 151 | return strings.Join(lines, "\n\n") 152 | } 153 | -------------------------------------------------------------------------------- /parser/parser_e2e_test.go: -------------------------------------------------------------------------------- 1 | //go:build e2e 2 | // +build e2e 3 | 4 | package parser 5 | 6 | import ( 7 | "fmt" 8 | "io/ioutil" 9 | "path/filepath" 10 | "strings" 11 | "testing" 12 | 13 | "github.com/sergi/go-diff/diffmatchpatch" 14 | ) 15 | 16 | const testdataPath = "../testdata" 17 | 18 | type example struct { 19 | modules, expected string 20 | } 21 | 22 | func TestParserE2E(t *testing.T) { 23 | examples, err := loadExamples() 24 | if err != nil { 25 | t.Fatal(err) 26 | } 27 | 28 | for n, x := range examples { 29 | expected, err := ioutil.ReadFile(x.expected) 30 | if err != nil { 31 | t.Fatal(err) 32 | } 33 | 34 | actual, err := Load(x.modules) 35 | if err != nil { 36 | t.Fatal(err) 37 | } 38 | 39 | dmp := diffmatchpatch.New() 40 | diffs := dmp.DiffMain(strings.TrimSpace(string(expected)), strings.TrimSpace(actual.String()), false) 41 | if dmp.DiffLevenshtein(diffs) > 0 { 42 | t.Errorf("%s: expected output doesn't match actual:\n%s", n, dmp.DiffPrettyText(diffs)) 43 | } 44 | } 45 | } 46 | 47 | func loadExamples() (map[string]*example, error) { 48 | res := map[string]*example{} 49 | 50 | dir, err := ioutil.ReadDir(testdataPath) 51 | if err != nil { 52 | return nil, err 53 | } 54 | 55 | for _, f := range dir { 56 | name := f.Name() 57 | parts := strings.SplitN(strings.TrimSuffix(name, filepath.Ext(name)), "_", 2) 58 | if len(parts) < 2 { 59 | return nil, fmt.Errorf("unexpected testdata file name: %q", name) 60 | } 61 | key, kind := parts[0], parts[1] 62 | 63 | x, ok := res[key] 64 | if !ok { 65 | x = &example{} 66 | res[key] = x 67 | } 68 | switch kind { 69 | case "modules": 70 | x.modules = filepath.Join(testdataPath, name) 71 | case "expected": 72 | x.expected = filepath.Join(testdataPath, name) 73 | default: 74 | return nil, fmt.Errorf("unexpected testdata file name: %q", name) 75 | } 76 | } 77 | 78 | return res, nil 79 | } 80 | -------------------------------------------------------------------------------- /parser/parser_offline_test.go: -------------------------------------------------------------------------------- 1 | //go:build !online && !e2e 2 | // +build !online,!e2e 3 | 4 | package parser 5 | 6 | import "github.com/dmgk/modules2tuple/v2/config" 7 | 8 | func init() { 9 | config.Offline = true 10 | } 11 | -------------------------------------------------------------------------------- /parser/parser_online_test.go: -------------------------------------------------------------------------------- 1 | //go:build online 2 | // +build online 3 | 4 | package parser 5 | 6 | import ( 7 | "strings" 8 | "testing" 9 | 10 | "github.com/dmgk/modules2tuple/v2/config" 11 | ) 12 | 13 | func init() { 14 | config.Offline = false 15 | } 16 | 17 | func TestUniqueProjectAndTag(t *testing.T) { 18 | given := ` 19 | # github.com/json-iterator/go v1.1.7 20 | # github.com/ugorji/go v1.1.7` 21 | 22 | expected := `GH_TUPLE= json-iterator:go:v1.1.7:json_iterator_go/vendor/github.com/json-iterator/go \ 23 | ugorji:go:v1.1.7:ugorji_go 24 | 25 | post-extract: 26 | @${MKDIR} ${WRKSRC}/vendor/github.com/ugorji 27 | @${RLN} ${WRKSRC_json_iterator_go} ${WRKSRC}/vendor/github.com/ugorji/go` 28 | 29 | tt, err := Read(strings.NewReader(given)) 30 | if err != nil { 31 | t.Fatal(err) 32 | } 33 | out := tt.String() 34 | if out != expected { 35 | t.Errorf("expected output\n%s\n, got\n%s", expected, out) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /parser/parser_test.go: -------------------------------------------------------------------------------- 1 | package parser 2 | 3 | import ( 4 | "strings" 5 | "testing" 6 | 7 | "github.com/dmgk/modules2tuple/v2/config" 8 | ) 9 | 10 | func TestReader(t *testing.T) { 11 | given := ` 12 | # github.com/karrick/godirwalk v1.10.12 13 | ## explicit 14 | github.com/karrick/godirwalk 15 | # github.com/rogpeppe/go-internal v1.3.0 16 | ## explicit 17 | github.com/rogpeppe/go-internal/modfile 18 | github.com/rogpeppe/go-internal/module 19 | github.com/rogpeppe/go-internal/semver 20 | # some_unknown.vanity_url.net/account/project v1.2.3 21 | some_unknown.vanity_url.net/account/project 22 | # another.vanity_url.org/account/project v1.0.0 23 | another.vanity_url.org/account/project 24 | # gopkg.in/user/pkg.v3 v3.0.0 25 | gopkg.in/user/pkg.v3 26 | # github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c 27 | github.com/cockroachdb/cockroach-go/crdb 28 | # gitlab.com/gitlab-org/labkit v0.0.0-20190221122536-0c3fc7cdd57c 29 | gitlab.com/gitlab-org/labkit/correlation 30 | # gitlab.com/gitlab-org/gitaly-proto v1.32.0 31 | gitlab.com/gitlab-org/gitaly-proto/go/gitalypb 32 | # github.com/golang/lint v0.0.0-20190409202823-959b441ac422 => golang.org/x/lint v0.0.0-20190409202823-959b441ac422 33 | # github.com/ugorji/go v1.1.4 => github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43` 34 | 35 | expected := `GH_TUPLE= \ 36 | cockroachdb:cockroach-go:e0a95dfd547c:cockroachdb_cockroach_go/vendor/github.com/cockroachdb/cockroach-go \ 37 | golang:lint:959b441ac422:golang_lint/vendor/github.com/golang/lint \ 38 | karrick:godirwalk:v1.10.12:karrick_godirwalk/vendor/github.com/karrick/godirwalk \ 39 | rogpeppe:go-internal:v1.3.0:rogpeppe_go_internal/vendor/github.com/rogpeppe/go-internal \ 40 | ugorji:go:e444a5086c43:ugorji_go_codec/vendor/github.com/ugorji/go \ 41 | user:pkg:v3.0.0:user_pkg/vendor/gopkg.in/user/pkg.v3 42 | 43 | GL_TUPLE= gitlab-org:gitaly-proto:v1.32.0:gitlab_org_gitaly_proto/vendor/gitlab.com/gitlab-org/gitaly-proto \ 44 | gitlab-org:labkit:0c3fc7cdd57c:gitlab_org_labkit/vendor/gitlab.com/gitlab-org/labkit 45 | 46 | # Mirrors for the following packages are not currently known, please look them up and handle these tuples manually: 47 | # ::v1.0.0:group_name/vendor/another.vanity_url.org/account/project (from another.vanity_url.org/account/project@v1.0.0) 48 | # ::v1.2.3:group_name/vendor/some_unknown.vanity_url.net/account/project (from some_unknown.vanity_url.net/account/project@v1.2.3)` 49 | 50 | config.Offline = true 51 | res, err := Read(strings.NewReader(given)) 52 | if err != nil { 53 | t.Fatal(err) 54 | } 55 | out := res.String() 56 | if out != expected { 57 | t.Errorf("expected output\n%q\n, got\n%q\n", expected, out) 58 | } 59 | } 60 | 61 | func TestUniqueGroups(t *testing.T) { 62 | given := ` 63 | # github.com/minio/lsync v1.0.1 64 | # github.com/minio/mc v0.0.0-20190924013003-643835013047 65 | # github.com/minio/minio-go v0.0.0-20190327203652-5325257a208f 66 | # github.com/minio/minio-go/v6 v6.0.39 67 | # github.com/minio/parquet-go v0.0.0-20190318185229-9d767baf1679` 68 | 69 | expected := `GH_TUPLE= \ 70 | minio:lsync:v1.0.1:minio_lsync/vendor/github.com/minio/lsync \ 71 | minio:mc:643835013047:minio_mc/vendor/github.com/minio/mc \ 72 | minio:minio-go:5325257a208f:minio_minio_go/vendor/github.com/minio/minio-go \ 73 | minio:minio-go:v6.0.39:minio_minio_go_v6/vendor/github.com/minio/minio-go/v6 \ 74 | minio:parquet-go:9d767baf1679:minio_parquet_go/vendor/github.com/minio/parquet-go` 75 | 76 | config.Offline = true 77 | res, err := Read(strings.NewReader(given)) 78 | if err != nil { 79 | t.Fatal(err) 80 | } 81 | out := res.String() 82 | if out != expected { 83 | t.Errorf("expected output\n%q\n, got\n%q\n", expected, out) 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /testdata/buffalo_expected.txt: -------------------------------------------------------------------------------- 1 | GH_TUPLE= \ 2 | BurntSushi:toml:v0.3.1:burntsushi_toml/vendor/github.com/BurntSushi/toml \ 3 | Masterminds:semver:v1.5.0:masterminds_semver/vendor/github.com/Masterminds/semver \ 4 | Masterminds:semver:v3.0.3:masterminds_semver_v3/vendor/github.com/Masterminds/semver/v3 \ 5 | alexcesaro:quotedprintable:2caba252f4dc:alexcesaro_quotedprintable/vendor/gopkg.in/alexcesaro/quotedprintable.v3 \ 6 | cockroachdb:cockroach-go:606b3d062051:cockroachdb_cockroach_go/vendor/github.com/cockroachdb/cockroach-go \ 7 | davecgh:go-spew:v1.1.1:davecgh_go_spew/vendor/github.com/davecgh/go-spew \ 8 | dustin:go-humanize:v1.0.0:dustin_go_humanize/vendor/github.com/dustin/go-humanize \ 9 | fatih:color:v1.9.0:fatih_color/vendor/github.com/fatih/color \ 10 | fatih:structs:v1.1.0:fatih_structs/vendor/github.com/fatih/structs \ 11 | fsnotify:fsnotify:v1.4.7:fsnotify_fsnotify/vendor/github.com/fsnotify/fsnotify \ 12 | go-ini:ini:v1.51.0:go_ini_ini/vendor/gopkg.in/ini.v1 \ 13 | go-sql-driver:mysql:v1.5.0:go_sql_driver_mysql/vendor/github.com/go-sql-driver/mysql \ 14 | go-yaml:yaml:v2.2.8:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \ 15 | gobuffalo:attrs:v1.0.0:gobuffalo_attrs/vendor/github.com/gobuffalo/attrs \ 16 | gobuffalo:buffalo-pop:v2.0.4:gobuffalo_buffalo_pop_v2/vendor/github.com/gobuffalo/buffalo-pop/v2 \ 17 | gobuffalo:clara:v2.0.2:gobuffalo_clara_v2/vendor/github.com/gobuffalo/clara/v2 \ 18 | gobuffalo:envy:v1.9.0:gobuffalo_envy/vendor/github.com/gobuffalo/envy \ 19 | gobuffalo:events:v1.4.1:gobuffalo_events/vendor/github.com/gobuffalo/events \ 20 | gobuffalo:fizz:v1.9.8:gobuffalo_fizz/vendor/github.com/gobuffalo/fizz \ 21 | gobuffalo:flect:v0.2.1:gobuffalo_flect/vendor/github.com/gobuffalo/flect \ 22 | gobuffalo:genny:v2.0.6:gobuffalo_genny_v2/vendor/github.com/gobuffalo/genny/v2 \ 23 | gobuffalo:github_flavored_markdown:v1.1.0:gobuffalo_github_flavored_markdown/vendor/github.com/gobuffalo/github_flavored_markdown \ 24 | gobuffalo:helpers:v0.6.1:gobuffalo_helpers/vendor/github.com/gobuffalo/helpers \ 25 | gobuffalo:here:v0.6.0:gobuffalo_here/vendor/github.com/gobuffalo/here \ 26 | gobuffalo:httptest:v1.5.0:gobuffalo_httptest/vendor/github.com/gobuffalo/httptest \ 27 | gobuffalo:logger:v1.0.3:gobuffalo_logger/vendor/github.com/gobuffalo/logger \ 28 | gobuffalo:meta:v0.3.0:gobuffalo_meta/vendor/github.com/gobuffalo/meta \ 29 | gobuffalo:nulls:v0.2.0:gobuffalo_nulls/vendor/github.com/gobuffalo/nulls \ 30 | gobuffalo:packd:v1.0.0:gobuffalo_packd/vendor/github.com/gobuffalo/packd \ 31 | gobuffalo:packr:v2.8.0:gobuffalo_packr_v2/vendor/github.com/gobuffalo/packr \ 32 | gobuffalo:plush:v3.8.3:gobuffalo_plush/vendor/github.com/gobuffalo/plush \ 33 | gobuffalo:plush:v4.0.0:gobuffalo_plush_v4/vendor/github.com/gobuffalo/plush/v4 \ 34 | gobuffalo:pop:v5.0.11:gobuffalo_pop_v5/vendor/github.com/gobuffalo/pop/v5 \ 35 | gobuffalo:tags:v3.1.0:gobuffalo_tags_v3/vendor/github.com/gobuffalo/tags/v3 \ 36 | gobuffalo:validate:v3.1.0:gobuffalo_validate_v3/vendor/github.com/gobuffalo/validate/v3 \ 37 | gofrs:uuid:v3.2.0:gofrs_uuid/vendor/github.com/gofrs/uuid \ 38 | golang:crypto:a0c6ece9d31a:golang_crypto/vendor/golang.org/x/crypto \ 39 | golang:mod:v0.2.0:golang_mod/vendor/golang.org/x/mod \ 40 | golang:net:0de0cce0169b:golang_net/vendor/golang.org/x/net \ 41 | golang:sync:43a5402ce75a:golang_sync/vendor/golang.org/x/sync \ 42 | golang:sys:d101bd2416d5:golang_sys/vendor/golang.org/x/sys \ 43 | golang:text:v0.3.2:golang_text/vendor/golang.org/x/text \ 44 | golang:tools:8849913b6971:golang_tools/vendor/golang.org/x/tools \ 45 | golang:xerrors:9bdfabe68543:golang_xerrors/vendor/golang.org/x/xerrors \ 46 | google:go-cmp:v0.4.0:google_go_cmp/vendor/github.com/google/go-cmp \ 47 | gorilla:mux:v1.7.4:gorilla_mux/vendor/github.com/gorilla/mux \ 48 | gorilla:securecookie:v1.1.1:gorilla_securecookie/vendor/github.com/gorilla/securecookie \ 49 | gorilla:sessions:v1.2.0:gorilla_sessions/vendor/github.com/gorilla/sessions \ 50 | hashicorp:hcl:v1.0.0:hashicorp_hcl/vendor/github.com/hashicorp/hcl \ 51 | inconshreveable:mousetrap:v1.0.0:inconshreveable_mousetrap/vendor/github.com/inconshreveable/mousetrap \ 52 | jackc:chunkreader:v2.0.1:jackc_chunkreader_v2/vendor/github.com/jackc/chunkreader/v2 \ 53 | jackc:pgconn:v1.3.2:jackc_pgconn/vendor/github.com/jackc/pgconn \ 54 | jackc:pgio:v1.0.0:jackc_pgio/vendor/github.com/jackc/pgio \ 55 | jackc:pgpassfile:v1.0.0:jackc_pgpassfile/vendor/github.com/jackc/pgpassfile \ 56 | jackc:pgproto3:v2.0.1:jackc_pgproto3_v2/vendor/github.com/jackc/pgproto3/v2 \ 57 | jmoiron:sqlx:v1.2.0:jmoiron_sqlx/vendor/github.com/jmoiron/sqlx \ 58 | joho:godotenv:v1.3.0:joho_godotenv/vendor/github.com/joho/godotenv \ 59 | karrick:godirwalk:v1.15.5:karrick_godirwalk/vendor/github.com/karrick/godirwalk \ 60 | kballard:go-shellquote:95032a82bc51:kballard_go_shellquote/vendor/github.com/kballard/go-shellquote \ 61 | konsorten:go-windows-terminal-sequences:v1.0.2:konsorten_go_windows_terminal_sequences/vendor/github.com/konsorten/go-windows-terminal-sequences \ 62 | lib:pq:v1.3.0:lib_pq/vendor/github.com/lib/pq \ 63 | magiconair:properties:v1.8.1:magiconair_properties/vendor/github.com/magiconair/properties \ 64 | markbates:errx:v1.1.0:markbates_errx/vendor/github.com/markbates/errx \ 65 | markbates:grift:v1.5.0:markbates_grift/vendor/github.com/markbates/grift \ 66 | markbates:oncer:v1.0.0:markbates_oncer/vendor/github.com/markbates/oncer \ 67 | markbates:refresh:v1.11.1:markbates_refresh/vendor/github.com/markbates/refresh \ 68 | markbates:safe:v1.0.1:markbates_safe/vendor/github.com/markbates/safe \ 69 | markbates:sigtx:v1.0.0:markbates_sigtx/vendor/github.com/markbates/sigtx \ 70 | mattn:go-colorable:v0.1.4:mattn_go_colorable/vendor/github.com/mattn/go-colorable \ 71 | mattn:go-isatty:v0.0.12:mattn_go_isatty/vendor/github.com/mattn/go-isatty \ 72 | mattn:go-sqlite3:v2.0.3:mattn_go_sqlite3/vendor/github.com/mattn/go-sqlite3 \ 73 | microcosm-cc:bluemonday:v1.0.2:microcosm_cc_bluemonday/vendor/github.com/microcosm-cc/bluemonday \ 74 | mitchellh:go-homedir:v1.1.0:mitchellh_go_homedir/vendor/github.com/mitchellh/go-homedir \ 75 | mitchellh:mapstructure:v1.1.2:mitchellh_mapstructure/vendor/github.com/mitchellh/mapstructure \ 76 | monoculum:formam:49f0baed3a1b:monoculum_formam/vendor/github.com/monoculum/formam \ 77 | pelletier:go-toml:v1.2.0:pelletier_go_toml/vendor/github.com/pelletier/go-toml \ 78 | pkg:errors:v0.9.1:pkg_errors/vendor/github.com/pkg/errors \ 79 | pmezard:go-difflib:v1.0.0:pmezard_go_difflib/vendor/github.com/pmezard/go-difflib \ 80 | rogpeppe:go-internal:v1.5.2:rogpeppe_go_internal/vendor/github.com/rogpeppe/go-internal \ 81 | sergi:go-diff:v1.1.0:sergi_go_diff/vendor/github.com/sergi/go-diff \ 82 | sirupsen:logrus:v1.5.0:sirupsen_logrus/vendor/github.com/sirupsen/logrus \ 83 | sourcegraph:annotate:f4cad6c6324d:sourcegraph_annotate/vendor/github.com/sourcegraph/annotate \ 84 | sourcegraph:syntaxhighlight:bd320f5d308e:sourcegraph_syntaxhighlight/vendor/github.com/sourcegraph/syntaxhighlight \ 85 | spf13:afero:v1.2.1:spf13_afero/vendor/github.com/spf13/afero \ 86 | spf13:cast:v1.3.0:spf13_cast/vendor/github.com/spf13/cast \ 87 | spf13:cobra:v0.0.6:spf13_cobra/vendor/github.com/spf13/cobra \ 88 | spf13:jwalterweatherman:v1.0.0:spf13_jwalterweatherman/vendor/github.com/spf13/jwalterweatherman \ 89 | spf13:pflag:v1.0.5:spf13_pflag/vendor/github.com/spf13/pflag \ 90 | spf13:viper:v1.6.2:spf13_viper/vendor/github.com/spf13/viper \ 91 | stretchr:testify:v1.5.1:stretchr_testify/vendor/github.com/stretchr/testify \ 92 | subosito:gotenv:v1.2.0:subosito_gotenv/vendor/github.com/subosito/gotenv 93 | -------------------------------------------------------------------------------- /testdata/buffalo_modules.txt: -------------------------------------------------------------------------------- 1 | # github.com/BurntSushi/toml v0.3.1 2 | github.com/BurntSushi/toml 3 | # github.com/Masterminds/semver v1.5.0 4 | github.com/Masterminds/semver 5 | # github.com/Masterminds/semver/v3 v3.0.3 6 | github.com/Masterminds/semver/v3 7 | # github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051 8 | github.com/cockroachdb/cockroach-go/crdb 9 | # github.com/davecgh/go-spew v1.1.1 10 | github.com/davecgh/go-spew/spew 11 | # github.com/dustin/go-humanize v1.0.0 12 | github.com/dustin/go-humanize 13 | # github.com/fatih/color v1.9.0 14 | github.com/fatih/color 15 | # github.com/fatih/structs v1.1.0 16 | github.com/fatih/structs 17 | # github.com/fsnotify/fsnotify v1.4.7 18 | github.com/fsnotify/fsnotify 19 | # github.com/go-sql-driver/mysql v1.5.0 20 | github.com/go-sql-driver/mysql 21 | # github.com/gobuffalo/attrs v1.0.0 22 | github.com/gobuffalo/attrs 23 | # github.com/gobuffalo/buffalo-pop/v2 v2.0.4 24 | github.com/gobuffalo/buffalo-pop/v2/genny/newapp 25 | github.com/gobuffalo/buffalo-pop/v2/packrd 26 | # github.com/gobuffalo/clara/v2 v2.0.2 27 | github.com/gobuffalo/clara/v2/genny/rx 28 | github.com/gobuffalo/clara/v2/packrd 29 | # github.com/gobuffalo/envy v1.9.0 30 | github.com/gobuffalo/envy 31 | # github.com/gobuffalo/events v1.4.1 32 | github.com/gobuffalo/events 33 | github.com/gobuffalo/events/internal/mapi 34 | github.com/gobuffalo/events/internal/safe 35 | # github.com/gobuffalo/fizz v1.9.8 36 | github.com/gobuffalo/fizz 37 | github.com/gobuffalo/fizz/translators 38 | # github.com/gobuffalo/flect v0.2.1 39 | github.com/gobuffalo/flect 40 | github.com/gobuffalo/flect/name 41 | # github.com/gobuffalo/genny/v2 v2.0.6 42 | github.com/gobuffalo/genny/v2 43 | github.com/gobuffalo/genny/v2/gentest 44 | github.com/gobuffalo/genny/v2/gogen 45 | github.com/gobuffalo/genny/v2/gogen/goimports 46 | github.com/gobuffalo/genny/v2/plushgen 47 | # github.com/gobuffalo/github_flavored_markdown v1.1.0 48 | github.com/gobuffalo/github_flavored_markdown 49 | github.com/gobuffalo/github_flavored_markdown/internal/russross/blackfriday 50 | github.com/gobuffalo/github_flavored_markdown/internal/shurcooL/highlight_diff 51 | github.com/gobuffalo/github_flavored_markdown/internal/shurcooL/highlight_go 52 | github.com/gobuffalo/github_flavored_markdown/internal/shurcooL/octicon 53 | github.com/gobuffalo/github_flavored_markdown/internal/shurcooL/sanitized_anchor_name 54 | # github.com/gobuffalo/helpers v0.6.1 55 | github.com/gobuffalo/helpers 56 | github.com/gobuffalo/helpers/content 57 | github.com/gobuffalo/helpers/debug 58 | github.com/gobuffalo/helpers/encoders 59 | github.com/gobuffalo/helpers/env 60 | github.com/gobuffalo/helpers/escapes 61 | github.com/gobuffalo/helpers/forms 62 | github.com/gobuffalo/helpers/forms/bootstrap 63 | github.com/gobuffalo/helpers/hctx 64 | github.com/gobuffalo/helpers/inflections 65 | github.com/gobuffalo/helpers/iterators 66 | github.com/gobuffalo/helpers/meta 67 | github.com/gobuffalo/helpers/paths 68 | github.com/gobuffalo/helpers/tags 69 | github.com/gobuffalo/helpers/text 70 | # github.com/gobuffalo/here v0.6.0 71 | github.com/gobuffalo/here 72 | github.com/gobuffalo/here/there 73 | # github.com/gobuffalo/httptest v1.5.0 74 | github.com/gobuffalo/httptest 75 | github.com/gobuffalo/httptest/internal/takeon/github.com/ajg/form 76 | github.com/gobuffalo/httptest/internal/takeon/github.com/markbates/hmax 77 | # github.com/gobuffalo/logger v1.0.3 78 | github.com/gobuffalo/logger 79 | # github.com/gobuffalo/meta v0.3.0 80 | github.com/gobuffalo/meta 81 | # github.com/gobuffalo/nulls v0.2.0 82 | github.com/gobuffalo/nulls 83 | # github.com/gobuffalo/packd v1.0.0 84 | github.com/gobuffalo/packd 85 | github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx 86 | # github.com/gobuffalo/packr/v2 v2.8.0 87 | github.com/gobuffalo/packr/v2 88 | github.com/gobuffalo/packr/v2/file 89 | github.com/gobuffalo/packr/v2/file/resolver 90 | github.com/gobuffalo/packr/v2/file/resolver/encoding/hex 91 | github.com/gobuffalo/packr/v2/internal 92 | github.com/gobuffalo/packr/v2/jam 93 | github.com/gobuffalo/packr/v2/jam/parser 94 | github.com/gobuffalo/packr/v2/jam/store 95 | github.com/gobuffalo/packr/v2/packr2/cmd/fix 96 | github.com/gobuffalo/packr/v2/plog 97 | # github.com/gobuffalo/plush v3.8.3+incompatible 98 | github.com/gobuffalo/plush 99 | github.com/gobuffalo/plush/ast 100 | github.com/gobuffalo/plush/lexer 101 | github.com/gobuffalo/plush/parser 102 | github.com/gobuffalo/plush/token 103 | # github.com/gobuffalo/plush/v4 v4.0.0 104 | github.com/gobuffalo/plush/v4 105 | github.com/gobuffalo/plush/v4/ast 106 | github.com/gobuffalo/plush/v4/lexer 107 | github.com/gobuffalo/plush/v4/parser 108 | github.com/gobuffalo/plush/v4/token 109 | # github.com/gobuffalo/pop/v5 v5.0.11 110 | github.com/gobuffalo/pop/v5 111 | github.com/gobuffalo/pop/v5/associations 112 | github.com/gobuffalo/pop/v5/columns 113 | github.com/gobuffalo/pop/v5/genny/config 114 | github.com/gobuffalo/pop/v5/internal/defaults 115 | github.com/gobuffalo/pop/v5/internal/randx 116 | github.com/gobuffalo/pop/v5/logging 117 | github.com/gobuffalo/pop/v5/packrd 118 | # github.com/gobuffalo/tags/v3 v3.1.0 119 | github.com/gobuffalo/tags/v3 120 | github.com/gobuffalo/tags/v3/form 121 | github.com/gobuffalo/tags/v3/form/bootstrap 122 | # github.com/gobuffalo/validate/v3 v3.1.0 123 | github.com/gobuffalo/validate/v3 124 | github.com/gobuffalo/validate/v3/validators 125 | # github.com/gofrs/uuid v3.2.0+incompatible 126 | github.com/gofrs/uuid 127 | # github.com/google/go-cmp v0.4.0 128 | github.com/google/go-cmp/cmp 129 | github.com/google/go-cmp/cmp/internal/diff 130 | github.com/google/go-cmp/cmp/internal/flags 131 | github.com/google/go-cmp/cmp/internal/function 132 | github.com/google/go-cmp/cmp/internal/value 133 | # github.com/gorilla/mux v1.7.4 134 | github.com/gorilla/mux 135 | # github.com/gorilla/securecookie v1.1.1 136 | github.com/gorilla/securecookie 137 | # github.com/gorilla/sessions v1.2.0 138 | github.com/gorilla/sessions 139 | # github.com/hashicorp/hcl v1.0.0 140 | github.com/hashicorp/hcl 141 | github.com/hashicorp/hcl/hcl/ast 142 | github.com/hashicorp/hcl/hcl/parser 143 | github.com/hashicorp/hcl/hcl/printer 144 | github.com/hashicorp/hcl/hcl/scanner 145 | github.com/hashicorp/hcl/hcl/strconv 146 | github.com/hashicorp/hcl/hcl/token 147 | github.com/hashicorp/hcl/json/parser 148 | github.com/hashicorp/hcl/json/scanner 149 | github.com/hashicorp/hcl/json/token 150 | # github.com/inconshreveable/mousetrap v1.0.0 151 | github.com/inconshreveable/mousetrap 152 | # github.com/jackc/chunkreader/v2 v2.0.1 153 | github.com/jackc/chunkreader/v2 154 | # github.com/jackc/pgconn v1.3.2 155 | github.com/jackc/pgconn 156 | github.com/jackc/pgconn/internal/ctxwatch 157 | # github.com/jackc/pgio v1.0.0 158 | github.com/jackc/pgio 159 | # github.com/jackc/pgpassfile v1.0.0 160 | github.com/jackc/pgpassfile 161 | # github.com/jackc/pgproto3/v2 v2.0.1 162 | github.com/jackc/pgproto3/v2 163 | # github.com/jmoiron/sqlx v1.2.0 164 | github.com/jmoiron/sqlx 165 | github.com/jmoiron/sqlx/reflectx 166 | # github.com/joho/godotenv v1.3.0 167 | github.com/joho/godotenv 168 | # github.com/karrick/godirwalk v1.15.5 169 | github.com/karrick/godirwalk 170 | # github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 171 | github.com/kballard/go-shellquote 172 | # github.com/konsorten/go-windows-terminal-sequences v1.0.2 173 | github.com/konsorten/go-windows-terminal-sequences 174 | # github.com/lib/pq v1.3.0 175 | github.com/lib/pq 176 | github.com/lib/pq/oid 177 | github.com/lib/pq/scram 178 | # github.com/magiconair/properties v1.8.1 179 | github.com/magiconair/properties 180 | # github.com/markbates/errx v1.1.0 181 | github.com/markbates/errx 182 | # github.com/markbates/grift v1.5.0 183 | github.com/markbates/grift/cli 184 | github.com/markbates/grift/cmd 185 | github.com/markbates/grift/grift 186 | # github.com/markbates/oncer v1.0.0 187 | github.com/markbates/oncer 188 | # github.com/markbates/refresh v1.11.1 189 | github.com/markbates/refresh/filenotify 190 | github.com/markbates/refresh/refresh 191 | github.com/markbates/refresh/refresh/web 192 | # github.com/markbates/safe v1.0.1 193 | github.com/markbates/safe 194 | # github.com/markbates/sigtx v1.0.0 195 | github.com/markbates/sigtx 196 | # github.com/mattn/go-colorable v0.1.4 197 | github.com/mattn/go-colorable 198 | # github.com/mattn/go-isatty v0.0.12 199 | github.com/mattn/go-isatty 200 | # github.com/mattn/go-sqlite3 v2.0.3+incompatible 201 | github.com/mattn/go-sqlite3 202 | # github.com/microcosm-cc/bluemonday v1.0.2 203 | github.com/microcosm-cc/bluemonday 204 | # github.com/mitchellh/go-homedir v1.1.0 205 | github.com/mitchellh/go-homedir 206 | # github.com/mitchellh/mapstructure v1.1.2 207 | github.com/mitchellh/mapstructure 208 | # github.com/monoculum/formam v0.0.0-20200316225015-49f0baed3a1b 209 | github.com/monoculum/formam 210 | # github.com/pelletier/go-toml v1.2.0 211 | github.com/pelletier/go-toml 212 | # github.com/pkg/errors v0.9.1 213 | github.com/pkg/errors 214 | # github.com/pmezard/go-difflib v1.0.0 215 | github.com/pmezard/go-difflib/difflib 216 | # github.com/rogpeppe/go-internal v1.5.2 217 | github.com/rogpeppe/go-internal/modfile 218 | github.com/rogpeppe/go-internal/module 219 | github.com/rogpeppe/go-internal/semver 220 | # github.com/sergi/go-diff v1.1.0 221 | github.com/sergi/go-diff/diffmatchpatch 222 | # github.com/sirupsen/logrus v1.5.0 223 | github.com/sirupsen/logrus 224 | # github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d 225 | github.com/sourcegraph/annotate 226 | # github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e 227 | github.com/sourcegraph/syntaxhighlight 228 | # github.com/spf13/afero v1.2.1 229 | github.com/spf13/afero 230 | github.com/spf13/afero/mem 231 | # github.com/spf13/cast v1.3.0 232 | github.com/spf13/cast 233 | # github.com/spf13/cobra v0.0.6 234 | github.com/spf13/cobra 235 | # github.com/spf13/jwalterweatherman v1.0.0 236 | github.com/spf13/jwalterweatherman 237 | # github.com/spf13/pflag v1.0.5 238 | github.com/spf13/pflag 239 | # github.com/spf13/viper v1.6.2 240 | github.com/spf13/viper 241 | # github.com/stretchr/testify v1.5.1 242 | github.com/stretchr/testify/assert 243 | github.com/stretchr/testify/require 244 | # github.com/subosito/gotenv v1.2.0 245 | github.com/subosito/gotenv 246 | # golang.org/x/crypto v0.0.0-20200206161412-a0c6ece9d31a 247 | golang.org/x/crypto/pbkdf2 248 | golang.org/x/crypto/ssh/terminal 249 | # golang.org/x/mod v0.2.0 250 | golang.org/x/mod/module 251 | golang.org/x/mod/semver 252 | # golang.org/x/net v0.0.0-20200226121028-0de0cce0169b 253 | golang.org/x/net/html 254 | golang.org/x/net/html/atom 255 | # golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a 256 | golang.org/x/sync/errgroup 257 | # golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 258 | golang.org/x/sys/unix 259 | golang.org/x/sys/windows 260 | # golang.org/x/text v0.3.2 261 | golang.org/x/text/cases 262 | golang.org/x/text/internal 263 | golang.org/x/text/internal/language 264 | golang.org/x/text/internal/language/compact 265 | golang.org/x/text/internal/tag 266 | golang.org/x/text/language 267 | golang.org/x/text/runes 268 | golang.org/x/text/secure/bidirule 269 | golang.org/x/text/secure/precis 270 | golang.org/x/text/transform 271 | golang.org/x/text/unicode/bidi 272 | golang.org/x/text/unicode/norm 273 | golang.org/x/text/width 274 | # golang.org/x/tools v0.0.0-20200323192200-8849913b6971 275 | golang.org/x/tools/go/ast/astutil 276 | golang.org/x/tools/imports 277 | golang.org/x/tools/internal/fastwalk 278 | golang.org/x/tools/internal/gocommand 279 | golang.org/x/tools/internal/gopathwalk 280 | golang.org/x/tools/internal/imports 281 | # golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 282 | golang.org/x/xerrors 283 | golang.org/x/xerrors/internal 284 | # gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc 285 | gopkg.in/alexcesaro/quotedprintable.v3 286 | # gopkg.in/ini.v1 v1.51.0 287 | gopkg.in/ini.v1 288 | # gopkg.in/yaml.v2 v2.2.8 289 | gopkg.in/yaml.v2 290 | -------------------------------------------------------------------------------- /testdata/concourse_expected.txt: -------------------------------------------------------------------------------- 1 | GH_TUPLE= \ 2 | Azure:go-autorest:5bd9621f41a0:azure_go_autorest_date/vendor/github.com/Azure/go-autorest \ 3 | Azure:go-autorest:autorest/v0.10.1:azure_go_autorest_autorest \ 4 | Azure:go-autorest:e727cfcfc902:azure_go_autorest_adal \ 5 | Azure:go-autorest:logger/v0.1.0:azure_go_autorest_logger \ 6 | Azure:go-autorest:tracing/v0.5.0:azure_go_autorest_tracing \ 7 | DataDog:datadog-go:v3.2.0:datadog_datadog_go/vendor/github.com/DataDog/datadog-go \ 8 | Masterminds:squirrel:v1.1.0:masterminds_squirrel/vendor/github.com/Masterminds/squirrel \ 9 | Microsoft:go-winio:fc70bd9a86b5:microsoft_go_winio/vendor/github.com/Microsoft/go-winio \ 10 | Microsoft:hcsshim:v0.8.7:microsoft_hcsshim/vendor/github.com/Microsoft/hcsshim \ 11 | NYTimes:gziphandler:v1.1.1:nytimes_gziphandler/vendor/github.com/NYTimes/gziphandler \ 12 | VividCortex:ewma:v1.1.1:vividcortex_ewma/vendor/github.com/VividCortex/ewma \ 13 | apache:thrift:v0.13.0:apache_thrift/vendor/github.com/apache/thrift \ 14 | aryann:difflib:e206f873d14a:aryann_difflib/vendor/github.com/aryann/difflib \ 15 | aws:aws-sdk-go:v1.25.18:aws_aws_sdk_go/vendor/github.com/aws/aws-sdk-go \ 16 | beevik:etree:4cd0dd976db8:beevik_etree/vendor/github.com/beevik/etree \ 17 | beorn7:perks:v1.0.0:beorn7_perks/vendor/github.com/beorn7/perks \ 18 | bgentry:go-netrc:9fd32a8b3d3d:bgentry_go_netrc/vendor/github.com/bgentry/go-netrc \ 19 | bmizerany:pat:6226ea591a40:bmizerany_pat/vendor/github.com/bmizerany/pat \ 20 | caarlos0:env:v3.5.0:caarlos0_env/vendor/github.com/caarlos0/env \ 21 | cenkalti:backoff:v2.1.1:cenkalti_backoff/vendor/github.com/cenkalti/backoff \ 22 | census-instrumentation:opencensus-go:v0.22.2:census_instrumentation_opencensus_go/vendor/go.opencensus.io \ 23 | charlievieth:fs:7dc373669fa1:charlievieth_fs/vendor/github.com/charlievieth/fs \ 24 | cloudfoundry:clock:02e53af36e6c:cloudfoundry_clock/vendor/code.cloudfoundry.org/clock \ 25 | cloudfoundry:credhub-cli:e3951663d25c:cloudfoundry_credhub_cli/vendor/code.cloudfoundry.org/credhub-cli \ 26 | cloudfoundry:garden:62470dc86365:cloudfoundry_garden/vendor/code.cloudfoundry.org/garden \ 27 | cloudfoundry:go-socks5:54f73bdb8a8e:cloudfoundry_go_socks5/vendor/github.com/cloudfoundry/go-socks5 \ 28 | cloudfoundry:lager:v2.0.0:cloudfoundry_lager/vendor/code.cloudfoundry.org/lager \ 29 | cloudfoundry:localip:b88ad0dea95c:cloudfoundry_localip/vendor/code.cloudfoundry.org/localip \ 30 | cloudfoundry:socks5-proxy:3659db090cb2:cloudfoundry_socks5_proxy/vendor/github.com/cloudfoundry/socks5-proxy \ 31 | cloudfoundry:urljoiner:5cabba6c0a50:cloudfoundry_urljoiner/vendor/code.cloudfoundry.org/urljoiner \ 32 | concourse:baggageclaim:v1.8.0:concourse_baggageclaim/vendor/github.com/concourse/baggageclaim \ 33 | concourse:dex:821b48abfd88:concourse_dex/vendor/github.com/concourse/dex \ 34 | concourse:flag:v1.1.0:concourse_flag/vendor/github.com/concourse/flag \ 35 | concourse:go-archive:v1.0.1:concourse_go_archive/vendor/github.com/concourse/go-archive \ 36 | concourse:retryhttp:v1.0.2:concourse_retryhttp/vendor/github.com/concourse/retryhttp \ 37 | containerd:cgroups:06e718085901:containerd_cgroups/vendor/github.com/containerd/cgroups \ 38 | containerd:containerd:v1.3.2:containerd_containerd/vendor/github.com/containerd/containerd \ 39 | containerd:continuity:1097c8bae83b:containerd_continuity/vendor/github.com/containerd/continuity \ 40 | containerd:fifo:ff969a566b00:containerd_fifo/vendor/github.com/containerd/fifo \ 41 | containerd:go-cni:c154a49e2c75:containerd_go_cni/vendor/github.com/containerd/go-cni \ 42 | containerd:ttrpc:4f1b8fe65a5c:containerd_ttrpc/vendor/github.com/containerd/ttrpc \ 43 | containerd:typeurl:5eb25027c9fd:containerd_typeurl/vendor/github.com/containerd/typeurl \ 44 | containernetworking:cni:v0.7.1:containernetworking_cni/vendor/github.com/containernetworking/cni \ 45 | coreos:go-iptables:v0.4.5:coreos_go_iptables/vendor/github.com/coreos/go-iptables \ 46 | coreos:go-oidc:v2.0.0:coreos_go_oidc/vendor/github.com/coreos/go-oidc \ 47 | cppforlife:go-semi-semantic:576b6af77ae4:cppforlife_go_semi_semantic/vendor/github.com/cppforlife/go-semi-semantic \ 48 | creack:pty:v1.1.9:creack_pty/vendor/github.com/creack/pty \ 49 | cyberark:conjur-api-go:v0.6.0:cyberark_conjur_api_go/vendor/github.com/cyberark/conjur-api-go \ 50 | davecgh:go-spew:v1.1.1:davecgh_go_spew/vendor/github.com/davecgh/go-spew \ 51 | dgrijalva:jwt-go:v3.2.0:dgrijalva_jwt_go/vendor/github.com/dgrijalva/jwt-go \ 52 | docker:distribution:0d3efadf0154:docker_distribution/vendor/github.com/docker/distribution \ 53 | docker:go-events:e31b211e4f1c:docker_go_events/vendor/github.com/docker/go-events \ 54 | evanphx:json-patch:v4.5.0:evanphx_json_patch/vendor/github.com/evanphx/json-patch \ 55 | fatih:color:v1.7.0:fatih_color/vendor/github.com/fatih/color \ 56 | felixge:httpsnoop:v1.0.0:felixge_httpsnoop/vendor/github.com/felixge/httpsnoop \ 57 | fsnotify:fsnotify:v1.4.7:fsnotify_fsnotify/vendor/gopkg.in/fsnotify.v1 \ 58 | go-asn1-ber:asn1-ber:f715ec2f112d:go_asn1_ber_asn1_ber/vendor/gopkg.in/asn1-ber.v1 \ 59 | go-inf:inf:v0.9.1:go_inf_inf/vendor/gopkg.in/inf.v0 \ 60 | go-ldap:ldap:v2.5.1:go_ldap_ldap/vendor/gopkg.in/ldap.v2 \ 61 | go-tomb:tomb:dd632973f1e7:go_tomb_tomb/vendor/gopkg.in/tomb.v1 \ 62 | go-yaml:yaml:v2.2.8:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \ 63 | gobuffalo:packr:v1.13.7:gobuffalo_packr/vendor/github.com/gobuffalo/packr \ 64 | gogo:googleapis:v1.3.1:gogo_googleapis/vendor/github.com/gogo/googleapis \ 65 | gogo:protobuf:v1.3.1:gogo_protobuf/vendor/github.com/gogo/protobuf \ 66 | golang:appengine:v1.6.1:golang_appengine/vendor/google.golang.org/appengine \ 67 | golang:crypto:bac4c82f6975:golang_crypto/vendor/golang.org/x/crypto \ 68 | golang:groupcache:611e8accdfc9:golang_groupcache/vendor/github.com/golang/groupcache \ 69 | golang:mod:c90efee705ee:golang_mod/vendor/golang.org/x/mod \ 70 | golang:net:7e3656a0809f:golang_net/vendor/golang.org/x/net \ 71 | golang:oauth2:0f29369cfe45:golang_oauth2/vendor/golang.org/x/oauth2 \ 72 | golang:protobuf:v1.3.2:golang_protobuf/vendor/github.com/golang/protobuf \ 73 | golang:snappy:v0.0.1:golang_snappy/vendor/github.com/golang/snappy \ 74 | golang:sync:cd5d95a43a6e:golang_sync/vendor/golang.org/x/sync \ 75 | golang:sys:6aff5f38e54f:golang_sys/vendor/golang.org/x/sys \ 76 | golang:text:v0.3.2:golang_text/vendor/golang.org/x/text \ 77 | golang:time:9d24e82272b4:golang_time/vendor/golang.org/x/time \ 78 | golang:tools:066e0c02454c:golang_tools/vendor/golang.org/x/tools \ 79 | golang:xerrors:9bdfabe68543:golang_xerrors/vendor/golang.org/x/xerrors \ 80 | google:go-cmp:v0.4.0:google_go_cmp/vendor/github.com/google/go-cmp \ 81 | google:go-genproto:3caeed10a8bf:google_go_genproto/vendor/google.golang.org/genproto \ 82 | google:gofuzz:v1.0.0:google_gofuzz/vendor/github.com/google/gofuzz \ 83 | google:jsonapi:5d047c6bc66b:google_jsonapi/vendor/github.com/google/jsonapi \ 84 | googleapis:gax-go:v2.0.5:googleapis_gax_go_v2/vendor/github.com/googleapis/gax-go \ 85 | googleapis:gnostic:v0.3.1:googleapis_gnostic/vendor/github.com/googleapis/gnostic \ 86 | googleapis:google-api-go-client:v0.11.0:googleapis_google_api_go_client/vendor/google.golang.org/api \ 87 | googleapis:google-cloud-go:v0.47.0:googleapis_google_cloud_go/vendor/cloud.google.com/go \ 88 | gophercloud:gophercloud:v0.10.0:gophercloud_gophercloud/vendor/github.com/gophercloud/gophercloud \ 89 | gorilla:context:v1.1.1:gorilla_context/vendor/github.com/gorilla/context \ 90 | gorilla:handlers:3a5767ca75ec:gorilla_handlers/vendor/github.com/gorilla/handlers \ 91 | gorilla:mux:v1.6.2:gorilla_mux/vendor/github.com/gorilla/mux \ 92 | gorilla:websocket:v1.4.0:gorilla_websocket/vendor/github.com/gorilla/websocket \ 93 | grpc:grpc-go:v1.26.0:grpc_grpc_go/vendor/google.golang.org/grpc \ 94 | hashicorp:errwrap:v1.0.0:hashicorp_errwrap/vendor/github.com/hashicorp/errwrap \ 95 | hashicorp:go-cleanhttp:v0.5.1:hashicorp_go_cleanhttp/vendor/github.com/hashicorp/go-cleanhttp \ 96 | hashicorp:go-hclog:v0.9.2:hashicorp_go_hclog/vendor/github.com/hashicorp/go-hclog \ 97 | hashicorp:go-multierror:v1.1.0:hashicorp_go_multierror/vendor/github.com/hashicorp/go-multierror \ 98 | hashicorp:go-retryablehttp:v0.6.2:hashicorp_go_retryablehttp/vendor/github.com/hashicorp/go-retryablehttp \ 99 | hashicorp:go-rootcerts:v1.0.2:hashicorp_go_rootcerts/vendor/github.com/hashicorp/go-rootcerts \ 100 | hashicorp:go-sockaddr:v1.0.2:hashicorp_go_sockaddr/vendor/github.com/hashicorp/go-sockaddr \ 101 | hashicorp:go-version:v1.2.0:hashicorp_go_version/vendor/github.com/hashicorp/go-version \ 102 | hashicorp:hcl:v1.0.0:hashicorp_hcl/vendor/github.com/hashicorp/hcl \ 103 | hashicorp:vault:390e96e22eb2:hashicorp_vault_sdk/vendor/github.com/hashicorp/vault \ 104 | hashicorp:vault:bdd38fca2cff:hashicorp_vault_api \ 105 | hpcloud:tail:v1.0.0:hpcloud_tail/vendor/github.com/hpcloud/tail \ 106 | imdario:mergo:v0.3.6:imdario_mergo/vendor/github.com/imdario/mergo \ 107 | inconshreveable:go-update:8152e7eb6ccf:inconshreveable_go_update/vendor/github.com/inconshreveable/go-update \ 108 | influxdata:influxdb1-client:f8cdb5d5f175:influxdata_influxdb1_client/vendor/github.com/influxdata/influxdb1-client \ 109 | jmespath:go-jmespath:c2b33e8439af:jmespath_go_jmespath/vendor/github.com/jmespath/go-jmespath \ 110 | jonboulle:clockwork:v0.1.0:jonboulle_clockwork/vendor/github.com/jonboulle/clockwork \ 111 | json-iterator:go:v1.1.7:json_iterator_go/vendor/github.com/json-iterator/go \ 112 | klauspost:compress:v1.9.7:klauspost_compress/vendor/github.com/klauspost/compress \ 113 | konsorten:go-windows-terminal-sequences:v1.0.2:konsorten_go_windows_terminal_sequences/vendor/github.com/konsorten/go-windows-terminal-sequences \ 114 | kr:pty:v1.1.8:kr_pty/vendor/github.com/kr/pty \ 115 | krishicks:yaml-patch:v0.0.10:krishicks_yaml_patch/vendor/github.com/krishicks/yaml-patch \ 116 | kubernetes-sigs:yaml:v1.1.0:kubernetes_sigs_yaml/vendor/sigs.k8s.io/yaml \ 117 | kubernetes:api:40a48860b5ab:kubernetes_api/vendor/k8s.io/api \ 118 | kubernetes:apimachinery:d7deff9243b1:kubernetes_apimachinery/vendor/k8s.io/apimachinery \ 119 | kubernetes:client-go:v11.0.0:kubernetes_client_go/vendor/k8s.io/client-go \ 120 | kubernetes:klog:v0.3.0:kubernetes_klog/vendor/k8s.io/klog \ 121 | kubernetes:kube-openapi:30be4d16710a:kubernetes_kube_openapi/vendor/k8s.io/kube-openapi \ 122 | kubernetes:utils:3a4a5477acf8:kubernetes_utils/vendor/k8s.io/utils \ 123 | lann:builder:47ae307949d0:lann_builder/vendor/github.com/lann/builder \ 124 | lann:ps:62de8c46ede0:lann_ps/vendor/github.com/lann/ps \ 125 | lib:pq:v1.3.0:lib_pq/vendor/github.com/lib/pq \ 126 | mattn:go-colorable:v0.1.6:mattn_go_colorable/vendor/github.com/mattn/go-colorable \ 127 | mattn:go-isatty:v0.0.12:mattn_go_isatty/vendor/github.com/mattn/go-isatty \ 128 | mattn:go-sqlite3:v1.10.0:mattn_go_sqlite3/vendor/github.com/mattn/go-sqlite3 \ 129 | matttproud:golang_protobuf_extensions:v1.0.1:matttproud_golang_protobuf_extensions/vendor/github.com/matttproud/golang_protobuf_extensions \ 130 | maxbrunsfeld:counterfeiter:v6.2.3:maxbrunsfeld_counterfeiter_v6/vendor/github.com/maxbrunsfeld/counterfeiter/v6 \ 131 | mgutz:ansi:9520e82c474b:mgutz_ansi/vendor/github.com/mgutz/ansi \ 132 | miekg:dns:v1.1.6:miekg_dns/vendor/github.com/miekg/dns \ 133 | mitchellh:go-homedir:v1.1.0:mitchellh_go_homedir/vendor/github.com/mitchellh/go-homedir \ 134 | mitchellh:mapstructure:v1.1.2:mitchellh_mapstructure/vendor/github.com/mitchellh/mapstructure \ 135 | modern-go:concurrent:bacd9c7ef1dd:modern_go_concurrent/vendor/github.com/modern-go/concurrent \ 136 | modern-go:reflect2:v1.0.1:modern_go_reflect2/vendor/github.com/modern-go/reflect2 \ 137 | nu7hatch:gouuid:179d4d0c4d8d:nu7hatch_gouuid/vendor/github.com/nu7hatch/gouuid \ 138 | onsi:ginkgo:v1.12.0:onsi_ginkgo/vendor/github.com/onsi/ginkgo \ 139 | onsi:gomega:v1.10.0:onsi_gomega/vendor/github.com/onsi/gomega \ 140 | open-telemetry:opentelemetry-go:v0.2.1:open_telemetry_opentelemetry_go/vendor/go.opentelemetry.io/otel \ 141 | opencontainers:go-digest:v1.0.0-rc1:opencontainers_go_digest/vendor/github.com/opencontainers/go-digest \ 142 | opencontainers:image-spec:v1.0.1:opencontainers_image_spec/vendor/github.com/opencontainers/image-spec \ 143 | opencontainers:runc:v0.1.1:opencontainers_runc/vendor/github.com/opencontainers/runc \ 144 | opencontainers:runtime-spec:v1.0.1:opencontainers_runtime_spec/vendor/github.com/opencontainers/runtime-spec \ 145 | patrickmn:go-cache:v2.1.0:patrickmn_go_cache/vendor/github.com/patrickmn/go-cache \ 146 | peterhellberg:link:v1.0.0:peterhellberg_link/vendor/github.com/peterhellberg/link \ 147 | pierrec:lz4:v2.0.5:pierrec_lz4/vendor/github.com/pierrec/lz4 \ 148 | pkg:errors:v0.8.1:pkg_errors/vendor/github.com/pkg/errors \ 149 | pkg:term:aa71e9d9e942:pkg_term/vendor/github.com/pkg/term \ 150 | pmezard:go-difflib:v1.0.0:pmezard_go_difflib/vendor/github.com/pmezard/go-difflib \ 151 | pquerna:cachecontrol:1555304b9b35:pquerna_cachecontrol/vendor/github.com/pquerna/cachecontrol \ 152 | prometheus:client_golang:v0.9.3:prometheus_client_golang/vendor/github.com/prometheus/client_golang \ 153 | prometheus:client_model:14fe0d1b01d4:prometheus_client_model/vendor/github.com/prometheus/client_model \ 154 | prometheus:common:v0.4.0:prometheus_common/vendor/github.com/prometheus/common \ 155 | prometheus:procfs:v0.0.5:prometheus_procfs/vendor/github.com/prometheus/procfs \ 156 | racksec:srslog:a4725f04ec91:racksec_srslog/vendor/github.com/racksec/srslog \ 157 | russellhaering:goxmldsig:eaac44c63fe0:russellhaering_goxmldsig/vendor/github.com/russellhaering/goxmldsig \ 158 | ryanuber:go-glob:v1.0.0:ryanuber_go_glob/vendor/github.com/ryanuber/go-glob \ 159 | sirupsen:logrus:v1.4.2:sirupsen_logrus/vendor/github.com/sirupsen/logrus \ 160 | skratchdot:open-golang:75fb7ed4208c:skratchdot_open_golang/vendor/github.com/skratchdot/open-golang \ 161 | spf13:pflag:v1.0.5:spf13_pflag/vendor/github.com/spf13/pflag \ 162 | square:certstrap:v1.1.1:square_certstrap/vendor/github.com/square/certstrap \ 163 | square:go-jose:v2.3.1:square_go_jose/vendor/gopkg.in/square/go-jose.v2 \ 164 | stretchr:objx:v0.2.0:stretchr_objx/vendor/github.com/stretchr/objx \ 165 | stretchr:testify:v1.4.0:stretchr_testify/vendor/github.com/stretchr/testify \ 166 | syndtr:gocapability:d98352740cb2:syndtr_gocapability/vendor/github.com/syndtr/gocapability \ 167 | tedsuo:ifrit:bea94bb476cc:tedsuo_ifrit/vendor/github.com/tedsuo/ifrit \ 168 | tedsuo:rata:07d200713958:tedsuo_rata/vendor/github.com/tedsuo/rata \ 169 | vbauerster:mpb:3a6acfe12ac6:vbauerster_mpb_v4/vendor/github.com/vbauerster/mpb/v4 \ 170 | vito:go-flags:c7161c3bd74d:vito_go_flags/vendor/github.com/jessevdk/go-flags \ 171 | vito:go-interact:fa338ed9e9ec:vito_go_interact/vendor/github.com/vito/go-interact \ 172 | vito:go-sse:fd69d275caac:vito_go_sse/vendor/github.com/vito/go-sse \ 173 | vito:houdini:v1.1.1:vito_houdini/vendor/github.com/vito/houdini \ 174 | vito:twentythousandtonnesofcrudeoil:3b21ad808fcb:vito_twentythousandtonnesofcrudeoil/vendor/github.com/vito/twentythousandtonnesofcrudeoil 175 | 176 | post-extract: 177 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest 178 | @${RLN} ${WRKSRC_azure_go_autorest_autorest}/autorest ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest 179 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/adal 180 | @${RLN} ${WRKSRC_azure_go_autorest_adal}/autorest/adal ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/adal 181 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/logger 182 | @${RLN} ${WRKSRC_azure_go_autorest_logger}/logger ${WRKSRC}/vendor/github.com/Azure/go-autorest/logger 183 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/tracing 184 | @${RLN} ${WRKSRC_azure_go_autorest_tracing}/tracing ${WRKSRC}/vendor/github.com/Azure/go-autorest/tracing 185 | @${RM} -r ${WRKSRC}/vendor/github.com/hashicorp/vault/api 186 | @${RLN} ${WRKSRC_hashicorp_vault_api}/api ${WRKSRC}/vendor/github.com/hashicorp/vault/api 187 | -------------------------------------------------------------------------------- /testdata/ctop_expected.txt: -------------------------------------------------------------------------------- 1 | GH_TUPLE= \ 2 | Azure:go-ansiterm:d6e3b3328b78:azure_go_ansiterm/vendor/github.com/Azure/go-ansiterm \ 3 | BurntSushi:toml:v0.3.1:burntsushi_toml/vendor/github.com/BurntSushi/toml \ 4 | Microsoft:go-winio:3fe6c5262873:microsoft_go_winio/vendor/github.com/Microsoft/go-winio \ 5 | Microsoft:hcsshim:v0.8.9:microsoft_hcsshim/vendor/github.com/Microsoft/hcsshim \ 6 | bcicen:termui:4eb80249d3f5:bcicen_termui/vendor/github.com/gizak/termui \ 7 | c9s:goprocinfo:b34328d6e0cd:c9s_goprocinfo/vendor/github.com/c9s/goprocinfo \ 8 | checkpoint-restore:go-criu:v4.1.0:checkpoint_restore_go_criu_v4/vendor/github.com/checkpoint-restore/go-criu/v4 \ 9 | cilium:ebpf:1c8d4c9ef775:cilium_ebpf/vendor/github.com/cilium/ebpf \ 10 | containerd:console:v1.0.0:containerd_console/vendor/github.com/containerd/console \ 11 | containerd:containerd:v1.3.4:containerd_containerd/vendor/github.com/containerd/containerd \ 12 | containerd:continuity:d3ef23f19fbb:containerd_continuity/vendor/github.com/containerd/continuity \ 13 | coreos:go-systemd:v22.1.0:coreos_go_systemd_v22/vendor/github.com/coreos/go-systemd/v22 \ 14 | cyphar:filepath-securejoin:v0.2.2:cyphar_filepath_securejoin/vendor/github.com/cyphar/filepath-securejoin \ 15 | docker:distribution:v2.7.1:docker_distribution/vendor/github.com/docker/distribution \ 16 | docker:go-connections:v0.4.0:docker_go_connections/vendor/github.com/docker/go-connections \ 17 | docker:go-units:v0.4.0:docker_go_units/vendor/github.com/docker/go-units \ 18 | fsouza:go-dockerclient:v1.6.6:fsouza_go_dockerclient/vendor/github.com/fsouza/go-dockerclient \ 19 | godbus:dbus:v5.0.3:godbus_dbus_v5/vendor/github.com/godbus/dbus/v5 \ 20 | gogo:protobuf:v1.3.1:gogo_protobuf/vendor/github.com/gogo/protobuf \ 21 | golang:protobuf:v1.4.2:golang_protobuf/vendor/github.com/golang/protobuf \ 22 | golang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \ 23 | golang:sys:3e129f6d46b1:golang_sys/vendor/golang.org/x/sys \ 24 | google:go-genproto:24fa4b261c55:google_go_genproto/vendor/google.golang.org/genproto \ 25 | grpc:grpc-go:v1.29.1:grpc_grpc_go/vendor/google.golang.org/grpc \ 26 | jgautheron:codename-generator:16d037c7cc3c:jgautheron_codename_generator/vendor/github.com/jgautheron/codename-generator \ 27 | konsorten:go-windows-terminal-sequences:v1.0.3:konsorten_go_windows_terminal_sequences/vendor/github.com/konsorten/go-windows-terminal-sequences \ 28 | mattn:go-runewidth:14207d285c6c:mattn_go_runewidth/vendor/github.com/mattn/go-runewidth \ 29 | mitchellh:go-wordwrap:ad45545899c7:mitchellh_go_wordwrap/vendor/github.com/mitchellh/go-wordwrap \ 30 | moby:moby:v17.12.0-ce-rc1.0.20200505174321-1655290016ac:moby_moby/vendor/github.com/docker/docker \ 31 | moby:sys:mount/v0.1.0:moby_sys_mount/vendor/github.com/moby/sys \ 32 | moby:sys:mountinfo/v0.1.3:moby_sys_mountinfo \ 33 | moby:term:129dac9f73f6:moby_term/vendor/github.com/moby/term \ 34 | morikuni:aec:v1.0.0:morikuni_aec/vendor/github.com/morikuni/aec \ 35 | mrunalp:fileutils:abd8a0e76976:mrunalp_fileutils/vendor/github.com/mrunalp/fileutils \ 36 | nsf:termbox-go:e2050e41c884:nsf_termbox_go/vendor/github.com/nsf/termbox-go \ 37 | nu7hatch:gouuid:179d4d0c4d8d:nu7hatch_gouuid/vendor/github.com/nu7hatch/gouuid \ 38 | op:go-logging:b2cb9fa56473:op_go_logging/vendor/github.com/op/go-logging \ 39 | opencontainers:go-digest:v1.0.0-rc1:opencontainers_go_digest/vendor/github.com/opencontainers/go-digest \ 40 | opencontainers:image-spec:v1.0.1:opencontainers_image_spec/vendor/github.com/opencontainers/image-spec \ 41 | opencontainers:runc:v1.0.0-rc92:opencontainers_runc/vendor/github.com/opencontainers/runc \ 42 | opencontainers:runtime-spec:4d89ac9fbff6:opencontainers_runtime_spec/vendor/github.com/opencontainers/runtime-spec \ 43 | opencontainers:selinux:v1.6.0:opencontainers_selinux/vendor/github.com/opencontainers/selinux \ 44 | pkg:errors:v0.9.1:pkg_errors/vendor/github.com/pkg/errors \ 45 | protocolbuffers:protobuf-go:v1.23.0:protocolbuffers_protobuf_go/vendor/google.golang.org/protobuf \ 46 | seccomp:libseccomp-golang:v0.9.1:seccomp_libseccomp_golang/vendor/github.com/seccomp/libseccomp-golang \ 47 | sirupsen:logrus:v1.6.0:sirupsen_logrus/vendor/github.com/sirupsen/logrus \ 48 | stretchr:testify:v1.4.0:stretchr_testify/vendor/github.com/stretchr/testify \ 49 | syndtr:gocapability:d98352740cb2:syndtr_gocapability/vendor/github.com/syndtr/gocapability \ 50 | vishvananda:netlink:v1.1.0:vishvananda_netlink/vendor/github.com/vishvananda/netlink \ 51 | vishvananda:netns:0a2b9b5464df:vishvananda_netns/vendor/github.com/vishvananda/netns \ 52 | willf:bitset:d5bec3311243:willf_bitset/vendor/github.com/willf/bitset 53 | 54 | post-extract: 55 | @${RM} -r ${WRKSRC}/vendor/github.com/moby/sys/mountinfo 56 | @${RLN} ${WRKSRC_moby_sys_mountinfo}/mountinfo ${WRKSRC}/vendor/github.com/moby/sys/mountinfo 57 | -------------------------------------------------------------------------------- /testdata/ctop_modules.txt: -------------------------------------------------------------------------------- 1 | # github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 2 | github.com/Azure/go-ansiterm 3 | github.com/Azure/go-ansiterm/winterm 4 | # github.com/BurntSushi/toml v0.3.1 5 | ## explicit 6 | github.com/BurntSushi/toml 7 | # github.com/Microsoft/go-winio v0.4.15-0.20200113171025-3fe6c5262873 8 | github.com/Microsoft/go-winio 9 | github.com/Microsoft/go-winio/pkg/guid 10 | # github.com/Microsoft/hcsshim v0.8.9 11 | github.com/Microsoft/hcsshim/osversion 12 | # github.com/c9s/goprocinfo v0.0.0-20170609001544-b34328d6e0cd 13 | ## explicit 14 | github.com/c9s/goprocinfo/linux 15 | # github.com/checkpoint-restore/go-criu/v4 v4.1.0 16 | github.com/checkpoint-restore/go-criu/v4 17 | github.com/checkpoint-restore/go-criu/v4/rpc 18 | # github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775 19 | github.com/cilium/ebpf 20 | github.com/cilium/ebpf/asm 21 | github.com/cilium/ebpf/internal 22 | github.com/cilium/ebpf/internal/btf 23 | github.com/cilium/ebpf/internal/unix 24 | # github.com/containerd/console v1.0.0 25 | github.com/containerd/console 26 | # github.com/containerd/containerd v1.3.4 27 | github.com/containerd/containerd/errdefs 28 | # github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb 29 | github.com/containerd/continuity/fs 30 | github.com/containerd/continuity/sysx 31 | # github.com/coreos/go-systemd/v22 v22.1.0 32 | github.com/coreos/go-systemd/v22/dbus 33 | # github.com/cyphar/filepath-securejoin v0.2.2 34 | github.com/cyphar/filepath-securejoin 35 | # github.com/docker/distribution v2.7.1+incompatible 36 | github.com/docker/distribution/registry/api/errcode 37 | # github.com/docker/docker v17.12.0-ce-rc1.0.20200505174321-1655290016ac+incompatible 38 | github.com/docker/docker/api/types/blkiodev 39 | github.com/docker/docker/api/types/container 40 | github.com/docker/docker/api/types/filters 41 | github.com/docker/docker/api/types/mount 42 | github.com/docker/docker/api/types/network 43 | github.com/docker/docker/api/types/registry 44 | github.com/docker/docker/api/types/strslice 45 | github.com/docker/docker/api/types/swarm 46 | github.com/docker/docker/api/types/swarm/runtime 47 | github.com/docker/docker/api/types/versions 48 | github.com/docker/docker/errdefs 49 | github.com/docker/docker/pkg/archive 50 | github.com/docker/docker/pkg/fileutils 51 | github.com/docker/docker/pkg/homedir 52 | github.com/docker/docker/pkg/idtools 53 | github.com/docker/docker/pkg/ioutils 54 | github.com/docker/docker/pkg/jsonmessage 55 | github.com/docker/docker/pkg/longpath 56 | github.com/docker/docker/pkg/pools 57 | github.com/docker/docker/pkg/stdcopy 58 | github.com/docker/docker/pkg/system 59 | # github.com/docker/go-connections v0.4.0 60 | github.com/docker/go-connections/nat 61 | # github.com/docker/go-units v0.4.0 62 | github.com/docker/go-units 63 | # github.com/fsouza/go-dockerclient v1.6.6 64 | ## explicit 65 | github.com/fsouza/go-dockerclient 66 | # github.com/gizak/termui v2.3.0+incompatible => github.com/bcicen/termui v0.0.0-20180326052246-4eb80249d3f5 67 | ## explicit 68 | github.com/gizak/termui 69 | # github.com/godbus/dbus/v5 v5.0.3 70 | github.com/godbus/dbus/v5 71 | # github.com/gogo/protobuf v1.3.1 72 | github.com/gogo/protobuf/proto 73 | # github.com/golang/protobuf v1.4.2 74 | github.com/golang/protobuf/proto 75 | github.com/golang/protobuf/ptypes 76 | github.com/golang/protobuf/ptypes/any 77 | github.com/golang/protobuf/ptypes/duration 78 | github.com/golang/protobuf/ptypes/timestamp 79 | # github.com/jgautheron/codename-generator v0.0.0-20150829203204-16d037c7cc3c 80 | ## explicit 81 | github.com/jgautheron/codename-generator 82 | # github.com/konsorten/go-windows-terminal-sequences v1.0.3 83 | github.com/konsorten/go-windows-terminal-sequences 84 | # github.com/mattn/go-runewidth v0.0.0-20170201023540-14207d285c6c 85 | ## explicit 86 | github.com/mattn/go-runewidth 87 | # github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 88 | ## explicit 89 | github.com/mitchellh/go-wordwrap 90 | # github.com/moby/sys/mount v0.1.0 91 | github.com/moby/sys/mount 92 | # github.com/moby/sys/mountinfo v0.1.3 93 | github.com/moby/sys/mountinfo 94 | # github.com/moby/term v0.0.0-20200429084858-129dac9f73f6 95 | github.com/moby/term 96 | github.com/moby/term/windows 97 | # github.com/morikuni/aec v1.0.0 98 | github.com/morikuni/aec 99 | # github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976 100 | github.com/mrunalp/fileutils 101 | # github.com/nsf/termbox-go v0.0.0-20180303152453-e2050e41c884 102 | ## explicit 103 | github.com/nsf/termbox-go 104 | # github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d 105 | ## explicit 106 | github.com/nu7hatch/gouuid 107 | # github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 108 | ## explicit 109 | github.com/op/go-logging 110 | # github.com/opencontainers/go-digest v1.0.0-rc1 111 | github.com/opencontainers/go-digest 112 | # github.com/opencontainers/image-spec v1.0.1 113 | github.com/opencontainers/image-spec/specs-go 114 | github.com/opencontainers/image-spec/specs-go/v1 115 | # github.com/opencontainers/runc v1.0.0-rc92 116 | ## explicit 117 | github.com/opencontainers/runc/libcontainer 118 | github.com/opencontainers/runc/libcontainer/apparmor 119 | github.com/opencontainers/runc/libcontainer/cgroups 120 | github.com/opencontainers/runc/libcontainer/cgroups/devices 121 | github.com/opencontainers/runc/libcontainer/cgroups/ebpf 122 | github.com/opencontainers/runc/libcontainer/cgroups/ebpf/devicefilter 123 | github.com/opencontainers/runc/libcontainer/cgroups/fs 124 | github.com/opencontainers/runc/libcontainer/cgroups/fs2 125 | github.com/opencontainers/runc/libcontainer/cgroups/fscommon 126 | github.com/opencontainers/runc/libcontainer/cgroups/systemd 127 | github.com/opencontainers/runc/libcontainer/configs 128 | github.com/opencontainers/runc/libcontainer/configs/validate 129 | github.com/opencontainers/runc/libcontainer/intelrdt 130 | github.com/opencontainers/runc/libcontainer/keys 131 | github.com/opencontainers/runc/libcontainer/logs 132 | github.com/opencontainers/runc/libcontainer/seccomp 133 | github.com/opencontainers/runc/libcontainer/stacktrace 134 | github.com/opencontainers/runc/libcontainer/system 135 | github.com/opencontainers/runc/libcontainer/user 136 | github.com/opencontainers/runc/libcontainer/utils 137 | github.com/opencontainers/runc/types 138 | # github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6 139 | github.com/opencontainers/runtime-spec/specs-go 140 | # github.com/opencontainers/selinux v1.6.0 141 | github.com/opencontainers/selinux/go-selinux 142 | github.com/opencontainers/selinux/go-selinux/label 143 | github.com/opencontainers/selinux/pkg/pwalk 144 | # github.com/pkg/errors v0.9.1 145 | ## explicit 146 | github.com/pkg/errors 147 | # github.com/seccomp/libseccomp-golang v0.9.1 148 | github.com/seccomp/libseccomp-golang 149 | # github.com/sirupsen/logrus v1.6.0 150 | github.com/sirupsen/logrus 151 | # github.com/stretchr/testify v1.4.0 152 | ## explicit 153 | # github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 154 | github.com/syndtr/gocapability/capability 155 | # github.com/vishvananda/netlink v1.1.0 156 | github.com/vishvananda/netlink 157 | github.com/vishvananda/netlink/nl 158 | # github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df 159 | github.com/vishvananda/netns 160 | # github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243 161 | github.com/willf/bitset 162 | # golang.org/x/sync v0.0.0-20190423024810-112230192c58 163 | golang.org/x/sync/errgroup 164 | # golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 165 | golang.org/x/sys/internal/unsafeheader 166 | golang.org/x/sys/unix 167 | golang.org/x/sys/windows 168 | # google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 169 | google.golang.org/genproto/googleapis/rpc/status 170 | # google.golang.org/grpc v1.29.1 171 | google.golang.org/grpc/codes 172 | google.golang.org/grpc/internal/status 173 | google.golang.org/grpc/status 174 | # google.golang.org/protobuf v1.23.0 175 | google.golang.org/protobuf/encoding/prototext 176 | google.golang.org/protobuf/encoding/protowire 177 | google.golang.org/protobuf/internal/descfmt 178 | google.golang.org/protobuf/internal/descopts 179 | google.golang.org/protobuf/internal/detrand 180 | google.golang.org/protobuf/internal/encoding/defval 181 | google.golang.org/protobuf/internal/encoding/messageset 182 | google.golang.org/protobuf/internal/encoding/tag 183 | google.golang.org/protobuf/internal/encoding/text 184 | google.golang.org/protobuf/internal/errors 185 | google.golang.org/protobuf/internal/fieldnum 186 | google.golang.org/protobuf/internal/fieldsort 187 | google.golang.org/protobuf/internal/filedesc 188 | google.golang.org/protobuf/internal/filetype 189 | google.golang.org/protobuf/internal/flags 190 | google.golang.org/protobuf/internal/genname 191 | google.golang.org/protobuf/internal/impl 192 | google.golang.org/protobuf/internal/mapsort 193 | google.golang.org/protobuf/internal/pragma 194 | google.golang.org/protobuf/internal/set 195 | google.golang.org/protobuf/internal/strs 196 | google.golang.org/protobuf/internal/version 197 | google.golang.org/protobuf/proto 198 | google.golang.org/protobuf/reflect/protoreflect 199 | google.golang.org/protobuf/reflect/protoregistry 200 | google.golang.org/protobuf/runtime/protoiface 201 | google.golang.org/protobuf/runtime/protoimpl 202 | google.golang.org/protobuf/types/known/anypb 203 | google.golang.org/protobuf/types/known/durationpb 204 | google.golang.org/protobuf/types/known/timestamppb 205 | # github.com/gizak/termui => github.com/bcicen/termui v0.0.0-20180326052246-4eb80249d3f5 206 | -------------------------------------------------------------------------------- /testdata/go-btfs_expected.txt: -------------------------------------------------------------------------------- 1 | GH_TUPLE= \ 2 | AndreasBriese:bbloom:e2d15f34fcf9:andreasbriese_bbloom/vendor/github.com/AndreasBriese/bbloom \ 3 | BurntSushi:toml:v0.3.1:burntsushi_toml/vendor/github.com/BurntSushi/toml \ 4 | FactomProject:basen:fe3947df716e:factomproject_basen/vendor/github.com/FactomProject/basen \ 5 | FactomProject:btcutilecc:d3a63a5752ec:factomproject_btcutilecc/vendor/github.com/FactomProject/btcutilecc \ 6 | Kubuxu:go-os-helper:v0.0.1:kubuxu_go_os_helper/vendor/github.com/Kubuxu/go-os-helper \ 7 | Kubuxu:gocovmerge:7ecaa51963cd:kubuxu_gocovmerge/vendor/github.com/Kubuxu/gocovmerge \ 8 | OpenPeeDeeP:depguard:v1.0.1:openpeedeep_depguard/vendor/github.com/OpenPeeDeeP/depguard \ 9 | StackExchange:wmi:e0a55b97c705:stackexchange_wmi/vendor/github.com/StackExchange/wmi \ 10 | Stebalien:go-bitfield:v0.0.1:stebalien_go_bitfield/vendor/github.com/Stebalien/go-bitfield \ 11 | TRON-US:go-btfs-api:v0.1.0:tron_us_go_btfs_api/vendor/github.com/TRON-US/go-btfs-api \ 12 | TRON-US:go-btfs-chunker:v0.2.8:tron_us_go_btfs_chunker/vendor/github.com/TRON-US/go-btfs-chunker \ 13 | TRON-US:go-btfs-cmds:v0.1.6:tron_us_go_btfs_cmds/vendor/github.com/TRON-US/go-btfs-cmds \ 14 | TRON-US:go-btfs-config:v0.5.2:tron_us_go_btfs_config/vendor/github.com/TRON-US/go-btfs-config \ 15 | TRON-US:go-btfs-files:v0.1.6:tron_us_go_btfs_files/vendor/github.com/TRON-US/go-btfs-files \ 16 | TRON-US:go-cid:v0.1.0:tron_us_go_cid/vendor/github.com/ipfs/go-cid \ 17 | TRON-US:go-eccrypto:v0.0.1:tron_us_go_eccrypto/vendor/github.com/TRON-US/go-eccrypto \ 18 | TRON-US:go-ipld-format:v0.1.0:tron_us_go_ipld_format/vendor/github.com/ipfs/go-ipld-format \ 19 | TRON-US:go-libp2p-core:v0.4.1:tron_us_go_libp2p_core/vendor/github.com/libp2p/go-libp2p-core \ 20 | TRON-US:go-mfs:v0.2.2:tron_us_go_mfs/vendor/github.com/TRON-US/go-mfs \ 21 | TRON-US:go-unixfs:v0.5.9:tron_us_go_unixfs/vendor/github.com/TRON-US/go-unixfs \ 22 | TRON-US:interface-go-btfs-core:v0.5.4:tron_us_interface_go_btfs_core/vendor/github.com/TRON-US/interface-go-btfs-core \ 23 | alecthomas:units:2efee857e7cf:alecthomas_units/vendor/github.com/alecthomas/units \ 24 | bazil:fuse:65cc252bf669:bazil_fuse/vendor/bazil.org/fuse \ 25 | beorn7:perks:v1.0.0:beorn7_perks/vendor/github.com/beorn7/perks \ 26 | blang:semver:v3.5.1:blang_semver/vendor/github.com/blang/semver \ 27 | bombsimon:wsl:v1.2.5:bombsimon_wsl/vendor/github.com/bombsimon/wsl \ 28 | bren2010:proquint:38337c27106d:bren2010_proquint/vendor/github.com/bren2010/proquint \ 29 | btcsuite:btcd:a0d1e3e36d50:btcsuite_btcd/vendor/github.com/btcsuite/btcd \ 30 | btcsuite:btcutil:9e5f4b9a998d:btcsuite_btcutil/vendor/github.com/btcsuite/btcutil \ 31 | cenkalti:backoff:v2.1.1:cenkalti_backoff/vendor/github.com/cenkalti/backoff \ 32 | cenkalti:backoff:v3.1.1:cenkalti_backoff_v3/vendor/github.com/cenkalti/backoff/v3 \ 33 | census-instrumentation:opencensus-go:v0.21.0:census_instrumentation_opencensus_go/vendor/go.opencensus.io \ 34 | cheekybits:genny:v1.0.0:cheekybits_genny/vendor/github.com/cheekybits/genny \ 35 | cheggaaa:pb:v1.0.28:cheggaaa_pb/vendor/gopkg.in/cheggaaa/pb.v1 \ 36 | cmars:basen:fe3947df716e:cmars_basen \ 37 | coreos:go-semver:v0.3.0:coreos_go_semver/vendor/github.com/coreos/go-semver \ 38 | cpuguy83:go-md2man:f79a8a8ca69d:cpuguy83_go_md2man_v2/vendor/github.com/cpuguy83/go-md2man/v2 \ 39 | cskr:pubsub:v1.0.2:cskr_pubsub/vendor/github.com/cskr/pubsub \ 40 | davecgh:go-spew:v1.1.1:davecgh_go_spew/vendor/github.com/davecgh/go-spew \ 41 | davidlazar:go-crypto:dcfb0a7ac018:davidlazar_go_crypto/vendor/github.com/davidlazar/go-crypto \ 42 | dgraph-io:badger:v1.6.0-rc1:dgraph_io_badger/vendor/github.com/dgraph-io/badger \ 43 | dgryski:go-farm:6a90982ecee2:dgryski_go_farm/vendor/github.com/dgryski/go-farm \ 44 | dominikh:go-tools:v0.0.1-2019.2.3:dominikh_go_tools/vendor/honnef.co/go/tools \ 45 | dsnet:compress:v0.0.1:dsnet_compress/vendor/github.com/dsnet/compress \ 46 | dustin:go-humanize:v1.0.0:dustin_go_humanize/vendor/github.com/dustin/go-humanize \ 47 | elgris:jsondiff:765b5c24c302:elgris_jsondiff/vendor/github.com/elgris/jsondiff \ 48 | ethereum:go-ethereum:v1.9.10:ethereum_go_ethereum/vendor/github.com/ethereum/go-ethereum \ 49 | facebookgo:atomicfile:2de1f203e7d5:facebookgo_atomicfile/vendor/github.com/facebookgo/atomicfile \ 50 | fatih:color:v1.7.0:fatih_color/vendor/github.com/fatih/color \ 51 | fomichev:secp256k1:00116ff8c62f:fomichev_secp256k1/vendor/github.com/fomichev/secp256k1 \ 52 | frankban:quicktest:v1.4.2:frankban_quicktest/vendor/github.com/frankban/quicktest \ 53 | fsnotify:fsnotify:v1.4.7:fsnotify_fsnotify/vendor/github.com/fsnotify/fsnotify \ 54 | go-check:check:000000000087:go_check_check/vendor/launchpad.net/gocheck \ 55 | go-critic:go-critic:d79a9f0c64db:go_critic_go_critic/vendor/github.com/go-critic/go-critic \ 56 | go-lintpack:lintpack:v0.5.2:go_lintpack_lintpack/vendor/github.com/go-lintpack/lintpack \ 57 | go-ole:go-ole:v1.2.4:go_ole_go_ole/vendor/github.com/go-ole/go-ole \ 58 | go-pg:migrations:v7.1.6:go_pg_migrations_v7/vendor/github.com/go-pg/migrations/v7 \ 59 | go-pg:pg:v9.0.1:go_pg_pg_v9/vendor/github.com/go-pg/pg/v9 \ 60 | go-pg:urlstruct:v0.2.6:go_pg_urlstruct/vendor/github.com/go-pg/urlstruct \ 61 | go-pg:zerochecker:v0.1.1:go_pg_zerochecker/vendor/github.com/go-pg/zerochecker \ 62 | go-redis:redis:v7.0.0-beta.4:go_redis_redis_v7/vendor/github.com/go-redis/redis/v7 \ 63 | go-toolsmith:astcast:v1.0.0:go_toolsmith_astcast/vendor/github.com/go-toolsmith/astcast \ 64 | go-toolsmith:astcopy:v1.0.0:go_toolsmith_astcopy/vendor/github.com/go-toolsmith/astcopy \ 65 | go-toolsmith:astequal:v1.0.0:go_toolsmith_astequal/vendor/github.com/go-toolsmith/astequal \ 66 | go-toolsmith:astfmt:v1.0.0:go_toolsmith_astfmt/vendor/github.com/go-toolsmith/astfmt \ 67 | go-toolsmith:astp:v1.0.0:go_toolsmith_astp/vendor/github.com/go-toolsmith/astp \ 68 | go-toolsmith:strparse:v1.0.0:go_toolsmith_strparse/vendor/github.com/go-toolsmith/strparse \ 69 | go-toolsmith:typep:v1.0.0:go_toolsmith_typep/vendor/github.com/go-toolsmith/typep \ 70 | go-yaml:yaml:v2.2.7:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \ 71 | go4org:go4:94abd6928b1d:go4org_go4/vendor/go4.org \ 72 | gobuffalo:here:v0.6.0:gobuffalo_here/vendor/github.com/gobuffalo/here \ 73 | gobwas:glob:v0.2.3:gobwas_glob/vendor/github.com/gobwas/glob \ 74 | gofrs:flock:5135e617513b:gofrs_flock/vendor/github.com/gofrs/flock \ 75 | gogo:protobuf:v1.3.1:gogo_protobuf/vendor/github.com/gogo/protobuf \ 76 | golang:crypto:8986dd9e96cf:golang_crypto/vendor/golang.org/x/crypto \ 77 | golang:lint:16217165b5de:golang_lint/vendor/golang.org/x/lint \ 78 | golang:net:aa69164e4478:golang_net/vendor/golang.org/x/net \ 79 | golang:protobuf:v1.3.2:golang_protobuf/vendor/github.com/golang/protobuf \ 80 | golang:snappy:v0.0.1:golang_snappy/vendor/github.com/golang/snappy \ 81 | golang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \ 82 | golang:sys:5c8b2ff67527:golang_sys/vendor/golang.org/x/sys \ 83 | golang:text:v0.3.2:golang_text/vendor/golang.org/x/text \ 84 | golang:tools:b9c20aec41a5:golang_tools/vendor/golang.org/x/tools \ 85 | golang:xerrors:a985d3407aa7:golang_xerrors/vendor/golang.org/x/xerrors \ 86 | golangci:check:cfe4005ccda2:golangci_check/vendor/github.com/golangci/check \ 87 | golangci:dupl:3e9179ac440a:golangci_dupl/vendor/github.com/golangci/dupl \ 88 | golangci:errcheck:ef45e06d44b6:golangci_errcheck/vendor/github.com/golangci/errcheck \ 89 | golangci:go-misc:927a3d87b613:golangci_go_misc/vendor/github.com/golangci/go-misc \ 90 | golangci:goconst:041c5f2b40f3:golangci_goconst/vendor/github.com/golangci/goconst \ 91 | golangci:gocyclo:2becd97e67ee:golangci_gocyclo/vendor/github.com/golangci/gocyclo \ 92 | golangci:gofmt:244bba706f1a:golangci_gofmt/vendor/github.com/golangci/gofmt \ 93 | golangci:golangci-lint:v1.21.0:golangci_golangci_lint/vendor/github.com/golangci/golangci-lint \ 94 | golangci:ineffassign:42439a7714cc:golangci_ineffassign/vendor/github.com/golangci/ineffassign \ 95 | golangci:lint-1:297bf364a8e0:golangci_lint_1/vendor/github.com/golangci/lint-1 \ 96 | golangci:maligned:b1d89398deca:golangci_maligned/vendor/github.com/golangci/maligned \ 97 | golangci:misspell:950f5d19e770:golangci_misspell/vendor/github.com/golangci/misspell \ 98 | golangci:prealloc:215b22d4de21:golangci_prealloc/vendor/github.com/golangci/prealloc \ 99 | golangci:revgrep:d9c87f5ffaf0:golangci_revgrep/vendor/github.com/golangci/revgrep \ 100 | golangci:unconvert:28b1c447d1f4:golangci_unconvert/vendor/github.com/golangci/unconvert \ 101 | google:go-genproto:24fa4b261c55:google_go_genproto/vendor/google.golang.org/genproto \ 102 | google:uuid:v1.1.1:google_uuid/vendor/github.com/google/uuid \ 103 | gorilla:websocket:ae1634f6a989:gorilla_websocket/vendor/github.com/gorilla/websocket \ 104 | gostaticanalysis:analysisutil:4088753ea4d3:gostaticanalysis_analysisutil/vendor/github.com/gostaticanalysis/analysisutil \ 105 | gotestyourself:gotestsum:v0.3.4:gotestyourself_gotestsum/vendor/gotest.tools/gotestsum \ 106 | grpc-ecosystem:go-grpc-middleware:v1.1.0:grpc_ecosystem_go_grpc_middleware/vendor/github.com/grpc-ecosystem/go-grpc-middleware \ 107 | grpc:grpc-go:v1.25.1:grpc_grpc_go/vendor/google.golang.org/grpc \ 108 | gxed:go-shellwords:v1.0.3:gxed_go_shellwords/vendor/github.com/gxed/go-shellwords \ 109 | hashicorp:errwrap:v1.0.0:hashicorp_errwrap/vendor/github.com/hashicorp/errwrap \ 110 | hashicorp:go-multierror:v1.0.0:hashicorp_go_multierror/vendor/github.com/hashicorp/go-multierror \ 111 | hashicorp:golang-lru:v0.5.1:hashicorp_golang_lru/vendor/github.com/hashicorp/golang-lru \ 112 | hashicorp:hcl:v1.0.0:hashicorp_hcl/vendor/github.com/hashicorp/hcl \ 113 | huin:goupnp:v1.0.0:huin_goupnp/vendor/github.com/huin/goupnp \ 114 | inconshreveable:mousetrap:v1.0.0:inconshreveable_mousetrap/vendor/github.com/inconshreveable/mousetrap \ 115 | ipfs:bbloom:v0.0.1:ipfs_bbloom/vendor/github.com/ipfs/bbloom \ 116 | ipfs:dir-index-html:v1.0.3:ipfs_dir_index_html/vendor/github.com/ipfs/dir-index-html \ 117 | ipfs:go-bitswap:v0.1.6:ipfs_go_bitswap/vendor/github.com/ipfs/go-bitswap \ 118 | ipfs:go-block-format:v0.0.2:ipfs_go_block_format/vendor/github.com/ipfs/go-block-format \ 119 | ipfs:go-blockservice:v0.1.1:ipfs_go_blockservice/vendor/github.com/ipfs/go-blockservice \ 120 | ipfs:go-cidutil:v0.0.2:ipfs_go_cidutil/vendor/github.com/ipfs/go-cidutil \ 121 | ipfs:go-datastore:v0.0.5:ipfs_go_datastore/vendor/github.com/ipfs/go-datastore \ 122 | ipfs:go-detect-race:v0.0.1:ipfs_go_detect_race/vendor/github.com/ipfs/go-detect-race \ 123 | ipfs:go-ds-badger:v0.0.5:ipfs_go_ds_badger/vendor/github.com/ipfs/go-ds-badger \ 124 | ipfs:go-ds-flatfs:v0.0.2:ipfs_go_ds_flatfs/vendor/github.com/ipfs/go-ds-flatfs \ 125 | ipfs:go-ds-leveldb:v0.0.2:ipfs_go_ds_leveldb/vendor/github.com/ipfs/go-ds-leveldb \ 126 | ipfs:go-ds-measure:v0.0.1:ipfs_go_ds_measure/vendor/github.com/ipfs/go-ds-measure \ 127 | ipfs:go-filestore:v0.0.2:ipfs_go_filestore/vendor/github.com/ipfs/go-filestore \ 128 | ipfs:go-fs-lock:v0.0.1:ipfs_go_fs_lock/vendor/github.com/ipfs/go-fs-lock \ 129 | ipfs:go-ipfs-blockstore:v0.0.1:ipfs_go_ipfs_blockstore/vendor/github.com/ipfs/go-ipfs-blockstore \ 130 | ipfs:go-ipfs-config:v0.0.6:ipfs_go_ipfs_config/vendor/github.com/ipfs/go-ipfs-config \ 131 | ipfs:go-ipfs-delay:v0.0.1:ipfs_go_ipfs_delay/vendor/github.com/ipfs/go-ipfs-delay \ 132 | ipfs:go-ipfs-ds-help:v0.0.1:ipfs_go_ipfs_ds_help/vendor/github.com/ipfs/go-ipfs-ds-help \ 133 | ipfs:go-ipfs-exchange-interface:v0.0.1:ipfs_go_ipfs_exchange_interface/vendor/github.com/ipfs/go-ipfs-exchange-interface \ 134 | ipfs:go-ipfs-exchange-offline:v0.0.1:ipfs_go_ipfs_exchange_offline/vendor/github.com/ipfs/go-ipfs-exchange-offline \ 135 | ipfs:go-ipfs-files:v0.0.3:ipfs_go_ipfs_files/vendor/github.com/ipfs/go-ipfs-files \ 136 | ipfs:go-ipfs-posinfo:v0.0.1:ipfs_go_ipfs_posinfo/vendor/github.com/ipfs/go-ipfs-posinfo \ 137 | ipfs:go-ipfs-pq:v0.0.1:ipfs_go_ipfs_pq/vendor/github.com/ipfs/go-ipfs-pq \ 138 | ipfs:go-ipfs-provider:v0.2.1:ipfs_go_ipfs_provider/vendor/github.com/ipfs/go-ipfs-provider \ 139 | ipfs:go-ipfs-routing:v0.1.0:ipfs_go_ipfs_routing/vendor/github.com/ipfs/go-ipfs-routing \ 140 | ipfs:go-ipfs-util:v0.0.1:ipfs_go_ipfs_util/vendor/github.com/ipfs/go-ipfs-util \ 141 | ipfs:go-ipld-cbor:v0.0.2:ipfs_go_ipld_cbor/vendor/github.com/ipfs/go-ipld-cbor \ 142 | ipfs:go-ipld-git:v0.0.2:ipfs_go_ipld_git/vendor/github.com/ipfs/go-ipld-git \ 143 | ipfs:go-ipns:v0.0.1:ipfs_go_ipns/vendor/github.com/ipfs/go-ipns \ 144 | ipfs:go-log:v0.0.1:ipfs_go_log/vendor/github.com/ipfs/go-log \ 145 | ipfs:go-merkledag:v0.2.3:ipfs_go_merkledag/vendor/github.com/ipfs/go-merkledag \ 146 | ipfs:go-metrics-interface:v0.0.1:ipfs_go_metrics_interface/vendor/github.com/ipfs/go-metrics-interface \ 147 | ipfs:go-metrics-prometheus:v0.0.2:ipfs_go_metrics_prometheus/vendor/github.com/ipfs/go-metrics-prometheus \ 148 | ipfs:go-path:v0.0.7:ipfs_go_path/vendor/github.com/ipfs/go-path \ 149 | ipfs:go-peertaskqueue:v0.1.1:ipfs_go_peertaskqueue/vendor/github.com/ipfs/go-peertaskqueue \ 150 | ipfs:go-todocounter:v0.0.1:ipfs_go_todocounter/vendor/github.com/ipfs/go-todocounter \ 151 | ipfs:go-verifcid:v0.0.1:ipfs_go_verifcid/vendor/github.com/ipfs/go-verifcid \ 152 | ipfs:hang-fds:v0.0.1:ipfs_hang_fds/vendor/github.com/ipfs/hang-fds \ 153 | ipfs:iptb-plugins:v0.1.0:ipfs_iptb_plugins/vendor/github.com/ipfs/iptb-plugins \ 154 | ipfs:iptb:v1.4.0:ipfs_iptb/vendor/github.com/ipfs/iptb \ 155 | jackpal:gateway:v1.0.5:jackpal_gateway/vendor/github.com/jackpal/gateway \ 156 | jackpal:go-nat-pmp:1fa385a6f458:jackpal_go_nat_pmp/vendor/github.com/jackpal/go-nat-pmp \ 157 | jbenet:go-is-domain:v1.0.2:jbenet_go_is_domain/vendor/github.com/jbenet/go-is-domain \ 158 | jbenet:go-random-files:31b3f20ebded:jbenet_go_random_files/vendor/github.com/jbenet/go-random-files \ 159 | jbenet:go-random:123a90aedc0c:jbenet_go_random/vendor/github.com/jbenet/go-random \ 160 | jbenet:go-temp-err-catcher:aac704a3f4f2:jbenet_go_temp_err_catcher/vendor/github.com/jbenet/go-temp-err-catcher \ 161 | jbenet:goprocess:v0.1.3:jbenet_goprocess/vendor/github.com/jbenet/goprocess \ 162 | jinzhu:inflection:v1.0.0:jinzhu_inflection/vendor/github.com/jinzhu/inflection \ 163 | jonboulle:clockwork:v0.1.0:jonboulle_clockwork/vendor/github.com/jonboulle/clockwork \ 164 | json-iterator:go:v1.1.6:json_iterator_go/vendor/github.com/json-iterator/go \ 165 | kisielk:gotool:v1.0.0:kisielk_gotool/vendor/github.com/kisielk/gotool \ 166 | klauspost:cpuid:v1.2.1:klauspost_cpuid/vendor/github.com/klauspost/cpuid \ 167 | klauspost:reedsolomon:v1.9.2:klauspost_reedsolomon/vendor/github.com/klauspost/reedsolomon \ 168 | konsorten:go-windows-terminal-sequences:v1.0.2:konsorten_go_windows_terminal_sequences/vendor/github.com/konsorten/go-windows-terminal-sequences \ 169 | koron:go-ssdp:4a0ed625a78b:koron_go_ssdp/vendor/github.com/koron/go-ssdp \ 170 | libp2p:go-addr-util:v0.0.1:libp2p_go_addr_util/vendor/github.com/libp2p/go-addr-util \ 171 | libp2p:go-buffer-pool:v0.0.2:libp2p_go_buffer_pool/vendor/github.com/libp2p/go-buffer-pool \ 172 | libp2p:go-conn-security-multistream:v0.1.0:libp2p_go_conn_security_multistream/vendor/github.com/libp2p/go-conn-security-multistream \ 173 | libp2p:go-eventbus:v0.0.3:libp2p_go_eventbus/vendor/github.com/libp2p/go-eventbus \ 174 | libp2p:go-flow-metrics:v0.0.1:libp2p_go_flow_metrics/vendor/github.com/libp2p/go-flow-metrics \ 175 | libp2p:go-libp2p-autonat-svc:v0.1.0:libp2p_go_libp2p_autonat_svc/vendor/github.com/libp2p/go-libp2p-autonat-svc \ 176 | libp2p:go-libp2p-autonat:v0.1.0:libp2p_go_libp2p_autonat/vendor/github.com/libp2p/go-libp2p-autonat \ 177 | libp2p:go-libp2p-circuit:v0.1.0:libp2p_go_libp2p_circuit/vendor/github.com/libp2p/go-libp2p-circuit \ 178 | libp2p:go-libp2p-connmgr:v0.1.0:libp2p_go_libp2p_connmgr/vendor/github.com/libp2p/go-libp2p-connmgr \ 179 | libp2p:go-libp2p-crypto:v0.1.0:libp2p_go_libp2p_crypto/vendor/github.com/libp2p/go-libp2p-crypto \ 180 | libp2p:go-libp2p-discovery:v0.1.0:libp2p_go_libp2p_discovery/vendor/github.com/libp2p/go-libp2p-discovery \ 181 | libp2p:go-libp2p-gostream:v0.1.1:libp2p_go_libp2p_gostream/vendor/github.com/libp2p/go-libp2p-gostream \ 182 | libp2p:go-libp2p-http:v0.1.2:libp2p_go_libp2p_http/vendor/github.com/libp2p/go-libp2p-http \ 183 | libp2p:go-libp2p-kad-dht:v0.1.1:libp2p_go_libp2p_kad_dht/vendor/github.com/libp2p/go-libp2p-kad-dht \ 184 | libp2p:go-libp2p-kbucket:v0.2.0:libp2p_go_libp2p_kbucket/vendor/github.com/libp2p/go-libp2p-kbucket \ 185 | libp2p:go-libp2p-loggables:v0.1.0:libp2p_go_libp2p_loggables/vendor/github.com/libp2p/go-libp2p-loggables \ 186 | libp2p:go-libp2p-metrics:v0.0.1:libp2p_go_libp2p_metrics/vendor/github.com/libp2p/go-libp2p-metrics \ 187 | libp2p:go-libp2p-mplex:v0.2.1:libp2p_go_libp2p_mplex/vendor/github.com/libp2p/go-libp2p-mplex \ 188 | libp2p:go-libp2p-nat:v0.0.4:libp2p_go_libp2p_nat/vendor/github.com/libp2p/go-libp2p-nat \ 189 | libp2p:go-libp2p-netutil:v0.1.0:libp2p_go_libp2p_netutil/vendor/github.com/libp2p/go-libp2p-netutil \ 190 | libp2p:go-libp2p-peer:v0.2.0:libp2p_go_libp2p_peer/vendor/github.com/libp2p/go-libp2p-peer \ 191 | libp2p:go-libp2p-peerstore:cfa9bb890c1a:libp2p_go_libp2p_peerstore/vendor/github.com/libp2p/go-libp2p-peerstore \ 192 | libp2p:go-libp2p-pnet:v0.1.0:libp2p_go_libp2p_pnet/vendor/github.com/libp2p/go-libp2p-pnet \ 193 | libp2p:go-libp2p-protocol:v0.1.0:libp2p_go_libp2p_protocol/vendor/github.com/libp2p/go-libp2p-protocol \ 194 | libp2p:go-libp2p-pubsub-router:v0.1.0:libp2p_go_libp2p_pubsub_router/vendor/github.com/libp2p/go-libp2p-pubsub-router \ 195 | libp2p:go-libp2p-pubsub:v0.1.0:libp2p_go_libp2p_pubsub/vendor/github.com/libp2p/go-libp2p-pubsub \ 196 | libp2p:go-libp2p-quic-transport:v0.1.1:libp2p_go_libp2p_quic_transport/vendor/github.com/libp2p/go-libp2p-quic-transport \ 197 | libp2p:go-libp2p-record:v0.1.0:libp2p_go_libp2p_record/vendor/github.com/libp2p/go-libp2p-record \ 198 | libp2p:go-libp2p-routing-helpers:v0.1.0:libp2p_go_libp2p_routing_helpers/vendor/github.com/libp2p/go-libp2p-routing-helpers \ 199 | libp2p:go-libp2p-routing:v0.1.0:libp2p_go_libp2p_routing/vendor/github.com/libp2p/go-libp2p-routing \ 200 | libp2p:go-libp2p-secio:v0.1.0:libp2p_go_libp2p_secio/vendor/github.com/libp2p/go-libp2p-secio \ 201 | libp2p:go-libp2p-swarm:v0.1.1:libp2p_go_libp2p_swarm/vendor/github.com/libp2p/go-libp2p-swarm \ 202 | libp2p:go-libp2p-testing:v0.0.4:libp2p_go_libp2p_testing/vendor/github.com/libp2p/go-libp2p-testing \ 203 | libp2p:go-libp2p-tls:v0.1.0:libp2p_go_libp2p_tls/vendor/github.com/libp2p/go-libp2p-tls \ 204 | libp2p:go-libp2p-transport-upgrader:v0.1.1:libp2p_go_libp2p_transport_upgrader/vendor/github.com/libp2p/go-libp2p-transport-upgrader \ 205 | libp2p:go-libp2p-yamux:v0.2.1:libp2p_go_libp2p_yamux/vendor/github.com/libp2p/go-libp2p-yamux \ 206 | libp2p:go-libp2p:v0.2.0:libp2p_go_libp2p/vendor/github.com/libp2p/go-libp2p \ 207 | libp2p:go-maddr-filter:v0.0.5:libp2p_go_maddr_filter/vendor/github.com/libp2p/go-maddr-filter \ 208 | libp2p:go-mplex:v0.1.0:libp2p_go_mplex/vendor/github.com/libp2p/go-mplex \ 209 | libp2p:go-msgio:v0.0.4:libp2p_go_msgio/vendor/github.com/libp2p/go-msgio \ 210 | libp2p:go-nat:v0.0.3:libp2p_go_nat/vendor/github.com/libp2p/go-nat \ 211 | libp2p:go-reuseport-transport:v0.0.2:libp2p_go_reuseport_transport/vendor/github.com/libp2p/go-reuseport-transport \ 212 | libp2p:go-reuseport:v0.0.1:libp2p_go_reuseport/vendor/github.com/libp2p/go-reuseport \ 213 | libp2p:go-stream-muxer-multistream:v0.2.0:libp2p_go_stream_muxer_multistream/vendor/github.com/libp2p/go-stream-muxer-multistream \ 214 | libp2p:go-tcp-transport:v0.1.0:libp2p_go_tcp_transport/vendor/github.com/libp2p/go-tcp-transport \ 215 | libp2p:go-testutil:v0.1.0:libp2p_go_testutil/vendor/github.com/libp2p/go-testutil \ 216 | libp2p:go-ws-transport:v0.1.0:libp2p_go_ws_transport/vendor/github.com/libp2p/go-ws-transport \ 217 | libp2p:go-yamux:v1.2.3:libp2p_go_yamux/vendor/github.com/libp2p/go-yamux \ 218 | looplab:fsm:v0.1.0:looplab_fsm/vendor/github.com/looplab/fsm \ 219 | lucas-clemente:quic-go:v0.11.2:lucas_clemente_quic_go/vendor/github.com/lucas-clemente/quic-go \ 220 | magiconair:properties:v1.8.0:magiconair_properties/vendor/github.com/magiconair/properties \ 221 | markbates:pkger:v0.15.1:markbates_pkger/vendor/github.com/markbates/pkger \ 222 | marten-seemann:qtls:v0.2.3:marten_seemann_qtls/vendor/github.com/marten-seemann/qtls \ 223 | matoous:godox:5d6d842e92eb:matoous_godox/vendor/github.com/matoous/godox \ 224 | mattn:go-colorable:v0.1.4:mattn_go_colorable/vendor/github.com/mattn/go-colorable \ 225 | mattn:go-isatty:v0.0.8:mattn_go_isatty/vendor/github.com/mattn/go-isatty \ 226 | mattn:go-runewidth:v0.0.4:mattn_go_runewidth/vendor/github.com/mattn/go-runewidth \ 227 | matttproud:golang_protobuf_extensions:v1.0.1:matttproud_golang_protobuf_extensions/vendor/github.com/matttproud/golang_protobuf_extensions \ 228 | mgutz:ansi:9520e82c474b:mgutz_ansi/vendor/github.com/mgutz/ansi \ 229 | mholt:archiver:v3.1.1:mholt_archiver/vendor/github.com/mholt/archiver \ 230 | miekg:dns:v1.1.12:miekg_dns/vendor/github.com/miekg/dns \ 231 | minio:blake2b-simd:3f5f724cb5b1:minio_blake2b_simd/vendor/github.com/minio/blake2b-simd \ 232 | minio:sha256-simd:v0.1.0:minio_sha256_simd/vendor/github.com/minio/sha256-simd \ 233 | mitchellh:go-homedir:v1.1.0:mitchellh_go_homedir/vendor/github.com/mitchellh/go-homedir \ 234 | mitchellh:mapstructure:v1.1.2:mitchellh_mapstructure/vendor/github.com/mitchellh/mapstructure \ 235 | modern-go:concurrent:bacd9c7ef1dd:modern_go_concurrent/vendor/github.com/modern-go/concurrent \ 236 | modern-go:reflect2:v1.0.1:modern_go_reflect2/vendor/github.com/modern-go/reflect2 \ 237 | mr-tron:base58:v1.1.2:mr_tron_base58/vendor/github.com/mr-tron/base58 \ 238 | multiformats:go-base32:v0.0.3:multiformats_go_base32/vendor/github.com/multiformats/go-base32 \ 239 | multiformats:go-multiaddr-dns:v0.0.3:multiformats_go_multiaddr_dns/vendor/github.com/multiformats/go-multiaddr-dns \ 240 | multiformats:go-multiaddr-fmt:v0.0.1:multiformats_go_multiaddr_fmt/vendor/github.com/multiformats/go-multiaddr-fmt \ 241 | multiformats:go-multiaddr-net:v0.0.1:multiformats_go_multiaddr_net/vendor/github.com/multiformats/go-multiaddr-net \ 242 | multiformats:go-multiaddr:v0.0.4:multiformats_go_multiaddr/vendor/github.com/multiformats/go-multiaddr \ 243 | multiformats:go-multibase:v0.0.1:multiformats_go_multibase/vendor/github.com/multiformats/go-multibase \ 244 | multiformats:go-multihash:v0.0.5:multiformats_go_multihash/vendor/github.com/multiformats/go-multihash \ 245 | multiformats:go-multistream:v0.1.0:multiformats_go_multistream/vendor/github.com/multiformats/go-multistream \ 246 | mvdan:interfacer:c20040233aed:mvdan_interfacer/vendor/mvdan.cc/interfacer \ 247 | mvdan:lint:adc824a0674b:mvdan_lint/vendor/mvdan.cc/lint \ 248 | mvdan:unparam:d51796306d8f:mvdan_unparam/vendor/mvdan.cc/unparam \ 249 | natefinch:lumberjack:v2.0.0:natefinch_lumberjack/vendor/github.com/natefinch/lumberjack \ 250 | natefinch:lumberjack:v2.0.0:natefinch_lumberjack_1/vendor/gopkg.in/natefinch/lumberjack.v2 \ 251 | nbutton23:zxcvbn-go:ae427f1e4c1d:nbutton23_zxcvbn_go/vendor/github.com/nbutton23/zxcvbn-go \ 252 | nwaples:rardecode:v1.0.0:nwaples_rardecode/vendor/github.com/nwaples/rardecode \ 253 | opentracing:opentracing-go:v1.1.0:opentracing_opentracing_go/vendor/github.com/opentracing/opentracing-go \ 254 | orcaman:concurrent-map:8c72a8bb44f6:orcaman_concurrent_map/vendor/github.com/orcaman/concurrent-map \ 255 | pelletier:go-toml:v1.2.0:pelletier_go_toml/vendor/github.com/pelletier/go-toml \ 256 | pierrec:lz4:v2.2.6:pierrec_lz4/vendor/github.com/pierrec/lz4 \ 257 | pkg:errors:v0.8.1:pkg_errors/vendor/github.com/pkg/errors \ 258 | pmezard:go-difflib:v1.0.0:pmezard_go_difflib/vendor/github.com/pmezard/go-difflib \ 259 | polydawn:refmt:01bf1e26dd14:polydawn_refmt/vendor/github.com/polydawn/refmt \ 260 | prometheus:client_golang:v0.9.3:prometheus_client_golang/vendor/github.com/prometheus/client_golang \ 261 | prometheus:client_model:14fe0d1b01d4:prometheus_client_model/vendor/github.com/prometheus/client_model \ 262 | prometheus:common:v0.4.0:prometheus_common/vendor/github.com/prometheus/common \ 263 | prometheus:procfs:9935e8e0588d:prometheus_procfs/vendor/github.com/prometheus/procfs \ 264 | rs:cors:v1.6.0:rs_cors/vendor/github.com/rs/cors \ 265 | russross:blackfriday:v2.0.1:russross_blackfriday_v2/vendor/github.com/russross/blackfriday/v2 \ 266 | securego:gosec:e680875ea14d:securego_gosec/vendor/github.com/securego/gosec \ 267 | shirou:gopsutil:v2.20.3:shirou_gopsutil/vendor/github.com/shirou/gopsutil \ 268 | shurcooL:sanitized_anchor_name:v1.0.0:shurcool_sanitized_anchor_name/vendor/github.com/shurcooL/sanitized_anchor_name \ 269 | sirupsen:logrus:v1.4.2:sirupsen_logrus/vendor/github.com/sirupsen/logrus \ 270 | sourcegraph:go-diff:v0.5.1:sourcegraph_go_diff/vendor/github.com/sourcegraph/go-diff \ 271 | spacemonkeygo:openssl:c2dcc5cca94a:spacemonkeygo_openssl/vendor/github.com/spacemonkeygo/openssl \ 272 | spacemonkeygo:spacelog:2296661a0572:spacemonkeygo_spacelog/vendor/github.com/spacemonkeygo/spacelog \ 273 | spaolacci:murmur3:v1.1.0:spaolacci_murmur3/vendor/github.com/spaolacci/murmur3 \ 274 | spf13:afero:v1.1.2:spf13_afero/vendor/github.com/spf13/afero \ 275 | spf13:cast:v1.3.0:spf13_cast/vendor/github.com/spf13/cast \ 276 | spf13:cobra:v0.0.5:spf13_cobra/vendor/github.com/spf13/cobra \ 277 | spf13:jwalterweatherman:v1.0.0:spf13_jwalterweatherman/vendor/github.com/spf13/jwalterweatherman \ 278 | spf13:pflag:v1.0.5:spf13_pflag/vendor/github.com/spf13/pflag \ 279 | spf13:viper:v1.4.0:spf13_viper/vendor/github.com/spf13/viper \ 280 | sqs:pbtypes:d3ebe8f20ae4:sqs_pbtypes/vendor/sourcegraph.com/sqs/pbtypes \ 281 | stretchr:objx:v0.2.0:stretchr_objx/vendor/github.com/stretchr/objx \ 282 | stretchr:testify:v1.5.1:stretchr_testify/vendor/github.com/stretchr/testify \ 283 | syndtr:goleveldb:758128399b1d:syndtr_goleveldb/vendor/github.com/syndtr/goleveldb \ 284 | texttheater:golang-levenshtein:d188e65d659e:texttheater_golang_levenshtein/vendor/github.com/texttheater/golang-levenshtein \ 285 | timakin:bodyclose:f7f2e9bca95e:timakin_bodyclose/vendor/github.com/timakin/bodyclose \ 286 | tron-us:go-btfs-common:v0.3.7:tron_us_go_btfs_common/vendor/github.com/tron-us/go-btfs-common \ 287 | tron-us:go-common:v2.0.5:tron_us_go_common_v2/vendor/github.com/tron-us/go-common/v2 \ 288 | tron-us:protobuf:v1.3.4:tron_us_protobuf/vendor/github.com/tron-us/protobuf \ 289 | tyler-smith:go-bip32:2c9cfd177564:tyler_smith_go_bip32/vendor/github.com/tyler-smith/go-bip32 \ 290 | tyler-smith:go-bip39:dbb3b84ba2ef:tyler_smith_go_bip39/vendor/github.com/tyler-smith/go-bip39 \ 291 | uber-go:atomic:v1.5.0:uber_go_atomic/vendor/go.uber.org/atomic \ 292 | uber-go:dig:v1.7.0:uber_go_dig/vendor/go.uber.org/dig \ 293 | uber-go:fx:v1.9.0:uber_go_fx/vendor/go.uber.org/fx \ 294 | uber-go:goleak:v0.10.0:uber_go_goleak/vendor/go.uber.org/goleak \ 295 | uber-go:multierr:v1.3.0:uber_go_multierr/vendor/go.uber.org/multierr \ 296 | uber-go:tools:2cfd321de3ee:uber_go_tools/vendor/go.uber.org/tools \ 297 | uber-go:zap:v1.14.0:uber_go_zap/vendor/go.uber.org/zap \ 298 | ulikunitz:xz:v0.5.6:ulikunitz_xz/vendor/github.com/ulikunitz/xz \ 299 | ultraware:funlen:v0.0.2:ultraware_funlen/vendor/github.com/ultraware/funlen \ 300 | ultraware:whitespace:v0.0.4:ultraware_whitespace/vendor/github.com/ultraware/whitespace \ 301 | urfave:cli:v1.22.1:urfave_cli/vendor/github.com/urfave/cli \ 302 | uudashr:gocognit:1655d0de0517:uudashr_gocognit/vendor/github.com/uudashr/gocognit \ 303 | vmihailenco:tagparser:v0.1.0:vmihailenco_tagparser/vendor/github.com/vmihailenco/tagparser \ 304 | whyrusleeping:base32:c30ac30633cc:whyrusleeping_base32/vendor/github.com/whyrusleeping/base32 \ 305 | whyrusleeping:chunker:fe64bd25879f:whyrusleeping_chunker/vendor/github.com/whyrusleeping/chunker \ 306 | whyrusleeping:go-keyspace:5b898ac5add1:whyrusleeping_go_keyspace/vendor/github.com/whyrusleeping/go-keyspace \ 307 | whyrusleeping:go-logging:0457bb6b88fc:whyrusleeping_go_logging/vendor/github.com/whyrusleeping/go-logging \ 308 | whyrusleeping:go-notifier:097c5d47330f:whyrusleeping_go_notifier/vendor/github.com/whyrusleeping/go-notifier \ 309 | whyrusleeping:go-sysinfo:4a357d4b90b1:whyrusleeping_go_sysinfo/vendor/github.com/whyrusleeping/go-sysinfo \ 310 | whyrusleeping:mafmt:v1.2.8:whyrusleeping_mafmt/vendor/github.com/whyrusleeping/mafmt \ 311 | whyrusleeping:mdns:ef14215e6b30:whyrusleeping_mdns/vendor/github.com/whyrusleeping/mdns \ 312 | whyrusleeping:multiaddr-filter:e903e4adabd7:whyrusleeping_multiaddr_filter/vendor/github.com/whyrusleeping/multiaddr-filter \ 313 | whyrusleeping:tar-utils:8c6c8ba81d5c:whyrusleeping_tar_utils/vendor/github.com/whyrusleeping/tar-utils \ 314 | whyrusleeping:timecache:cfcb2f1abfee:whyrusleeping_timecache/vendor/github.com/whyrusleeping/timecache \ 315 | xi2:xz:48954b6210f8:xi2_xz/vendor/github.com/xi2/xz 316 | 317 | post-extract: 318 | @${MKDIR} ${WRKSRC}/vendor/github.com/cmars 319 | @${RLN} ${WRKSRC_factomproject_basen} ${WRKSRC}/vendor/github.com/cmars/basen 320 | -------------------------------------------------------------------------------- /testdata/minio_expected.txt: -------------------------------------------------------------------------------- 1 | GH_TUPLE= \ 2 | Azure:azure-pipeline-go:v0.2.1:azure_azure_pipeline_go/vendor/github.com/Azure/azure-pipeline-go \ 3 | Azure:azure-storage-blob-go:v0.8.0:azure_azure_storage_blob_go/vendor/github.com/Azure/azure-storage-blob-go \ 4 | Shopify:sarama:v1.24.1:shopify_sarama/vendor/github.com/Shopify/sarama \ 5 | StackExchange:wmi:cbe66965904d:stackexchange_wmi/vendor/github.com/StackExchange/wmi \ 6 | alecthomas:participle:v0.2.1:alecthomas_participle/vendor/github.com/alecthomas/participle \ 7 | aliyun:aliyun-oss-go-sdk:86c17b95fcd5:aliyun_aliyun_oss_go_sdk/vendor/github.com/aliyun/aliyun-oss-go-sdk \ 8 | apache:thrift:v0.13.0:apache_thrift/vendor/git.apache.org/thrift.git \ 9 | aws:aws-sdk-go:v1.20.21:aws_aws_sdk_go/vendor/github.com/aws/aws-sdk-go \ 10 | bcicen:jstream:16c1f8af81c2:bcicen_jstream/vendor/github.com/bcicen/jstream \ 11 | beevik:ntp:v0.2.0:beevik_ntp/vendor/github.com/beevik/ntp \ 12 | beorn7:perks:3a771d992973:beorn7_perks/vendor/github.com/beorn7/perks \ 13 | census-instrumentation:opencensus-go:v0.21.0:census_instrumentation_opencensus_go/vendor/go.opencensus.io \ 14 | cespare:xxhash:v2.1.1:cespare_xxhash_v2/vendor/github.com/cespare/xxhash/v2 \ 15 | cheggaaa:pb:v1.0.28:cheggaaa_pb/vendor/github.com/cheggaaa/pb \ 16 | coredns:coredns:v1.4.0:coredns_coredns/vendor/github.com/coredns/coredns \ 17 | coreos:etcd:v3.3.12:coreos_etcd/vendor/github.com/coreos/etcd \ 18 | davecgh:go-spew:v1.1.1:davecgh_go_spew/vendor/github.com/davecgh/go-spew \ 19 | dgrijalva:jwt-go:v3.2.0:dgrijalva_jwt_go/vendor/github.com/dgrijalva/jwt-go \ 20 | djherbis:atime:v1.0.0:djherbis_atime/vendor/github.com/djherbis/atime \ 21 | dustin:go-humanize:v1.0.0:dustin_go_humanize/vendor/github.com/dustin/go-humanize \ 22 | eapache:go-resiliency:v1.2.0:eapache_go_resiliency/vendor/github.com/eapache/go-resiliency \ 23 | eapache:go-xerial-snappy:776d5712da21:eapache_go_xerial_snappy/vendor/github.com/eapache/go-xerial-snappy \ 24 | eapache:queue:v1.1.0:eapache_queue/vendor/github.com/eapache/queue \ 25 | eclipse:paho.mqtt.golang:v1.2.0:eclipse_paho_mqtt_golang/vendor/github.com/eclipse/paho.mqtt.golang \ 26 | elazarl:go-bindata-assetfs:v1.0.0:elazarl_go_bindata_assetfs/vendor/github.com/elazarl/go-bindata-assetfs \ 27 | fatih:color:v1.7.0:fatih_color/vendor/github.com/fatih/color \ 28 | fatih:structs:v1.1.0:fatih_structs/vendor/github.com/fatih/structs \ 29 | go-asn1-ber:asn1-ber:f715ec2f112d:go_asn1_ber_asn1_ber/vendor/gopkg.in/asn1-ber.v1 \ 30 | go-ini:ini:v1.48.0:go_ini_ini/vendor/gopkg.in/ini.v1 \ 31 | go-ldap:ldap:v3.0.3:go_ldap_ldap/vendor/gopkg.in/ldap.v3 \ 32 | go-ole:go-ole:v1.2.4:go_ole_go_ole/vendor/github.com/go-ole/go-ole \ 33 | go-sql-driver:mysql:v1.4.1:go_sql_driver_mysql/vendor/github.com/go-sql-driver/mysql \ 34 | go-yaml:yaml:v2.2.4:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \ 35 | gogo:protobuf:v1.2.1:gogo_protobuf/vendor/github.com/gogo/protobuf \ 36 | golang:appengine:v1.6.0:golang_appengine/vendor/google.golang.org/appengine \ 37 | golang:crypto:497ca9f6d64f:golang_crypto/vendor/golang.org/x/crypto \ 38 | golang:net:d3edc9973b7e:golang_net/vendor/golang.org/x/net \ 39 | golang:oauth2:9f3314589c9a:golang_oauth2/vendor/golang.org/x/oauth2 \ 40 | golang:protobuf:v1.3.2:golang_protobuf/vendor/github.com/golang/protobuf \ 41 | golang:snappy:v0.0.1:golang_snappy/vendor/github.com/golang/snappy \ 42 | golang:sys:85ca7c5b95cd:golang_sys/vendor/golang.org/x/sys \ 43 | golang:text:v0.3.2:golang_text/vendor/golang.org/x/text \ 44 | golang:time:9d24e82272b4:golang_time/vendor/golang.org/x/time \ 45 | golang:tools:31e00f45c22e:golang_tools/vendor/golang.org/x/tools \ 46 | gomodule:redigo:v2.0.0:gomodule_redigo/vendor/github.com/gomodule/redigo \ 47 | google:go-genproto:d00d292a067c:google_go_genproto/vendor/google.golang.org/genproto \ 48 | googleapis:gax-go:v2.0.4:googleapis_gax_go_v2/vendor/github.com/googleapis/gax-go \ 49 | googleapis:google-api-go-client:v0.5.0:googleapis_google_api_go_client/vendor/google.golang.org/api \ 50 | googleapis:google-cloud-go:v0.39.0:googleapis_google_cloud_go/vendor/cloud.google.com/go \ 51 | gorilla:handlers:v1.4.0:gorilla_handlers/vendor/github.com/gorilla/handlers \ 52 | gorilla:mux:v1.7.0:gorilla_mux/vendor/github.com/gorilla/mux \ 53 | gorilla:rpc:v1.2.0:gorilla_rpc/vendor/github.com/gorilla/rpc \ 54 | grpc:grpc-go:v1.22.0:grpc_grpc_go/vendor/google.golang.org/grpc \ 55 | hashicorp:errwrap:v1.0.0:hashicorp_errwrap/vendor/github.com/hashicorp/errwrap \ 56 | hashicorp:go-cleanhttp:v0.5.1:hashicorp_go_cleanhttp/vendor/github.com/hashicorp/go-cleanhttp \ 57 | hashicorp:go-multierror:v1.0.0:hashicorp_go_multierror/vendor/github.com/hashicorp/go-multierror \ 58 | hashicorp:go-retryablehttp:v0.5.4:hashicorp_go_retryablehttp/vendor/github.com/hashicorp/go-retryablehttp \ 59 | hashicorp:go-rootcerts:v1.0.1:hashicorp_go_rootcerts/vendor/github.com/hashicorp/go-rootcerts \ 60 | hashicorp:go-sockaddr:v1.0.2:hashicorp_go_sockaddr/vendor/github.com/hashicorp/go-sockaddr \ 61 | hashicorp:go-uuid:v1.0.1:hashicorp_go_uuid/vendor/github.com/hashicorp/go-uuid \ 62 | hashicorp:golang-lru:v0.5.1:hashicorp_golang_lru/vendor/github.com/hashicorp/golang-lru \ 63 | hashicorp:hcl:v1.0.0:hashicorp_hcl/vendor/github.com/hashicorp/hcl \ 64 | hashicorp:vault:api/v1.0.4:hashicorp_vault_api/vendor/github.com/hashicorp/vault \ 65 | hashicorp:vault:sdk/v0.1.13:hashicorp_vault_sdk \ 66 | inconshreveable:go-update:8152e7eb6ccf:inconshreveable_go_update/vendor/github.com/inconshreveable/go-update \ 67 | jcmturner:aescts:v1.0.1:jcmturner_aescts/vendor/gopkg.in/jcmturner/aescts.v1 \ 68 | jcmturner:dnsutils:v1.0.1:jcmturner_dnsutils/vendor/gopkg.in/jcmturner/dnsutils.v1 \ 69 | jcmturner:gofork:dc7c13fece03:jcmturner_gofork/vendor/github.com/jcmturner/gofork \ 70 | jcmturner:goidentity:v3.0.0:jcmturner_goidentity/vendor/gopkg.in/jcmturner/goidentity.v3 \ 71 | jcmturner:gokrb5:v7.2.3:jcmturner_gokrb5/vendor/gopkg.in/jcmturner/gokrb5.v7 \ 72 | jcmturner:rpc:v1.1.0:jcmturner_rpc/vendor/gopkg.in/jcmturner/rpc.v1 \ 73 | jmespath:go-jmespath:c2b33e8439af:jmespath_go_jmespath/vendor/github.com/jmespath/go-jmespath \ 74 | json-iterator:go:v1.1.9:json_iterator_go/vendor/github.com/json-iterator/go \ 75 | klauspost:compress:v1.10.3:klauspost_compress/vendor/github.com/klauspost/compress \ 76 | klauspost:cpuid:v1.2.2:klauspost_cpuid/vendor/github.com/klauspost/cpuid \ 77 | klauspost:pgzip:v1.2.1:klauspost_pgzip/vendor/github.com/klauspost/pgzip \ 78 | klauspost:readahead:v1.3.1:klauspost_readahead/vendor/github.com/klauspost/readahead \ 79 | klauspost:reedsolomon:v1.9.3:klauspost_reedsolomon/vendor/github.com/klauspost/reedsolomon \ 80 | konsorten:go-windows-terminal-sequences:v1.0.1:konsorten_go_windows_terminal_sequences/vendor/github.com/konsorten/go-windows-terminal-sequences \ 81 | kurin:blazer:8f90a40f8af7:kurin_blazer/vendor/github.com/kurin/blazer \ 82 | lib:pq:v1.1.1:lib_pq/vendor/github.com/lib/pq \ 83 | mailru:easyjson:03f2033d19d5:mailru_easyjson/vendor/github.com/mailru/easyjson \ 84 | mattn:go-colorable:v0.1.1:mattn_go_colorable/vendor/github.com/mattn/go-colorable \ 85 | mattn:go-ieproxy:f9202b1cfdeb:mattn_go_ieproxy/vendor/github.com/mattn/go-ieproxy \ 86 | mattn:go-isatty:v0.0.7:mattn_go_isatty/vendor/github.com/mattn/go-isatty \ 87 | mattn:go-runewidth:v0.0.4:mattn_go_runewidth/vendor/github.com/mattn/go-runewidth \ 88 | matttproud:golang_protobuf_extensions:v1.0.1:matttproud_golang_protobuf_extensions/vendor/github.com/matttproud/golang_protobuf_extensions \ 89 | miekg:dns:v1.1.8:miekg_dns/vendor/github.com/miekg/dns \ 90 | minio:cli:v1.22.0:minio_cli/vendor/github.com/minio/cli \ 91 | minio:highwayhash:v1.0.0:minio_highwayhash/vendor/github.com/minio/highwayhash \ 92 | minio:lsync:v1.0.1:minio_lsync/vendor/github.com/minio/lsync \ 93 | minio:minio-go:v6.0.52:minio_minio_go_v6/vendor/github.com/minio/minio-go/v6 \ 94 | minio:parquet-go:a1e49702e174:minio_parquet_go/vendor/github.com/minio/parquet-go \ 95 | minio:sha256-simd:v0.1.1:minio_sha256_simd/vendor/github.com/minio/sha256-simd \ 96 | minio:simdjson-go:b17fe061ea37:minio_simdjson_go/vendor/github.com/minio/simdjson-go \ 97 | minio:sio:v0.2.0:minio_sio/vendor/github.com/minio/sio \ 98 | mitchellh:go-homedir:v1.1.0:mitchellh_go_homedir/vendor/github.com/mitchellh/go-homedir \ 99 | mitchellh:mapstructure:v1.1.2:mitchellh_mapstructure/vendor/github.com/mitchellh/mapstructure \ 100 | mmcloughlin:avo:6df701fe672f:mmcloughlin_avo/vendor/github.com/mmcloughlin/avo \ 101 | modern-go:concurrent:bacd9c7ef1dd:modern_go_concurrent/vendor/github.com/modern-go/concurrent \ 102 | modern-go:reflect2:v1.0.1:modern_go_reflect2/vendor/github.com/modern-go/reflect2 \ 103 | montanaflynn:stats:v0.5.0:montanaflynn_stats/vendor/github.com/montanaflynn/stats \ 104 | nats-io:jwt:v0.3.2:nats_io_jwt/vendor/github.com/nats-io/jwt \ 105 | nats-io:nats-server:v2.1.2:nats_io_nats_server_v2/vendor/github.com/nats-io/nats-server/v2 \ 106 | nats-io:nats.go:v1.9.1:nats_io_nats_go/vendor/github.com/nats-io/nats.go \ 107 | nats-io:nkeys:v0.1.3:nats_io_nkeys/vendor/github.com/nats-io/nkeys \ 108 | nats-io:nuid:v1.0.1:nats_io_nuid/vendor/github.com/nats-io/nuid \ 109 | nats-io:stan.go:v0.4.5:nats_io_stan_go/vendor/github.com/nats-io/stan.go \ 110 | ncw:directio:v1.0.5:ncw_directio/vendor/github.com/ncw/directio \ 111 | nsqio:go-nsq:v1.0.7:nsqio_go_nsq/vendor/github.com/nsqio/go-nsq \ 112 | olivere:elastic:v5.0.80:olivere_elastic/vendor/gopkg.in/olivere/elastic.v5 \ 113 | philhofer:fwd:v1.0.0:philhofer_fwd/vendor/github.com/philhofer/fwd \ 114 | pierrec:lz4:v2.4.0:pierrec_lz4/vendor/github.com/pierrec/lz4 \ 115 | pkg:errors:v0.8.1:pkg_errors/vendor/github.com/pkg/errors \ 116 | prometheus:client_golang:3c4408c8b829:prometheus_client_golang/vendor/github.com/prometheus/client_golang \ 117 | prometheus:client_model:fd36f4220a90:prometheus_client_model/vendor/github.com/prometheus/client_model \ 118 | prometheus:common:v0.2.0:prometheus_common/vendor/github.com/prometheus/common \ 119 | prometheus:procfs:bf6a532e95b1:prometheus_procfs/vendor/github.com/prometheus/procfs \ 120 | rcrowley:go-metrics:9c2d0518ed81:rcrowley_go_metrics/vendor/github.com/rcrowley/go-metrics \ 121 | rjeczalik:notify:v0.9.2:rjeczalik_notify/vendor/github.com/rjeczalik/notify \ 122 | rs:cors:v1.6.0:rs_cors/vendor/github.com/rs/cors \ 123 | ryanuber:go-glob:v1.0.0:ryanuber_go_glob/vendor/github.com/ryanuber/go-glob \ 124 | secure-io:sio-go:v0.3.0:secure_io_sio_go/vendor/github.com/secure-io/sio-go \ 125 | shirou:gopsutil:53cec6b37e6a:shirou_gopsutil/vendor/github.com/shirou/gopsutil \ 126 | sirupsen:logrus:v1.5.0:sirupsen_logrus/vendor/github.com/sirupsen/logrus \ 127 | skyrings:skyring-common:d1c0bb1cbd5e:skyrings_skyring_common/vendor/github.com/skyrings/skyring-common \ 128 | square:go-jose:v2.3.1:square_go_jose/vendor/gopkg.in/square/go-jose.v2 \ 129 | streadway:amqp:75d898a42a94:streadway_amqp/vendor/github.com/streadway/amqp \ 130 | tidwall:gjson:v1.3.5:tidwall_gjson/vendor/github.com/tidwall/gjson \ 131 | tidwall:match:v1.0.1:tidwall_match/vendor/github.com/tidwall/match \ 132 | tidwall:pretty:v1.0.0:tidwall_pretty/vendor/github.com/tidwall/pretty \ 133 | tidwall:sjson:v1.0.4:tidwall_sjson/vendor/github.com/tidwall/sjson \ 134 | tinylib:msgp:v1.1.1:tinylib_msgp/vendor/github.com/tinylib/msgp \ 135 | uber-go:atomic:v1.3.2:uber_go_atomic/vendor/go.uber.org/atomic \ 136 | valyala:tcplisten:ceec8f93295a:valyala_tcplisten/vendor/github.com/valyala/tcplisten \ 137 | xdg:scram:7eeb5667e42c:xdg_scram/vendor/github.com/xdg/scram \ 138 | xdg:stringprep:v1.0.0:xdg_stringprep/vendor/github.com/xdg/stringprep 139 | 140 | post-extract: 141 | @${RM} -r ${WRKSRC}/vendor/github.com/hashicorp/vault/sdk 142 | @${RLN} ${WRKSRC_hashicorp_vault_sdk}/sdk ${WRKSRC}/vendor/github.com/hashicorp/vault/sdk 143 | -------------------------------------------------------------------------------- /testdata/minio_modules.txt: -------------------------------------------------------------------------------- 1 | # cloud.google.com/go v0.39.0 2 | cloud.google.com/go/compute/metadata 3 | cloud.google.com/go/iam 4 | cloud.google.com/go/internal 5 | cloud.google.com/go/internal/optional 6 | cloud.google.com/go/internal/trace 7 | cloud.google.com/go/internal/version 8 | cloud.google.com/go/storage 9 | # git.apache.org/thrift.git v0.13.0 10 | git.apache.org/thrift.git/lib/go/thrift 11 | # github.com/Azure/azure-pipeline-go v0.2.1 12 | github.com/Azure/azure-pipeline-go/pipeline 13 | # github.com/Azure/azure-storage-blob-go v0.8.0 14 | github.com/Azure/azure-storage-blob-go/azblob 15 | # github.com/Shopify/sarama v1.24.1 16 | github.com/Shopify/sarama 17 | github.com/Shopify/sarama/tools/tls 18 | # github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d 19 | github.com/StackExchange/wmi 20 | # github.com/alecthomas/participle v0.2.1 21 | github.com/alecthomas/participle 22 | github.com/alecthomas/participle/lexer 23 | # github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5 24 | github.com/aliyun/aliyun-oss-go-sdk/oss 25 | # github.com/aws/aws-sdk-go v1.20.21 26 | github.com/aws/aws-sdk-go/aws 27 | github.com/aws/aws-sdk-go/aws/awserr 28 | github.com/aws/aws-sdk-go/aws/awsutil 29 | github.com/aws/aws-sdk-go/aws/client 30 | github.com/aws/aws-sdk-go/aws/client/metadata 31 | github.com/aws/aws-sdk-go/aws/corehandlers 32 | github.com/aws/aws-sdk-go/aws/credentials 33 | github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds 34 | github.com/aws/aws-sdk-go/aws/credentials/endpointcreds 35 | github.com/aws/aws-sdk-go/aws/credentials/processcreds 36 | github.com/aws/aws-sdk-go/aws/credentials/stscreds 37 | github.com/aws/aws-sdk-go/aws/csm 38 | github.com/aws/aws-sdk-go/aws/defaults 39 | github.com/aws/aws-sdk-go/aws/ec2metadata 40 | github.com/aws/aws-sdk-go/aws/endpoints 41 | github.com/aws/aws-sdk-go/aws/request 42 | github.com/aws/aws-sdk-go/aws/session 43 | github.com/aws/aws-sdk-go/aws/signer/v4 44 | github.com/aws/aws-sdk-go/internal/ini 45 | github.com/aws/aws-sdk-go/internal/s3err 46 | github.com/aws/aws-sdk-go/internal/sdkio 47 | github.com/aws/aws-sdk-go/internal/sdkrand 48 | github.com/aws/aws-sdk-go/internal/sdkuri 49 | github.com/aws/aws-sdk-go/internal/shareddefaults 50 | github.com/aws/aws-sdk-go/private/protocol 51 | github.com/aws/aws-sdk-go/private/protocol/eventstream 52 | github.com/aws/aws-sdk-go/private/protocol/eventstream/eventstreamapi 53 | github.com/aws/aws-sdk-go/private/protocol/json/jsonutil 54 | github.com/aws/aws-sdk-go/private/protocol/query 55 | github.com/aws/aws-sdk-go/private/protocol/query/queryutil 56 | github.com/aws/aws-sdk-go/private/protocol/rest 57 | github.com/aws/aws-sdk-go/private/protocol/restxml 58 | github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil 59 | github.com/aws/aws-sdk-go/service/s3 60 | github.com/aws/aws-sdk-go/service/sts 61 | # github.com/bcicen/jstream v0.0.0-20190220045926-16c1f8af81c2 62 | github.com/bcicen/jstream 63 | # github.com/beevik/ntp v0.2.0 64 | github.com/beevik/ntp 65 | # github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 66 | github.com/beorn7/perks/quantile 67 | # github.com/cespare/xxhash/v2 v2.1.1 68 | github.com/cespare/xxhash/v2 69 | # github.com/cheggaaa/pb v1.0.28 70 | github.com/cheggaaa/pb 71 | # github.com/coredns/coredns v1.4.0 72 | github.com/coredns/coredns/plugin/etcd/msg 73 | github.com/coredns/coredns/plugin/pkg/dnsutil 74 | github.com/coredns/coredns/plugin/pkg/response 75 | # github.com/coreos/etcd v3.3.12+incompatible 76 | github.com/coreos/etcd/auth/authpb 77 | github.com/coreos/etcd/clientv3 78 | github.com/coreos/etcd/clientv3/namespace 79 | github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes 80 | github.com/coreos/etcd/etcdserver/etcdserverpb 81 | github.com/coreos/etcd/mvcc/mvccpb 82 | github.com/coreos/etcd/pkg/types 83 | # github.com/davecgh/go-spew v1.1.1 84 | github.com/davecgh/go-spew/spew 85 | # github.com/dgrijalva/jwt-go v3.2.0+incompatible 86 | github.com/dgrijalva/jwt-go 87 | github.com/dgrijalva/jwt-go/request 88 | # github.com/djherbis/atime v1.0.0 89 | github.com/djherbis/atime 90 | # github.com/dustin/go-humanize v1.0.0 91 | github.com/dustin/go-humanize 92 | # github.com/eapache/go-resiliency v1.2.0 93 | github.com/eapache/go-resiliency/breaker 94 | # github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 95 | github.com/eapache/go-xerial-snappy 96 | # github.com/eapache/queue v1.1.0 97 | github.com/eapache/queue 98 | # github.com/eclipse/paho.mqtt.golang v1.2.0 99 | github.com/eclipse/paho.mqtt.golang 100 | github.com/eclipse/paho.mqtt.golang/packets 101 | # github.com/elazarl/go-bindata-assetfs v1.0.0 102 | github.com/elazarl/go-bindata-assetfs 103 | # github.com/fatih/color v1.7.0 104 | github.com/fatih/color 105 | # github.com/fatih/structs v1.1.0 106 | github.com/fatih/structs 107 | # github.com/go-ole/go-ole v1.2.4 108 | github.com/go-ole/go-ole 109 | github.com/go-ole/go-ole/oleutil 110 | # github.com/go-sql-driver/mysql v1.4.1 111 | github.com/go-sql-driver/mysql 112 | # github.com/gogo/protobuf v1.2.1 113 | github.com/gogo/protobuf/gogoproto 114 | github.com/gogo/protobuf/proto 115 | github.com/gogo/protobuf/protoc-gen-gogo/descriptor 116 | # github.com/golang/protobuf v1.3.2 117 | github.com/golang/protobuf/proto 118 | github.com/golang/protobuf/protoc-gen-go/descriptor 119 | github.com/golang/protobuf/ptypes 120 | github.com/golang/protobuf/ptypes/any 121 | github.com/golang/protobuf/ptypes/duration 122 | github.com/golang/protobuf/ptypes/timestamp 123 | # github.com/golang/snappy v0.0.1 124 | github.com/golang/snappy 125 | # github.com/gomodule/redigo v2.0.0+incompatible 126 | github.com/gomodule/redigo/internal 127 | github.com/gomodule/redigo/redis 128 | # github.com/googleapis/gax-go/v2 v2.0.4 129 | github.com/googleapis/gax-go/v2 130 | # github.com/gorilla/handlers v1.4.0 131 | github.com/gorilla/handlers 132 | # github.com/gorilla/mux v1.7.0 133 | github.com/gorilla/mux 134 | # github.com/gorilla/rpc v1.2.0 135 | github.com/gorilla/rpc/v2 136 | github.com/gorilla/rpc/v2/json2 137 | # github.com/hashicorp/errwrap v1.0.0 138 | github.com/hashicorp/errwrap 139 | # github.com/hashicorp/go-cleanhttp v0.5.1 140 | github.com/hashicorp/go-cleanhttp 141 | # github.com/hashicorp/go-multierror v1.0.0 142 | github.com/hashicorp/go-multierror 143 | # github.com/hashicorp/go-retryablehttp v0.5.4 144 | github.com/hashicorp/go-retryablehttp 145 | # github.com/hashicorp/go-rootcerts v1.0.1 146 | github.com/hashicorp/go-rootcerts 147 | # github.com/hashicorp/go-sockaddr v1.0.2 148 | github.com/hashicorp/go-sockaddr 149 | # github.com/hashicorp/go-uuid v1.0.1 150 | github.com/hashicorp/go-uuid 151 | # github.com/hashicorp/golang-lru v0.5.1 152 | github.com/hashicorp/golang-lru/simplelru 153 | # github.com/hashicorp/hcl v1.0.0 154 | github.com/hashicorp/hcl 155 | github.com/hashicorp/hcl/hcl/ast 156 | github.com/hashicorp/hcl/hcl/parser 157 | github.com/hashicorp/hcl/hcl/scanner 158 | github.com/hashicorp/hcl/hcl/strconv 159 | github.com/hashicorp/hcl/hcl/token 160 | github.com/hashicorp/hcl/json/parser 161 | github.com/hashicorp/hcl/json/scanner 162 | github.com/hashicorp/hcl/json/token 163 | # github.com/hashicorp/vault/api v1.0.4 164 | github.com/hashicorp/vault/api 165 | # github.com/hashicorp/vault/sdk v0.1.13 166 | github.com/hashicorp/vault/sdk/helper/compressutil 167 | github.com/hashicorp/vault/sdk/helper/consts 168 | github.com/hashicorp/vault/sdk/helper/hclutil 169 | github.com/hashicorp/vault/sdk/helper/jsonutil 170 | github.com/hashicorp/vault/sdk/helper/parseutil 171 | github.com/hashicorp/vault/sdk/helper/strutil 172 | # github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf 173 | github.com/inconshreveable/go-update 174 | github.com/inconshreveable/go-update/internal/binarydist 175 | github.com/inconshreveable/go-update/internal/osext 176 | # github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03 177 | github.com/jcmturner/gofork/encoding/asn1 178 | github.com/jcmturner/gofork/x/crypto/pbkdf2 179 | # github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af 180 | github.com/jmespath/go-jmespath 181 | # github.com/json-iterator/go v1.1.9 182 | github.com/json-iterator/go 183 | # github.com/klauspost/compress v1.10.3 184 | github.com/klauspost/compress/flate 185 | github.com/klauspost/compress/fse 186 | github.com/klauspost/compress/gzip 187 | github.com/klauspost/compress/huff0 188 | github.com/klauspost/compress/s2 189 | github.com/klauspost/compress/snappy 190 | github.com/klauspost/compress/zip 191 | github.com/klauspost/compress/zstd 192 | github.com/klauspost/compress/zstd/internal/xxhash 193 | # github.com/klauspost/cpuid v1.2.2 194 | github.com/klauspost/cpuid 195 | # github.com/klauspost/pgzip v1.2.1 196 | github.com/klauspost/pgzip 197 | # github.com/klauspost/readahead v1.3.1 198 | github.com/klauspost/readahead 199 | # github.com/klauspost/reedsolomon v1.9.3 200 | github.com/klauspost/reedsolomon 201 | # github.com/konsorten/go-windows-terminal-sequences v1.0.1 202 | github.com/konsorten/go-windows-terminal-sequences 203 | # github.com/kurin/blazer v0.5.4-0.20200327014341-8f90a40f8af7 204 | github.com/kurin/blazer/base 205 | github.com/kurin/blazer/internal/b2types 206 | github.com/kurin/blazer/internal/blog 207 | # github.com/lib/pq v1.1.1 208 | github.com/lib/pq 209 | github.com/lib/pq/oid 210 | github.com/lib/pq/scram 211 | # github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5 212 | github.com/mailru/easyjson 213 | github.com/mailru/easyjson/buffer 214 | github.com/mailru/easyjson/jlexer 215 | github.com/mailru/easyjson/jwriter 216 | # github.com/mattn/go-colorable v0.1.1 217 | github.com/mattn/go-colorable 218 | # github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb 219 | github.com/mattn/go-ieproxy 220 | # github.com/mattn/go-isatty v0.0.7 221 | github.com/mattn/go-isatty 222 | # github.com/mattn/go-runewidth v0.0.4 223 | github.com/mattn/go-runewidth 224 | # github.com/matttproud/golang_protobuf_extensions v1.0.1 225 | github.com/matttproud/golang_protobuf_extensions/pbutil 226 | # github.com/miekg/dns v1.1.8 227 | github.com/miekg/dns 228 | # github.com/minio/cli v1.22.0 229 | github.com/minio/cli 230 | # github.com/minio/highwayhash v1.0.0 231 | github.com/minio/highwayhash 232 | # github.com/minio/lsync v1.0.1 233 | github.com/minio/lsync 234 | # github.com/minio/minio-go/v6 v6.0.52 235 | github.com/minio/minio-go/v6 236 | github.com/minio/minio-go/v6/pkg/credentials 237 | github.com/minio/minio-go/v6/pkg/encrypt 238 | github.com/minio/minio-go/v6/pkg/policy 239 | github.com/minio/minio-go/v6/pkg/s3signer 240 | github.com/minio/minio-go/v6/pkg/s3utils 241 | github.com/minio/minio-go/v6/pkg/set 242 | # github.com/minio/parquet-go v0.0.0-20200125064549-a1e49702e174 243 | github.com/minio/parquet-go 244 | github.com/minio/parquet-go/common 245 | github.com/minio/parquet-go/data 246 | github.com/minio/parquet-go/encoding 247 | github.com/minio/parquet-go/gen-go/parquet 248 | github.com/minio/parquet-go/schema 249 | # github.com/minio/sha256-simd v0.1.1 250 | github.com/minio/sha256-simd 251 | # github.com/minio/simdjson-go v0.1.5-0.20200303142138-b17fe061ea37 252 | github.com/minio/simdjson-go 253 | # github.com/minio/sio v0.2.0 254 | github.com/minio/sio 255 | # github.com/mitchellh/go-homedir v1.1.0 256 | github.com/mitchellh/go-homedir 257 | # github.com/mitchellh/mapstructure v1.1.2 258 | github.com/mitchellh/mapstructure 259 | # github.com/mmcloughlin/avo v0.0.0-20200303042253-6df701fe672f 260 | github.com/mmcloughlin/avo/attr 261 | github.com/mmcloughlin/avo/build 262 | github.com/mmcloughlin/avo/buildtags 263 | github.com/mmcloughlin/avo/gotypes 264 | github.com/mmcloughlin/avo/internal/prnt 265 | github.com/mmcloughlin/avo/internal/stack 266 | github.com/mmcloughlin/avo/ir 267 | github.com/mmcloughlin/avo/operand 268 | github.com/mmcloughlin/avo/pass 269 | github.com/mmcloughlin/avo/printer 270 | github.com/mmcloughlin/avo/reg 271 | github.com/mmcloughlin/avo/src 272 | github.com/mmcloughlin/avo/x86 273 | # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd 274 | github.com/modern-go/concurrent 275 | # github.com/modern-go/reflect2 v1.0.1 276 | github.com/modern-go/reflect2 277 | # github.com/montanaflynn/stats v0.5.0 278 | github.com/montanaflynn/stats 279 | # github.com/nats-io/jwt v0.3.2 280 | github.com/nats-io/jwt 281 | # github.com/nats-io/nats-server/v2 v2.1.2 282 | github.com/nats-io/nats-server/v2/conf 283 | github.com/nats-io/nats-server/v2/logger 284 | github.com/nats-io/nats-server/v2/server 285 | github.com/nats-io/nats-server/v2/server/pse 286 | github.com/nats-io/nats-server/v2/test 287 | # github.com/nats-io/nats.go v1.9.1 288 | github.com/nats-io/nats.go 289 | github.com/nats-io/nats.go/encoders/builtin 290 | github.com/nats-io/nats.go/util 291 | # github.com/nats-io/nkeys v0.1.3 292 | github.com/nats-io/nkeys 293 | # github.com/nats-io/nuid v1.0.1 294 | github.com/nats-io/nuid 295 | # github.com/nats-io/stan.go v0.4.5 296 | github.com/nats-io/stan.go 297 | github.com/nats-io/stan.go/pb 298 | # github.com/ncw/directio v1.0.5 299 | github.com/ncw/directio 300 | # github.com/nsqio/go-nsq v1.0.7 301 | github.com/nsqio/go-nsq 302 | # github.com/philhofer/fwd v1.0.0 303 | github.com/philhofer/fwd 304 | # github.com/pierrec/lz4 v2.4.0+incompatible 305 | github.com/pierrec/lz4 306 | github.com/pierrec/lz4/internal/xxh32 307 | # github.com/pkg/errors v0.8.1 308 | github.com/pkg/errors 309 | # github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 310 | github.com/prometheus/client_golang/prometheus 311 | github.com/prometheus/client_golang/prometheus/internal 312 | github.com/prometheus/client_golang/prometheus/promhttp 313 | # github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 314 | github.com/prometheus/client_model/go 315 | # github.com/prometheus/common v0.2.0 316 | github.com/prometheus/common/expfmt 317 | github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg 318 | github.com/prometheus/common/model 319 | # github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 320 | github.com/prometheus/procfs 321 | github.com/prometheus/procfs/internal/util 322 | github.com/prometheus/procfs/nfs 323 | github.com/prometheus/procfs/xfs 324 | # github.com/rcrowley/go-metrics v0.0.0-20190704165056-9c2d0518ed81 325 | github.com/rcrowley/go-metrics 326 | # github.com/rjeczalik/notify v0.9.2 327 | github.com/rjeczalik/notify 328 | # github.com/rs/cors v1.6.0 329 | github.com/rs/cors 330 | # github.com/ryanuber/go-glob v1.0.0 331 | github.com/ryanuber/go-glob 332 | # github.com/secure-io/sio-go v0.3.0 333 | github.com/secure-io/sio-go 334 | github.com/secure-io/sio-go/sioutil 335 | # github.com/shirou/gopsutil v2.20.3-0.20200314133625-53cec6b37e6a+incompatible 336 | github.com/shirou/gopsutil/cpu 337 | github.com/shirou/gopsutil/disk 338 | github.com/shirou/gopsutil/host 339 | github.com/shirou/gopsutil/internal/common 340 | github.com/shirou/gopsutil/mem 341 | github.com/shirou/gopsutil/net 342 | github.com/shirou/gopsutil/process 343 | # github.com/sirupsen/logrus v1.5.0 344 | github.com/sirupsen/logrus 345 | # github.com/skyrings/skyring-common v0.0.0-20160929130248-d1c0bb1cbd5e 346 | github.com/skyrings/skyring-common/tools/uuid 347 | # github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94 348 | github.com/streadway/amqp 349 | # github.com/tidwall/gjson v1.3.5 350 | github.com/tidwall/gjson 351 | # github.com/tidwall/match v1.0.1 352 | github.com/tidwall/match 353 | # github.com/tidwall/pretty v1.0.0 354 | github.com/tidwall/pretty 355 | # github.com/tidwall/sjson v1.0.4 356 | github.com/tidwall/sjson 357 | # github.com/tinylib/msgp v1.1.1 358 | github.com/tinylib/msgp/msgp 359 | # github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a 360 | github.com/valyala/tcplisten 361 | # github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c 362 | github.com/xdg/scram 363 | # github.com/xdg/stringprep v1.0.0 364 | github.com/xdg/stringprep 365 | # go.opencensus.io v0.21.0 366 | go.opencensus.io 367 | go.opencensus.io/internal 368 | go.opencensus.io/internal/tagencoding 369 | go.opencensus.io/metric/metricdata 370 | go.opencensus.io/metric/metricproducer 371 | go.opencensus.io/plugin/ochttp 372 | go.opencensus.io/plugin/ochttp/propagation/b3 373 | go.opencensus.io/resource 374 | go.opencensus.io/stats 375 | go.opencensus.io/stats/internal 376 | go.opencensus.io/stats/view 377 | go.opencensus.io/tag 378 | go.opencensus.io/trace 379 | go.opencensus.io/trace/internal 380 | go.opencensus.io/trace/propagation 381 | go.opencensus.io/trace/tracestate 382 | # go.uber.org/atomic v1.3.2 383 | go.uber.org/atomic 384 | # golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f 385 | golang.org/x/crypto/argon2 386 | golang.org/x/crypto/bcrypt 387 | golang.org/x/crypto/blake2b 388 | golang.org/x/crypto/blowfish 389 | golang.org/x/crypto/chacha20 390 | golang.org/x/crypto/chacha20poly1305 391 | golang.org/x/crypto/ed25519 392 | golang.org/x/crypto/ed25519/internal/edwards25519 393 | golang.org/x/crypto/internal/subtle 394 | golang.org/x/crypto/md4 395 | golang.org/x/crypto/pbkdf2 396 | golang.org/x/crypto/poly1305 397 | # golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e 398 | golang.org/x/net/bpf 399 | golang.org/x/net/context 400 | golang.org/x/net/context/ctxhttp 401 | golang.org/x/net/http/httpguts 402 | golang.org/x/net/http/httpproxy 403 | golang.org/x/net/http2 404 | golang.org/x/net/http2/hpack 405 | golang.org/x/net/idna 406 | golang.org/x/net/internal/iana 407 | golang.org/x/net/internal/socket 408 | golang.org/x/net/internal/socks 409 | golang.org/x/net/internal/timeseries 410 | golang.org/x/net/ipv4 411 | golang.org/x/net/ipv6 412 | golang.org/x/net/proxy 413 | golang.org/x/net/publicsuffix 414 | golang.org/x/net/trace 415 | golang.org/x/net/websocket 416 | # golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a 417 | golang.org/x/oauth2 418 | golang.org/x/oauth2/google 419 | golang.org/x/oauth2/internal 420 | golang.org/x/oauth2/jws 421 | golang.org/x/oauth2/jwt 422 | # golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd 423 | golang.org/x/sys/cpu 424 | golang.org/x/sys/unix 425 | golang.org/x/sys/windows 426 | golang.org/x/sys/windows/registry 427 | golang.org/x/sys/windows/svc 428 | golang.org/x/sys/windows/svc/eventlog 429 | golang.org/x/sys/windows/svc/mgr 430 | # golang.org/x/text v0.3.2 431 | golang.org/x/text/secure/bidirule 432 | golang.org/x/text/transform 433 | golang.org/x/text/unicode/bidi 434 | golang.org/x/text/unicode/norm 435 | # golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 436 | golang.org/x/time/rate 437 | # golang.org/x/tools v0.0.0-20190914235951-31e00f45c22e 438 | golang.org/x/tools/go/gcexportdata 439 | golang.org/x/tools/go/internal/gcimporter 440 | golang.org/x/tools/go/internal/packagesdriver 441 | golang.org/x/tools/go/packages 442 | golang.org/x/tools/internal/fastwalk 443 | golang.org/x/tools/internal/gopathwalk 444 | golang.org/x/tools/internal/semver 445 | # google.golang.org/api v0.5.0 446 | google.golang.org/api/gensupport 447 | google.golang.org/api/googleapi 448 | google.golang.org/api/googleapi/internal/uritemplates 449 | google.golang.org/api/googleapi/transport 450 | google.golang.org/api/internal 451 | google.golang.org/api/iterator 452 | google.golang.org/api/option 453 | google.golang.org/api/storage/v1 454 | google.golang.org/api/transport/http 455 | google.golang.org/api/transport/http/internal/propagation 456 | # google.golang.org/appengine v1.6.0 457 | google.golang.org/appengine 458 | google.golang.org/appengine/cloudsql 459 | google.golang.org/appengine/internal 460 | google.golang.org/appengine/internal/app_identity 461 | google.golang.org/appengine/internal/base 462 | google.golang.org/appengine/internal/datastore 463 | google.golang.org/appengine/internal/log 464 | google.golang.org/appengine/internal/modules 465 | google.golang.org/appengine/internal/remote_api 466 | google.golang.org/appengine/internal/urlfetch 467 | google.golang.org/appengine/urlfetch 468 | # google.golang.org/genproto v0.0.0-20190513181449-d00d292a067c 469 | google.golang.org/genproto/googleapis/api/annotations 470 | google.golang.org/genproto/googleapis/iam/v1 471 | google.golang.org/genproto/googleapis/rpc/code 472 | google.golang.org/genproto/googleapis/rpc/status 473 | google.golang.org/genproto/googleapis/type/expr 474 | # google.golang.org/grpc v1.22.0 475 | google.golang.org/grpc 476 | google.golang.org/grpc/balancer 477 | google.golang.org/grpc/balancer/base 478 | google.golang.org/grpc/balancer/roundrobin 479 | google.golang.org/grpc/binarylog/grpc_binarylog_v1 480 | google.golang.org/grpc/codes 481 | google.golang.org/grpc/connectivity 482 | google.golang.org/grpc/credentials 483 | google.golang.org/grpc/credentials/internal 484 | google.golang.org/grpc/encoding 485 | google.golang.org/grpc/encoding/proto 486 | google.golang.org/grpc/grpclog 487 | google.golang.org/grpc/health/grpc_health_v1 488 | google.golang.org/grpc/internal 489 | google.golang.org/grpc/internal/backoff 490 | google.golang.org/grpc/internal/balancerload 491 | google.golang.org/grpc/internal/binarylog 492 | google.golang.org/grpc/internal/channelz 493 | google.golang.org/grpc/internal/envconfig 494 | google.golang.org/grpc/internal/grpcrand 495 | google.golang.org/grpc/internal/grpcsync 496 | google.golang.org/grpc/internal/syscall 497 | google.golang.org/grpc/internal/transport 498 | google.golang.org/grpc/keepalive 499 | google.golang.org/grpc/metadata 500 | google.golang.org/grpc/naming 501 | google.golang.org/grpc/peer 502 | google.golang.org/grpc/resolver 503 | google.golang.org/grpc/resolver/dns 504 | google.golang.org/grpc/resolver/passthrough 505 | google.golang.org/grpc/serviceconfig 506 | google.golang.org/grpc/stats 507 | google.golang.org/grpc/status 508 | google.golang.org/grpc/tap 509 | # gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d 510 | gopkg.in/asn1-ber.v1 511 | # gopkg.in/ini.v1 v1.48.0 512 | gopkg.in/ini.v1 513 | # gopkg.in/jcmturner/aescts.v1 v1.0.1 514 | gopkg.in/jcmturner/aescts.v1 515 | # gopkg.in/jcmturner/dnsutils.v1 v1.0.1 516 | gopkg.in/jcmturner/dnsutils.v1 517 | # gopkg.in/jcmturner/goidentity.v3 v3.0.0 518 | gopkg.in/jcmturner/goidentity.v3 519 | # gopkg.in/jcmturner/gokrb5.v7 v7.2.3 520 | gopkg.in/jcmturner/gokrb5.v7/asn1tools 521 | gopkg.in/jcmturner/gokrb5.v7/client 522 | gopkg.in/jcmturner/gokrb5.v7/config 523 | gopkg.in/jcmturner/gokrb5.v7/credentials 524 | gopkg.in/jcmturner/gokrb5.v7/crypto 525 | gopkg.in/jcmturner/gokrb5.v7/crypto/common 526 | gopkg.in/jcmturner/gokrb5.v7/crypto/etype 527 | gopkg.in/jcmturner/gokrb5.v7/crypto/rfc3961 528 | gopkg.in/jcmturner/gokrb5.v7/crypto/rfc3962 529 | gopkg.in/jcmturner/gokrb5.v7/crypto/rfc4757 530 | gopkg.in/jcmturner/gokrb5.v7/crypto/rfc8009 531 | gopkg.in/jcmturner/gokrb5.v7/gssapi 532 | gopkg.in/jcmturner/gokrb5.v7/iana 533 | gopkg.in/jcmturner/gokrb5.v7/iana/addrtype 534 | gopkg.in/jcmturner/gokrb5.v7/iana/adtype 535 | gopkg.in/jcmturner/gokrb5.v7/iana/asnAppTag 536 | gopkg.in/jcmturner/gokrb5.v7/iana/chksumtype 537 | gopkg.in/jcmturner/gokrb5.v7/iana/errorcode 538 | gopkg.in/jcmturner/gokrb5.v7/iana/etypeID 539 | gopkg.in/jcmturner/gokrb5.v7/iana/flags 540 | gopkg.in/jcmturner/gokrb5.v7/iana/keyusage 541 | gopkg.in/jcmturner/gokrb5.v7/iana/msgtype 542 | gopkg.in/jcmturner/gokrb5.v7/iana/nametype 543 | gopkg.in/jcmturner/gokrb5.v7/iana/patype 544 | gopkg.in/jcmturner/gokrb5.v7/kadmin 545 | gopkg.in/jcmturner/gokrb5.v7/keytab 546 | gopkg.in/jcmturner/gokrb5.v7/krberror 547 | gopkg.in/jcmturner/gokrb5.v7/messages 548 | gopkg.in/jcmturner/gokrb5.v7/pac 549 | gopkg.in/jcmturner/gokrb5.v7/types 550 | # gopkg.in/jcmturner/rpc.v1 v1.1.0 551 | gopkg.in/jcmturner/rpc.v1/mstypes 552 | gopkg.in/jcmturner/rpc.v1/ndr 553 | # gopkg.in/ldap.v3 v3.0.3 554 | gopkg.in/ldap.v3 555 | # gopkg.in/olivere/elastic.v5 v5.0.80 556 | gopkg.in/olivere/elastic.v5 557 | gopkg.in/olivere/elastic.v5/config 558 | gopkg.in/olivere/elastic.v5/uritemplates 559 | # gopkg.in/square/go-jose.v2 v2.3.1 560 | gopkg.in/square/go-jose.v2 561 | gopkg.in/square/go-jose.v2/cipher 562 | gopkg.in/square/go-jose.v2/json 563 | gopkg.in/square/go-jose.v2/jwt 564 | # gopkg.in/yaml.v2 v2.2.4 565 | gopkg.in/yaml.v2 566 | -------------------------------------------------------------------------------- /testdata/thanos_expected.txt: -------------------------------------------------------------------------------- 1 | GH_TUPLE= \ 2 | Azure:azure-pipeline-go:v0.2.2:azure_azure_pipeline_go/vendor/github.com/Azure/azure-pipeline-go \ 3 | Azure:azure-sdk-for-go:v36.1.0:azure_azure_sdk_for_go/vendor/github.com/Azure/azure-sdk-for-go \ 4 | Azure:azure-storage-blob-go:v0.8.0:azure_azure_storage_blob_go/vendor/github.com/Azure/azure-storage-blob-go \ 5 | Azure:go-autorest:3492b2aff503:azure_go_autorest_autorest/vendor/github.com/Azure/go-autorest \ 6 | Azure:go-autorest:5bd9621f41a0:azure_go_autorest_date \ 7 | Azure:go-autorest:logger/v0.1.0:azure_go_autorest_logger \ 8 | Azure:go-autorest:tracing/v0.5.0:azure_go_autorest_tracing \ 9 | BurntSushi:toml:v0.3.1:burntsushi_toml/vendor/github.com/BurntSushi/toml \ 10 | NYTimes:gziphandler:v1.1.1:nytimes_gziphandler/vendor/github.com/NYTimes/gziphandler \ 11 | PuerkitoBio:purell:v1.1.1:puerkitobio_purell/vendor/github.com/PuerkitoBio/purell \ 12 | PuerkitoBio:urlesc:de5bf2ad4578:puerkitobio_urlesc/vendor/github.com/PuerkitoBio/urlesc \ 13 | alecthomas:kingpin:v2.2.6:alecthomas_kingpin/vendor/gopkg.in/alecthomas/kingpin.v2 \ 14 | alecthomas:template:fb15b899a751:alecthomas_template/vendor/github.com/alecthomas/template \ 15 | alecthomas:units:f65c72e2690d:alecthomas_units/vendor/github.com/alecthomas/units \ 16 | aliyun:aliyun-oss-go-sdk:v2.0.4:aliyun_aliyun_oss_go_sdk/vendor/github.com/aliyun/aliyun-oss-go-sdk \ 17 | armon:go-metrics:v0.3.0:armon_go_metrics/vendor/github.com/armon/go-metrics \ 18 | armon:go-radix:v1.0.0:armon_go_radix/vendor/github.com/armon/go-radix \ 19 | asaskevich:govalidator:f61b66f89f4a:asaskevich_govalidator/vendor/github.com/asaskevich/govalidator \ 20 | aws:aws-sdk-go:v1.25.48:aws_aws_sdk_go/vendor/github.com/aws/aws-sdk-go \ 21 | beorn7:perks:v1.0.1:beorn7_perks/vendor/github.com/beorn7/perks \ 22 | blang:semver:v3.5.0:blang_semver/vendor/github.com/blang/semver \ 23 | bradfitz:gomemcache:a41fca850d0b:bradfitz_gomemcache/vendor/github.com/bradfitz/gomemcache \ 24 | census-instrumentation:opencensus-go:v0.22.2:census_instrumentation_opencensus_go/vendor/go.opencensus.io \ 25 | cespare:xxhash:v1.1.0:cespare_xxhash/vendor/github.com/cespare/xxhash \ 26 | cespare:xxhash:v2.1.1:cespare_xxhash_v2/vendor/github.com/cespare/xxhash/v2 \ 27 | cortexproject:cortex:92ab6cbe0995:cortexproject_cortex/vendor/github.com/cortexproject/cortex \ 28 | davecgh:go-spew:v1.1.1:davecgh_go_spew/vendor/github.com/davecgh/go-spew \ 29 | dgrijalva:jwt-go:v3.2.0:dgrijalva_jwt_go/vendor/github.com/dgrijalva/jwt-go \ 30 | dominikh:go-tools:v0.0.1-2019.2.3:dominikh_go_tools/vendor/honnef.co/go/tools \ 31 | edsrzf:mmap-go:v1.0.0:edsrzf_mmap_go/vendor/github.com/edsrzf/mmap-go \ 32 | elastic:apm-agent-go:v1.5.0:elastic_apm_agent_go/vendor/go.elastic.co/apm \ 33 | elastic:go-fastjson:v1.0.0:elastic_go_fastjson/vendor/go.elastic.co/fastjson \ 34 | elastic:go-sysinfo:v1.1.1:elastic_go_sysinfo/vendor/github.com/elastic/go-sysinfo \ 35 | elastic:go-windows:v1.0.1:elastic_go_windows/vendor/github.com/elastic/go-windows \ 36 | facette:natsort:2cd4dd1e2dcb:facette_natsort/vendor/github.com/facette/natsort \ 37 | fatih:structtag:v1.1.0:fatih_structtag/vendor/github.com/fatih/structtag \ 38 | fortytw2:leaktest:v1.3.0:fortytw2_leaktest/vendor/github.com/fortytw2/leaktest \ 39 | fsnotify:fsnotify:v1.4.7:fsnotify_fsnotify/vendor/github.com/fsnotify/fsnotify \ 40 | go-inf:inf:v0.9.1:go_inf_inf/vendor/gopkg.in/inf.v0 \ 41 | go-ini:ini:v1.51.0:go_ini_ini/vendor/gopkg.in/ini.v1 \ 42 | go-kit:kit:v0.9.0:go_kit_kit/vendor/github.com/go-kit/kit \ 43 | go-logfmt:logfmt:v0.4.0:go_logfmt_logfmt/vendor/github.com/go-logfmt/logfmt \ 44 | go-openapi:analysis:v0.19.2:go_openapi_analysis/vendor/github.com/go-openapi/analysis \ 45 | go-openapi:errors:v0.19.2:go_openapi_errors/vendor/github.com/go-openapi/errors \ 46 | go-openapi:jsonpointer:v0.19.2:go_openapi_jsonpointer/vendor/github.com/go-openapi/jsonpointer \ 47 | go-openapi:jsonreference:v0.19.2:go_openapi_jsonreference/vendor/github.com/go-openapi/jsonreference \ 48 | go-openapi:loads:v0.19.2:go_openapi_loads/vendor/github.com/go-openapi/loads \ 49 | go-openapi:runtime:v0.19.4:go_openapi_runtime/vendor/github.com/go-openapi/runtime \ 50 | go-openapi:spec:v0.19.2:go_openapi_spec/vendor/github.com/go-openapi/spec \ 51 | go-openapi:strfmt:v0.19.2:go_openapi_strfmt/vendor/github.com/go-openapi/strfmt \ 52 | go-openapi:swag:v0.19.5:go_openapi_swag/vendor/github.com/go-openapi/swag \ 53 | go-openapi:validate:v0.19.2:go_openapi_validate/vendor/github.com/go-openapi/validate \ 54 | go-stack:stack:v1.8.0:go_stack_stack/vendor/github.com/go-stack/stack \ 55 | go-yaml:yaml:v2.2.7:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \ 56 | gogo:googleapis:v1.1.0:gogo_googleapis/vendor/github.com/gogo/googleapis \ 57 | gogo:protobuf:v1.3.1:gogo_protobuf/vendor/github.com/gogo/protobuf \ 58 | gogo:status:v1.0.3:gogo_status/vendor/github.com/gogo/status \ 59 | golang:appengine:v1.6.5:golang_appengine/vendor/google.golang.org/appengine \ 60 | golang:crypto:e1110fd1c708:golang_crypto/vendor/golang.org/x/crypto \ 61 | golang:exp:a1ab85dbe136:golang_exp/vendor/golang.org/x/exp \ 62 | golang:groupcache:611e8accdfc9:golang_groupcache/vendor/github.com/golang/groupcache \ 63 | golang:lint:16217165b5de:golang_lint/vendor/golang.org/x/lint \ 64 | golang:mod:v0.2.0:golang_mod/vendor/golang.org/x/mod \ 65 | golang:net:0de0cce0169b:golang_net/vendor/golang.org/x/net \ 66 | golang:oauth2:0f29369cfe45:golang_oauth2/vendor/golang.org/x/oauth2 \ 67 | golang:protobuf:v1.3.2:golang_protobuf/vendor/github.com/golang/protobuf \ 68 | golang:snappy:v0.0.1:golang_snappy/vendor/github.com/golang/snappy \ 69 | golang:sync:cd5d95a43a6e:golang_sync/vendor/golang.org/x/sync \ 70 | golang:sys:e047566fdf82:golang_sys/vendor/golang.org/x/sys \ 71 | golang:text:v0.3.2:golang_text/vendor/golang.org/x/text \ 72 | golang:time:555d28b269f0:golang_time/vendor/golang.org/x/time \ 73 | golang:tools:51e69f71924f:golang_tools/vendor/golang.org/x/tools \ 74 | golang:xerrors:9bdfabe68543:golang_xerrors/vendor/golang.org/x/xerrors \ 75 | google:go-cmp:v0.4.0:google_go_cmp/vendor/github.com/google/go-cmp \ 76 | google:go-genproto:c23dd37a84c9:google_go_genproto/vendor/google.golang.org/genproto \ 77 | google:go-querystring:v1.0.0:google_go_querystring/vendor/github.com/google/go-querystring \ 78 | google:gofuzz:v1.0.0:google_gofuzz/vendor/github.com/google/gofuzz \ 79 | googleapis:gax-go:v2.0.2:googleapis_gax_go/vendor/github.com/googleapis/gax-go \ 80 | googleapis:gax-go:v2.0.5:googleapis_gax_go_v2 \ 81 | googleapis:gnostic:v0.3.1:googleapis_gnostic/vendor/github.com/googleapis/gnostic \ 82 | googleapis:google-api-go-client:v0.14.0:googleapis_google_api_go_client/vendor/google.golang.org/api \ 83 | googleapis:google-cloud-go:storage/v1.3.0:googleapis_google_cloud_go_storage \ 84 | googleapis:google-cloud-go:v0.49.0:googleapis_google_cloud_go/vendor/cloud.google.com/go \ 85 | gophercloud:gophercloud:v0.6.0:gophercloud_gophercloud/vendor/github.com/gophercloud/gophercloud \ 86 | gorilla:mux:v1.7.1:gorilla_mux/vendor/github.com/gorilla/mux \ 87 | grpc-ecosystem:go-grpc-middleware:v1.1.0:grpc_ecosystem_go_grpc_middleware/vendor/github.com/grpc-ecosystem/go-grpc-middleware \ 88 | grpc-ecosystem:go-grpc-prometheus:v1.2.0:grpc_ecosystem_go_grpc_prometheus/vendor/github.com/grpc-ecosystem/go-grpc-prometheus \ 89 | grpc-ecosystem:grpc-gateway:v1.12.1:grpc_ecosystem_grpc_gateway/vendor/github.com/grpc-ecosystem/grpc-gateway \ 90 | grpc:grpc-go:v1.25.1:grpc_grpc_go/vendor/google.golang.org/grpc \ 91 | hashicorp:consul:v1.3.0:hashicorp_consul_api/vendor/github.com/hashicorp/consul \ 92 | hashicorp:go-cleanhttp:v0.5.1:hashicorp_go_cleanhttp/vendor/github.com/hashicorp/go-cleanhttp \ 93 | hashicorp:go-immutable-radix:v1.1.0:hashicorp_go_immutable_radix/vendor/github.com/hashicorp/go-immutable-radix \ 94 | hashicorp:go-rootcerts:v1.0.1:hashicorp_go_rootcerts/vendor/github.com/hashicorp/go-rootcerts \ 95 | hashicorp:golang-lru:v0.5.3:hashicorp_golang_lru/vendor/github.com/hashicorp/golang-lru \ 96 | hashicorp:serf:v0.8.5:hashicorp_serf/vendor/github.com/hashicorp/serf \ 97 | jmespath:go-jmespath:c2b33e8439af:jmespath_go_jmespath/vendor/github.com/jmespath/go-jmespath \ 98 | joeshaw:multierror:69b34d4ec901:joeshaw_multierror/vendor/github.com/joeshaw/multierror \ 99 | jpillora:backoff:v1.0.0:jpillora_backoff/vendor/github.com/jpillora/backoff \ 100 | json-iterator:go:v1.1.9:json_iterator_go/vendor/github.com/json-iterator/go \ 101 | jstemmer:go-junit-report:v0.9.1:jstemmer_go_junit_report/vendor/github.com/jstemmer/go-junit-report \ 102 | julienschmidt:httprouter:v1.3.0:julienschmidt_httprouter/vendor/github.com/julienschmidt/httprouter \ 103 | konsorten:go-windows-terminal-sequences:v1.0.2:konsorten_go_windows_terminal_sequences/vendor/github.com/konsorten/go-windows-terminal-sequences \ 104 | kr:logfmt:b84e30acd515:kr_logfmt/vendor/github.com/kr/logfmt \ 105 | kubernetes-sigs:yaml:v1.1.0:kubernetes_sigs_yaml/vendor/sigs.k8s.io/yaml \ 106 | kubernetes:api:7cf5895f2711:kubernetes_api/vendor/k8s.io/api \ 107 | kubernetes:apimachinery:1799e75a0719:kubernetes_apimachinery/vendor/k8s.io/apimachinery \ 108 | kubernetes:client-go:78d2af792bab:kubernetes_client_go/vendor/k8s.io/client-go \ 109 | kubernetes:klog:v0.3.1:kubernetes_klog/vendor/k8s.io/klog \ 110 | kubernetes:utils:6ca3b61696b6:kubernetes_utils/vendor/k8s.io/utils \ 111 | leanovate:gopter:v0.2.4:leanovate_gopter/vendor/github.com/leanovate/gopter \ 112 | lightstep:lightstep-tracer-common:bc2310a04743:lightstep_lightstep_tracer_common_gogo/vendor/github.com/lightstep/lightstep-tracer-common \ 113 | lightstep:lightstep-tracer-go:v0.18.0:lightstep_lightstep_tracer_go/vendor/github.com/lightstep/lightstep-tracer-go \ 114 | lovoo:gcloud-opentracing:v0.3.0:lovoo_gcloud_opentracing/vendor/github.com/lovoo/gcloud-opentracing \ 115 | mailru:easyjson:94de47d64c63:mailru_easyjson/vendor/github.com/mailru/easyjson \ 116 | mattn:go-ieproxy:7c0f6868bffe:mattn_go_ieproxy/vendor/github.com/mattn/go-ieproxy \ 117 | mattn:go-runewidth:v0.0.6:mattn_go_runewidth/vendor/github.com/mattn/go-runewidth \ 118 | matttproud:golang_protobuf_extensions:v1.0.1:matttproud_golang_protobuf_extensions/vendor/github.com/matttproud/golang_protobuf_extensions \ 119 | miekg:dns:v1.1.22:miekg_dns/vendor/github.com/miekg/dns \ 120 | minio:minio-go:v6.0.49:minio_minio_go_v6/vendor/github.com/minio/minio-go/v6 \ 121 | minio:sha256-simd:v0.1.1:minio_sha256_simd/vendor/github.com/minio/sha256-simd \ 122 | mitchellh:go-homedir:v1.1.0:mitchellh_go_homedir/vendor/github.com/mitchellh/go-homedir \ 123 | mitchellh:mapstructure:v1.1.2:mitchellh_mapstructure/vendor/github.com/mitchellh/mapstructure \ 124 | modern-go:concurrent:bacd9c7ef1dd:modern_go_concurrent/vendor/github.com/modern-go/concurrent \ 125 | modern-go:reflect2:v1.0.1:modern_go_reflect2/vendor/github.com/modern-go/reflect2 \ 126 | mongodb:mongo-go-driver:v1.1.0:mongodb_mongo_go_driver/vendor/go.mongodb.org/mongo-driver \ 127 | mozillazg:go-cos:v0.13.0:mozillazg_go_cos/vendor/github.com/mozillazg/go-cos \ 128 | mozillazg:go-httpheader:v0.2.1:mozillazg_go_httpheader/vendor/github.com/mozillazg/go-httpheader \ 129 | mwitkow:go-conntrack:2f068394615f:mwitkow_go_conntrack/vendor/github.com/mwitkow/go-conntrack \ 130 | oklog:run:v1.0.0:oklog_run/vendor/github.com/oklog/run \ 131 | oklog:ulid:v1.3.1:oklog_ulid/vendor/github.com/oklog/ulid \ 132 | olekukonko:tablewriter:v0.0.2:olekukonko_tablewriter/vendor/github.com/olekukonko/tablewriter \ 133 | opentracing-contrib:go-grpc:4b5a12d3ff02:opentracing_contrib_go_grpc/vendor/github.com/opentracing-contrib/go-grpc \ 134 | opentracing-contrib:go-stdlib:cf7a6c988dc9:opentracing_contrib_go_stdlib/vendor/github.com/opentracing-contrib/go-stdlib \ 135 | opentracing:basictracer-go:v1.0.0:opentracing_basictracer_go/vendor/github.com/opentracing/basictracer-go \ 136 | opentracing:opentracing-go:2876d2018785:opentracing_opentracing_go/vendor/github.com/opentracing/opentracing-go \ 137 | pkg:errors:v0.9.1:pkg_errors/vendor/github.com/pkg/errors \ 138 | pmezard:go-difflib:v1.0.0:pmezard_go_difflib/vendor/github.com/pmezard/go-difflib \ 139 | prometheus:alertmanager:v0.20.0:prometheus_alertmanager/vendor/github.com/prometheus/alertmanager \ 140 | prometheus:client_golang:v1.5.0:prometheus_client_golang/vendor/github.com/prometheus/client_golang \ 141 | prometheus:client_model:v0.2.0:prometheus_client_model/vendor/github.com/prometheus/client_model \ 142 | prometheus:common:v0.9.1:prometheus_common/vendor/github.com/prometheus/common \ 143 | prometheus:procfs:v0.0.8:prometheus_procfs/vendor/github.com/prometheus/procfs \ 144 | prometheus:prometheus:1e64d757f711:prometheus_prometheus/vendor/github.com/prometheus/prometheus \ 145 | samuel:go-zookeeper:2cc03de413da:samuel_go_zookeeper/vendor/github.com/samuel/go-zookeeper \ 146 | santhosh-tekuri:jsonschema:v1.2.4:santhosh_tekuri_jsonschema/vendor/github.com/santhosh-tekuri/jsonschema \ 147 | sercand:kuberesolver:v2.1.0:sercand_kuberesolver/vendor/github.com/sercand/kuberesolver \ 148 | sirupsen:logrus:v1.4.2:sirupsen_logrus/vendor/github.com/sirupsen/logrus \ 149 | uber-go:atomic:v1.5.0:uber_go_atomic/vendor/go.uber.org/atomic \ 150 | uber-go:automaxprocs:v1.2.0:uber_go_automaxprocs/vendor/go.uber.org/automaxprocs \ 151 | uber:jaeger-client-go:v2.20.1:uber_jaeger_client_go/vendor/github.com/uber/jaeger-client-go \ 152 | uber:jaeger-lib:v2.2.0:uber_jaeger_lib/vendor/github.com/uber/jaeger-lib \ 153 | weaveworks:common:760e36ae819a:weaveworks_common/vendor/github.com/weaveworks/common \ 154 | weaveworks:promrus:v1.2.0:weaveworks_promrus/vendor/github.com/weaveworks/promrus 155 | 156 | GL_TUPLE= https://gitlab.howett.net:go:plist:591f970eefbbeb04d7b37f334a0c4c3256e32876:go_plist/vendor/howett.net/plist 157 | 158 | post-extract: 159 | @${RM} -r ${WRKSRC}/vendor/cloud.google.com/go/storage 160 | @${RLN} ${WRKSRC_googleapis_google_cloud_go_storage}/storage ${WRKSRC}/vendor/cloud.google.com/go/storage 161 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/date 162 | @${RLN} ${WRKSRC_azure_go_autorest_date}/autorest/date ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/date 163 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/logger 164 | @${RLN} ${WRKSRC_azure_go_autorest_logger}/logger ${WRKSRC}/vendor/github.com/Azure/go-autorest/logger 165 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/tracing 166 | @${RLN} ${WRKSRC_azure_go_autorest_tracing}/tracing ${WRKSRC}/vendor/github.com/Azure/go-autorest/tracing 167 | @${RM} -r ${WRKSRC}/vendor/github.com/googleapis/gax-go/v2 168 | @${RLN} ${WRKSRC_googleapis_gax_go_v2}/v2 ${WRKSRC}/vendor/github.com/googleapis/gax-go/v2 169 | @${MKDIR} ${WRKSRC}/vendor/gopkg.in 170 | @${RLN} ${WRKSRC_fsnotify_fsnotify} ${WRKSRC}/vendor/gopkg.in/fsnotify.v1 171 | @${MKDIR} ${WRKSRC}/vendor/gopkg.in/fsnotify 172 | @${RLN} ${WRKSRC_fsnotify_fsnotify} ${WRKSRC}/vendor/gopkg.in/fsnotify/fsnotify.v1 173 | -------------------------------------------------------------------------------- /testdata/vault_expected.txt: -------------------------------------------------------------------------------- 1 | GH_TUPLE= \ 2 | Azure:azure-sdk-for-go:v36.2.0:azure_azure_sdk_for_go/vendor/github.com/Azure/azure-sdk-for-go \ 3 | Azure:go-ansiterm:d6e3b3328b78:azure_go_ansiterm/vendor/github.com/Azure/go-ansiterm \ 4 | Azure:go-autorest:5bd9621f41a0:azure_go_autorest_date/vendor/github.com/Azure/go-autorest \ 5 | Azure:go-autorest:7fcf7bf4a585:azure_go_autorest_auth \ 6 | Azure:go-autorest:autorest/v0.9.2:azure_go_autorest_autorest \ 7 | Azure:go-autorest:b72636a78a83:azure_go_autorest_cli \ 8 | Azure:go-autorest:fa2154f3dfe4:azure_go_autorest_adal \ 9 | Azure:go-autorest:logger/v0.1.0:azure_go_autorest_logger \ 10 | Azure:go-autorest:tracing/v0.5.0:azure_go_autorest_tracing \ 11 | BurntSushi:toml:v0.3.1:burntsushi_toml/vendor/github.com/BurntSushi/toml \ 12 | DataDog:datadog-go:v3.2.0:datadog_datadog_go/vendor/github.com/DataDog/datadog-go \ 13 | DataDog:zstd:v1.4.4:datadog_zstd/vendor/github.com/DataDog/zstd \ 14 | Jeffail:gabs:v1.1.1:jeffail_gabs/vendor/github.com/Jeffail/gabs \ 15 | Masterminds:semver:v1.4.2:masterminds_semver/vendor/github.com/Masterminds/semver \ 16 | Microsoft:go-winio:v0.4.13:microsoft_go_winio/vendor/github.com/Microsoft/go-winio \ 17 | NYTimes:gziphandler:v1.1.1:nytimes_gziphandler/vendor/github.com/NYTimes/gziphandler \ 18 | Nvveen:Gotty:cd527374f1e5:nvveen_gotty/vendor/github.com/Nvveen/Gotty \ 19 | SAP:go-hdb:v0.14.1:sap_go_hdb/vendor/github.com/SAP/go-hdb \ 20 | Sectorbob:mlab-ns2:d3aa0c295a8a:sectorbob_mlab_ns2/vendor/github.com/Sectorbob/mlab-ns2 \ 21 | StackExchange:wmi:5d049714c4a6:stackexchange_wmi/vendor/github.com/StackExchange/wmi \ 22 | aliyun:alibaba-cloud-sdk-go:9418d7b0cd0f:aliyun_alibaba_cloud_sdk_go/vendor/github.com/aliyun/alibaba-cloud-sdk-go \ 23 | aliyun:aliyun-oss-go-sdk:86c17b95fcd5:aliyun_aliyun_oss_go_sdk/vendor/github.com/aliyun/aliyun-oss-go-sdk \ 24 | apple:foundationdb:cd5c9d91fad2:apple_foundationdb_go/vendor/github.com/apple/foundationdb \ 25 | armon:go-metrics:v0.3.3:armon_go_metrics/vendor/github.com/armon/go-metrics \ 26 | armon:go-proxyproto:68259f75880e:armon_go_proxyproto/vendor/github.com/armon/go-proxyproto \ 27 | armon:go-radix:v1.0.0:armon_go_radix/vendor/github.com/armon/go-radix \ 28 | asaskevich:govalidator:f9ffefc3facf:asaskevich_govalidator/vendor/github.com/asaskevich/govalidator \ 29 | aws:aws-sdk-go:v1.25.41:aws_aws_sdk_go/vendor/github.com/aws/aws-sdk-go \ 30 | beorn7:perks:v1.0.1:beorn7_perks/vendor/github.com/beorn7/perks \ 31 | bgentry:speakeasy:v0.1.0:bgentry_speakeasy/vendor/github.com/bgentry/speakeasy \ 32 | boombuler:barcode:6c824513bacc:boombuler_barcode/vendor/github.com/boombuler/barcode \ 33 | briankassouf:jose:d2569464773f:briankassouf_jose/vendor/github.com/briankassouf/jose \ 34 | cenkalti:backoff:v2.2.1:cenkalti_backoff/vendor/github.com/cenkalti/backoff \ 35 | census-instrumentation:opencensus-go:v0.21.0:census_instrumentation_opencensus_go/vendor/go.opencensus.io \ 36 | centrify:cloud-golang-sdk:119110094d0f:centrify_cloud_golang_sdk/vendor/github.com/centrify/cloud-golang-sdk \ 37 | cespare:xxhash:v2.1.1:cespare_xxhash_v2/vendor/github.com/cespare/xxhash/v2 \ 38 | chrismalek:oktasdk-go:3430665dfaa0:chrismalek_oktasdk_go/vendor/github.com/chrismalek/oktasdk-go \ 39 | circonus-labs:circonus-gometrics:v2.3.1:circonus_labs_circonus_gometrics/vendor/github.com/circonus-labs/circonus-gometrics \ 40 | circonus-labs:circonusllhist:v0.1.3:circonus_labs_circonusllhist/vendor/github.com/circonus-labs/circonusllhist \ 41 | cloudfoundry-community:go-cfclient:f136f9222381:cloudfoundry_community_go_cfclient/vendor/github.com/cloudfoundry-community/go-cfclient \ 42 | cloudfoundry:gofileutils:4d0c80011a0f:cloudfoundry_gofileutils/vendor/code.cloudfoundry.org/gofileutils \ 43 | cockroachdb:cockroach-go:e0a95dfd547c:cockroachdb_cockroach_go/vendor/github.com/cockroachdb/cockroach-go \ 44 | containerd:continuity:aaeac12a7ffc:containerd_continuity/vendor/github.com/containerd/continuity \ 45 | coreos:go-oidc:v2.1.0:coreos_go_oidc/vendor/github.com/coreos/go-oidc \ 46 | coreos:go-semver:v0.2.0:coreos_go_semver/vendor/github.com/coreos/go-semver \ 47 | coreos:go-systemd:39ca1b05acc7:coreos_go_systemd/vendor/github.com/coreos/go-systemd \ 48 | coreos:pkg:3ac0863d7acf:coreos_pkg/vendor/github.com/coreos/pkg \ 49 | davecgh:go-spew:v1.1.1:davecgh_go_spew/vendor/github.com/davecgh/go-spew \ 50 | denisenkom:go-mssqldb:3b1d194e553a:denisenkom_go_mssqldb/vendor/github.com/denisenkom/go-mssqldb \ 51 | dgrijalva:jwt-go:v3.2.0:dgrijalva_jwt_go/vendor/github.com/dgrijalva/jwt-go \ 52 | dimchansky:utfbom:v1.1.0:dimchansky_utfbom/vendor/github.com/dimchansky/utfbom \ 53 | docker:go-connections:v0.4.0:docker_go_connections/vendor/github.com/docker/go-connections \ 54 | docker:go-units:v0.4.0:docker_go_units/vendor/github.com/docker/go-units \ 55 | dsnet:compress:v0.0.1:dsnet_compress/vendor/github.com/dsnet/compress \ 56 | duosecurity:duo_api_golang:6c680f768e74:duosecurity_duo_api_golang/vendor/github.com/duosecurity/duo_api_golang \ 57 | elazarl:go-bindata-assetfs:v1.0.0:elazarl_go_bindata_assetfs/vendor/github.com/elazarl/go-bindata-assetfs \ 58 | etcd-io:bbolt:v1.3.3:etcd_io_bbolt/vendor/go.etcd.io/bbolt \ 59 | etcd-io:etcd:3cf2f69b5738:etcd_io_etcd/vendor/go.etcd.io/etcd \ 60 | fatih:color:v1.7.0:fatih_color/vendor/github.com/fatih/color \ 61 | fatih:structs:v1.1.0:fatih_structs/vendor/github.com/fatih/structs \ 62 | fullsailor:pkcs7:d7302db945fa:fullsailor_pkcs7/vendor/github.com/fullsailor/pkcs7 \ 63 | gammazero:deque:2afb3858e9c7:gammazero_deque/vendor/github.com/gammazero/deque \ 64 | gammazero:workerpool:88d534f22b56:gammazero_workerpool/vendor/github.com/gammazero/workerpool \ 65 | ghodss:yaml:25d852aebe32:ghodss_yaml/vendor/github.com/ghodss/yaml \ 66 | go-asn1-ber:asn1-ber:v1.3.1:go_asn1_ber_asn1_ber/vendor/github.com/go-asn1-ber/asn1-ber \ 67 | go-errors:errors:v1.0.1:go_errors_errors/vendor/github.com/go-errors/errors \ 68 | go-inf:inf:v0.9.1:go_inf_inf/vendor/gopkg.in/inf.v0 \ 69 | go-ini:ini:v1.42.0:go_ini_ini/vendor/gopkg.in/ini.v1 \ 70 | go-ldap:ldap:v3.1.3:go_ldap_ldap_v3/vendor/github.com/go-ldap/ldap/v3 \ 71 | go-mgo:mgo:9856a29383ce:go_mgo_mgo/vendor/gopkg.in/mgo.v2 \ 72 | go-ole:go-ole:v1.2.1:go_ole_go_ole/vendor/github.com/go-ole/go-ole \ 73 | go-sql-driver:mysql:v1.4.1:go_sql_driver_mysql/vendor/github.com/go-sql-driver/mysql \ 74 | go-stack:stack:v1.8.0:go_stack_stack/vendor/github.com/go-stack/stack \ 75 | go-test:deep:v1.0.2:go_test_deep/vendor/github.com/go-test/deep \ 76 | go-yaml:yaml:v2.1.0:go_yaml_yaml/vendor/github.com/go-yaml/yaml \ 77 | go-yaml:yaml:v2.2.5:go_yaml_yaml_1/vendor/gopkg.in/yaml.v2 \ 78 | gocql:gocql:0e1d5de854df:gocql_gocql/vendor/github.com/gocql/gocql \ 79 | gogo:protobuf:v1.2.1:gogo_protobuf/vendor/github.com/gogo/protobuf \ 80 | golang:appengine:v1.6.0:golang_appengine/vendor/google.golang.org/appengine \ 81 | golang:crypto:530e935923ad:golang_crypto/vendor/golang.org/x/crypto \ 82 | golang:net:6afb5195e5aa:golang_net/vendor/golang.org/x/net \ 83 | golang:oauth2:0f29369cfe45:golang_oauth2/vendor/golang.org/x/oauth2 \ 84 | golang:protobuf:v1.3.2:golang_protobuf/vendor/github.com/golang/protobuf \ 85 | golang:snappy:v0.0.1:golang_snappy/vendor/github.com/golang/snappy \ 86 | golang:sync:cd5d95a43a6e:golang_sync/vendor/golang.org/x/sync \ 87 | golang:sys:e047566fdf82:golang_sys/vendor/golang.org/x/sys \ 88 | golang:text:v0.3.2:golang_text/vendor/golang.org/x/text \ 89 | golang:time:9d24e82272b4:golang_time/vendor/golang.org/x/time \ 90 | google:go-genproto:fa694d86fc64:google_go_genproto/vendor/google.golang.org/genproto \ 91 | google:go-github:v17.0.0:google_go_github/vendor/github.com/google/go-github \ 92 | google:go-metrics-stackdriver:v0.2.0:google_go_metrics_stackdriver/vendor/github.com/google/go-metrics-stackdriver \ 93 | google:go-querystring:v1.0.0:google_go_querystring/vendor/github.com/google/go-querystring \ 94 | google:gofuzz:v1.0.0:google_gofuzz/vendor/github.com/google/gofuzz \ 95 | google:uuid:v1.0.0:google_uuid/vendor/github.com/google/uuid \ 96 | googleapis:gax-go:v2.0.5:googleapis_gax_go_v2/vendor/github.com/googleapis/gax-go \ 97 | googleapis:google-api-go-client:v0.14.0:googleapis_google_api_go_client/vendor/google.golang.org/api \ 98 | googleapis:google-cloud-go:v0.39.0:googleapis_google_cloud_go/vendor/cloud.google.com/go \ 99 | gorhill:cronexpr:88b0669f7d75:gorhill_cronexpr/vendor/github.com/gorhill/cronexpr \ 100 | gorilla:websocket:v1.4.1:gorilla_websocket/vendor/github.com/gorilla/websocket \ 101 | grpc:grpc-go:v1.23.1:grpc_grpc_go/vendor/google.golang.org/grpc \ 102 | hailocab:go-hostpool:e80d13ce29ed:hailocab_go_hostpool/vendor/github.com/hailocab/go-hostpool \ 103 | hashicorp:consul-template:v0.22.0:hashicorp_consul_template/vendor/github.com/hashicorp/consul-template \ 104 | hashicorp:consul:6681be918a6e:hashicorp_consul_api/vendor/github.com/hashicorp/consul \ 105 | hashicorp:errwrap:v1.0.0:hashicorp_errwrap/vendor/github.com/hashicorp/errwrap \ 106 | hashicorp:go-cleanhttp:v0.5.1:hashicorp_go_cleanhttp/vendor/github.com/hashicorp/go-cleanhttp \ 107 | hashicorp:go-gcp-common:v0.6.0:hashicorp_go_gcp_common/vendor/github.com/hashicorp/go-gcp-common \ 108 | hashicorp:go-hclog:v0.12.0:hashicorp_go_hclog/vendor/github.com/hashicorp/go-hclog \ 109 | hashicorp:go-immutable-radix:v1.1.0:hashicorp_go_immutable_radix/vendor/github.com/hashicorp/go-immutable-radix \ 110 | hashicorp:go-kms-wrapping:entropy/v0.1.0:hashicorp_go_kms_wrapping_entropy \ 111 | hashicorp:go-kms-wrapping:v0.5.1:hashicorp_go_kms_wrapping/vendor/github.com/hashicorp/go-kms-wrapping \ 112 | hashicorp:go-memdb:v1.0.2:hashicorp_go_memdb/vendor/github.com/hashicorp/go-memdb \ 113 | hashicorp:go-msgpack:v0.5.5:hashicorp_go_msgpack/vendor/github.com/hashicorp/go-msgpack \ 114 | hashicorp:go-multierror:v1.0.0:hashicorp_go_multierror/vendor/github.com/hashicorp/go-multierror \ 115 | hashicorp:go-plugin:v1.0.1:hashicorp_go_plugin/vendor/github.com/hashicorp/go-plugin \ 116 | hashicorp:go-raftchunking:7e9e8525653a:hashicorp_go_raftchunking/vendor/github.com/hashicorp/go-raftchunking \ 117 | hashicorp:go-retryablehttp:v0.6.2:hashicorp_go_retryablehttp/vendor/github.com/hashicorp/go-retryablehttp \ 118 | hashicorp:go-rootcerts:v1.0.2:hashicorp_go_rootcerts/vendor/github.com/hashicorp/go-rootcerts \ 119 | hashicorp:go-sockaddr:v1.0.2:hashicorp_go_sockaddr/vendor/github.com/hashicorp/go-sockaddr \ 120 | hashicorp:go-syslog:v1.0.0:hashicorp_go_syslog/vendor/github.com/hashicorp/go-syslog \ 121 | hashicorp:go-uuid:v1.0.2:hashicorp_go_uuid/vendor/github.com/hashicorp/go-uuid \ 122 | hashicorp:go-version:v1.2.0:hashicorp_go_version/vendor/github.com/hashicorp/go-version \ 123 | hashicorp:golang-lru:v0.5.3:hashicorp_golang_lru/vendor/github.com/hashicorp/golang-lru \ 124 | hashicorp:hcl:v1.0.0:hashicorp_hcl/vendor/github.com/hashicorp/hcl \ 125 | hashicorp:logutils:v1.0.0:hashicorp_logutils/vendor/github.com/hashicorp/logutils \ 126 | hashicorp:nomad:edc62acd919d:hashicorp_nomad_api/vendor/github.com/hashicorp/nomad \ 127 | hashicorp:raft-snapshot:8117efcc5aab:hashicorp_raft_snapshot/vendor/github.com/hashicorp/raft-snapshot \ 128 | hashicorp:raft:9c6bd3e3eb17:hashicorp_raft/vendor/github.com/hashicorp/raft \ 129 | hashicorp:serf:v0.8.3:hashicorp_serf/vendor/github.com/hashicorp/serf \ 130 | hashicorp:vault-plugin-auth-alicloud:v0.5.4-beta1:hashicorp_vault_plugin_auth_alicloud/vendor/github.com/hashicorp/vault-plugin-auth-alicloud \ 131 | hashicorp:vault-plugin-auth-azure:v0.5.4-beta1:hashicorp_vault_plugin_auth_azure/vendor/github.com/hashicorp/vault-plugin-auth-azure \ 132 | hashicorp:vault-plugin-auth-centrify:v0.5.4-beta1:hashicorp_vault_plugin_auth_centrify/vendor/github.com/hashicorp/vault-plugin-auth-centrify \ 133 | hashicorp:vault-plugin-auth-cf:v0.5.3-beta1:hashicorp_vault_plugin_auth_cf/vendor/github.com/hashicorp/vault-plugin-auth-cf \ 134 | hashicorp:vault-plugin-auth-gcp:v0.6.0-beta1:hashicorp_vault_plugin_auth_gcp/vendor/github.com/hashicorp/vault-plugin-auth-gcp \ 135 | hashicorp:vault-plugin-auth-jwt:v0.6.0-beta1:hashicorp_vault_plugin_auth_jwt/vendor/github.com/hashicorp/vault-plugin-auth-jwt \ 136 | hashicorp:vault-plugin-auth-kerberos:v0.1.4-beta1:hashicorp_vault_plugin_auth_kerberos/vendor/github.com/hashicorp/vault-plugin-auth-kerberos \ 137 | hashicorp:vault-plugin-auth-kubernetes:v0.6.0-beta1:hashicorp_vault_plugin_auth_kubernetes/vendor/github.com/hashicorp/vault-plugin-auth-kubernetes \ 138 | hashicorp:vault-plugin-auth-oci:v0.5.3-beta1:hashicorp_vault_plugin_auth_oci/vendor/github.com/hashicorp/vault-plugin-auth-oci \ 139 | hashicorp:vault-plugin-database-elasticsearch:v0.5.3-beta1:hashicorp_vault_plugin_database_elasticsearch/vendor/github.com/hashicorp/vault-plugin-database-elasticsearch \ 140 | hashicorp:vault-plugin-database-mongodbatlas:v0.1.0-beta1:hashicorp_vault_plugin_database_mongodbatlas/vendor/github.com/hashicorp/vault-plugin-database-mongodbatlas \ 141 | hashicorp:vault-plugin-secrets-ad:v0.6.4-beta1:hashicorp_vault_plugin_secrets_ad/vendor/github.com/hashicorp/vault-plugin-secrets-ad \ 142 | hashicorp:vault-plugin-secrets-alicloud:v0.5.4-beta1:hashicorp_vault_plugin_secrets_alicloud/vendor/github.com/hashicorp/vault-plugin-secrets-alicloud \ 143 | hashicorp:vault-plugin-secrets-azure:v0.5.5-beta1:hashicorp_vault_plugin_secrets_azure/vendor/github.com/hashicorp/vault-plugin-secrets-azure \ 144 | hashicorp:vault-plugin-secrets-gcp:v0.6.0-beta1:hashicorp_vault_plugin_secrets_gcp/vendor/github.com/hashicorp/vault-plugin-secrets-gcp \ 145 | hashicorp:vault-plugin-secrets-gcpkms:v0.5.4-beta1:hashicorp_vault_plugin_secrets_gcpkms/vendor/github.com/hashicorp/vault-plugin-secrets-gcpkms \ 146 | hashicorp:vault-plugin-secrets-kv:v0.5.4-beta1:hashicorp_vault_plugin_secrets_kv/vendor/github.com/hashicorp/vault-plugin-secrets-kv \ 147 | hashicorp:vault-plugin-secrets-mongodbatlas:v0.1.1:hashicorp_vault_plugin_secrets_mongodbatlas/vendor/github.com/hashicorp/vault-plugin-secrets-mongodbatlas \ 148 | hashicorp:vault-plugin-secrets-openldap:e7553b03b931:hashicorp_vault_plugin_secrets_openldap/vendor/github.com/hashicorp/vault-plugin-secrets-openldap \ 149 | hashicorp:vault:03a3749f220d:hashicorp_vault_sdk/github.com/hashicorp/vault \ 150 | hashicorp:vault:f6547fa8e820:hashicorp_vault_api \ 151 | hashicorp:yamux:2f1d1f20f75d:hashicorp_yamux/vendor/github.com/hashicorp/yamux \ 152 | influxdata:influxdb:d24b7ba8c4c4:influxdata_influxdb/vendor/github.com/influxdata/influxdb \ 153 | jackc:pgx:v3.3.0:jackc_pgx/vendor/github.com/jackc/pgx \ 154 | jcmturner:aescts:v1.0.1:jcmturner_aescts/vendor/github.com/jcmturner/aescts \ 155 | jcmturner:dnsutils:v1.0.1:jcmturner_dnsutils/vendor/github.com/jcmturner/dnsutils \ 156 | jcmturner:gofork:v1.0.0:jcmturner_gofork/vendor/github.com/jcmturner/gofork \ 157 | jcmturner:goidentity:v3.0.0:jcmturner_goidentity/vendor/gopkg.in/jcmturner/goidentity.v3 \ 158 | jcmturner:goidentity:v6.0.1:jcmturner_goidentity_v6/vendor/github.com/jcmturner/goidentity \ 159 | jcmturner:gokrb5:v8.0.0:jcmturner_gokrb5_v8/vendor/github.com/jcmturner/gokrb5 \ 160 | jcmturner:rpc:v2.0.2:jcmturner_rpc_v2/vendor/github.com/jcmturner/rpc \ 161 | jeffchao:backoff:9d7fd7aa17f2:jeffchao_backoff/vendor/github.com/jeffchao/backoff \ 162 | jefferai:isbadcipher:51d2077c035f:jefferai_isbadcipher/vendor/github.com/jefferai/isbadcipher \ 163 | jefferai:jsonx:v1.0.0:jefferai_jsonx/vendor/github.com/jefferai/jsonx \ 164 | jmespath:go-jmespath:c2b33e8439af:jmespath_go_jmespath/vendor/github.com/jmespath/go-jmespath \ 165 | joyent:triton-go:51ffac552869:joyent_triton_go/vendor/github.com/joyent/triton-go \ 166 | json-iterator:go:v1.1.9:json_iterator_go/vendor/github.com/json-iterator/go \ 167 | kelseyhightower:envconfig:v1.3.0:kelseyhightower_envconfig/vendor/github.com/kelseyhightower/envconfig \ 168 | keybase:go-crypto:d65b6b94177f:keybase_go_crypto/vendor/github.com/keybase/go-crypto \ 169 | konsorten:go-windows-terminal-sequences:v1.0.1:konsorten_go_windows_terminal_sequences/vendor/github.com/konsorten/go-windows-terminal-sequences \ 170 | kr:pretty:v0.1.0:kr_pretty/vendor/github.com/kr/pretty \ 171 | kr:text:v0.1.0:kr_text/vendor/github.com/kr/text \ 172 | kubernetes:api:d687e77c8ae9:kubernetes_api/vendor/k8s.io/api \ 173 | kubernetes:apimachinery:760d1845f48b:kubernetes_apimachinery/vendor/k8s.io/apimachinery \ 174 | kubernetes:klog:8e90cee79f82:kubernetes_klog/vendor/k8s.io/klog \ 175 | layeh:radius:890bc1058917:layeh_radius/vendor/layeh.com/radius \ 176 | lib:pq:v1.2.0:lib_pq/vendor/github.com/lib/pq \ 177 | mattn:go-colorable:v0.1.4:mattn_go_colorable/vendor/github.com/mattn/go-colorable \ 178 | mattn:go-isatty:v0.0.10:mattn_go_isatty/vendor/github.com/mattn/go-isatty \ 179 | mattn:go-shellwords:v1.0.5:mattn_go_shellwords/vendor/github.com/mattn/go-shellwords \ 180 | matttproud:golang_protobuf_extensions:v1.0.1:matttproud_golang_protobuf_extensions/vendor/github.com/matttproud/golang_protobuf_extensions \ 181 | mholt:archiver:v3.1.1:mholt_archiver/vendor/github.com/mholt/archiver \ 182 | michaelklishin:rabbit-hole:93d9988f0cd5:michaelklishin_rabbit_hole/vendor/github.com/michaelklishin/rabbit-hole \ 183 | mitchellh:cli:v1.0.0:mitchellh_cli/vendor/github.com/mitchellh/cli \ 184 | mitchellh:copystructure:v1.0.0:mitchellh_copystructure/vendor/github.com/mitchellh/copystructure \ 185 | mitchellh:go-homedir:v1.1.0:mitchellh_go_homedir/vendor/github.com/mitchellh/go-homedir \ 186 | mitchellh:go-testing-interface:v1.0.0:mitchellh_go_testing_interface/vendor/github.com/mitchellh/go-testing-interface \ 187 | mitchellh:hashstructure:v1.0.0:mitchellh_hashstructure/vendor/github.com/mitchellh/hashstructure \ 188 | mitchellh:mapstructure:v1.1.2:mitchellh_mapstructure/vendor/github.com/mitchellh/mapstructure \ 189 | mitchellh:pointerstructure:f252a8fd71c8:mitchellh_pointerstructure/vendor/github.com/mitchellh/pointerstructure \ 190 | mitchellh:reflectwalk:v1.0.1:mitchellh_reflectwalk/vendor/github.com/mitchellh/reflectwalk \ 191 | modern-go:concurrent:bacd9c7ef1dd:modern_go_concurrent/vendor/github.com/modern-go/concurrent \ 192 | modern-go:reflect2:v1.0.1:modern_go_reflect2/vendor/github.com/modern-go/reflect2 \ 193 | mongodb:go-client-mongodb-atlas:v0.1.2:mongodb_go_client_mongodb_atlas/vendor/github.com/mongodb/go-client-mongodb-atlas \ 194 | mongodb:mongo-go-driver:v1.2.1:mongodb_mongo_go_driver/vendor/go.mongodb.org/mongo-driver \ 195 | mwielbut:pointy:v1.1.0:mwielbut_pointy/vendor/github.com/mwielbut/pointy \ 196 | ncw:swift:v1.0.47:ncw_swift/vendor/github.com/ncw/swift \ 197 | nwaples:rardecode:v1.0.0:nwaples_rardecode/vendor/github.com/nwaples/rardecode \ 198 | oklog:run:v1.0.0:oklog_run/vendor/github.com/oklog/run \ 199 | okta:okta-sdk-golang:v1.0.1:okta_okta_sdk_golang/vendor/github.com/okta/okta-sdk-golang \ 200 | opencontainers:go-digest:v1.0.0-rc1:opencontainers_go_digest/vendor/github.com/opencontainers/go-digest \ 201 | opencontainers:image-spec:v1.0.1:opencontainers_image_spec/vendor/github.com/opencontainers/image-spec \ 202 | opencontainers:runc:v0.1.1:opencontainers_runc/vendor/github.com/opencontainers/runc \ 203 | oracle:oci-go-sdk:v12.5.0:oracle_oci_go_sdk/vendor/github.com/oracle/oci-go-sdk \ 204 | ory-am:dockertest:v3.3.4:ory_am_dockertest/vendor/gopkg.in/ory-am/dockertest.v3 \ 205 | ory:dockertest:v3.3.5:ory_dockertest/vendor/github.com/ory/dockertest \ 206 | patrickmn:go-cache:v2.1.0:patrickmn_go_cache/vendor/github.com/patrickmn/go-cache \ 207 | petermattis:goid:b0b1615b78e5:petermattis_goid/vendor/github.com/petermattis/goid \ 208 | pierrec:lz4:v2.2.6:pierrec_lz4/vendor/github.com/pierrec/lz4 \ 209 | pkg:errors:v0.8.1:pkg_errors/vendor/github.com/pkg/errors \ 210 | pmezard:go-difflib:v1.0.0:pmezard_go_difflib/vendor/github.com/pmezard/go-difflib \ 211 | posener:complete:v1.2.1:posener_complete/vendor/github.com/posener/complete \ 212 | pquerna:cachecontrol:1555304b9b35:pquerna_cachecontrol/vendor/github.com/pquerna/cachecontrol \ 213 | pquerna:otp:468c2dd2b58d:pquerna_otp/vendor/github.com/pquerna/otp \ 214 | prometheus:client_golang:v1.4.0:prometheus_client_golang/vendor/github.com/prometheus/client_golang \ 215 | prometheus:client_model:v0.2.0:prometheus_client_model/vendor/github.com/prometheus/client_model \ 216 | prometheus:common:v0.9.1:prometheus_common/vendor/github.com/prometheus/common \ 217 | prometheus:procfs:v0.0.8:prometheus_procfs/vendor/github.com/prometheus/procfs \ 218 | ryanuber:columnize:v2.1.0:ryanuber_columnize/vendor/github.com/ryanuber/columnize \ 219 | ryanuber:go-glob:v1.0.0:ryanuber_go_glob/vendor/github.com/ryanuber/go-glob \ 220 | samuel:go-zookeeper:c4fab1ac1bec:samuel_go_zookeeper/vendor/github.com/samuel/go-zookeeper \ 221 | sasha-s:go-deadlock:v0.2.0:sasha_s_go_deadlock/vendor/github.com/sasha-s/go-deadlock \ 222 | satori:go.uuid:v1.2.0:satori_go_uuid/vendor/github.com/satori/go.uuid \ 223 | shirou:gopsutil:v2.19.9:shirou_gopsutil/vendor/github.com/shirou/gopsutil \ 224 | shirou:w32:bb4de0191aa4:shirou_w32/vendor/github.com/shirou/w32 \ 225 | sirupsen:logrus:v1.4.2:sirupsen_logrus/vendor/github.com/sirupsen/logrus \ 226 | square:go-jose:v2.4.1:square_go_jose/vendor/gopkg.in/square/go-jose.v2 \ 227 | stretchr:testify:v1.4.0:stretchr_testify/vendor/github.com/stretchr/testify \ 228 | tv42:httpunix:b75d8614f926:tv42_httpunix/vendor/github.com/tv42/httpunix \ 229 | uber-go:atomic:v1.4.0:uber_go_atomic/vendor/go.uber.org/atomic \ 230 | uber-go:multierr:v1.1.0:uber_go_multierr/vendor/go.uber.org/multierr \ 231 | uber-go:zap:v1.10.0:uber_go_zap/vendor/go.uber.org/zap \ 232 | ulikunitz:xz:v0.5.6:ulikunitz_xz/vendor/github.com/ulikunitz/xz \ 233 | xdg:scram:7eeb5667e42c:xdg_scram/vendor/github.com/xdg/scram \ 234 | xdg:stringprep:v1.0.0:xdg_stringprep/vendor/github.com/xdg/stringprep \ 235 | xi2:xz:48954b6210f8:xi2_xz/vendor/github.com/xi2/xz 236 | 237 | post-extract: 238 | @${RM} -r ${WRKSRC}/api 239 | @${RLN} ${WRKSRC_hashicorp_vault_api}/api ${WRKSRC}/api 240 | @${RM} -r ${WRKSRC}/sdk 241 | @${RLN} ${WRKSRC_hashicorp_vault_sdk}/sdk ${WRKSRC}/sdk 242 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest 243 | @${RLN} ${WRKSRC_azure_go_autorest_autorest}/autorest ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest 244 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/adal 245 | @${RLN} ${WRKSRC_azure_go_autorest_adal}/autorest/adal ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/adal 246 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/azure/auth 247 | @${RLN} ${WRKSRC_azure_go_autorest_auth}/autorest/azure/auth ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/azure/auth 248 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/azure/cli 249 | @${RLN} ${WRKSRC_azure_go_autorest_cli}/autorest/azure/cli ${WRKSRC}/vendor/github.com/Azure/go-autorest/autorest/azure/cli 250 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/logger 251 | @${RLN} ${WRKSRC_azure_go_autorest_logger}/logger ${WRKSRC}/vendor/github.com/Azure/go-autorest/logger 252 | @${RM} -r ${WRKSRC}/vendor/github.com/Azure/go-autorest/tracing 253 | @${RLN} ${WRKSRC_azure_go_autorest_tracing}/tracing ${WRKSRC}/vendor/github.com/Azure/go-autorest/tracing 254 | @${RM} -r ${WRKSRC}/vendor/github.com/hashicorp/go-kms-wrapping/entropy 255 | @${RLN} ${WRKSRC_hashicorp_go_kms_wrapping_entropy}/entropy ${WRKSRC}/vendor/github.com/hashicorp/go-kms-wrapping/entropy 256 | -------------------------------------------------------------------------------- /tuple/discovery.go: -------------------------------------------------------------------------------- 1 | package tuple 2 | 3 | import ( 4 | "encoding/xml" 5 | "fmt" 6 | "io" 7 | "net/http" 8 | "net/url" 9 | "regexp" 10 | "strings" 11 | ) 12 | 13 | func discoverMirrors(pkg string) (string, error) { 14 | u, err := pkgURL(pkg) 15 | if err != nil { 16 | return "", err 17 | } 18 | resp, err := http.Get(u) 19 | if err != nil { 20 | return "", fmt.Errorf("tuple.discoverMirrors %s: %v", u, err) 21 | } 22 | defer resp.Body.Close() 23 | 24 | switch resp.StatusCode { 25 | case http.StatusOK: 26 | return parseMetaGoImports(resp.Body) 27 | default: 28 | return "", fmt.Errorf("tuple.discoverMirrors %s: status %d", u, resp.StatusCode) 29 | } 30 | } 31 | 32 | // HTML meta imports discovery code adopted from 33 | // https://github.com/golang/go/blob/master/src/cmd/go/internal/get/discovery.go 34 | func parseMetaGoImports(r io.Reader) (string, error) { 35 | d := xml.NewDecoder(r) 36 | d.CharsetReader = charsetReader 37 | d.Strict = false 38 | 39 | for { 40 | t, err := d.RawToken() 41 | if err != nil { 42 | if err != io.EOF { 43 | return "", err 44 | } 45 | break 46 | } 47 | if e, ok := t.(xml.StartElement); ok && strings.EqualFold(e.Name.Local, "body") { 48 | break 49 | } 50 | if e, ok := t.(xml.EndElement); ok && strings.EqualFold(e.Name.Local, "head") { 51 | break 52 | } 53 | e, ok := t.(xml.StartElement) 54 | if !ok || !strings.EqualFold(e.Name.Local, "meta") { 55 | continue 56 | } 57 | if attrValue(e.Attr, "name") != "go-import" { 58 | continue 59 | } 60 | if f := strings.Fields(attrValue(e.Attr, "content")); len(f) == 3 { 61 | if f[1] == "git" { 62 | repo := schemeRe.ReplaceAllString(f[2], "") 63 | return suffixRe.ReplaceAllString(repo, ""), nil 64 | } 65 | } 66 | } 67 | return "", nil 68 | } 69 | 70 | var ( 71 | schemeRe = regexp.MustCompile(`\Ahttps?://`) 72 | suffixRe = regexp.MustCompile(`\.git\z`) 73 | ) 74 | 75 | func pkgURL(pkg string) (string, error) { 76 | u, err := url.Parse(pkg) 77 | if err != nil { 78 | return "", err 79 | } 80 | 81 | u.Scheme = "https" 82 | q := u.Query() 83 | q.Set("go-get", "1") 84 | u.RawQuery = q.Encode() 85 | 86 | return u.String(), nil 87 | } 88 | 89 | func charsetReader(charset string, input io.Reader) (io.Reader, error) { 90 | switch strings.ToLower(charset) { 91 | case "utf-8", "ascii": 92 | return input, nil 93 | default: 94 | return nil, fmt.Errorf("can't decode XML document using charset %q", charset) 95 | } 96 | } 97 | 98 | func attrValue(attrs []xml.Attr, name string) string { 99 | for _, a := range attrs { 100 | if strings.EqualFold(a.Name.Local, name) { 101 | return a.Value 102 | } 103 | } 104 | return "" 105 | } 106 | -------------------------------------------------------------------------------- /tuple/resolver.go: -------------------------------------------------------------------------------- 1 | package tuple 2 | 3 | import ( 4 | "fmt" 5 | "regexp" 6 | "strings" 7 | 8 | "github.com/dmgk/modules2tuple/v2/config" 9 | "github.com/dmgk/modules2tuple/v2/debug" 10 | ) 11 | 12 | type SourceError string 13 | 14 | func (err SourceError) Error() string { 15 | return string(err) 16 | } 17 | 18 | // Resolve looks up mirrors and parses tuple account and project. 19 | func Resolve(pkg, version, subdir, link_target string) (*Tuple, error) { 20 | t := &Tuple{ 21 | pkg: pkg, 22 | version: version, 23 | subdir: subdir, 24 | link_tgt: link_target, 25 | group: "group_name", 26 | } 27 | 28 | var done bool 29 | for { 30 | // try static mirror lookup first 31 | for _, r := range resolvers { 32 | if strings.HasPrefix(pkg, r.prefix) { 33 | m, err := r.resolver.resolve(pkg) 34 | if err != nil { 35 | return nil, err 36 | } 37 | if m != nil { 38 | t.makeResolved(m.source, m.account, m.project, m.module) 39 | return t, nil 40 | } 41 | } 42 | } 43 | 44 | if done || config.Offline { 45 | break 46 | } 47 | 48 | // try looking up missing mirror online 49 | m, err := discoverMirrors(pkg) 50 | if err != nil { 51 | return nil, err 52 | } 53 | debug.Printf("[tuple.Resolve] discovered mirror %q for %q\n", m, pkg) 54 | pkg = m 55 | done = true 56 | } 57 | 58 | return nil, SourceError(fmt.Sprintf("%s (from %s@%s)", t.String(), pkg, version)) 59 | } 60 | 61 | type mirror struct { 62 | source Source 63 | account string 64 | project string 65 | module string 66 | } 67 | 68 | type resolver interface { 69 | resolve(pkg string) (*mirror, error) 70 | } 71 | 72 | func (m *mirror) resolve(string) (*mirror, error) { 73 | return m, nil 74 | } 75 | 76 | type mirrorFn func(pkg string) (*mirror, error) 77 | 78 | func (f mirrorFn) resolve(pkg string) (*mirror, error) { 79 | return f(pkg) 80 | } 81 | 82 | var resolvers = []struct { 83 | prefix string 84 | resolver resolver 85 | }{ 86 | // Docker is a special snowflake 87 | {"github.com/docker/docker", &mirror{GH, "moby", "moby", ""}}, 88 | 89 | {"github.com", mirrorFn(githubResolver)}, 90 | {"gitlab.com", mirrorFn(gitlabResolver)}, 91 | 92 | {"contrib.go.opencensus.io/exporter/ocagent", &mirror{GH, "census-ecosystem", "opencensus-go-exporter-ocagent", ""}}, 93 | {"aletheia.icu/broccoli/fs", &mirror{GH, "aletheia-icu", "broccoli", "fs"}}, 94 | {"bazil.org", mirrorFn(bazilOrgResolver)}, 95 | {"camlistore.org", &mirror{GH, "perkeep", "perkeep", ""}}, 96 | {"cloud.google.com", mirrorFn(cloudGoogleComResolver)}, 97 | {"docker.io/go-docker", &mirror{GH, "docker", "go-docker", ""}}, 98 | {"git.apache.org/thrift.git", &mirror{GH, "apache", "thrift", ""}}, 99 | {"go.bug.st/serial.v1", &mirror{GH, "bugst", "go-serial", ""}}, 100 | {"go.elastic.co/apm", mirrorFn(goElasticCoResolver)}, 101 | {"go.elastic.co/fastjson", &mirror{GH, "elastic", "go-fastjson", ""}}, 102 | {"go.etcd.io", mirrorFn(goEtcdIoResolver)}, 103 | {"go.mongodb.org/mongo-driver", &mirror{GH, "mongodb", "mongo-go-driver", ""}}, 104 | {"go.mozilla.org", mirrorFn(goMozillaOrgResolver)}, 105 | {"go.opencensus.io", &mirror{GH, "census-instrumentation", "opencensus-go", ""}}, 106 | {"go.uber.org", mirrorFn(goUberOrgResolver)}, 107 | {"go4.org", &mirror{GH, "go4org", "go4", ""}}, 108 | {"gocloud.dev", &mirror{GH, "google", "go-cloud", ""}}, 109 | {"golang.org", mirrorFn(golangOrgResolver)}, 110 | {"golang.zx2c4.com/wireguard", &mirror{GH, "wireguard", "wireguard-go", ""}}, 111 | {"google.golang.org/api", &mirror{GH, "googleapis", "google-api-go-client", ""}}, 112 | {"google.golang.org/appengine", &mirror{GH, "golang", "appengine", ""}}, 113 | {"google.golang.org/genproto", &mirror{GH, "google", "go-genproto", ""}}, 114 | {"google.golang.org/grpc", &mirror{GH, "grpc", "grpc-go", ""}}, 115 | {"google.golang.org/protobuf", &mirror{GH, "protocolbuffers", "protobuf-go", ""}}, 116 | {"gopkg.in", mirrorFn(gopkgInResolver)}, 117 | {"gotest.tools", mirrorFn(gotestToolsResolver)}, 118 | {"honnef.co/go/tools", &mirror{GH, "dominikh", "go-tools", ""}}, 119 | {"howett.net/plist", &mirror{GitlabSource("https://gitlab.howett.net"), "go", "plist", ""}}, 120 | {"k8s.io", mirrorFn(k8sIoResolver)}, 121 | {"launchpad.net/gocheck", &mirror{GH, "go-check", "check", ""}}, 122 | {"layeh.com/radius", &mirror{GH, "layeh", "radius", ""}}, 123 | {"mvdan.cc", mirrorFn(mvdanCcResolver)}, 124 | {"rsc.io", mirrorFn(rscIoResolver)}, 125 | {"sigs.k8s.io/yaml", &mirror{GH, "kubernetes-sigs", "yaml", ""}}, 126 | {"tinygo.org/x/go-llvm", &mirror{GH, "tinygo-org", "go-llvm", ""}}, 127 | } 128 | 129 | func githubResolver(pkg string) (*mirror, error) { 130 | if !strings.HasPrefix(pkg, "github.com") { 131 | return nil, nil 132 | } 133 | parts := strings.SplitN(pkg, "/", 4) 134 | if len(parts) < 3 { 135 | return nil, fmt.Errorf("unexpected Github package name: %q", pkg) 136 | } 137 | var module string 138 | if len(parts) == 4 { 139 | module = parts[3] 140 | } 141 | return &mirror{GH, parts[1], parts[2], module}, nil 142 | } 143 | 144 | func gitlabResolver(pkg string) (*mirror, error) { 145 | if !strings.HasPrefix(pkg, "gitlab.com") { 146 | return nil, nil 147 | } 148 | parts := strings.SplitN(pkg, "/", 4) 149 | if len(parts) < 3 { 150 | return nil, fmt.Errorf("unexpected Gitlab package name: %q", pkg) 151 | } 152 | var module string 153 | if len(parts) == 4 { 154 | module = parts[3] 155 | } 156 | return &mirror{GL, parts[1], parts[2], module}, nil 157 | } 158 | 159 | // bazil.org/fuse -> github.com/bazil/fuse 160 | var bazilOrgRe = regexp.MustCompile(`\Abazil\.org/([0-9A-Za-z][-0-9A-Za-z]+)\z`) 161 | 162 | func bazilOrgResolver(pkg string) (*mirror, error) { 163 | if !bazilOrgRe.MatchString(pkg) { 164 | return nil, nil 165 | } 166 | sm := bazilOrgRe.FindAllStringSubmatch(pkg, -1) 167 | if len(sm) == 0 { 168 | return nil, nil 169 | } 170 | return &mirror{GH, "bazil", sm[0][1], ""}, nil 171 | } 172 | 173 | // cloud.google.com/go/* -> github.com/googleapis/google-cloud-go 174 | var cloudGoogleComRe = regexp.MustCompile(`\Acloud\.google\.com/go(?:/([0-9A-Za-z][-0-9A-Za-z]+))?\z`) 175 | 176 | func cloudGoogleComResolver(pkg string) (*mirror, error) { 177 | if !cloudGoogleComRe.MatchString(pkg) { 178 | return nil, nil 179 | } 180 | var module string 181 | sm := cloudGoogleComRe.FindAllStringSubmatch(pkg, -1) 182 | if len(sm) > 0 { 183 | module = sm[0][1] 184 | } 185 | return &mirror{GH, "googleapis", "google-cloud-go", module}, nil 186 | } 187 | 188 | // // code.cloudfoundry.org/gofileutils -> github.com/cloudfoundry/gofileutils 189 | // var codeCloudfoundryOrgRe = regexp.MustCompile(`\Acode\.cloudfoundry\.org/([0-9A-Za-z][-0-9A-Za-z]+)\z`) 190 | 191 | // func codeCloudfoundryOrgResolver(pkg string) (*mirror, error) { 192 | // if !codeCloudfoundryOrgRe.MatchString(pkg) { 193 | // return nil, nil 194 | // } 195 | // sm := codeCloudfoundryOrgRe.FindAllStringSubmatch(pkg, -1) 196 | // if len(sm) == 0 { 197 | // return nil, nil 198 | // } 199 | // return &mirror{GH, "cloudfoundry", sm[0][1], ""}, nil 200 | // } 201 | 202 | // go.elastic.co/apm -> github.com/elastic/apm-agent-go 203 | // go.elastic.co/apm/module/apmhttp -> github.com/elastic/apm-agent-go/module/apmhttp 204 | var goElasticCoModuleRe = regexp.MustCompile(`\Ago\.elastic\.co/apm(?:/(module/[0-9A-Za-z][-0-9A-Za-z]+))?\z`) 205 | 206 | func goElasticCoResolver(pkg string) (*mirror, error) { 207 | if !goElasticCoModuleRe.MatchString(pkg) { 208 | return nil, nil 209 | } 210 | var module string 211 | sm := goElasticCoModuleRe.FindAllStringSubmatch(pkg, -1) 212 | if len(sm) > 0 { 213 | module = sm[0][1] 214 | } 215 | return &mirror{GH, "elastic", "apm-agent-go", module}, nil 216 | } 217 | 218 | // go.etcd.io/etcd -> github.com/etcd-io/etcd 219 | var goEtcdIoRe = regexp.MustCompile(`\Ago\.etcd\.io/([0-9A-Za-z][-0-9A-Za-z]+)\z`) 220 | 221 | func goEtcdIoResolver(pkg string) (*mirror, error) { 222 | if !goEtcdIoRe.MatchString(pkg) { 223 | return nil, nil 224 | } 225 | sm := goEtcdIoRe.FindAllStringSubmatch(pkg, -1) 226 | if len(sm) == 0 { 227 | return nil, nil 228 | } 229 | return &mirror{GH, "etcd-io", sm[0][1], ""}, nil 230 | } 231 | 232 | // go.mozilla.org/gopgagent -> github.com/mozilla-services/gopgagent 233 | var goMozillaOrgRe = regexp.MustCompile(`\Ago\.mozilla\.org/([0-9A-Za-z][-0-9A-Za-z]+)\z`) 234 | 235 | func goMozillaOrgResolver(pkg string) (*mirror, error) { 236 | if !goMozillaOrgRe.MatchString(pkg) { 237 | return nil, nil 238 | } 239 | sm := goMozillaOrgRe.FindAllStringSubmatch(pkg, -1) 240 | if len(sm) == 0 { 241 | return nil, nil 242 | } 243 | return &mirror{GH, "mozilla-services", sm[0][1], ""}, nil 244 | } 245 | 246 | // go.uber.org/zap -> github.com/uber-go/zap 247 | var goUberOrgRe = regexp.MustCompile(`\Ago\.uber\.org/([0-9A-Za-z][-0-9A-Za-z]+)\z`) 248 | 249 | func goUberOrgResolver(pkg string) (*mirror, error) { 250 | if !goUberOrgRe.MatchString(pkg) { 251 | return nil, nil 252 | } 253 | sm := goUberOrgRe.FindAllStringSubmatch(pkg, -1) 254 | if len(sm) == 0 { 255 | return nil, nil 256 | } 257 | return &mirror{GH, "uber-go", sm[0][1], ""}, nil 258 | } 259 | 260 | // golang.org/x/pkg -> github.com/golang/pkg 261 | var golangOrgRe = regexp.MustCompile(`\Agolang\.org/x/([0-9A-Za-z][-0-9A-Za-z]+)\z`) 262 | 263 | func golangOrgResolver(pkg string) (*mirror, error) { 264 | if !golangOrgRe.MatchString(pkg) { 265 | return nil, nil 266 | } 267 | sm := golangOrgRe.FindAllStringSubmatch(pkg, -1) 268 | if len(sm) == 0 { 269 | return nil, nil 270 | } 271 | return &mirror{GH, "golang", sm[0][1], ""}, nil 272 | } 273 | 274 | // gopkg.in/pkg.v3 -> github.com/go-pkg/pkg 275 | // gopkg.in/user/pkg.v3 -> github.com/user/pkg 276 | var gopkgInRe = regexp.MustCompile(`\Agopkg\.in/([0-9A-Za-z][-0-9A-Za-z]+)(?:\.v.+)?(?:/([0-9A-Za-z][-0-9A-Za-z]+)(?:\.v.+))?\z`) 277 | 278 | func gopkgInResolver(pkg string) (*mirror, error) { 279 | if !gopkgInRe.MatchString(pkg) { 280 | return nil, nil 281 | } 282 | // fsnotify is a special case in gopkg.in 283 | if pkg == "gopkg.in/fsnotify.v1" { 284 | return &mirror{GH, "fsnotify", "fsnotify", ""}, nil 285 | } 286 | sm := gopkgInRe.FindAllStringSubmatch(pkg, -1) 287 | if len(sm) == 0 { 288 | return nil, nil 289 | } 290 | var account, project string 291 | if sm[0][2] == "" { 292 | account = "go-" + sm[0][1] 293 | project = sm[0][1] 294 | } else { 295 | account = sm[0][1] 296 | project = sm[0][2] 297 | } 298 | return &mirror{GH, account, project, ""}, nil 299 | } 300 | 301 | // k8s.io/api -> github.com/kubernetes/api 302 | var k8sIoRe = regexp.MustCompile(`\Ak8s\.io/([0-9A-Za-z][-0-9A-Za-z]+)\z`) 303 | 304 | func k8sIoResolver(pkg string) (*mirror, error) { 305 | if !k8sIoRe.MatchString(pkg) { 306 | return nil, nil 307 | } 308 | sm := k8sIoRe.FindAllStringSubmatch(pkg, -1) 309 | if len(sm) == 0 { 310 | return nil, nil 311 | } 312 | return &mirror{GH, "kubernetes", sm[0][1], ""}, nil 313 | } 314 | 315 | // mvdan.cc/editorconfig -> github.com/mvdan/editconfig 316 | var mvdanCcRe = regexp.MustCompile(`\Amvdan\.cc/([0-9A-Za-z][-0-9A-Za-z]+)\z`) 317 | 318 | func mvdanCcResolver(pkg string) (*mirror, error) { 319 | if !mvdanCcRe.MatchString(pkg) { 320 | return nil, nil 321 | } 322 | sm := mvdanCcRe.FindAllStringSubmatch(pkg, -1) 323 | if len(sm) == 0 { 324 | return nil, nil 325 | } 326 | return &mirror{GH, "mvdan", sm[0][1], ""}, nil 327 | } 328 | 329 | // rsc.io/pdf -> github.com/rsc/pdf 330 | var rscIoRe = regexp.MustCompile(`\Arsc\.io/([0-9A-Za-z][-0-9A-Za-z]+)\z`) 331 | 332 | func rscIoResolver(pkg string) (*mirror, error) { 333 | if !rscIoRe.MatchString(pkg) { 334 | return nil, nil 335 | } 336 | sm := rscIoRe.FindAllStringSubmatch(pkg, -1) 337 | if len(sm) == 0 { 338 | return nil, nil 339 | } 340 | return &mirror{GH, "rsc", sm[0][1], ""}, nil 341 | } 342 | 343 | func gotestToolsResolver(pkg string) (*mirror, error) { 344 | switch pkg { 345 | case "gotest.tools": 346 | return &mirror{GH, "gotestyourself", "gotest.tools", ""}, nil 347 | case "gotest.tools/gotestsum": 348 | return &mirror{GH, "gotestyourself", "gotestsum", ""}, nil 349 | } 350 | return nil, nil 351 | } 352 | -------------------------------------------------------------------------------- /tuple/resolver_test.go: -------------------------------------------------------------------------------- 1 | package tuple 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/dmgk/modules2tuple/v2/config" 8 | ) 9 | 10 | func init() { 11 | config.Offline = true 12 | } 13 | 14 | type resolverExample struct { 15 | pkg string 16 | source Source 17 | account, project, module string 18 | } 19 | 20 | func TestGithubResolver(t *testing.T) { 21 | examples := []resolverExample{ 22 | {"github.com/pkg/errors", GH, "pkg", "errors", ""}, 23 | {"github.com/konsorten/go-windows-terminal-sequences", GH, "konsorten", "go-windows-terminal-sequences", ""}, 24 | {"github.com/account/project/v2", GH, "account", "project", "v2"}, 25 | {"github.com/account/project/api/client", GH, "account", "project", "api/client"}, 26 | } 27 | 28 | for i, x := range examples { 29 | m, err := githubResolver(x.pkg) 30 | if err != nil { 31 | t.Fatal(err) 32 | } 33 | if m == nil { 34 | t.Fatalf("(%d): expected %q to match", i, x.pkg) 35 | } 36 | if fmt.Sprintf("%T %v", m.source, m.source) != fmt.Sprintf("%T %v", x.source, x.source) { 37 | t.Errorf("(%d) expected source to be %q, got %q", i, fmt.Sprintf("%T %v", x.source, x.source), fmt.Sprintf("%T %v", m.source, m.source)) 38 | } 39 | if m.account != x.account { 40 | t.Errorf("(%d) expected account to be %q, got %q", i, x.account, m.account) 41 | } 42 | if m.project != x.project { 43 | t.Errorf("(%d) expected project to be %q, got %q", i, x.project, m.project) 44 | } 45 | } 46 | } 47 | 48 | func TestGitlabResolver(t *testing.T) { 49 | examples := []resolverExample{ 50 | {"gitlab.com/account/project", GL, "account", "project", ""}, 51 | {"gitlab.com/account/project/api/client", GL, "account", "project", "api/client"}, 52 | } 53 | 54 | for i, x := range examples { 55 | m, err := gitlabResolver(x.pkg) 56 | if err != nil { 57 | t.Fatal(err) 58 | } 59 | if m == nil { 60 | t.Fatalf("(%d): expected %q to match", i, x.pkg) 61 | } 62 | if fmt.Sprintf("%T %v", m.source, m.source) != fmt.Sprintf("%T %v", x.source, x.source) { 63 | t.Errorf("(%d) expected source to be %q, got %q", i, fmt.Sprintf("%T %v", x.source, x.source), fmt.Sprintf("%T %v", m.source, m.source)) 64 | } 65 | if m.account != x.account { 66 | t.Errorf("(%d) expected account to be %q, got %q", i, x.account, m.account) 67 | } 68 | if m.project != x.project { 69 | t.Errorf("(%d) expected project to be %q, got %q", i, x.project, m.project) 70 | } 71 | } 72 | } 73 | 74 | func TestMirrorResolver(t *testing.T) { 75 | examples := []resolverExample{ 76 | {"camlistore.org", GH, "perkeep", "perkeep", ""}, 77 | {"docker.io/go-docker", GH, "docker", "go-docker", ""}, 78 | {"git.apache.org/thrift.git", GH, "apache", "thrift", ""}, 79 | {"go.bug.st/serial.v1", GH, "bugst", "go-serial", ""}, 80 | {"go.elastic.co/apm", GH, "elastic", "apm-agent-go", ""}, 81 | {"go.elastic.co/fastjson", GH, "elastic", "go-fastjson", ""}, 82 | {"go.mongodb.org/mongo-driver", GH, "mongodb", "mongo-go-driver", ""}, 83 | {"go.opencensus.io", GH, "census-instrumentation", "opencensus-go", ""}, 84 | {"go4.org", GH, "go4org", "go4", ""}, 85 | {"gocloud.dev", GH, "google", "go-cloud", ""}, 86 | {"google.golang.org/api", GH, "googleapis", "google-api-go-client", ""}, 87 | {"google.golang.org/appengine", GH, "golang", "appengine", ""}, 88 | {"google.golang.org/genproto", GH, "google", "go-genproto", ""}, 89 | {"google.golang.org/grpc", GH, "grpc", "grpc-go", ""}, 90 | {"gotest.tools", GH, "gotestyourself", "gotest.tools", ""}, 91 | {"honnef.co/go/tools", GH, "dominikh", "go-tools", ""}, 92 | {"howett.net/plist", GitlabSource("https://gitlab.howett.net"), "go", "plist", ""}, 93 | {"layeh.com/radius", GH, "layeh", "radius", ""}, 94 | {"sigs.k8s.io/yaml", GH, "kubernetes-sigs", "yaml", ""}, 95 | {"tinygo.org/x/go-llvm", GH, "tinygo-org", "go-llvm", ""}, 96 | } 97 | 98 | for i, x := range examples { 99 | m, err := Resolve(x.pkg, "", "", "") 100 | if err != nil { 101 | t.Fatal(err) 102 | } 103 | if m == nil { 104 | t.Fatalf("(%d): expected %q to match", i, x.pkg) 105 | } 106 | if fmt.Sprintf("%T %v", m.source, m.source) != fmt.Sprintf("%T %v", x.source, x.source) { 107 | t.Errorf("(%d) expected source to be %q, got %q", i, fmt.Sprintf("%T %v", x.source, x.source), fmt.Sprintf("%T %v", m.source, m.source)) 108 | } 109 | if m.account != x.account { 110 | t.Errorf("(%d) expected account to be %q, got %q", i, x.account, m.account) 111 | } 112 | if m.project != x.project { 113 | t.Errorf("(%d) expected project to be %q, got %q", i, x.project, m.project) 114 | } 115 | } 116 | } 117 | 118 | func testResolverFnExamples(t *testing.T, name string, fn mirrorFn, examples []resolverExample) { 119 | for _, x := range examples { 120 | m, err := fn(x.pkg) 121 | if err != nil { 122 | t.Fatal(err) 123 | } 124 | if m == nil { 125 | t.Fatalf("(%s): expected %q to match", name, x.pkg) 126 | } 127 | if fmt.Sprintf("%T %v", m.source, m.source) != fmt.Sprintf("%T %v", x.source, x.source) { 128 | t.Errorf("(%s) expected source to be %q, got %q", name, fmt.Sprintf("%T %v", x.source, x.source), fmt.Sprintf("%T %v", m.source, m.source)) 129 | } 130 | if m.account != x.account { 131 | t.Errorf("(%s) expected account to be %q, got %q", name, x.account, m.account) 132 | } 133 | if m.project != x.project { 134 | t.Errorf("(%s) expected project to be %q, got %q", name, x.project, m.project) 135 | } 136 | } 137 | } 138 | 139 | func TestBazilOrgResolver(t *testing.T) { 140 | examples := []resolverExample{ 141 | // name, expected account, expected project 142 | {"bazil.org/fuse", GH, "bazil", "fuse", ""}, 143 | } 144 | testResolverFnExamples(t, "bazilOrgResolver", bazilOrgResolver, examples) 145 | } 146 | 147 | func TestCloudGoogleComResolver(t *testing.T) { 148 | examples := []resolverExample{ 149 | // name, expected account, expected project 150 | {"cloud.google.com/go", GH, "googleapis", "google-cloud-go", ""}, 151 | {"cloud.google.com/go/storage", GH, "googleapis", "google-cloud-go", ""}, 152 | } 153 | testResolverFnExamples(t, "cloudGoogleComResolver", cloudGoogleComResolver, examples) 154 | } 155 | 156 | // func TestCodeCloudfoundryOrgResolver(t *testing.T) { 157 | // examples := []resolverExample{ 158 | // // name, expected account, expected project 159 | // {"code.cloudfoundry.org/gofileutils", GH, "cloudfoundry", "gofileutils", ""}, 160 | // } 161 | // testResolverFnExamples(t, "codeCloudfoundryOrgResolver", codeCloudfoundryOrgResolver, examples) 162 | // } 163 | 164 | func TestGoEtcdIoResolver(t *testing.T) { 165 | examples := []resolverExample{ 166 | // name, expected account, expected project 167 | {"go.etcd.io/bbolt", GH, "etcd-io", "bbolt", ""}, 168 | } 169 | testResolverFnExamples(t, "goEtcdIoResolver", goEtcdIoResolver, examples) 170 | } 171 | 172 | func TestGopkgInResolver(t *testing.T) { 173 | examples := []resolverExample{ 174 | // pkg, expected account, expected project 175 | {"gopkg.in/pkg.v3", GH, "go-pkg", "pkg", ""}, 176 | {"gopkg.in/user/pkg.v3", GH, "user", "pkg", ""}, 177 | {"gopkg.in/pkg-with-dashes.v3", GH, "go-pkg-with-dashes", "pkg-with-dashes", ""}, 178 | {"gopkg.in/UserCaps-With-Dashes/0andCrazyPkgName.v3-alpha", GH, "UserCaps-With-Dashes", "0andCrazyPkgName", ""}, 179 | } 180 | testResolverFnExamples(t, "gopkgInResolver", gopkgInResolver, examples) 181 | } 182 | 183 | func TestGolangOrgResolver(t *testing.T) { 184 | examples := []resolverExample{ 185 | // name, expected account, expected project 186 | {"golang.org/x/pkg", GH, "golang", "pkg", ""}, 187 | {"golang.org/x/oauth2", GH, "golang", "oauth2", ""}, 188 | } 189 | testResolverFnExamples(t, "golangOrgResolver", golangOrgResolver, examples) 190 | } 191 | 192 | func TestK8sIoResolver(t *testing.T) { 193 | examples := []resolverExample{ 194 | // name, expected account, expected project 195 | {"k8s.io/api", GH, "kubernetes", "api", ""}, 196 | } 197 | testResolverFnExamples(t, "k8sIoResolver", k8sIoResolver, examples) 198 | } 199 | 200 | func TestGoUberOrgResolver(t *testing.T) { 201 | examples := []resolverExample{ 202 | // name, expected account, expected project 203 | {"go.uber.org/zap", GH, "uber-go", "zap", ""}, 204 | } 205 | testResolverFnExamples(t, "goUberOrgResolver", goUberOrgResolver, examples) 206 | } 207 | 208 | func TestGoMozillaOrgResolver(t *testing.T) { 209 | examples := []resolverExample{ 210 | // name, expected account, expected project 211 | {"go.mozilla.org/gopgagent", GH, "mozilla-services", "gopgagent", ""}, 212 | } 213 | testResolverFnExamples(t, "goMozillaOrgResolver", goMozillaOrgResolver, examples) 214 | } 215 | 216 | func TestMvdanCcResolver(t *testing.T) { 217 | examples := []resolverExample{ 218 | // name, expected account, expected project 219 | {"mvdan.cc/editorconfig", GH, "mvdan", "editorconfig", ""}, 220 | } 221 | testResolverFnExamples(t, "mvdanCcResolver", mvdanCcResolver, examples) 222 | } 223 | 224 | func TestRscIoResolver(t *testing.T) { 225 | examples := []resolverExample{ 226 | // name, expected account, expected project 227 | {"rsc.io/pdf", GH, "rsc", "pdf", ""}, 228 | } 229 | testResolverFnExamples(t, "rscIoResolver", rscIoResolver, examples) 230 | } 231 | 232 | func TestGotestToolsResolver(t *testing.T) { 233 | examples := []resolverExample{ 234 | // name, expected account, expected project 235 | {"gotest.tools", GH, "gotestyourself", "gotest.tools", ""}, 236 | {"gotest.tools/gotestsum", GH, "gotestyourself", "gotestsum", ""}, 237 | } 238 | testResolverFnExamples(t, "gotestToolsResolver", gotestToolsResolver, examples) 239 | } 240 | -------------------------------------------------------------------------------- /tuple/source.go: -------------------------------------------------------------------------------- 1 | package tuple 2 | 3 | type Source interface { 4 | String() string 5 | } 6 | 7 | type GithubSource string 8 | 9 | func (s GithubSource) String() string { 10 | return string(s) 11 | } 12 | 13 | type GitlabSource string 14 | 15 | func (s GitlabSource) String() string { 16 | return string(s) 17 | } 18 | 19 | // GH is Github default source 20 | var GH GithubSource 21 | 22 | // GL is Gitlab default source 23 | var GL GitlabSource 24 | 25 | func sourceVarName(s Source) string { 26 | switch s.(type) { 27 | case GithubSource: 28 | return "GH_TUPLE" 29 | case GitlabSource: 30 | return "GL_TUPLE" 31 | default: 32 | panic("unknown source type") 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /tuple/tuple.go: -------------------------------------------------------------------------------- 1 | package tuple 2 | 3 | import ( 4 | "bytes" 5 | "errors" 6 | "fmt" 7 | "path/filepath" 8 | "regexp" 9 | "sort" 10 | "strings" 11 | 12 | "github.com/dmgk/modules2tuple/v2/apis" 13 | "github.com/dmgk/modules2tuple/v2/config" 14 | "github.com/dmgk/modules2tuple/v2/debug" 15 | ) 16 | 17 | // Parse parses a package spec into Tuple. 18 | func Parse(spec string) (*Tuple, error) { 19 | const replaceSep = " => " 20 | 21 | // "replace" spec 22 | if strings.Contains(spec, replaceSep) { 23 | parts := strings.Split(spec, replaceSep) 24 | if len(parts) != 2 { 25 | return nil, fmt.Errorf("unexpected replace spec format: %q", spec) 26 | } 27 | 28 | leftPkg, leftVersion, err := parseSpec(parts[0]) 29 | if err != nil { 30 | return nil, err 31 | } 32 | 33 | rightPkg, rightVersion, err := parseSpec(parts[1]) 34 | if err != nil { 35 | return nil, err 36 | } 37 | 38 | // https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive 39 | if isFilesystemPath(rightPkg) { 40 | // get the left spec package and symlink it to the rightPkg path 41 | return Resolve(leftPkg, leftVersion, leftPkg, rightPkg) 42 | } 43 | // get the right spec package and put it under leftPkg path 44 | return Resolve(rightPkg, rightVersion, leftPkg, "") 45 | } 46 | 47 | // regular spec 48 | pkg, version, err := parseSpec(spec) 49 | if err != nil { 50 | return nil, err 51 | } 52 | return Resolve(pkg, version, pkg, "") 53 | } 54 | 55 | // v1.0.0 56 | // v1.0.0+incompatible 57 | // v1.2.3-pre-release-suffix 58 | // v1.2.3-pre-release-suffix+incompatible 59 | var versionRx = regexp.MustCompile(`\A(v\d+\.\d+\.\d+(?:-[0-9A-Za-z]+[0-9A-Za-z\.-]+)?)(?:\+incompatible)?\z`) 60 | 61 | // v0.0.0-20181001143604-e0a95dfd547c 62 | // v1.2.3-20181001143604-e0a95dfd547c 63 | // v1.2.3-3.20181001143604-e0a95dfd547c 64 | // v0.8.0-dev.2.0.20180608203834-19279f049241 65 | // v3.0.1-0.20190209023717-9147687966d9+incompatible 66 | var tagRx = regexp.MustCompile(`\Av\d+\.\d+\.\d+-(?:[0-9A-Za-z\.]+\.)?\d{14}-([0-9a-f]+)(?:\+incompatible)?\z`) 67 | 68 | func parseSpec(spec string) (string, string, error) { 69 | parts := strings.Fields(spec) 70 | 71 | switch len(parts) { 72 | case 1: 73 | return parts[0], "", nil 74 | case 2: 75 | // regular spec 76 | if tagRx.MatchString(parts[1]) { 77 | sm := tagRx.FindAllStringSubmatch(parts[1], -1) 78 | return parts[0], sm[0][1], nil 79 | } 80 | if versionRx.MatchString(parts[1]) { 81 | sm := versionRx.FindAllStringSubmatch(parts[1], -1) 82 | return parts[0], sm[0][1], nil 83 | } 84 | return "", "", fmt.Errorf("unexpected version string in spec: %q", spec) 85 | default: 86 | return "", "", fmt.Errorf("unexpected number of fields in spec: %q", spec) 87 | } 88 | } 89 | 90 | func isFilesystemPath(s string) bool { 91 | return s[0] == '.' || s[0] == '/' 92 | } 93 | 94 | type Tuple struct { 95 | pkg string // Go package name 96 | version string // tag or commit ID 97 | subdir string // GH_TUPLE subdir 98 | group string // GH_TUPLE group 99 | module string // module, if any 100 | link_src *Tuple // symlink source tuple, if any 101 | link_tgt string // symlink target, if any 102 | source Source // tuple source (Github ot Gitlab) 103 | account string // source account 104 | project string // source project 105 | hidden bool // if true, tuple will be excluded from G{H,L}_TUPLE 106 | } 107 | 108 | var underscoreRe = regexp.MustCompile(`[^\w]+`) 109 | 110 | func (t *Tuple) makeResolved(source Source, account, project, module string) { 111 | t.source = source 112 | t.account = account 113 | t.project = project 114 | t.module = module 115 | 116 | var moduleBase string 117 | if t.module != "" { 118 | moduleBase = filepath.Base(t.module) 119 | } 120 | 121 | group := t.account + "_" + t.project 122 | if moduleBase != "" { 123 | group = group + "_" + moduleBase 124 | } 125 | group = underscoreRe.ReplaceAllString(group, "_") 126 | group = strings.Trim(group, "_") 127 | t.group = strings.ToLower(group) 128 | } 129 | 130 | func (t *Tuple) isResolved() bool { 131 | return t.source != nil 132 | } 133 | 134 | func (t *Tuple) Fix() error { 135 | if config.Offline { 136 | return nil 137 | } 138 | 139 | switch t.source.(type) { 140 | case GithubSource: 141 | // If package version is a tag and it's a module in a multi-module repo, call Gihub API 142 | // to check tags. Go seem to be able to magically translate tags like "v1.0.4" to the 143 | // "api/v1.0.4", lets try to do the same. 144 | if strings.HasPrefix(t.version, "v") && t.module != "" { 145 | tag, err := apis.GithubLookupTag(t.account, t.project, t.module, t.version) 146 | if err != nil { 147 | return err 148 | } 149 | if t.version != tag { 150 | debug.Printf("[Tuple.Fix] translated Github tag %q to %q\n", t.version, tag) 151 | t.version = tag 152 | } 153 | } 154 | // If package is a module in a multi-module repo, adjust GH_SUBDIR 155 | // NOTE: tag translation has to be done before this 156 | if t.module != "" { 157 | hasContentAtSuffix, err := apis.GithubHasContentsAtPath(t.account, t.project, t.module, t.version) 158 | if err != nil { 159 | return err 160 | } 161 | if hasContentAtSuffix { 162 | // Trim suffix from GH_TUPLE subdir because repo already has contents and it'll 163 | // be extracted at the correct path. 164 | debug.Printf("[Tuple.Fix] trimmed module suffix %q from %q\n", t.module, t.subdir) 165 | t.subdir = strings.TrimSuffix(t.subdir, "/"+t.module) 166 | } 167 | } 168 | // Ports framework doesn't understand tags that have more than 2 path separators in it, 169 | // replace by commit ID 170 | if len(strings.Split(t.version, "/")) > 2 { 171 | hash, err := apis.GithubGetCommit(t.account, t.project, t.version) 172 | if err != nil { 173 | return err 174 | } 175 | if len(hash) < 12 { 176 | return errors.New("unexpectedly short Githib commit hash") 177 | } 178 | debug.Printf("[Tuple.Fix] translated Github tag %q to %q\n", t.version, hash[:12]) 179 | t.version = hash[:12] 180 | } 181 | case GitlabSource: 182 | // Call Gitlab API to translate go.mod short commit IDs and tags 183 | // to the full 40-character commit IDs as required by bsd.sites.mk 184 | hash, err := apis.GitlabGetCommit(t.source.String(), t.account, t.project, t.version) 185 | if err != nil { 186 | return err 187 | } 188 | debug.Printf("[Tuple.Fix] translated Gitlab tag %q to %q\n", t.version, hash) 189 | t.version = hash 190 | } 191 | 192 | return nil 193 | } 194 | 195 | func (t *Tuple) subdirPath() string { 196 | if t.subdir == "" { 197 | return "" 198 | } 199 | if t.isLinked() { 200 | return t.subdir 201 | } 202 | return filepath.Join("vendor", t.subdir) 203 | } 204 | 205 | func (t *Tuple) isLinked() bool { 206 | return t.link_tgt != "" 207 | } 208 | 209 | func (t *Tuple) makeLinked() { 210 | if !t.isLinked() { 211 | t.link_tgt = filepath.Join("vendor", t.subdir, t.module) 212 | } 213 | t.subdir = "" 214 | } 215 | 216 | func (t *Tuple) makeLinkedAs(src *Tuple) { 217 | if !t.isLinked() { 218 | t.link_src = src 219 | t.link_tgt = filepath.Join("vendor", t.subdir, t.module) 220 | } 221 | t.subdir = "" 222 | } 223 | 224 | func (t *Tuple) String() string { 225 | var res string 226 | 227 | if t.source != nil && t.source.String() != "" { 228 | res = t.source.String() + ":" 229 | } 230 | res = fmt.Sprintf("%s%s:%s:%s:%s", res, t.account, t.project, t.version, t.group) 231 | if t.subdirPath() != "" { 232 | res = fmt.Sprintf("%s/%s", res, t.subdirPath()) 233 | } 234 | // if t.isLinked() { 235 | // res = fmt.Sprintf("%s ==> %s", res, t.Link) 236 | // } 237 | 238 | return res 239 | } 240 | 241 | func (t *Tuple) defaultSortKey() string { 242 | return fmt.Sprintf("%s:%s:%s:%s:%s:%s:%s", t.source, t.account, t.project, t.version, t.module, t.group, t.link_tgt) 243 | } 244 | 245 | type Slice []*Tuple 246 | 247 | func (s Slice) Fix() error { 248 | if len(s) < 2 { 249 | return nil 250 | } 251 | 252 | if err := fixGithubProjectsAndTags(s); err != nil { 253 | return err 254 | } 255 | fixSubdirs(s) 256 | fixGroups(s) 257 | fixFsNotify(s) 258 | 259 | return nil 260 | } 261 | 262 | // fixGroups makes sure there are no duplicate group names. 263 | func fixGroups(s Slice) { 264 | var prevGroup string 265 | suffix := 1 266 | 267 | var maxGroup, maxPkg int 268 | for _, t := range s { 269 | if len(t.group) > maxGroup { 270 | maxGroup = len(t.group) 271 | } 272 | if len(t.pkg) > maxPkg { 273 | maxPkg = len(t.pkg) 274 | } 275 | } 276 | 277 | key := func(i int) string { 278 | return fmt.Sprintf("%*s %*s", -(maxGroup + 1), s[i].group, -(maxPkg + 1), s[i].pkg) 279 | } 280 | sort.Slice(s, func(i, j int) bool { 281 | return key(i) < key(j) 282 | }) 283 | 284 | if config.Debug { 285 | debug.Print("[fixGroups] looking at slice:\n") 286 | for i := range s { 287 | debug.Printf("[fixGroups] %s\n", key(i)) 288 | } 289 | } 290 | 291 | for _, t := range s { 292 | if prevGroup == "" { 293 | prevGroup = t.group 294 | continue 295 | } 296 | if t.hidden { 297 | continue 298 | } 299 | if t.group == prevGroup { 300 | oldGroup := t.group 301 | t.group = fmt.Sprintf("%s_%d", t.group, suffix) 302 | debug.Printf("[fixGroups] deduped group %q as %q\n", oldGroup, t.group) 303 | suffix++ 304 | } else { 305 | prevGroup = t.group 306 | suffix = 1 307 | } 308 | } 309 | } 310 | 311 | type DuplicateProjectAndTag string 312 | 313 | func (err DuplicateProjectAndTag) Error() string { 314 | return string(err) 315 | } 316 | 317 | // fixGithubProjectsAndTags checks that tuples have a unique GH_PROJECT/GH_TAGNAME 318 | // combination. Due to the way Github prepares release tarballs and the way port framework 319 | // works, tuples sharing GH_PROJECT/GH_TAGNAME pair will be extracted into the same directory. 320 | // Try avoiding this mess by switching one of the conflicting tuple's GH_TAGNAME from git tag 321 | // to git commit ID. 322 | func fixGithubProjectsAndTags(s Slice) error { 323 | if config.Offline { 324 | return nil 325 | } 326 | 327 | key := func(i int) string { 328 | return fmt.Sprintf("%T:%s:%s:%s", s[i].source, s[i].project, s[i].version, s[i].account) 329 | } 330 | sort.Slice(s, func(i, j int) bool { 331 | return key(i) < key(j) 332 | }) 333 | 334 | var prevTuple *Tuple 335 | 336 | for _, t := range s { 337 | if t.source != GH { 338 | continue // not a Github tuple, skip 339 | } 340 | 341 | if prevTuple == nil { 342 | prevTuple = t 343 | continue 344 | } 345 | 346 | if t.project == prevTuple.project && t.version == prevTuple.version && t.module == prevTuple.module { 347 | // same Project and Version, different Account 348 | if t.account != prevTuple.account { 349 | // hash, err := apis.GithubGetCommit(t.account, t.project, t.version) 350 | // if err != nil { 351 | // return DuplicateProjectAndTag(t.String()) 352 | // } 353 | // if len(hash) < 12 { 354 | // return errors.New("unexpectedly short Githib commit hash") 355 | // } 356 | // debug.Printf("[fixGithubProjectsAndTags] translated Github tag %q to %q\n", t.version, hash[:12]) 357 | // t.version = hash[:12] 358 | 359 | // dont bother with replacing tag with commit hash, just link to prev tuple 360 | t.makeLinkedAs(prevTuple) 361 | } 362 | } 363 | prevTuple = t 364 | } 365 | 366 | key = func(i int) string { 367 | return fmt.Sprintf("%T:%s:%s:%s:%s", s[i].source, s[i].account, s[i].project, s[i].version, s[i].subdir) 368 | } 369 | sort.Slice(s, func(i, j int) bool { 370 | return key(i) < key(j) 371 | }) 372 | 373 | var prevSubdir string 374 | 375 | for _, t := range s { 376 | if t.source != GH { 377 | continue // not a Github tuple, skip 378 | } 379 | 380 | if prevTuple == nil { 381 | prevTuple = t 382 | prevSubdir = t.subdir 383 | continue 384 | } 385 | 386 | // same Account, Project and Version, and package is a subdir of previous tuple 387 | if t.account == prevTuple.account && t.project == prevTuple.project && t.version == prevTuple.version { 388 | if t.subdir != prevSubdir && strings.HasPrefix(t.subdir, prevSubdir+"/") { 389 | t.hidden = true 390 | continue 391 | } 392 | } 393 | prevTuple = t 394 | prevSubdir = t.subdir 395 | } 396 | 397 | return nil 398 | } 399 | 400 | // fixSubdirs ensures that all subdirs are unique and makes symlinks as needed. 401 | func fixSubdirs(s Slice) { 402 | var maxSubdir, maxVersion, maxModule int 403 | for _, t := range s { 404 | if len(t.subdir) > maxSubdir { 405 | maxSubdir = len(t.subdir) 406 | } 407 | if len(t.version) > maxVersion { 408 | maxVersion = len(t.version) 409 | } 410 | if len(t.module) > maxModule { 411 | maxModule = len(t.module) 412 | } 413 | } 414 | 415 | key := func(i int) string { 416 | return fmt.Sprintf("%*s %*s %*s", -(maxSubdir + 1), s[i].subdir, maxVersion+1, s[i].version, -(maxModule + 1), s[i].module) 417 | } 418 | sort.Slice(s, func(i, j int) bool { 419 | return key(i) < key(j) 420 | }) 421 | 422 | if config.Debug { 423 | debug.Print("[fixSubdirs] looking at slice:\n") 424 | for i := range s { 425 | debug.Printf("[fixSubdirs] %s\n", key(i)) 426 | } 427 | } 428 | 429 | var ( 430 | prevSubdir, prevVersion string 431 | currentSubdir, currentVersion string 432 | ) 433 | 434 | for _, t := range s { 435 | if prevSubdir == "" { 436 | prevSubdir, prevVersion = t.subdir, t.version 437 | continue 438 | } 439 | 440 | currentSubdir, currentVersion = t.subdir, t.version 441 | if prevSubdir == t.subdir { 442 | if t.version != prevVersion { 443 | debug.Printf("[fixSubdirs] linking %s/%s@%s (parent %s@%s)\n", t.pkg, t.module, t.version, prevSubdir, prevVersion) 444 | t.makeLinked() 445 | } else { 446 | debug.Printf("[fixSubdirs] hiding %s/%s@%s (parent %s@%s)\n", t.pkg, t.module, t.version, prevSubdir, prevVersion) 447 | t.hidden = true 448 | } 449 | } 450 | prevSubdir, prevVersion = currentSubdir, currentVersion 451 | } 452 | } 453 | 454 | // fixFsNotify takes care of fsnotify annoying ability to appear under multiple different import paths. 455 | // github.com/fsnotify/fsnotify is the canonical package name. 456 | func fixFsNotify(s Slice) { 457 | key := func(i int) string { 458 | return fmt.Sprintf("%s:%s:%s:%s", s[i].account, s[i].project, s[i].version, s[i].group) 459 | } 460 | sort.Slice(s, func(i, j int) bool { 461 | return key(i) < key(j) 462 | }) 463 | 464 | const ( 465 | fsnotifyAccount = "fsnotify" 466 | fsnotifyProject = "fsnotify" 467 | ) 468 | var fsnotifyTuple *Tuple 469 | 470 | for _, t := range s { 471 | if t.account == fsnotifyAccount && t.project == fsnotifyProject && fsnotifyTuple == nil { 472 | fsnotifyTuple = t 473 | continue 474 | } 475 | if fsnotifyTuple != nil { 476 | if t.version == fsnotifyTuple.version { 477 | t.makeLinkedAs(fsnotifyTuple) 478 | t.hidden = true 479 | debug.Printf("[fixFsNotify] linking fnotify %s@%s => %s@%s\n", fsnotifyTuple.pkg, fsnotifyTuple.version, t.pkg, t.version) 480 | } 481 | } 482 | } 483 | } 484 | 485 | // If tuple slice contains more than largeLimit entries, start tuple list on the new line for easier sorting/editing. 486 | // Otherwise omit the first line continuation for more compact representation. 487 | const largeLimit = 3 488 | 489 | // String returns G{H,L}_TUPLE variables contents. 490 | func (s Slice) String() string { 491 | sort.Slice(s, func(i, j int) bool { 492 | return s[i].defaultSortKey() < s[j].defaultSortKey() 493 | }) 494 | 495 | var githubTuples, gitlabTuples Slice 496 | for _, t := range s { 497 | switch t.source.(type) { 498 | case GithubSource: 499 | githubTuples = append(githubTuples, t) 500 | case GitlabSource: 501 | gitlabTuples = append(gitlabTuples, t) 502 | default: 503 | panic("unknown source type") 504 | } 505 | } 506 | 507 | var lines []string 508 | for _, tt := range []Slice{githubTuples, gitlabTuples} { 509 | if len(tt) == 0 { 510 | continue 511 | } 512 | buf := bytes.NewBufferString(fmt.Sprintf("%s=\t", sourceVarName(tt[0].source))) 513 | large := len(tt) > largeLimit 514 | if large { 515 | buf.WriteString("\\\n") 516 | } 517 | for i := 0; i < len(tt); i += 1 { 518 | if tt[i].hidden { 519 | continue 520 | } 521 | if i > 0 || large { 522 | buf.WriteString("\t\t") 523 | } 524 | buf.WriteString(tt[i].String()) 525 | if i < len(tt)-1 { 526 | buf.WriteString(" \\\n") 527 | } 528 | } 529 | lines = append(lines, buf.String()) 530 | } 531 | 532 | return strings.Join(lines, "\n\n") 533 | } 534 | 535 | type Links []*Tuple 536 | 537 | // Links returns a slice of tuples that require symlinking. 538 | func (s Slice) Links() Links { 539 | var res Links 540 | 541 | for _, t := range s { 542 | if t.isLinked() { 543 | res = append(res, t) 544 | } 545 | } 546 | key := func(i int) string { 547 | return res[i].link_tgt 548 | } 549 | sort.Slice(res, func(i, j int) bool { 550 | return key(i) < key(j) 551 | }) 552 | 553 | return res 554 | } 555 | 556 | // String returns "post-extract" target contents. 557 | func (l Links) String() string { 558 | if len(l) == 0 { 559 | return "" 560 | } 561 | 562 | var lines []string 563 | dirs := map[string]struct{}{} 564 | 565 | for _, t := range l { 566 | var b bytes.Buffer 567 | 568 | var src string 569 | var need_target_mkdir bool 570 | 571 | if t.link_src != nil { 572 | src = filepath.Join(fmt.Sprintf("${WRKSRC_%s}", t.link_src.group), t.link_src.module) 573 | // symlinking other package under different name, target dir is not guaranteed to exist 574 | need_target_mkdir = true 575 | } else { 576 | src = filepath.Join(fmt.Sprintf("${WRKSRC_%s}", t.group), t.module) 577 | // symlinking module under another module, target dir already exists 578 | need_target_mkdir = false 579 | } 580 | tgt := filepath.Join("${WRKSRC}", t.link_tgt) 581 | 582 | if need_target_mkdir { 583 | dir := filepath.Dir(t.link_tgt) 584 | if dir != "" && dir != "." { 585 | if _, ok := dirs[dir]; !ok { 586 | b.WriteString(fmt.Sprintf("\t@${MKDIR} %s\n", filepath.Join("${WRKSRC}", dir))) 587 | dirs[dir] = struct{}{} 588 | } 589 | } 590 | } 591 | 592 | // symlinking over another module, rm -rf first 593 | if t.module != "" { 594 | debug.Printf("[Links.String] rm %s\n", tgt) 595 | b.WriteString(fmt.Sprintf("\t@${RM} -r %s\n", tgt)) 596 | } 597 | 598 | debug.Printf("[Links.String] ln %s => %s\n", src, tgt) 599 | b.WriteString(fmt.Sprintf("\t@${RLN} %s %s", src, tgt)) 600 | 601 | lines = append(lines, b.String()) 602 | } 603 | 604 | var b bytes.Buffer 605 | b.WriteString("post-extract:\n") 606 | b.WriteString(strings.Join(lines, "\n")) 607 | 608 | return b.String() 609 | } 610 | -------------------------------------------------------------------------------- /tuple/tuple_test.go: -------------------------------------------------------------------------------- 1 | package tuple 2 | 3 | import ( 4 | "strings" 5 | "testing" 6 | 7 | "github.com/dmgk/modules2tuple/v2/config" 8 | ) 9 | 10 | func init() { 11 | config.Offline = true 12 | } 13 | 14 | func TestParseRegularSpec(t *testing.T) { 15 | examples := [][]string{ 16 | // spec, expected package, expected version 17 | 18 | // version is tag 19 | {"github.com/pkg/errors v1.0.0", "github.com/pkg/errors", "v1.0.0"}, 20 | {"github.com/pkg/errors v1.0.0+incompatible", "github.com/pkg/errors", "v1.0.0"}, 21 | {"github.com/pkg/errors v1.0.0-rc.1.2.3", "github.com/pkg/errors", "v1.0.0-rc.1.2.3"}, 22 | {"github.com/pkg/errors v1.2.3-alpha", "github.com/pkg/errors", "v1.2.3-alpha"}, 23 | {"github.com/pkg/errors v1.2.3-alpha+incompatible", "github.com/pkg/errors", "v1.2.3-alpha"}, 24 | 25 | // version is commit ID 26 | {"github.com/pkg/errors v0.0.0-20181001143604-e0a95dfd547c", "github.com/pkg/errors", "e0a95dfd547c"}, 27 | {"github.com/pkg/errors v1.2.3-20150716171945-2caba252f4dc", "github.com/pkg/errors", "2caba252f4dc"}, 28 | {"github.com/pkg/errors v1.2.3-0.20150716171945-2caba252f4dc", "github.com/pkg/errors", "2caba252f4dc"}, 29 | {"github.com/pkg/errors v1.2.3-42.20150716171945-2caba252f4dc", "github.com/pkg/errors", "2caba252f4dc"}, 30 | {"github.com/docker/libnetwork v0.8.0-dev.2.0.20180608203834-19279f049241", "github.com/docker/libnetwork", "19279f049241"}, 31 | {"github.com/hjson/hjson-go v3.0.1-0.20190209023717-9147687966d9+incompatible", "github.com/hjson/hjson-go", "9147687966d9"}, 32 | 33 | // filesystem replacement spec 34 | {"/some/path", "/some/path", ""}, 35 | {"./relative/path", "./relative/path", ""}, 36 | } 37 | 38 | for i, x := range examples { 39 | pkg, version, err := parseSpec(x[0]) 40 | if err != nil { 41 | t.Fatal(err) 42 | } 43 | if pkg != x[1] { 44 | t.Errorf("(%d) expected package to be %q, got %q", i, x[1], pkg) 45 | } 46 | if version != x[2] { 47 | t.Errorf("(%d) expected version to be %q, got %q", i, x[1], version) 48 | } 49 | } 50 | } 51 | 52 | func TestParseRegularSpecFail(t *testing.T) { 53 | examples := [][]string{ 54 | // spec, expected error 55 | 56 | // extra stuff 57 | {"github.com/pkg/errors v1.0.0 v2.0.0", "unexpected number of fields"}, 58 | 59 | // unparseable version 60 | {"github.com/pkg/errors 012345", "unexpected version string"}, 61 | } 62 | 63 | for i, x := range examples { 64 | _, _, err := parseSpec(x[0]) 65 | if err == nil { 66 | t.Errorf("(%d) expected to fail: %q", i, x[0]) 67 | } 68 | if !strings.HasPrefix(err.Error(), x[1]) { 69 | t.Errorf("(%d) expected error to start with %q, got %q", i, x[1], err.Error()) 70 | } 71 | } 72 | } 73 | 74 | func TestStringer(t *testing.T) { 75 | examples := [][]string{ 76 | // spec, expected String() 77 | {"github.com/pkg/errors v1.0.0", "pkg:errors:v1.0.0:pkg_errors/vendor/github.com/pkg/errors"}, 78 | {"github.com/pkg/errors v0.0.0-20181001143604-e0a95dfd547c", "pkg:errors:e0a95dfd547c:pkg_errors/vendor/github.com/pkg/errors"}, 79 | {"github.com/pkg/errors v1.0.0-rc.1.2.3", "pkg:errors:v1.0.0-rc.1.2.3:pkg_errors/vendor/github.com/pkg/errors"}, 80 | {"github.com/pkg/errors v0.12.3-0.20181001143604-e0a95dfd547c", "pkg:errors:e0a95dfd547c:pkg_errors/vendor/github.com/pkg/errors"}, 81 | {"github.com/UserName/project-with-dashes v1.1.1", "UserName:project-with-dashes:v1.1.1:username_project_with_dashes/vendor/github.com/UserName/project-with-dashes"}, 82 | } 83 | 84 | for i, x := range examples { 85 | tuple, err := Parse(x[0]) 86 | if err != nil { 87 | t.Fatal(err) 88 | } 89 | s := tuple.String() 90 | if s != x[1] { 91 | t.Errorf("(%d) expected String() to return %q, got %q", i, x[1], s) 92 | } 93 | } 94 | } 95 | 96 | func TestPackageReplace(t *testing.T) { 97 | examples := [][]string{ 98 | // spec, expected replaced package String() 99 | {"github.com/spf13/cobra v0.0.0-20180412120829-615425954c3b => github.com/rsteube/cobra v0.0.1-zsh-completion-custom", "rsteube:cobra:v0.0.1-zsh-completion-custom:rsteube_cobra/vendor/github.com/spf13/cobra"}, 100 | {"github.com/hashicorp/vault/api v1.0.5-0.20200215224050-f6547fa8e820 => ./api", "hashicorp:vault:f6547fa8e820:hashicorp_vault_api/github.com/hashicorp/vault/api"}, 101 | } 102 | 103 | for i, x := range examples { 104 | tuple, err := Parse(x[0]) 105 | if err != nil { 106 | t.Fatalf("%T: %v", err, err) 107 | } 108 | s := tuple.String() 109 | if s != x[1] { 110 | t.Errorf("(%d) expected replaced package String() to return\n%s\ngot\n%s", i, x[1], s) 111 | } 112 | } 113 | } 114 | --------------------------------------------------------------------------------