Skip to content

Commit 536a7d3

Browse files
authored
Merge pull request #228 from x-motemen/gopls-completion
Support completion based on gopls, deprecate gocode support
2 parents 5ef0509 + 9d247e2 commit 536a7d3

14 files changed

+504
-219
lines changed

.github/workflows/ci.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ jobs:
5050
uses: actions/setup-go@v5
5151
with:
5252
go-version: ${{ matrix.go }}
53-
- name: Install gocode
54-
run: go install github.com/mdempsky/gocode@latest
53+
- name: Install gopls
54+
run: go install golang.org/x/tools/gopls@latest
5555
- name: Build
5656
run: make build
5757
- name: Test

Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
FROM golang:1.24.0-alpine3.21
22

33
RUN apk add --no-cache git make \
4-
&& go install github.com/mdempsky/gocode@latest
4+
&& go install golang.org/x/tools/gopls@latest
55

66
WORKDIR /go/src/github.com/x-motemen/gore/
77
COPY go.* ./

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ To quit the session, type `Ctrl-D` or use `:q` command.
2525
- Package importing with completion
2626
- Evaluates any expressions, statements and function declarations
2727
- No "evaluated but not used" errors
28-
- Code completion (requires [gocode](https://github.com/mdempsky/gocode))
28+
- Code completion (requires [gopls](https://github.com/golang/tools/blob/master/gopls/README.md))
2929
- Showing documents
3030
- Auto-importing (`gore -autoimport`)
3131

@@ -56,7 +56,7 @@ Make sure `$GOPATH/bin` is in your `$PATH`.
5656
Also recommended:
5757

5858
```sh
59-
go install github.com/mdempsky/gocode@latest # for code completion
59+
go install golang.org/x/tools/gopls@latest # for code completion
6060
```
6161

6262
Or you can use Docker:

complete.go

+13-22
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import (
44
"fmt"
55
"strings"
66
"unicode"
7-
8-
"github.com/x-motemen/gore/gocode"
97
)
108

119
func (s *Session) completeWord(line string, pos int) (string, []string, string) {
@@ -63,12 +61,12 @@ func (s *Session) completeCommand(prefix, suffix string) (string, []string, stri
6361
return "", nil, ""
6462
}
6563

66-
// completeCode does code completion within the session using gocode.
64+
// completeCode does code completion within the session using gopls.
6765
// in and pos specifies the current input and the cursor position (0 <= pos <= len(in)) respectively.
6866
// If exprMode is set to true, the completion is done as an expression (e.g. appends "(" to functions).
6967
// Return value keep specifies how many characters of in should be kept and candidates are what follow in[0:keep].
7068
func (s *Session) completeCode(in string, pos int, exprMode bool) (keep int, candidates []string, err error) {
71-
if !gocode.Available() {
69+
if s.completer == nil {
7270
return
7371
}
7472

@@ -79,29 +77,22 @@ func (s *Session) completeCode(in string, pos int, exprMode bool) (keep int, can
7977
return
8078
}
8179

80+
if err = s.completer.update(source); err != nil {
81+
return
82+
}
83+
8284
// Kind of dirty hack :/
8385
p := strings.LastIndex(source, "}")
84-
editingSource := source[0:p] + in + source[p:]
85-
cursor := len(source[0:p]) + pos
86+
editingSource := source[:p] + "; " + in + source[p:]
87+
cursor := p + pos + 2
8688

87-
result, err := gocode.Query([]byte(editingSource), cursor)
88-
if err != nil {
89+
debugf("complete code: %q, %d, %v", in, pos, exprMode)
90+
if candidates, keep, err = s.completer.complete(
91+
editingSource, cursor, exprMode); err != nil {
8992
return
9093
}
91-
92-
keep = pos - result.Cursor
93-
candidates = make([]string, 0, len(result.Candidates))
94-
for _, e := range result.Candidates {
95-
cand := e.Name
96-
if cand == printerName && e.Class == "func" {
97-
continue
98-
}
99-
if exprMode && e.Class == "func" {
100-
cand += "("
101-
}
102-
candidates = append(candidates, cand)
103-
}
104-
94+
keep -= p + 2
95+
debugf("complete results: %q, %d", candidates, keep)
10596
return
10697
}
10798

complete_test.go

+16-9
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,19 @@ import (
66

77
"github.com/stretchr/testify/assert"
88
"github.com/stretchr/testify/require"
9-
10-
"github.com/x-motemen/gore/gocode"
119
)
1210

1311
func TestSession_completeWord(t *testing.T) {
14-
if !gocode.Available() {
15-
t.Skipf("gocode unavailable")
16-
}
17-
1812
var stdout, stderr strings.Builder
1913
s, err := NewSession(&stdout, &stderr)
2014
t.Cleanup(func() { s.Clear() })
2115
require.NoError(t, err)
2216

17+
err = s.initCompleter()
18+
if err != nil {
19+
t.Skipf("Skip test: %s", err)
20+
}
21+
2322
pre, cands, post := s.completeWord("", 0)
2423
assert.Equal(t, "", pre)
2524
assert.Equal(t, []string{" "}, cands)
@@ -113,13 +112,21 @@ func TestSession_completeWord(t *testing.T) {
113112
err = actionImport(s, "fmt")
114113
require.NoError(t, err)
115114

116-
pre, cands, post = s.completeWord("fmt.p", 5)
115+
pre, cands, post = s.completeWord("fmt.f", 5)
117116
assert.Equal(t, "fmt.", pre)
118-
assert.Contains(t, cands, "Println(")
117+
assert.Contains(t, cands, "Fprintf(")
118+
assert.Contains(t, cands, "Formatter")
119119
assert.Equal(t, post, "")
120120

121121
pre, cands, post = s.completeWord(" ::: doc f", 11)
122122
assert.Equal(t, " ::: doc ", pre)
123-
assert.Equal(t, []string{"fmt"}, cands)
123+
assert.Contains(t, cands, "fmt")
124+
assert.Contains(t, cands, "fmt.Append")
125+
assert.Equal(t, post, "")
126+
127+
pre, cands, post = s.completeWord(" ::: doc fmt.", 14)
128+
assert.Equal(t, " ::: doc ", pre)
129+
assert.Contains(t, cands, "fmt.Fprintf")
130+
assert.Contains(t, cands, "fmt.Formatter")
124131
assert.Equal(t, post, "")
125132
}

go.mod

+12-2
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,27 @@ go 1.22.0
55
require (
66
github.com/motemen/go-quickfix v0.0.0-20250224075427-39bb724d71b7
77
github.com/peterh/liner v1.2.2
8-
github.com/stretchr/testify v1.3.0
8+
github.com/stretchr/testify v1.7.0
9+
go.lsp.dev/jsonrpc2 v0.10.0
10+
go.lsp.dev/protocol v0.12.0
911
golang.org/x/text v0.22.0
1012
golang.org/x/tools v0.30.0
1113
)
1214

1315
require (
14-
github.com/davecgh/go-spew v1.1.0 // indirect
16+
github.com/davecgh/go-spew v1.1.1 // indirect
1517
github.com/mattn/go-runewidth v0.0.16 // indirect
1618
github.com/pmezard/go-difflib v1.0.0 // indirect
1719
github.com/rivo/uniseg v0.4.7 // indirect
20+
github.com/segmentio/asm v1.1.3 // indirect
21+
github.com/segmentio/encoding v0.3.4 // indirect
22+
go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 // indirect
23+
go.lsp.dev/uri v0.3.0 // indirect
24+
go.uber.org/atomic v1.9.0 // indirect
25+
go.uber.org/multierr v1.8.0 // indirect
26+
go.uber.org/zap v1.21.0 // indirect
1827
golang.org/x/mod v0.23.0 // indirect
1928
golang.org/x/sync v0.11.0 // indirect
2029
golang.org/x/sys v0.30.0 // indirect
30+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
2131
)

go.sum

+72-2
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,100 @@
1-
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
1+
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
2+
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
23
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/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
37
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
48
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
9+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
10+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
11+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
12+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
13+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
514
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
615
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
716
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
817
github.com/motemen/go-quickfix v0.0.0-20250224075427-39bb724d71b7 h1:MgCuhAyhIhANdLQ3lSDEIVkPJ+Ptl3vF+VlxwtvktKg=
918
github.com/motemen/go-quickfix v0.0.0-20250224075427-39bb724d71b7/go.mod h1:0+5ypL0dsSEP+Sk2ka+6CuQY7Dzr3wVIDgKDjLf8tRg=
1019
github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw=
1120
github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI=
21+
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
22+
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
1223
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1324
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1425
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
1526
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
1627
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
28+
github.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc=
29+
github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg=
30+
github.com/segmentio/encoding v0.3.4 h1:WM4IBnxH8B9TakiM2QD5LyNl9JSndh88QbHqVC+Pauc=
31+
github.com/segmentio/encoding v0.3.4/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM=
1732
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
18-
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
1933
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
34+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
35+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
36+
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
37+
go.lsp.dev/jsonrpc2 v0.10.0 h1:Pr/YcXJoEOTMc/b6OTmcR1DPJ3mSWl/SWiU1Cct6VmI=
38+
go.lsp.dev/jsonrpc2 v0.10.0/go.mod h1:fmEzIdXPi/rf6d4uFcayi8HpFP1nBF99ERP1htC72Ac=
39+
go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 h1:hCzQgh6UcwbKgNSRurYWSqh8MufqRRPODRBblutn4TE=
40+
go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2/go.mod h1:gtSHRuYfbCT0qnbLnovpie/WEmqyJ7T4n6VXiFMBtcw=
41+
go.lsp.dev/protocol v0.12.0 h1:tNprUI9klQW5FAFVM4Sa+AbPFuVQByWhP1ttNUAjIWg=
42+
go.lsp.dev/protocol v0.12.0/go.mod h1:Qb11/HgZQ72qQbeyPfJbu3hZBH23s1sr4st8czGeDMQ=
43+
go.lsp.dev/uri v0.3.0 h1:KcZJmh6nFIBeJzTugn5JTU6OOyG0lDOo3R9KwTxTYbo=
44+
go.lsp.dev/uri v0.3.0/go.mod h1:P5sbO1IQR+qySTWOCnhnK7phBx+W3zbLqSMDJNTw88I=
45+
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
46+
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
47+
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
48+
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
49+
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
50+
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
51+
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
52+
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
53+
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
54+
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
55+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
56+
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
57+
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
58+
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
2059
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
2160
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
61+
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
62+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
63+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
64+
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
65+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
66+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
2267
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
2368
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
69+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
70+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
71+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
72+
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
73+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
74+
golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
2475
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
2576
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
2677
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
78+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
79+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
80+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
2781
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
2882
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
83+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
84+
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
85+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
86+
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
2987
golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
3088
golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
89+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
90+
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
91+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
92+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
93+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
94+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
95+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
96+
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
97+
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
98+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
99+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
100+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)