diff --git a/datastore.go b/datastore.go index 5d33d9e..954752e 100644 --- a/datastore.go +++ b/datastore.go @@ -1,6 +1,7 @@ package leveldb import ( + "context" "os" "path/filepath" "sync" @@ -79,17 +80,17 @@ type accessor struct { closeLk *sync.RWMutex } -func (a *accessor) Put(key ds.Key, value []byte) (err error) { +func (a *accessor) Put(ctx context.Context, key ds.Key, value []byte) (err error) { a.closeLk.RLock() defer a.closeLk.RUnlock() return a.ldb.Put(key.Bytes(), value, &opt.WriteOptions{Sync: a.syncWrites}) } -func (a *accessor) Sync(prefix ds.Key) error { +func (a *accessor) Sync(ctx context.Context, prefix ds.Key) error { return nil } -func (a *accessor) Get(key ds.Key) (value []byte, err error) { +func (a *accessor) Get(ctx context.Context, key ds.Key) (value []byte, err error) { a.closeLk.RLock() defer a.closeLk.RUnlock() val, err := a.ldb.Get(key.Bytes(), nil) @@ -102,23 +103,23 @@ func (a *accessor) Get(key ds.Key) (value []byte, err error) { return val, nil } -func (a *accessor) Has(key ds.Key) (exists bool, err error) { +func (a *accessor) Has(ctx context.Context, key ds.Key) (exists bool, err error) { a.closeLk.RLock() defer a.closeLk.RUnlock() return a.ldb.Has(key.Bytes(), nil) } -func (a *accessor) GetSize(key ds.Key) (size int, err error) { - return ds.GetBackedSize(a, key) +func (a *accessor) GetSize(ctx context.Context, key ds.Key) (size int, err error) { + return ds.GetBackedSize(ctx, a, key) } -func (a *accessor) Delete(key ds.Key) (err error) { +func (a *accessor) Delete(ctx context.Context, key ds.Key) (err error) { a.closeLk.RLock() defer a.closeLk.RUnlock() return a.ldb.Delete(key.Bytes(), &opt.WriteOptions{Sync: a.syncWrites}) } -func (a *accessor) Query(q dsq.Query) (dsq.Results, error) { +func (a *accessor) Query(ctx context.Context, q dsq.Query) (dsq.Results, error) { a.closeLk.RLock() defer a.closeLk.RUnlock() var rnge *util.Range @@ -175,7 +176,7 @@ func (a *accessor) Query(q dsq.Query) (dsq.Results, error) { // DiskUsage returns the current disk size used by this levelDB. // For in-mem datastores, it will return 0. -func (d *Datastore) DiskUsage() (uint64, error) { +func (d *Datastore) DiskUsage(ctx context.Context) (uint64, error) { d.closeLk.RLock() defer d.closeLk.RUnlock() if d.path == "" { // in-mem @@ -213,7 +214,7 @@ type leveldbBatch struct { syncWrites bool } -func (d *Datastore) Batch() (ds.Batch, error) { +func (d *Datastore) Batch(ctx context.Context) (ds.Batch, error) { return &leveldbBatch{ b: new(leveldb.Batch), db: d.DB, @@ -222,18 +223,18 @@ func (d *Datastore) Batch() (ds.Batch, error) { }, nil } -func (b *leveldbBatch) Put(key ds.Key, value []byte) error { +func (b *leveldbBatch) Put(ctx context.Context, key ds.Key, value []byte) error { b.b.Put(key.Bytes(), value) return nil } -func (b *leveldbBatch) Commit() error { +func (b *leveldbBatch) Commit(ctx context.Context) error { b.closeLk.RLock() defer b.closeLk.RUnlock() return b.db.Write(b.b, &opt.WriteOptions{Sync: b.syncWrites}) } -func (b *leveldbBatch) Delete(key ds.Key) error { +func (b *leveldbBatch) Delete(ctx context.Context, key ds.Key) error { b.b.Delete(key.Bytes()) return nil } @@ -244,19 +245,19 @@ type transaction struct { tx *leveldb.Transaction } -func (t *transaction) Commit() error { +func (t *transaction) Commit(ctx context.Context) error { t.closeLk.RLock() defer t.closeLk.RUnlock() return t.tx.Commit() } -func (t *transaction) Discard() { +func (t *transaction) Discard(ctx context.Context) { t.closeLk.RLock() defer t.closeLk.RUnlock() t.tx.Discard() } -func (d *Datastore) NewTransaction(readOnly bool) (ds.Txn, error) { +func (d *Datastore) NewTransaction(ctx context.Context, readOnly bool) (ds.Txn, error) { d.closeLk.RLock() defer d.closeLk.RUnlock() tx, err := d.DB.OpenTransaction() diff --git a/ds_test.go b/ds_test.go index 8779414..43013dd 100644 --- a/ds_test.go +++ b/ds_test.go @@ -2,6 +2,7 @@ package leveldb import ( "bytes" + "context" "fmt" "io/ioutil" "os" @@ -24,6 +25,8 @@ var testcases = map[string]string{ "/f": "f", } +var bg = context.Background() + // returns datastore, and a function to call on exit. // (this garbage collects). So: // @@ -61,14 +64,14 @@ func newDSMem(t *testing.T) *Datastore { func addTestCases(t *testing.T, d *Datastore, testcases map[string]string) { for k, v := range testcases { dsk := ds.NewKey(k) - if err := d.Put(dsk, []byte(v)); err != nil { + if err := d.Put(bg, dsk, []byte(v)); err != nil { t.Fatal(err) } } for k, v := range testcases { dsk := ds.NewKey(k) - v2, err := d.Get(dsk) + v2, err := d.Get(bg, dsk) if err != nil { t.Fatal(err) } @@ -82,7 +85,7 @@ func addTestCases(t *testing.T, d *Datastore, testcases map[string]string) { func testQuery(t *testing.T, d *Datastore) { addTestCases(t, d, testcases) - rs, err := d.Query(dsq.Query{Prefix: "/a/"}) + rs, err := d.Query(bg, dsq.Query{Prefix: "/a/"}) if err != nil { t.Fatal(err) } @@ -97,7 +100,7 @@ func testQuery(t *testing.T, d *Datastore) { // test offset and limit - rs, err = d.Query(dsq.Query{Prefix: "/a/", Offset: 2, Limit: 2}) + rs, err = d.Query(bg, dsq.Query{Prefix: "/a/", Offset: 2, Limit: 2}) if err != nil { t.Fatal(err) } @@ -109,7 +112,7 @@ func testQuery(t *testing.T, d *Datastore) { // test order - rs, err = d.Query(dsq.Query{Orders: []dsq.Order{dsq.OrderByKey{}}}) + rs, err = d.Query(bg, dsq.Query{Orders: []dsq.Order{dsq.OrderByKey{}}}) if err != nil { t.Fatal(err) } @@ -122,7 +125,7 @@ func testQuery(t *testing.T, d *Datastore) { expectOrderedMatches(t, keys, rs) - rs, err = d.Query(dsq.Query{Orders: []dsq.Order{dsq.OrderByKeyDescending{}}}) + rs, err = d.Query(bg, dsq.Query{Orders: []dsq.Order{dsq.OrderByKeyDescending{}}}) if err != nil { t.Fatal(err) } @@ -154,11 +157,11 @@ func TestQueryRespectsProcess(t *testing.T) { func TestCloseRace(t *testing.T) { d, close := newDS(t) for n := 0; n < 100; n++ { - d.Put(ds.NewKey(fmt.Sprintf("%d", n)), []byte(fmt.Sprintf("test%d", n))) + d.Put(bg, ds.NewKey(fmt.Sprintf("%d", n)), []byte(fmt.Sprintf("test%d", n))) } - tx, _ := d.NewTransaction(false) - tx.Put(ds.NewKey("txnversion"), []byte("bump")) + tx, _ := d.NewTransaction(bg, false) + tx.Put(bg, ds.NewKey("txnversion"), []byte("bump")) closeCh := make(chan interface{}) @@ -167,9 +170,9 @@ func TestCloseRace(t *testing.T) { closeCh <- nil }() for k := range testcases { - tx.Get(ds.NewKey(k)) + tx.Get(bg, ds.NewKey(k)) } - tx.Commit() + tx.Commit(bg) <-closeCh } @@ -177,13 +180,13 @@ func TestCloseSafety(t *testing.T) { d, close := newDS(t) addTestCases(t, d, testcases) - tx, _ := d.NewTransaction(false) - err := tx.Put(ds.NewKey("test"), []byte("test")) + tx, _ := d.NewTransaction(bg, false) + err := tx.Put(bg, ds.NewKey("test"), []byte("test")) if err != nil { t.Error("Failed to put in a txn.") } close() - err = tx.Commit() + err = tx.Commit(bg) if err == nil { t.Error("committing after close should fail.") } @@ -235,25 +238,25 @@ func expectOrderedMatches(t *testing.T, expect []string, actualR dsq.Results) { } func testBatching(t *testing.T, d *Datastore) { - b, err := d.Batch() + b, err := d.Batch(bg) if err != nil { t.Fatal(err) } for k, v := range testcases { - err := b.Put(ds.NewKey(k), []byte(v)) + err := b.Put(bg, ds.NewKey(k), []byte(v)) if err != nil { t.Fatal(err) } } - err = b.Commit() + err = b.Commit(bg) if err != nil { t.Fatal(err) } for k, v := range testcases { - val, err := d.Get(ds.NewKey(k)) + val, err := d.Get(bg, ds.NewKey(k)) if err != nil { t.Fatal(err) } @@ -278,7 +281,7 @@ func TestBatchingMem(t *testing.T) { func TestDiskUsage(t *testing.T) { d, done := newDS(t) addTestCases(t, d, testcases) - du, err := d.DiskUsage() + du, err := d.DiskUsage(bg) if err != nil { t.Fatal(err) } @@ -288,12 +291,12 @@ func TestDiskUsage(t *testing.T) { } k := ds.NewKey("more") - err = d.Put(k, []byte("value")) + err = d.Put(bg, k, []byte("value")) if err != nil { t.Fatal(err) } - du2, err := d.DiskUsage() + du2, err := d.DiskUsage(bg) if err != nil { t.Fatal(err) } @@ -304,7 +307,7 @@ func TestDiskUsage(t *testing.T) { done() // This should fail - _, err = d.DiskUsage() + _, err = d.DiskUsage(bg) if err == nil { t.Fatal("DiskUsage should fail when we cannot walk path") } @@ -312,7 +315,7 @@ func TestDiskUsage(t *testing.T) { func TestDiskUsageInMem(t *testing.T) { d := newDSMem(t) - du, _ := d.DiskUsage() + du, _ := d.DiskUsage(bg) if du != 0 { t.Fatal("inmem dbs have 0 disk usage") } @@ -324,22 +327,22 @@ func TestTransactionCommit(t *testing.T) { d, done := newDS(t) defer done() - txn, err := d.NewTransaction(false) + txn, err := d.NewTransaction(bg, false) if err != nil { t.Fatal(err) } - defer txn.Discard() + defer txn.Discard(bg) - if err := txn.Put(key, []byte("hello")); err != nil { + if err := txn.Put(bg, key, []byte("hello")); err != nil { t.Fatal(err) } - if val, err := d.Get(key); err != ds.ErrNotFound { + if val, err := d.Get(bg, key); err != ds.ErrNotFound { t.Fatalf("expected ErrNotFound, got err: %v, value: %v", err, val) } - if err := txn.Commit(); err != nil { + if err := txn.Commit(bg); err != nil { t.Fatal(err) } - if val, err := d.Get(key); err != nil || !bytes.Equal(val, []byte("hello")) { + if val, err := d.Get(bg, key); err != nil || !bytes.Equal(val, []byte("hello")) { t.Fatalf("expected entry present after commit, got err: %v, value: %v", err, val) } } @@ -350,22 +353,22 @@ func TestTransactionDiscard(t *testing.T) { d, done := newDS(t) defer done() - txn, err := d.NewTransaction(false) + txn, err := d.NewTransaction(bg, false) if err != nil { t.Fatal(err) } - defer txn.Discard() + defer txn.Discard(bg) - if err := txn.Put(key, []byte("hello")); err != nil { + if err := txn.Put(bg, key, []byte("hello")); err != nil { t.Fatal(err) } - if val, err := d.Get(key); err != ds.ErrNotFound { + if val, err := d.Get(bg, key); err != ds.ErrNotFound { t.Fatalf("expected ErrNotFound, got err: %v, value: %v", err, val) } - if txn.Discard(); err != nil { + if txn.Discard(bg); err != nil { t.Fatal(err) } - if val, err := d.Get(key); err != ds.ErrNotFound { + if val, err := d.Get(bg, key); err != ds.ErrNotFound { t.Fatalf("expected ErrNotFound, got err: %v, value: %v", err, val) } } @@ -376,41 +379,41 @@ func TestTransactionManyOperations(t *testing.T) { d, done := newDS(t) defer done() - txn, err := d.NewTransaction(false) + txn, err := d.NewTransaction(bg, false) if err != nil { t.Fatal(err) } - defer txn.Discard() + defer txn.Discard(bg) // Insert all entries. for i := 0; i < 5; i++ { - if err := txn.Put(keys[i], []byte(fmt.Sprintf("hello%d", i))); err != nil { + if err := txn.Put(bg, keys[i], []byte(fmt.Sprintf("hello%d", i))); err != nil { t.Fatal(err) } } // Remove the third entry. - if err := txn.Delete(keys[2]); err != nil { + if err := txn.Delete(bg, keys[2]); err != nil { t.Fatal(err) } // Check existences. - if has, err := txn.Has(keys[1]); err != nil || !has { + if has, err := txn.Has(bg, keys[1]); err != nil || !has { t.Fatalf("expected key[1] to be present, err: %v, has: %v", err, has) } - if has, err := txn.Has(keys[2]); err != nil || has { + if has, err := txn.Has(bg, keys[2]); err != nil || has { t.Fatalf("expected key[2] to be absent, err: %v, has: %v", err, has) } var res dsq.Results - if res, err = txn.Query(dsq.Query{Prefix: "/test"}); err != nil { + if res, err = txn.Query(bg, dsq.Query{Prefix: "/test"}); err != nil { t.Fatalf("query failed, err: %v", err) } if entries, err := res.Rest(); err != nil || len(entries) != 4 { t.Fatalf("query failed or contained unexpected number of entries, err: %v, results: %v", err, entries) } - txn.Discard() + txn.Discard(bg) } func TestSuite(t *testing.T) { diff --git a/go.mod b/go.mod index 5a0bffd..2626e13 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,7 @@ module github.com/ipfs/go-ds-leveldb require ( - github.com/ipfs/go-datastore v0.4.1 + github.com/ipfs/go-datastore v0.5.0 github.com/syndtr/goleveldb v1.0.0 ) diff --git a/go.sum b/go.sum index 72bb771..ab4fcd4 100644 --- a/go.sum +++ b/go.sum @@ -1,18 +1,27 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ipfs/go-datastore v0.4.1 h1:W4ZfzyhNi3xmuU5dQhjfuRn/wFuqEE1KnOmmQiOevEY= -github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.5.0 h1:rQicVCEacWyk4JZ6G5bD9TKR7lZEG1MWcG7UdWYrFAU= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -21,22 +30,46 @@ github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=