Skip to content

Commit c188930

Browse files
authoredNov 19, 2019
Switch to Go modules (#111)
This switches the library to Go modules, simplifying the Makefile and Travis setup. We didn't have linting set up on this repo. This also sets up some basic linting and fixes the issues found by it.
1 parent 773b542 commit c188930

File tree

10 files changed

+194
-77
lines changed

10 files changed

+194
-77
lines changed
 

‎.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,6 @@ coverage.txt
1111
*.pprof
1212
/.bin
1313
/.cache
14+
/bin
15+
cover.out
16+
cover.html

‎.travis.yml

+21-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,28 @@
11
language: go
22
sudo: false
33
go_import_path: go.uber.org/config
4-
go:
5-
- 1.9.x
6-
- 1.10.x
4+
5+
env:
6+
global:
7+
- GO111MODULE=on
8+
79
matrix:
8-
# Necessary until we only support Go 1.10 and above.
910
include:
10-
- go: 1.10.x
11-
env: COVER=true
11+
- go: 1.12.x
12+
- go: 1.13.x
13+
env: LINT=1
14+
15+
before_install:
16+
- go version
17+
18+
# Download modules to the cache.
1219
install:
13-
- make install
20+
- go mod download
21+
1422
script:
15-
- make ci
23+
- test -z "$LINT" || make lint
24+
- make test
25+
26+
after_success:
27+
- make cover
28+
- bash <(curl -s https://codecov.io/bash)

‎CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

7+
## Unreleased
8+
### Changed
9+
- Migrate to Go modules.
10+
711
## 1.3.1 - 2018-10-22
812
### Fixed
913
- Fix environment variable interpolation when `WithDefault` is used.

‎Makefile

+39-16
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,43 @@
1-
SHELL := /usr/bin/env bash
2-
TEST := go test -race
1+
export GOBIN ?= $(shell pwd)/bin
32

4-
.PHONY: install
5-
install:
6-
glide --version || go get github.com/Masterminds/glide
7-
glide install
3+
GOLINT = $(GOBIN)/golint
4+
5+
GO_FILES := $(shell \
6+
find . '(' -path '*/.*' -o -path './vendor' ')' -prune \
7+
-o -name '*.go' -print | cut -b3-)
8+
9+
.PHONY: build
10+
build:
11+
go build ./...
812

913
.PHONY: test
1014
test:
11-
$(TEST) ./...
12-
13-
.PHONY: ci
14-
ci:
15-
ifdef COVER
16-
$(TEST) -cover -coverprofile=coverage.txt ./...
17-
bash <(curl -s https://codecov.io/bash)
18-
else
19-
$(TEST) ./...
20-
endif
15+
go test -race ./...
16+
17+
.PHONY: cover
18+
cover:
19+
go test -coverprofile=cover.out -coverpkg=./... -v ./...
20+
go tool cover -html=cover.out -o cover.html
21+
22+
.PHONY: lint
23+
lint: gofmt govet golint
24+
25+
.PHONY: govet
26+
@echo "Running govet"
27+
@go vet ./...
28+
29+
.PHONY: gofmt
30+
gofmt:
31+
@echo "Running gofmt"
32+
$(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX))
33+
@gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true
34+
@[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" | cat - $(FMT_LOG) && false)
35+
36+
.PHONY: golint
37+
golint: $(GOLINT)
38+
@echo "Running golint"
39+
@$(GOLINT) ./...
40+
41+
$(GOLINT):
42+
@echo "Installing golint"
43+
@go install golang.org/x/lint/golint

‎expand_test.go

+25-25
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2017 Uber Technologies, Inc.
1+
// Copyright (c) 2019 Uber Technologies, Inc.
22
//
33
// Permission is hereby granted, free of charge, to any person obtaining a copy
44
// of this software and associated documentation files (the "Software"), to deal
@@ -47,12 +47,12 @@ const expected = `This is a test$. $ This is a $test.
4747
$$$$
4848
${parti`
4949

50-
const ends_in_dollar = `There is a dollar at the end$`
51-
const ends_in_ddollar = `There is a dollar at the end$$`
52-
const many_dollars_orig = `$$$$$$$`
53-
const many_dollars_expect = `$$$$`
54-
const ends_in_var = `There is a test at the end: $t3sT`
55-
const ends_in_var_expect = `There is a test at the end: test`
50+
const endsInDollar = `There is a dollar at the end$`
51+
const endsInDoubleDollar = `There is a dollar at the end$$`
52+
const manyDollarsOrig = `$$$$$$$`
53+
const manyDollarsExpect = `$$$$`
54+
const endsInVar = `There is a test at the end: $t3sT`
55+
const endsInVarExpect = `There is a test at the end: test`
5656

5757
type oneByteReader struct {
5858
r io.Reader
@@ -89,7 +89,7 @@ func (e *bufReader) Read(buf []byte) (int, error) {
8989
func TestExpander(t *testing.T) {
9090
r := bytes.NewReader([]byte(orig))
9191

92-
expand_func := func(s string) (string, error) {
92+
expandFunc := func(s string) (string, error) {
9393
switch s {
9494
case "t3sT":
9595
return "test", nil
@@ -101,7 +101,7 @@ func TestExpander(t *testing.T) {
101101
}
102102

103103
// Parse whole string
104-
tr := transform.NewReader(r, &expandTransformer{expand: expand_func})
104+
tr := transform.NewReader(r, &expandTransformer{expand: expandFunc})
105105
actual, err := ioutil.ReadAll(tr)
106106
require.NoError(t, err)
107107
assert.Exactly(t, expected, string(actual))
@@ -111,15 +111,15 @@ func TestExpander(t *testing.T) {
111111

112112
// Partial parse
113113
var partial [11]byte
114-
tr = transform.NewReader(r, &expandTransformer{expand: expand_func})
114+
tr = transform.NewReader(r, &expandTransformer{expand: expandFunc})
115115
n, err := tr.Read(partial[:])
116116
require.NoError(t, err)
117117
assert.Exactly(t, n, len(partial))
118118
assert.Exactly(t, expected[:n], string(partial[:]))
119119

120120
// Empty string
121121
r = bytes.NewReader([]byte{})
122-
tr = transform.NewReader(r, &expandTransformer{expand: expand_func})
122+
tr = transform.NewReader(r, &expandTransformer{expand: expandFunc})
123123
actual, err = ioutil.ReadAll(tr)
124124
require.NoError(t, err)
125125
assert.Exactly(t, "", string(actual))
@@ -129,7 +129,7 @@ func TestExpanderOneByteAtATime(t *testing.T) {
129129
r := bytes.NewReader([]byte(orig))
130130
rr := &oneByteReader{r: r}
131131

132-
expand_func := func(s string) (string, error) {
132+
expandFunc := func(s string) (string, error) {
133133
switch s {
134134
case "t3sT":
135135
return "test", nil
@@ -140,7 +140,7 @@ func TestExpanderOneByteAtATime(t *testing.T) {
140140
return "NOMATCH", errors.New("No Match")
141141
}
142142

143-
tr := transform.NewReader(rr, &expandTransformer{expand: expand_func})
143+
tr := transform.NewReader(rr, &expandTransformer{expand: expandFunc})
144144
actual, err := ioutil.ReadAll(tr)
145145
require.NoError(t, err)
146146
assert.Exactly(t, expected, string(actual))
@@ -149,7 +149,7 @@ func TestExpanderOneByteAtATime(t *testing.T) {
149149
func TestExpanderFailingTransform(t *testing.T) {
150150
r := bytes.NewReader([]byte(orig))
151151

152-
expand_func := func(s string) (string, error) {
152+
expandFunc := func(s string) (string, error) {
153153
switch s {
154154
case "t3sT":
155155
return "test", nil
@@ -159,7 +159,7 @@ func TestExpanderFailingTransform(t *testing.T) {
159159
return "NOMATCH", errors.New("No Match")
160160
}
161161

162-
tr := transform.NewReader(r, &expandTransformer{expand: expand_func})
162+
tr := transform.NewReader(r, &expandTransformer{expand: expandFunc})
163163
_, err := ioutil.ReadAll(tr)
164164
require.Error(t, err)
165165
}
@@ -169,13 +169,13 @@ func TestExpanderMisc(t *testing.T) {
169169
orig string
170170
expect string
171171
}{
172-
{ends_in_dollar, ends_in_dollar},
173-
{ends_in_ddollar, ends_in_dollar},
174-
{ends_in_var, ends_in_var_expect},
175-
{many_dollars_orig, many_dollars_expect},
172+
{endsInDollar, endsInDollar},
173+
{endsInDoubleDollar, endsInDollar},
174+
{endsInVar, endsInVarExpect},
175+
{manyDollarsOrig, manyDollarsExpect},
176176
}
177177

178-
expand_func := func(s string) (string, error) {
178+
expandFunc := func(s string) (string, error) {
179179
switch s {
180180
case "t3sT":
181181
return "test", nil
@@ -191,7 +191,7 @@ func TestExpanderMisc(t *testing.T) {
191191
func(t *testing.T) {
192192
tr := transform.NewReader(
193193
bytes.NewReader([]byte(tst.orig)),
194-
&expandTransformer{expand: expand_func},
194+
&expandTransformer{expand: expandFunc},
195195
)
196196
actual, err := ioutil.ReadAll(tr)
197197
require.NoError(t, err)
@@ -213,7 +213,7 @@ func TestExpanderLongSrc(t *testing.T) {
213213
{"$a${", a + "${"},
214214
}
215215

216-
expand_func := func(s string) (string, error) {
216+
expandFunc := func(s string) (string, error) {
217217
switch s {
218218
case "a":
219219
return a, nil
@@ -228,7 +228,7 @@ func TestExpanderLongSrc(t *testing.T) {
228228
func(t *testing.T) {
229229
tr := transform.NewReader(
230230
&bufReader{buf: []byte(tst.orig)},
231-
&expandTransformer{expand: expand_func},
231+
&expandTransformer{expand: expandFunc},
232232
)
233233
actual, err := ioutil.ReadAll(tr)
234234
require.NoError(t, err)
@@ -253,7 +253,7 @@ func TestTransformLimit(t *testing.T) {
253253
{"$" + a, transform.ErrShortSrc},
254254
}
255255

256-
expand_func := func(s string) (string, error) {
256+
expandFunc := func(s string) (string, error) {
257257
switch s {
258258
case "a":
259259
return a + "aa", nil
@@ -270,7 +270,7 @@ func TestTransformLimit(t *testing.T) {
270270
func(t *testing.T) {
271271
tr := transform.NewReader(
272272
bytes.NewReader([]byte(tst.orig)),
273-
&expandTransformer{expand: expand_func},
273+
&expandTransformer{expand: expandFunc},
274274
)
275275
_, err := ioutil.ReadAll(tr)
276276
require.EqualError(t, err, tst.err.Error())

‎glide.lock

-27
This file was deleted.

‎go.mod

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module go.uber.org/config
2+
3+
go 1.13
4+
5+
require (
6+
github.com/stretchr/testify v1.4.0
7+
go.uber.org/multierr v1.4.0
8+
golang.org/x/lint v0.0.0-20190930215403-16217165b5de
9+
golang.org/x/text v0.3.2
10+
golang.org/x/tools v0.0.0-20191104232314-dc038396d1f0 // indirect
11+
gopkg.in/yaml.v2 v2.2.5
12+
)

‎go.sum

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
2+
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
7+
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
8+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
9+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
10+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
11+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
12+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
13+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
14+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
15+
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
16+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
17+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
18+
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
19+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
20+
go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
21+
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
22+
go.uber.org/multierr v1.4.0 h1:f3WCSC2KzAcBXGATIxAB1E2XuCpNU255wNKZ505qi3E=
23+
go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
24+
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
25+
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
26+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
27+
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
28+
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
29+
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
30+
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
31+
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
32+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
33+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
34+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
35+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
36+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
37+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
38+
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
39+
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
40+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
41+
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
42+
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
43+
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
44+
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
45+
golang.org/x/tools v0.0.0-20191104232314-dc038396d1f0 h1:azkp5oIgy7LNGQ64URezZccjePaEGSYIHEgYTn/bfXI=
46+
golang.org/x/tools v0.0.0-20191104232314-dc038396d1f0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
47+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
48+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
49+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
50+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
51+
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
52+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
53+
gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c=
54+
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
55+
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
56+
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=

‎internal/merge/merge.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2018 Uber Technologies, Inc.
1+
// Copyright (c) 2019 Uber Technologies, Inc.
22
//
33
// Permission is hereby granted, free of charge, to any person obtaining a copy
44
// of this software and associated documentation files (the "Software"), to deal
@@ -136,16 +136,21 @@ func mergeMapping(into, from mapping, strict bool) (mapping, error) {
136136
return merged, nil
137137
}
138138

139+
// IsMapping reports whether a type is a mapping in YAML, represented as a
140+
// map[interface{}]interface{}.
139141
func IsMapping(i interface{}) bool {
140142
_, is := i.(mapping)
141143
return is
142144
}
143145

146+
// IsSequence reports whether a type is a sequence in YAML, represented as an
147+
// []interface{}.
144148
func IsSequence(i interface{}) bool {
145149
_, is := i.(sequence)
146150
return is
147151
}
148152

153+
// IsScalar reports whether a type is a scalar value in YAML.
149154
func IsScalar(i interface{}) bool {
150155
return !IsMapping(i) && !IsSequence(i)
151156
}

‎tools.go

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright (c) 2019 Uber Technologies, Inc.
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy
4+
// of this software and associated documentation files (the "Software"), to deal
5+
// in the Software without restriction, including without limitation the rights
6+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7+
// copies of the Software, and to permit persons to whom the Software is
8+
// furnished to do so, subject to the following conditions:
9+
//
10+
// The above copyright notice and this permission notice shall be included in
11+
// all copies or substantial portions of the Software.
12+
//
13+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19+
// THE SOFTWARE.
20+
21+
// +build tools
22+
23+
package config
24+
25+
import (
26+
// Tools we use during development.
27+
_ "golang.org/x/lint/golint"
28+
)

0 commit comments

Comments
 (0)
Please sign in to comment.