Git Product home page Git Product logo

govend's Introduction

govend

govend GoDoc Build Status Go Report Card Join the chat at https://gitter.im/govend/govend

govend is a simple tool to vendor Go package dependencies. It's like go get, but for vendoring external or third party packages.

govend is:

  • like go get, but for vendoring packages
  • compatible with any project directory structure
  • designed to vendor nested dependencies to the nth degree
  • compatible with Go versions 1.5+.

govend does not:

  • wrap the go command
  • try to create a new project
  • force you to lock dependency versions
  • generate temporary directories or files
  • alter any Go environment variables, including $GOPATH

Install

$ go get -u github.com/govend/govend

Usage

Small Project Usage

# ...                                        # code, code, code
$ govend github.com/gorilla/mux              # vendor a dependency
# ...                                        # code, code, code
$ go build                                   # go tools work normally
$ govend -u github.com/gorilla/mux           # updated a dependency
# ...                                        # code, code, code
$ go build                                   # go tools work normally

Big Project Usage

# ...                  # code, code, code
$ govend -v            # scan your project and download all dependencies
# ...                  # code, code, code
$ go build             # go tools work normally
$ govend -u            # scan your project and update all dependencies
# ...                  # code, code, code
$ go build             # go tools work normally

Team Usage

Sarah:

$ git init                     # start git project
# ...                          # code, code, code
$ govend -v -l                 # scan your project, download all dependencies,
                               # and create a vendor.yml file to lock
                               # dependency versions
# ...                          # code, code, code
$ go build                     # go tools work normally
$ govend -v -u                 # scan your project, update all dependencies,
                               # and update the vendor.yml revision versions
# ...                          # code, code, code
$ git push                     # push code to github
$ go build                     # go tools work normally

Mike:

$ git clone url       # grab all the code Sarah pushed
$ govend -v           # download all the dependencies in the vendor.yml file
                      # and use the same revision versions Sarah is using
$ go build            # build the exact same binary Sarah has
# ...                 # code, code, code

Verbose Mode

As with most unixy programs, no news is good news. Therefore, unless something goes wrong govend will not print anything to the terminal. If you want to see progress or proof something is happening use the -v flag to print out package import paths as they are downloaded and vendored.

The Dependency Tree

You can use the -t or --tree flag to view a rendition of the package dependency tree. This is helpful to visualize and understand what packages your dependencies rely on as well.

Explicitly Vendor A Package

You can explicitly tell govend to vendor one or more packages. It works the same way as go get but instead of running:

$ go get github.com/gorilla/mux

which will download the gorilla mux package into your $GOPATH, run:

$ govend github.com/gorilla/mux

which will download the gorilla mux package into your local project vendor/ directory. If you want govend to download more than one package, just tack them on. For example, you might want to vendor the gorilla mux, http, and securecookie packages like so:

$ govend github.com/gorilla/mux github.com/gorilla/http github.com/gorilla/securecookie

Explicitly Update Packages

To update a package that has already been vendored, simply use the -u network update flag. This flag has the same meaning as go get -u and will always use the network to download a fresh copy of the dependency.

To update the gorilla mux package in your $GOPATH you would run:

$ go get -u github.com/gorilla/mux

To update the gorilla mux package in your local project vendor/ directory run:

$ govend -u github.com/gorilla/mux

Vendor Packages Automatically

It would get old to ask govend to download and vendor each individual package when working on large Go projects. Thankfully govend can scan your project source code and identify dependencies for you.

govend assumes you want this behavior when no packages are explicitly provided:

$ cd project/root

$ govend

You can also show dependencies as they are vendored with the -v flag:

$ cd project/root

$ govend -v
github.com/kr/fs
github.com/BurntSushi/toml
github.com/spf13/cobra
github.com/inconshreveable/mousetrap
github.com/spf13/pflag
gopkg.in/yaml.v2
gopkg.in/check.v1

If you would like to update all vendored packages in a project use the -u flag:

$ cd project/root

$ govend -v -u
github.com/kr/fs
github.com/BurntSushi/toml
github.com/spf13/cobra
github.com/inconshreveable/mousetrap
github.com/spf13/pflag
gopkg.in/yaml.v2
gopkg.in/check.v1

Lock Packages

The command govend only scans for external packages and downloads them to the vendor/ directory in your project. You may need more control over versioning your dependencies so that reliable reproducible builds are possible.

govend can save the path and commit revisions of each repository downloaded in a vendor.yml file. This is called vendor locking. The format of the file can be specified to be JSON or TOML, YAML is used by default. Usually this file is located in the root directory of your project and should be included in your version control system.

To generate a vendor.yml file use the -l flag:

$ cd project/root

$ govend -v -l
github.com/kr/fs
github.com/BurntSushi/toml
github.com/spf13/cobra
github.com/inconshreveable/mousetrap
github.com/spf13/pflag
gopkg.in/yaml.v2
gopkg.in/check.v1

The resulting project structure should look something like:

.
├── ...
├── code
├── README.md
├── vendor
└── vendor.yml

The contents of the generated vendor.yml file in this example would be:

vendors:
- path: github.com/BurntSushi/toml
  rev: f772cd89eb0b33743387f826d1918df67f99cc7a
- path: github.com/inconshreveable/mousetrap
  rev: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75
- path: github.com/kr/fs
  rev: 2788f0dbd16903de03cb8186e5c7d97b69ad387b
- path: github.com/spf13/cobra
  rev: 65a708cee0a4424f4e353d031ce440643e312f92
- path: github.com/spf13/pflag
  rev: 7f60f83a2c81bc3c3c0d5297f61ddfa68da9d3b7
- path: gopkg.in/check.v1
  rev: 4f90aeace3a26ad7021961c297b22c42160c7b25
- path: gopkg.in/yaml.v2
  rev: f7716cbe52baa25d2e9b0d0da546fcf909fc16b4

You can now ignore the large vendor/ directory and pass the small vendor.yml file to your buddy. Your buddy can run $ govend and will get the exact same dependency versions as specified by vendor.yml.

This is how a team of developers can ensure reproducible builds if they do not want to check the vendor/ directory into a version control system.

Note: It is still a best practice to check in the vendor/ directory to your VCS.

Update Locked Packages

If you would like to update a particular vendored package to its latest version use the -u flag:

$ govend -u github.com/gorilla/mux

If you would like to update all the vendored packages to their latest versions run:

$ govend -u

If you want to update a particular vendored package to a particular revision, update the relevant rev: value inside the vendor.yml file. Then to update to that specific revision hash run:

$ govend -l

Prune Packages

Sometimes large repositories must be downloaded to satisfy a singular package dependency. This generates a lot of dead files if you are checking in vendor/ to your VCS.

The --prune flag will use the known dependency tree to remove or prune out all unused package leaving you with only relevant code.

Note: When pruning occurs it removes not only unused packages, but also files that start with ., _ and files that end with _test.go. This is because pruning is highly likely to break third party tests.

Hold onto Packages

If you stop using or importing a package path in your project code, govend will remove that package from your vendor.yml. Its how govend cleans up after you and keeps vendor.yml tidy.

The --hold flag will tell govend to keep that dependency, even if its not being used as an import by your project. This is great for versioning tooling that you might want to ship with a project.

$ govend --hold github.com/hashicorp/terraform

Note: When using the --hold flag a manifest file like vendor.yml is generated. Essentially, opting into --hold is also opting into --lock. Also because of the nature of hold, repos using hold cannot be pruned.

Vendor Report Summary

If you would like to get a report summary of the number of unique packages scanned, skipped and how many repositories were downloaded, run govend -v -r.

→ govend -v -r
github.com/kr/fs
github.com/BurntSushi/toml
github.com/spf13/cobra
github.com/inconshreveable/mousetrap
github.com/spf13/pflag
gopkg.in/yaml.v2
gopkg.in/check.v1

packages scanned: 7
packages skipped: 0
repos downloaded: 7

Vendor Scan

You may want to scan your code to determine how many third party dependencies are in your project. To do so run govend -s <path/to/dir>. You can also specify different output formats.

TXT

$ govend -s packages
github.com/kr/fs
gopkg.in/yaml.v2

JSON

$ govend -s -f json packages
[
  "github.com/kr/fs",
  "gopkg.in/yaml.v2"
]

YAML

$ govend -s -f yaml packages
- github.com/kr/fs
- gopkg.in/yaml.v2

XML

$ govend -s -f xml packages
<string>gopkg.in/yaml.v2</string>
<string>github.com/kr/fs</string>

More Flags

You can run govend -h to find more flags and options.

Vendor Supported Go Versions

  • Go 1.4 or less - Go does not support vendoring
  • Go 1.5 - vendor via GO15VENDOREXPERIMENT=1
  • Go 1.6 - vendor unless GO15VENDOREXPERIMENT=0
  • Go 1.7+ - vendor always despite the value of GO15VENDOREXPERIMENT

For further explanation please read https://golang.org/doc/go1.6#go_command.

Windows Support

govend works on Windows, but please report any bugs.

Contributing

Simply fork the code and send a pull request.

govend's People

Contributors

3oris avatar cmertz avatar gitter-badger avatar jackspirou avatar ks888 avatar metalmatze avatar mostlygeek avatar nathanielc avatar plenluno avatar swdunlop avatar uberbrodt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

govend's Issues

Panic: runtime error: slice bounds out of range

Hello, just got a panic running govend:

govend golang.org/x/crypto

Panic:

panic: runtime error: slice bounds out of range

goroutine 1 [running]:
github.com/govend/govend/imports/filters.projectImportPath(0x0, 0x0)
        /home/fz/environments/gopath/src/github.com/govend/govend/imports/filters/filters.go:144 +0x399
github.com/govend/govend/imports/filters.Local(0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/fz/environments/gopath/src/github.com/govend/govend/imports/filters/filters.go:81 +0x3e
github.com/govend/govend/imports.Scan(0xc8204c0f80, 0x1a, 0xc820507760, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/fz/environments/gopath/src/github.com/govend/govend/imports/scan.go:119 +0x9d6
github.com/govend/govend/deps.Vend(0xc8200f7000, 0x1, 0x1, 0x9160e8, 0x4, 0xc820507b08, 0x0, 0x0, 0x0, 0x0)
        /home/fz/environments/gopath/src/github.com/govend/govend/deps/vend.go:185 +0xfae
main.glob.func1(0xb6c640, 0xc8200f6f20, 0x1, 0x1)
        /home/fz/environments/gopath/src/github.com/govend/govend/main.go:114 +0xa8c
github.com/govend/govend/vendor/github.com/spf13/cobra.(*Command).execute(0xb6c640, 0xc82000a190, 0x1, 0x1, 0x0, 0x0)
        /home/fz/environments/gopath/src/github.com/govend/govend/vendor/github.com/spf13/cobra/command.go:569 +0x869
github.com/govend/govend/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0xb6c640, 0xb6c640, 0x0, 0x0)
        /home/fz/environments/gopath/src/github.com/govend/govend/vendor/github.com/spf13/cobra/command.go:656 +0x56b
github.com/govend/govend/vendor/github.com/spf13/cobra.(*Command).Execute(0xb6c640, 0x0, 0x0)
        /home/fz/environments/gopath/src/github.com/govend/govend/vendor/github.com/spf13/cobra/command.go:615 +0x2d
main.main()
        /home/fz/environments/gopath/src/github.com/govend/govend/main.go:132 +0x49d

GoVend vendoring own packages

I have a project with a main.go, and a v1 package for my API, with a file for each CRUD object (post and user). I import the v1 package in main.go.

When I run govend, for some reason, it vendors the v1 package, but it shouldn't. How can I stop this?

auto correct import paths

After running govend at the project root, import paths in a project should be auto corrected to the vendor directory.

The first implementation of this will be the following steps:

  • remove what the go get placed in the $GOPATH.
  • run gormimports (my silly version of goimports that removes all imports)
  • run goimports

Supporting forks

Hey there, thanks for making govend--it's been really helpful so far! I just
ran across a use case that I don't see mentioned in the documentation, so I
thought I'd bring it up here.

I just submitted a bug fix to an open source Golang project, and I'd like to
use my fork while I wait for the patch to be accepted upstream. I can get part
of the way there by referencing my fork in the application code, but since that
version is destined for upstream, all of its internal import statements are
in terms of the canonical URL.

I believe this could be addressed with an extension to govend's "vendor file",
one that allows me to specify both the package name and its URL.

...but maybe there is a simpler way to address this. Am I missing something
here? Has this been discussed before? gh-41 touches on the topic of forks, but
it seems distinct. Would an extension like what I've suggested be in-scope for
the project?

Thanks again!

vendor.yml file

How do I only update the affected dependencies that have updated commit hashes in the vendor.yml file?

Fail govend command when a specified revision does not exist

Thank you for this great tool!

I recently noticed that govend command does not fail when a specified revision does not exist. For example,

% cat vendor.yml
vendors:
- path: github.com/davecgh/go-spew
  rev: <invalid revision id>
% govend -vi
github.com/davecgh/go-spew
github.com/davecgh/go-spew bad ping: exit status 1
% echo $?
0

It is great for CI if govend command's response code is not 0 when the revision id is invalid.

How about adding an option such as --strict which means response code is 1 when path and/or rev is invalid?

Update to specific commit?

Is there a way to do this? Something like govend -u github.com/foo/ba --commit e3f973b66b91445ec816dd7411ad1b6495a5a2fc?

--prune option does not work with -l

Steps to reproduce:

  1. Generate dependencies using govend --prune -l
  2. Manually update several rev numbers, per the README.

From here, I tried a few different things (resetting my state between each one). For all of these, the expected (or hoped-for) behavior was that pruned copies of the different versions would replace the previous vendored dirs.

I tried all three of these, resetting state between each one (so I had the old version of vendor/ but the version of vendor.yml with manually-updated SHAs)

  1. Run govend --prune -l
    Result: nothing happens

  2. Run govend -l
    Result: It's not quite clear, but I think the deps do get updated, but they are non-pruned versions. Also, additional deps got added to vendor.yml (presumably transitive deps of previously-pruned subpackages?).

  3. Run govend --prune
    Result: nothing happens

  4. Run rm -r vendor && govend -l --prune
    Result: In vendor.yml file, version numbers that had been explicitly pinned get overwritten to the latest version.

  5. Run rm -r vendor && govend --prune
    This might actually have the intended effect of downloading pruned versions of deps to the correct pinned version

govend -v throws an error when running Go release candidates

Repro:

  • Install go1.7rc2
  • go get -u github.com/govend/govend
  • Use `govend -v``

Actual:
strconv.ParseInt: parsing "7rc2": invalid syntax

The bug seems to only be cosmetic so it's not a big deal.

Another side bug is that govend saves the version it's built at and use this instead of the currently used version. This means that building another Go version will not be detected by govend until it is rebuilt.

Overall pretty low priority, mostly FYI.

Error for symlinked GOPATH

$ pwd
/Users/Me/Developer/go/src/github.com/foo/bar

$ echo $GOPATH
/Users/Me/Developer/go

$ ls -l /Users/Me/Developer/go
lrwxr-xr-x  1 Me  DOMAIN\Domain Users    19B Oct 26 17:56 /Users/Me/Developer/go -> /Users/Me/Developer/devbox/codebases/go

$ govend -v
2016/11/08 11:16:38 you cannot vendor packages outside of your $GOPATH/src

Unable to handle missing packages in apache thrift

errortest
errortest (bad ping): unrecognized import path "errortest" (import path does not begin with hostname)
gen/stress
gen/stress (bad ping): unrecognized import path "gen/stress" (import path does not begin with hostname)
gen/thrifttest
gen/thrifttest (bad ping): unrecognized import path "gen/thrifttest" (import path does not begin with hostname)
git.apache.org/thrift.git/lib/go/thrift
github.com/BurntSushi/toml
github.com/DataDog/datadog-go/statsd
github.com/codegangsta/inject
github.com/codegangsta/negroni
github.com/go-martini/martini
github.com/go-sql-driver/mysql
github.com/goji/param
github.com/golang/mock/gomock
  github.com/golang/mock/gomock/mock_matcher
github.com/golang/mock/mockgen/model
github.com/golang/mock/sample
  github.com/golang/mock/sample/mock_user
    github.com/golang/mock/sample/imp4
    github.com/golang/mock/sample/imp3
    github.com/golang/mock/sample/imp2
    github.com/golang/mock/sample/imp1
github.com/jmoiron/sqlx
  github.com/mattn/go-sqlite3
    github.com/mattn/go-sqlite3/sqlite3_test
  github.com/lib/pq
    github.com/lib/pq/oid
  github.com/jmoiron/sqlx/reflectx
github.com/justinas/alice
  github.com/stretchr/testify/assert
    github.com/pmezard/go-difflib/difflib
    github.com/davecgh/go-spew/spew
      github.com/davecgh/go-spew/spew/testdata
github.com/martini-contrib/render
  github.com/oxtoacart/bpool
github.com/rs/cors
  github.com/rs/xhandler
github.com/smartystreets/goconvey/convey
  github.com/smartystreets/goconvey/convey/reporting
    github.com/smartystreets/goconvey/convey/gotest
  github.com/smartystreets/assertions
    github.com/smartystreets/assertions/internal/oglematchers
      github.com/smartystreets/assertions/internal/ogletest
        github.com/smartystreets/assertions/internal/reqtrace
        github.com/smartystreets/assertions/internal/ogletest/srcutil
        github.com/smartystreets/assertions/internal/oglemock
          github.com/smartystreets/assertions/internal/oglemock/sample/mock_io
    github.com/smartystreets/assertions/internal/go-render/render
  github.com/jtolds/gls
    github.com/gopherjs/gopherjs/js
github.com/tamtam-im/flags
  gopkg.in/ini.v1
github.com/zenazn/goji
  github.com/zenazn/goji/web/middleware
    github.com/zenazn/goji/web/mutil
    github.com/zenazn/goji/web
  github.com/zenazn/goji/graceful
    github.com/zenazn/goji/graceful/listener
  github.com/zenazn/goji/bind
go4.org/syncutil/singleflight
golang.org/x/crypto/blowfish
golang.org/x/crypto/cast5
golang.org/x/crypto/curve25519
golang.org/x/crypto/hkdf
golang.org/x/crypto/nacl/secretbox
  golang.org/x/crypto/salsa20/salsa
  golang.org/x/crypto/poly1305
golang.org/x/crypto/openpgp
  golang.org/x/crypto/openpgp/s2k
    golang.org/x/crypto/ripemd160
    golang.org/x/crypto/openpgp/errors
  golang.org/x/crypto/openpgp/packet
    golang.org/x/crypto/openpgp/elgamal
    golang.org/x/crypto/openpgp/armor
golang.org/x/crypto/pbkdf2
golang.org/x/crypto/pkcs12/internal/rc2
golang.org/x/crypto/ssh
  golang.org/x/crypto/ssh/testdata
  golang.org/x/crypto/ssh/terminal
golang.org/x/crypto/ssh/agent
golang.org/x/net/html
  golang.org/x/net/html/atom
golang.org/x/net/http2
  golang.org/x/net/http2/hpack
golang.org/x/net/icmp
  golang.org/x/net/ipv6
    golang.org/x/net/internal/nettest
    golang.org/x/net/internal/iana
  golang.org/x/net/ipv4
golang.org/x/net/idna
golang.org/x/net/internal/timeseries
golang.org/x/net/webdav
  golang.org/x/net/webdav/internal/xml
golang.org/x/net/websocket
golang.org/x/text/cases
  golang.org/x/text/unicode/rangetable
    golang.org/x/text/internal/ucd
    golang.org/x/text/internal/gen
      golang.org/x/text/unicode/cldr
  golang.org/x/text/unicode/norm
    golang.org/x/text/transform
    golang.org/x/text/internal/triegen
    golang.org/x/text/internal/testtext
  golang.org/x/text/language
    golang.org/x/text/internal/tag
golang.org/x/text/collate
  golang.org/x/text/internal/colltab
    golang.org/x/text/collate/colltab
  golang.org/x/text/collate/build
golang.org/x/text/encoding
  golang.org/x/text/encoding/unicode
    golang.org/x/text/runes
      golang.org/x/text/width
    golang.org/x/text/internal/utf8internal
    golang.org/x/text/encoding/internal/identifier
    golang.org/x/text/encoding/internal
  golang.org/x/text/encoding/traditionalchinese
  golang.org/x/text/encoding/simplifiedchinese
  golang.org/x/text/encoding/korean
  golang.org/x/text/encoding/japanese
  golang.org/x/text/encoding/charmap
golang.org/x/text/encoding/htmlindex
golang.org/x/text/encoding/ianaindex
golang.org/x/text/internal
golang.org/x/text/internal/format
golang.org/x/text/internal/format/plural
golang.org/x/text/internal/stringset
golang.org/x/text/language/display
golang.org/x/text/message
google.golang.org/api/compute/v1
gotagtest
gotagtest (bad ping): unrecognized import path "gotagtest" (import path does not begin with hostname)
ignoreinitialismstest
ignoreinitialismstest (bad ping): unrecognized import path "ignoreinitialismstest" (import path does not begin with hostname)
initialismstest
initialismstest (bad ping): unrecognized import path "initialismstest" (import path does not begin with hostname)
multiplexedprotocoltest
multiplexedprotocoltest (bad ping): unrecognized import path "multiplexedprotocoltest" (import path does not begin with hostname)
namestest
namestest (bad ping): unrecognized import path "namestest" (import path does not begin with hostname)
onewaytest
onewaytest (bad ping): unrecognized import path "onewaytest" (import path does not begin with hostname)
optionalfieldstest
optionalfieldstest (bad ping): unrecognized import path "optionalfieldstest" (import path does not begin with hostname)
servicestest
servicestest (bad ping): unrecognized import path "servicestest" (import path does not begin with hostname)
shared
shared (bad ping): unrecognized import path "shared" (import path does not begin with hostname)
thrift
thrift (bad ping): unrecognized import path "thrift" (import path does not begin with hostname)
thrifttest
thrifttest (bad ping): unrecognized import path "thrifttest" (import path does not begin with hostname)
tutorial
tutorial (bad ping): unrecognized import path "tutorial" (import path does not begin with hostname)
uniondefaultvaluetest
uniondefaultvaluetest (bad ping): unrecognized import path "uniondefaultvaluetest" (import path does not begin with hostname)

Remove extra printing

Extra printing is happening that was for debugging... that should be happening...

Add Alias To Support Syntax From Other Tools

From gitter:

jackspirou: Do you think the glide syntax is better with the vagrant like up instead of the go get -u?.

MetalMatze: Maybe we could also try to use aliases and name them like npm or composer do. govend init, govend installetc.

No ability to lock one new dependency

If attempting to vendor one or more packages explicitly with command line arguments along with the -l option to lock revisions, the intuitive behavior--to me--would be to vendor the new dependency and add just that dependency and its dependencies to the vendor.yml file. For example:

govend -v -l github.com/sha1sum/govend

This should simply add the package listed (and its dependencies) to the lock file. This is not the behavior, however, and the entire vendor directory is cleaned and then all dependencies are re-fetched and added to the lock file.

Strange behaviour in Windows

  1. go get -u github.com/govend/govend
  2. Cloned https://github.com/rancher/trash to %GOPATH%\src\github.com\rancher\trash.
  3. Removed vendor dir from there.
  4. Ran govend -v -l.

Got this:

github.com/Sirupsen/logrus
github.com/Sirupsen/logrus bad ping: remove vendor\github.com\Sirupsen\logrus\.git\objects\pack\pack-52963ec0fba187111894b34c37aeb6b0328ebcab.idx: Access is denied.
github.com/cloudfoundry-incubator/candiedyaml
github.com/cloudfoundry-incubator/candiedyaml bad ping: remove vendor\github.com\cloudfoundry-incubator\candiedyaml\.git\objects\pack\pack-8407cabce55413073fdaa32297edb032b616e88e.idx: Access is denied.
github.com/codegangsta/cli
github.com/codegangsta/cli bad ping: remove vendor\github.com\codegangsta\cli\.git\objects\pack\pack-19306555cc740447ff23dde181d6447a5fc51e45.idx: Access is denied.
github.com/rancher/trash/conf
github.com/rancher/trash bad ping: remove vendor\github.com\rancher\trash\.git\objects\pack\pack-dc479e0027b19200a05c19f53abb789b45375d09.idx: Access is denied.
github.com/rancher/trash/util
github.com/stretchr/testify/require
github.com/stretchr/testify bad ping: remove vendor\github.com\stretchr\testify\.git\objects\pack\pack-43f76c30286e46bcf11e6127d946a19e3848b711.idx: Access is denied.

And in vendor.yml:

vendors: []

Support import current package in test code

I import current package in test code

package util_test

import (
	. "trend_following/util"
)

run

govend -v 

throw error

 trend_following/util bad ping: unrecognized import path "trend_following/util" (import path does not begin with hostname)

go test runs well, it is an extra error

compile: version "go1.9.2" does not match go tool version "go1.10.1"

➜  go git:(master) go get -u github.com/govend/govend
go tool asm: exit status 2
flag provided but not defined: -V
usage: asm [options] file.s ...
Flags:
  -D value
        predefined symbol with optional simple value -D=identifier=value; can be set multiple times
  -I value
        include directory; can be set multiple times
  -S    print assembly and machine code
  -debug
        dump instructions as they are parsed
  -dynlink
        support references to Go symbols defined in other shared libraries
  -e    no limit on number of errors reported
  -o string
        output file; default foo.o for /a/b/c/foo.s as first argument
  -shared
        generate code that can be linked into a shared library
  -trimpath string
        remove prefix from recorded source file paths
go tool asm: exit status 2
flag provided but not defined: -V
usage: asm [options] file.s ...
Flags:
  -D value
        predefined symbol with optional simple value -D=identifier=value; can be set multiple times
  -I value
        include directory; can be set multiple times
  -S    print assembly and machine code
  -debug
        dump instructions as they are parsed
  -dynlink
        support references to Go symbols defined in other shared libraries
  -e    no limit on number of errors reported
  -o string
        output file; default foo.o for /a/b/c/foo.s as first argument
  -shared
        generate code that can be linked into a shared library
  -trimpath string
        remove prefix from recorded source file paths
# errors
compile: version "go1.9.2" does not match go tool version "go1.10.1"
# runtime/internal/sys
compile: version "go1.9.2" does not match go tool version "go1.10.1"
go tool asm: exit status 2
flag provided but not defined: -V
usage: asm [options] file.s ...
Flags:
  -D value
        predefined symbol with optional simple value -D=identifier=value; can be set multiple times
  -I value
        include directory; can be set multiple times
  -S    print assembly and machine code
  -debug
        dump instructions as they are parsed
  -dynlink
        support references to Go symbols defined in other shared libraries
  -e    no limit on number of errors reported
  -o string
        output file; default foo.o for /a/b/c/foo.s as first argument
  -shared
        generate code that can be linked into a shared library
  -trimpath string
        remove prefix from recorded source file paths
# internal/race
compile: version "go1.9.2" does not match go tool version "go1.10.1"

checkGopath in Windows

When using govend under Windows always gives an error: "you can not vendor packages outside of your $GOPATH/src". This is due to the different register VolumeName.
I run govend from the folder D:\gopath\src\github.com. The result is:
gopath := os.Getenv("GOPATH") // == d:\gopath
cwd, _ := os.Getwd() // == D:\gopath\src\github.com
_ = filepath.VolumeName(gopath) // == d:
_ = filepath.VolumeName(cwd) // == D:
Change the variable $GOPATH on D:\gopath solved the problem, but the use of other tools such problems did not arise.
Maybe add
if runtime.GOOS == "windows" {
gosrc = strings.ToLower(gosrc)
cwd = strings.ToLower(cwd)
}
before
if !strings.HasPrefix(cwd, gosrc) {

Ability to ignore packages from being vendored?

Hi, I was wondering if it would be possible to add an option to ignore dependencies that are not already in the lock file from being vendored?

Scenario

Company has developed a web application say: github.com/company/webapp and
has also developed a bunch of reusable libraries for use in multiple applications, like the following:

github.com/company/db - common database access used by many applications

now this library is fully under the company's control so we know that master is always going to be stable; this is ensured by only admin having the ability to merge or push code to the master branch ( this is actually a security requirement of the company... ) The db library is also frequently updated when making changes to our web application and this is where the troubles, for us, begin because the steps in getting a projects changes merged becomes too involved:

  1. Remove github.com/company/db from the vendored code
  2. Make changes to web application and db library + test.....
  3. Commit and push/create pull request for db changes
  4. Now have to wait for an admin to merge the db changes into master before we can update the webapp and add the new db library commit version
  5. Commit changes to webapp wait for them to be merged
  6. Developer can move on to next task

this is just an example of one reusable library, we use many more.

Proposed Solution 1

Add option, say -i, --ignore and when a lock file already exists it will only download and vendor packages within the lock file.

Proposed Solution 2

Add section to the vendor lock file of packages to ignore and preserve when updating all.

Either of these would solve our issues as the developer doesn't have to worry about vendoring the company code which is guaranteed to be stable.

Thanks in advance for your consideration :)

P.S. Thanks for govend, out of all the tools I've tried so far it is simple and does vendoring properly! this is the only problem that's stopping us from implementing as our vendoring solution.

Updating single dependency deletes all others.

I am using govend. I have ~10 deps vendored (all deps of the project) I have locked all of them but only two deps were not locked to the current head of their repo.

Today I wanted to update one of the dep and I ran:

govend -u dep

Now my vendor dir only has the dep files. All other files have been removed for the other ~10 deps.

It seems related to this line of code https://github.com/govend/govend/blob/master/deps/vend.go#L72

Is this a user/workflow error? Is there a correct way to update this dep without updating all of them?

Vendorable Checks argv[0] Against GOPATH/src

The following code from Vendorable in deps/vendorable.go checks os.Args[0] (which is the path to the govendor binary) against $GOPATH/src. This means it will not work for any project unless you are invoking ./govendor where your current directory is within $GOPATH/src.

   // check the env $GOPATH is valid
    gopath := os.Getenv("GOPATH")
    if len(gopath) == 0 {
        log.Fatal(errors.New("please set your $GOPATH"))
    }

    // determine the current absolute file path
    path, err := filepath.Abs(filepath.Dir(os.Args[0]))
    if err != nil {
        log.Fatal(err)
    }

    // check we are in the $GOPATH
    if !strings.Contains(path, gopath+"/src/") {
        return errors.New("you cannot vendor packages outside of your $GOPATH/src")
    }

Reproduction:

$ mkdir -p /tmp/go/src 
$ cd /tmp/go/src 
$ env GOPATH=/tmp/go ~/bin/govend

This will result in "you cannot vendor packages outside of your $GOPATH/src"

Submodules for vendor directory?

Thanks for govend. It seems to do what the others (Godep, gopm) cannot: put the sqlite3 driver (including the .c code!) into vendor/.

However, when I try to call govend to add a new dependency, I get a username/password prompt for Github.

-> % govend github.com/moiron/sqlx
Username for 'https://github.com': 

Is there a way to get it to default to doing the clone with SSH (i.e. git clone [email protected]:moiron/sqlx.git)?

EDIT: Just realized I had a typo in the URL which is the root cause of my issue... (Github assumes it is a private repository.)

Also, I noticed you commit your vendor/ directory instead of adding it to .gitignore and calling govend locally. I was curious if there is a reason to do this?

Failed to run govend -u -v with drone/drone

tboerger@mimir: ~/Projects/golang/src/github.com/drone/drone # GO15VENDOREXPERIMENT=1 govend -u -v
github.com/rubenv/sql-migrate
gopkg.in/check.v1
gopkg.in/gorp.v1
github.com/go-sql-driver/mysql
github.com/ziutek/mymysql
github.com/lib/pq
github.com/mattn/go-sqlite3
golang.org/x/oauth2
golang.org/x/net
google.golang.org/appengine
github.com/golang/protobuf
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

runtime stack:
runtime.throw(0x94bd10, 0xe)
    /usr/lib64/go/src/runtime/panic.go:527 +0x90
runtime.newstack()
    /usr/lib64/go/src/runtime/stack1.go:794 +0xb17
runtime.morestack()
    /usr/lib64/go/src/runtime/asm_amd64.s:330 +0x7f

goroutine 1 [stack growth]:
runtime.mallocgc(0x5, 0x0, 0xc800000003, 0x40e978)
    /usr/lib64/go/src/runtime/malloc.go:489 fp=0xc8407002c8 sp=0xc8407002c0
runtime.rawstring(0x5, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/lib64/go/src/runtime/string.go:264 +0x70 fp=0xc840700310 sp=0xc8407002c8
runtime.rawstringtmp(0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/lib64/go/src/runtime/string.go:107 +0xb7 fp=0xc840700348 sp=0xc840700310
runtime.slicebytetostring(0x0, 0xc8271cb6f1, 0x5, 0x67f, 0x0, 0x0)
    /usr/lib64/go/src/runtime/string.go:89 +0x6f fp=0xc8407003e0 sp=0xc840700348
go/scanner.(*Scanner).scanString(0xc8282e4920, 0x0, 0x0)
    /usr/lib64/go/src/go/scanner/scanner.go:476 +0xba fp=0xc840700440 sp=0xc8407003e0
go/scanner.(*Scanner).Scan(0xc8282e4920, 0x6f2, 0x9, 0x0, 0x0)
    /usr/lib64/go/src/go/scanner/scanner.go:642 +0x4f4 fp=0xc840700500 sp=0xc840700440
go/parser.(*parser).next0(0xc8282e4900)
    /usr/lib64/go/src/go/parser/parser.go:257 +0x26c fp=0xc8407005e8 sp=0xc840700500
go/parser.(*parser).next(0xc8282e4900)
    /usr/lib64/go/src/go/parser/parser.go:320 +0x43 fp=0xc840700630 sp=0xc8407005e8
go/parser.(*parser).expectSemi(0xc8282e4900)
    /usr/lib64/go/src/go/parser/parser.go:414 +0x48 fp=0xc840700658 sp=0xc840700630
go/parser.(*parser).parseImportSpec(0xc8282e4900, 0x0, 0x4b, 0x0, 0x0, 0x0)
    /usr/lib64/go/src/go/parser/parser.go:2240 +0x1bf fp=0xc8407006e8 sp=0xc840700658
go/parser.(*parser).(go/parser.parseImportSpec)-fm(0x0, 0x4b, 0x0, 0x0, 0x0)
    /usr/lib64/go/src/go/parser/parser.go:2466 +0x4c fp=0xc840700720 sp=0xc8407006e8
go/parser.(*parser).parseGenDecl(0xc8282e4900, 0x4b, 0xc840700898, 0x0)
    /usr/lib64/go/src/go/parser/parser.go:2335 +0x1fc fp=0xc8407007d8 sp=0xc840700720
go/parser.(*parser).parseFile(0xc8282e4900, 0x0)
    /usr/lib64/go/src/go/parser/parser.go:2466 +0x2f9 fp=0xc840700928 sp=0xc8407007d8
go/parser.ParseFile(0xc824718740, 0xc824718640, 0x3f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0)
    /usr/lib64/go/src/go/parser/interface.go:117 +0x1a7 fp=0xc840700998 sp=0xc840700928
github.com/gophersaurus/govend/packages.Scan(0xc823c87320, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/packages/scan.go:59 +0x524 fp=0xc840700c70 sp=0xc840700998
github.com/gophersaurus/govend/govend.deptree(0xc823c86ea1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x111106, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:128 +0x71c fp=0xc840700e50 sp=0xc840700c70
github.com/gophersaurus/govend/govend.deptree(0xc824c41e61, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x111106, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840701030 sp=0xc840700e50
github.com/gophersaurus/govend/govend.deptree(0xc8281fc481, 0x20, 0xc820124930, 0xc8606ffaf8, 0x111105, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840701210 sp=0xc840701030
github.com/gophersaurus/govend/govend.deptree(0xc828645aa1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x111104, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407013f0 sp=0xc840701210
github.com/gophersaurus/govend/govend.deptree(0xc8286455c1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x111103, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407015d0 sp=0xc8407013f0
github.com/gophersaurus/govend/govend.deptree(0xc8252c4d21, 0x20, 0xc820124930, 0xc8606ffaf8, 0x111102, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407017b0 sp=0xc8407015d0
github.com/gophersaurus/govend/govend.deptree(0xc8276c5b91, 0x29, 0xc820124930, 0xc8606ffaf8, 0x111101, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840701990 sp=0xc8407017b0
github.com/gophersaurus/govend/govend.deptree(0xc8276c55c1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x111100, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840701b70 sp=0xc840701990
github.com/gophersaurus/govend/govend.deptree(0xc826804811, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110ff, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840701d50 sp=0xc840701b70
github.com/gophersaurus/govend/govend.deptree(0xc826804121, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110fe, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840701f30 sp=0xc840701d50
github.com/gophersaurus/govend/govend.deptree(0xc824786ea1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110fd, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840702110 sp=0xc840701f30
github.com/gophersaurus/govend/govend.deptree(0xc825436121, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110fc, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407022f0 sp=0xc840702110
github.com/gophersaurus/govend/govend.deptree(0xc8269e7051, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110fb, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407024d0 sp=0xc8407022f0
github.com/gophersaurus/govend/govend.deptree(0xc8269e64e1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110fa, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407026b0 sp=0xc8407024d0
github.com/gophersaurus/govend/govend.deptree(0xc8238871a1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110f9, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840702890 sp=0xc8407026b0
github.com/gophersaurus/govend/govend.deptree(0xc823886511, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110f8, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840702a70 sp=0xc840702890
github.com/gophersaurus/govend/govend.deptree(0xc82388f831, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110f7, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840702c50 sp=0xc840702a70
github.com/gophersaurus/govend/govend.deptree(0xc82677b861, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110f6, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840702e30 sp=0xc840702c50
github.com/gophersaurus/govend/govend.deptree(0xc82677b261, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110f5, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840703010 sp=0xc840702e30
github.com/gophersaurus/govend/govend.deptree(0xc82677ae11, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110f4, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407031f0 sp=0xc840703010
github.com/gophersaurus/govend/govend.deptree(0xc8292b4a81, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110f3, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407033d0 sp=0xc8407031f0
github.com/gophersaurus/govend/govend.deptree(0xc8292b4121, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110f2, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407035b0 sp=0xc8407033d0
github.com/gophersaurus/govend/govend.deptree(0xc827a3d501, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110f1, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840703790 sp=0xc8407035b0
github.com/gophersaurus/govend/govend.deptree(0xc82f3c1bc1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110f0, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840703970 sp=0xc840703790
github.com/gophersaurus/govend/govend.deptree(0xc82fca89f1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110ef, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840703b50 sp=0xc840703970
github.com/gophersaurus/govend/govend.deptree(0xc82b30e301, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110ee, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840703d30 sp=0xc840703b50
github.com/gophersaurus/govend/govend.deptree(0xc82f7a6de1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110ed, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840703f10 sp=0xc840703d30
github.com/gophersaurus/govend/govend.deptree(0xc827db0811, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110ec, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407040f0 sp=0xc840703f10
github.com/gophersaurus/govend/govend.deptree(0xc82eafbce1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110eb, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407042d0 sp=0xc8407040f0
github.com/gophersaurus/govend/govend.deptree(0xc82f700c91, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110ea, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407044b0 sp=0xc8407042d0
github.com/gophersaurus/govend/govend.deptree(0xc82c8b77d1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110e9, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840704690 sp=0xc8407044b0
github.com/gophersaurus/govend/govend.deptree(0xc8306d3051, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110e8, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840704870 sp=0xc840704690
github.com/gophersaurus/govend/govend.deptree(0xc82f685321, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110e7, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840704a50 sp=0xc840704870
github.com/gophersaurus/govend/govend.deptree(0xc82ecf9651, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110e6, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840704c30 sp=0xc840704a50
github.com/gophersaurus/govend/govend.deptree(0xc828d37801, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110e5, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840704e10 sp=0xc840704c30
github.com/gophersaurus/govend/govend.deptree(0xc831496991, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110e4, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840704ff0 sp=0xc840704e10
github.com/gophersaurus/govend/govend.deptree(0xc82b5b3a41, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110e3, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407051d0 sp=0xc840704ff0
github.com/gophersaurus/govend/govend.deptree(0xc82d8d0751, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110e2, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407053b0 sp=0xc8407051d0
github.com/gophersaurus/govend/govend.deptree(0xc8305571a1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110e1, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840705590 sp=0xc8407053b0
github.com/gophersaurus/govend/govend.deptree(0xc82d1b5501, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110e0, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840705770 sp=0xc840705590
github.com/gophersaurus/govend/govend.deptree(0xc8306bbe61, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110df, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840705950 sp=0xc840705770
github.com/gophersaurus/govend/govend.deptree(0xc82ddedda1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110de, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840705b30 sp=0xc840705950
github.com/gophersaurus/govend/govend.deptree(0xc83087ccc1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110dd, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840705d10 sp=0xc840705b30
github.com/gophersaurus/govend/govend.deptree(0xc83087c061, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110dc, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840705ef0 sp=0xc840705d10
github.com/gophersaurus/govend/govend.deptree(0xc824779771, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110db, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407060d0 sp=0xc840705ef0
github.com/gophersaurus/govend/govend.deptree(0xc824778ed1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110da, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407062b0 sp=0xc8407060d0
github.com/gophersaurus/govend/govend.deptree(0xc824778a51, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110d9, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840706490 sp=0xc8407062b0
github.com/gophersaurus/govend/govend.deptree(0xc825e7ab71, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110d8, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840706670 sp=0xc840706490
github.com/gophersaurus/govend/govend.deptree(0xc83129b561, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110d7, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840706850 sp=0xc840706670
github.com/gophersaurus/govend/govend.deptree(0xc83129ac91, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110d6, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840706a30 sp=0xc840706850
github.com/gophersaurus/govend/govend.deptree(0xc82fe1ede1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110d5, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840706c10 sp=0xc840706a30
github.com/gophersaurus/govend/govend.deptree(0xc829b70ae1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110d4, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840706df0 sp=0xc840706c10
github.com/gophersaurus/govend/govend.deptree(0xc8295b3ec1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110d3, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840706fd0 sp=0xc840706df0
github.com/gophersaurus/govend/govend.deptree(0xc82d384f91, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110d2, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407071b0 sp=0xc840706fd0
github.com/gophersaurus/govend/govend.deptree(0xc830b56601, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110d1, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840707390 sp=0xc8407071b0
github.com/gophersaurus/govend/govend.deptree(0xc82e4bcf31, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110d0, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840707570 sp=0xc840707390
github.com/gophersaurus/govend/govend.deptree(0xc82d1b6f91, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110cf, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840707750 sp=0xc840707570
github.com/gophersaurus/govend/govend.deptree(0xc830418ab1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110ce, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840707930 sp=0xc840707750
github.com/gophersaurus/govend/govend.deptree(0xc82f442fc1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110cd, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840707b10 sp=0xc840707930
github.com/gophersaurus/govend/govend.deptree(0xc830f244b1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110cc, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840707cf0 sp=0xc840707b10
github.com/gophersaurus/govend/govend.deptree(0xc82e97aae1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110cb, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840707ed0 sp=0xc840707cf0
github.com/gophersaurus/govend/govend.deptree(0xc82f08b3b1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110ca, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc8407080b0 sp=0xc840707ed0
github.com/gophersaurus/govend/govend.deptree(0xc82ae8e361, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110c9, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840708290 sp=0xc8407080b0
github.com/gophersaurus/govend/govend.deptree(0xc82662a4b1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110c8, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840708470 sp=0xc840708290
github.com/gophersaurus/govend/govend.deptree(0xc830281bc1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110c7, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840708650 sp=0xc840708470
github.com/gophersaurus/govend/govend.deptree(0xc82584c331, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110c6, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840708830 sp=0xc840708650
github.com/gophersaurus/govend/govend.deptree(0xc82b931501, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110c5, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840708a10 sp=0xc840708830
github.com/gophersaurus/govend/govend.deptree(0xc82b930b71, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110c4, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840708bf0 sp=0xc840708a10
github.com/gophersaurus/govend/govend.deptree(0xc82a106151, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110c3, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840708dd0 sp=0xc840708bf0
github.com/gophersaurus/govend/govend.deptree(0xc830446b41, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110c2, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840708fb0 sp=0xc840708dd0
github.com/gophersaurus/govend/govend.deptree(0xc82f283b31, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110c1, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840709190 sp=0xc840708fb0
github.com/gophersaurus/govend/govend.deptree(0xc830d15c81, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110c0, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840709370 sp=0xc840709190
github.com/gophersaurus/govend/govend.deptree(0xc826a0ad21, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110bf, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840709550 sp=0xc840709370
github.com/gophersaurus/govend/govend.deptree(0xc826a0a061, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110be, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840709730 sp=0xc840709550
github.com/gophersaurus/govend/govend.deptree(0xc82dde59b1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110bd, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840709910 sp=0xc840709730
github.com/gophersaurus/govend/govend.deptree(0xc82c56f861, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110bc, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840709af0 sp=0xc840709910
github.com/gophersaurus/govend/govend.deptree(0xc82c464e71, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110bb, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840709cd0 sp=0xc840709af0
github.com/gophersaurus/govend/govend.deptree(0xc830b6c0c1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110ba, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc840709eb0 sp=0xc840709cd0
github.com/gophersaurus/govend/govend.deptree(0xc830f0f2f1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110b9, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc84070a090 sp=0xc840709eb0
github.com/gophersaurus/govend/govend.deptree(0xc830f0e8a1, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110b8, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc84070a270 sp=0xc84070a090
github.com/gophersaurus/govend/govend.deptree(0xc830de93e1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110b7, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc84070a450 sp=0xc84070a270
github.com/gophersaurus/govend/govend.deptree(0xc830de8db1, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110b6, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc84070a630 sp=0xc84070a450
github.com/gophersaurus/govend/govend.deptree(0xc830de8781, 0x2d, 0xc820124930, 0xc8606ffaf8, 0x1110b5, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc84070a810 sp=0xc84070a630
github.com/gophersaurus/govend/govend.deptree(0xc82dddd1a1, 0x20, 0xc820124930, 0xc8606ffaf8, 0x1110b4, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc84070a9f0 sp=0xc84070a810
github.com/gophersaurus/govend/govend.deptree(0xc82dddcb71, 0x29, 0xc820124930, 0xc8606ffaf8, 0x1110b3, 0x1, 0x0, 0x0, 0x0)
    /home/tboerger/Projects/golang/src/github.com/gophersaurus/govend/govend/vendor.go:145 +0xa06 fp=0xc84070abd0 sp=0xc84070a9f0
...additional frames elided...

goroutine 17 [syscall, 44 minutes, locked to thread]:
runtime.goexit()
    /usr/lib64/go/src/runtime/asm_amd64.s:1696 +0x1

goroutine 58 [IO wait, 44 minutes]:
net.runtime_pollWait(0x7f8cec3aff40, 0x72, 0xc820010320)
    /usr/lib64/go/src/runtime/netpoll.go:157 +0x60
net.(*pollDesc).Wait(0xc82010c680, 0x72, 0x0, 0x0)
    /usr/lib64/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(*pollDesc).WaitRead(0xc82010c680, 0x0, 0x0)
    /usr/lib64/go/src/net/fd_poll_runtime.go:78 +0x36
net.(*netFD).Read(0xc82010c620, 0xc8203d0000, 0x2000, 0x2000, 0x0, 0x7f8cef475050, 0xc820010320)
    /usr/lib64/go/src/net/fd_unix.go:232 +0x23a
net.(*conn).Read(0xc8200361c8, 0xc8203d0000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
    /usr/lib64/go/src/net/net.go:172 +0xe4
crypto/tls.(*block).readFromUntil(0xc8203aa6c0, 0x7f8cec3b0308, 0xc8200361c8, 0x5, 0x0, 0x0)
    /usr/lib64/go/src/crypto/tls/conn.go:455 +0xcc
crypto/tls.(*Conn).readRecord(0xc820126840, 0xa0c817, 0x0, 0x0)
    /usr/lib64/go/src/crypto/tls/conn.go:540 +0x2d1
crypto/tls.(*Conn).Read(0xc820126840, 0xc820129000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/lib64/go/src/crypto/tls/conn.go:901 +0x167
net/http.noteEOFReader.Read(0x7f8cec3b0e08, 0xc820126840, 0xc82001c268, 0xc820129000, 0x1000, 0x1000, 0xc820514000, 0x0, 0x0)
    /usr/lib64/go/src/net/http/transport.go:1370 +0x67
net/http.(*noteEOFReader).Read(0xc82019dfa0, 0xc820129000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    <autogenerated>:126 +0xd0
bufio.(*Reader).fill(0xc820303bc0)
    /usr/lib64/go/src/bufio/bufio.go:97 +0x1e9
bufio.(*Reader).Peek(0xc820303bc0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/lib64/go/src/bufio/bufio.go:132 +0xcc
net/http.(*persistConn).readLoop(0xc82001c210)
    /usr/lib64/go/src/net/http/transport.go:876 +0xf7
created by net/http.(*Transport).dialConn
    /usr/lib64/go/src/net/http/transport.go:685 +0xc78

goroutine 59 [select, 44 minutes]:
net/http.(*persistConn).writeLoop(0xc82001c210)
    /usr/lib64/go/src/net/http/transport.go:1009 +0x40c
created by net/http.(*Transport).dialConn
    /usr/lib64/go/src/net/http/transport.go:686 +0xc9d

Govend fails with multiple gopaths

multiple gopaths are valid in go https://golang.org/cmd/go/#hdr-GOPATH_environment_variable

GOPATH environment variable lists places to look for Go code. On Unix, the value is a colon-separated string. On Windows, the value is a semicolon-separated string. On Plan 9, the value is a list.

but govend fails completely if you use them. vendorable.go is at fault
https://github.com/govend/govend/blob/master/deps/vendorable.go#L60

the checks assume the GOPATH variable will be a single path when it can be "/a/b/c:/d/e:/f/" or others. obviously that entire function fails if you have a GOPATH like that

possible to support git repo sub-folder?

Hi govend team,

I'm experimenting migrating our repo (100+ deps) to govend from govender. It works fine here except we have some deps are using sub folders with different commit id, for example,

  • path: github.com/stretchr/testify/mock
    rev: f390dcf405f7b83c997eac1b06768bb9f44dec18
  • path: github.com/stretchr/testify/require
    rev: e3a8ff8ce36581f87a15341206f205b1da467059

however I noticed govend only supports first level folder, like,

  • path: github.com/stretchr/testify
    rev: e3a8ff8ce36581f87a15341206f205b1da467059

Have I missed sth? If not support now could we support it in future?

Thanks.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.