Skip to content

Commit 57e4a35

Browse files
authored
Merge pull request #68 from cocoide/feature/auto-pull-req
PRの自動生成
2 parents 5455880 + 38dd185 commit 57e4a35

20 files changed

+812
-117
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ go.work
2323
# Environment variables
2424
.env
2525
dist/
26-
config.yaml
26+
config.yaml
27+
.idea

cmd/push.go

+265
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,265 @@
1+
/*
2+
Copyright © 2023 NAME HERE <EMAIL ADDRESS>
3+
*/
4+
package cmd
5+
6+
import (
7+
"fmt"
8+
"github.com/charmbracelet/bubbles/spinner"
9+
"github.com/charmbracelet/bubbles/textarea"
10+
"github.com/charmbracelet/bubbles/textinput"
11+
tea "github.com/charmbracelet/bubbletea"
12+
"github.com/cocoide/commitify/internal/entity"
13+
"github.com/cocoide/commitify/internal/gateway"
14+
"github.com/cocoide/commitify/internal/usecase"
15+
"github.com/fatih/color"
16+
"github.com/spf13/cobra"
17+
"golang.org/x/net/context"
18+
"strings"
19+
)
20+
21+
type pushModel struct {
22+
step PushCmdStep
23+
selectBaseIndex int
24+
baseList []string
25+
pr *entity.PullRequest
26+
pcu *usecase.PushCmdUsecase
27+
loadMsg string
28+
errMsg string
29+
spinner spinner.Model
30+
prInput *prInput
31+
}
32+
33+
type prInput struct {
34+
titleInput textinput.Model
35+
bodyInput textarea.Model
36+
}
37+
38+
type PushCmdStep int
39+
40+
const (
41+
SelectBaseBranch PushCmdStep = iota
42+
EditPRTitle
43+
EditPRBody
44+
SubmitPR
45+
)
46+
47+
var _ tea.Model = &pushModel{}
48+
49+
func (m *pushModel) Init() tea.Cmd {
50+
return nil
51+
}
52+
53+
type generatePRMsg struct {
54+
pr *entity.PullRequest
55+
err error
56+
}
57+
58+
func (m *pushModel) generatePRCmd() tea.Cmd {
59+
return func() tea.Msg {
60+
selectBranch := m.baseList[m.selectBaseIndex]
61+
pr, err := m.pcu.GeneratePullRequest(selectBranch)
62+
return generatePRMsg{pr, err}
63+
}
64+
}
65+
66+
type submitPRMsg struct {
67+
err error
68+
}
69+
70+
func (m *pushModel) submitPRCmd() tea.Cmd {
71+
return func() tea.Msg {
72+
err := m.pcu.SubmitPullRequest(m.pr)
73+
return submitPRMsg{err}
74+
}
75+
}
76+
77+
func (m *pushModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
78+
var cmd tea.Cmd
79+
switch msg := msg.(type) {
80+
case spinner.TickMsg:
81+
var cmd tea.Cmd
82+
m.spinner, cmd = m.spinner.Update(msg)
83+
return m, cmd
84+
case tea.KeyMsg:
85+
switch msg.Type {
86+
case tea.KeyCtrlC, tea.KeyEsc:
87+
return m, tea.Quit
88+
case tea.KeyCtrlE:
89+
m.step--
90+
}
91+
switch m.step {
92+
case SelectBaseBranch:
93+
switch msg.Type {
94+
case tea.KeyUp:
95+
if m.selectBaseIndex > 0 {
96+
m.selectBaseIndex--
97+
}
98+
case tea.KeyDown:
99+
if m.selectBaseIndex < len(m.baseList)-1 {
100+
m.selectBaseIndex++
101+
}
102+
case tea.KeyEnter:
103+
m.loadMsg = "PRを生成中..."
104+
return m, m.generatePRCmd()
105+
}
106+
case EditPRTitle:
107+
cmd = m.updateTitleInput(msg)
108+
switch msg.Type {
109+
case tea.KeyEnter:
110+
m.pr.Title = m.prInput.titleInput.Value()
111+
m.step = EditPRBody
112+
m.focusInPRBody()
113+
return m, cmd
114+
}
115+
case EditPRBody:
116+
cmd = m.updateBodyInput(msg)
117+
switch msg.Type {
118+
case tea.KeyEnter:
119+
m.pr.Body = m.prInput.bodyInput.Value()
120+
m.step = SubmitPR
121+
m.loadMsg = "PRを提出中..."
122+
return m, m.submitPRCmd()
123+
}
124+
}
125+
case generatePRMsg:
126+
if msg.err != nil {
127+
m.errMsg = fmt.Sprintf("🚨PR生成中にエラーが発生: %v", msg.err)
128+
} else {
129+
m.pr = msg.pr
130+
m.step = EditPRTitle
131+
m.focusInPRTitle()
132+
}
133+
m.finishLoading()
134+
case submitPRMsg:
135+
if msg.err != nil {
136+
// リファクタ: github tokenがexpireした時は、loginコマンドを自動実行
137+
// → tokenがexpireしたときのエラーを調べないといけない...
138+
m.errMsg = fmt.Sprintf("🚨PR提出中にエラーが発生: %v", msg.err)
139+
}
140+
m.finishLoading()
141+
}
142+
return m, nil
143+
}
144+
145+
func (m *pushModel) View() string {
146+
if m.errMsg != "" {
147+
return m.errMsg
148+
}
149+
if m.loadMsg != "" {
150+
return fmt.Sprintf("\n %s %s\n\n", m.spinner.View(), textStyle(m.loadMsg))
151+
}
152+
switch m.step {
153+
case SelectBaseBranch:
154+
return m.buildSelectBaseBranchText()
155+
case EditPRTitle:
156+
return color.HiWhiteString("<Titleの編集: Enterで確定>\n\n") + fmt.Sprintf("Title:\n%s", m.prInput.titleInput.View())
157+
case EditPRBody:
158+
return color.HiWhiteString("<Bodyの編集: EnterでPush&PR提出, Ctrl+Eで戻る>\n\n") + fmt.Sprintf("Body:\n%s", m.prInput.bodyInput.View())
159+
case SubmitPR:
160+
return fmt.Sprintf("**🎉PRの作成に成功**")
161+
}
162+
return ""
163+
}
164+
165+
func NewPushModel() *pushModel {
166+
ti := textinput.New()
167+
ti.Focus()
168+
var errMsg string
169+
ctx := context.Background()
170+
github := gateway.NewGithubGateway()
171+
nlp := gateway.NewOpenAIGateway(ctx)
172+
pcu := usecase.NewPushCmdUsecase(github, nlp)
173+
baseList, err := pcu.GetRemoteBaseBranchCandidates()
174+
if err != nil {
175+
errMsg = "🚨Baseブランチを取得中にエラーが発生"
176+
}
177+
var maxBaseElements = 5
178+
var selectedBaseList []string
179+
if len(baseList) < maxBaseElements {
180+
selectedBaseList = baseList[:]
181+
} else {
182+
selectedBaseList = baseList[:maxBaseElements]
183+
}
184+
return &pushModel{
185+
step: SelectBaseBranch,
186+
baseList: selectedBaseList,
187+
pcu: pcu,
188+
errMsg: errMsg,
189+
loadMsg: "",
190+
prInput: &prInput{
191+
titleInput: textinput.New(),
192+
bodyInput: textarea.New(),
193+
},
194+
}
195+
}
196+
197+
var pushCmd = &cobra.Command{
198+
Use: "push",
199+
Short: "push and create pull request",
200+
Run: func(cmd *cobra.Command, args []string) {
201+
m := NewPushModel()
202+
m.initSpinner()
203+
p := tea.NewProgram(m)
204+
p.Run()
205+
},
206+
}
207+
208+
func init() {
209+
rootCmd.AddCommand(pushCmd)
210+
}
211+
212+
func (m *pushModel) buildSelectBaseBranchText() string {
213+
var b strings.Builder
214+
b.WriteString(color.HiWhiteString("📢Baseブランチ(Merge先)を選んで下さい\n"))
215+
b.WriteString(color.WhiteString("click ↑↓ to navigate and press Enter to select.\n"))
216+
217+
for i, base := range m.baseList {
218+
if i == m.selectBaseIndex {
219+
b.WriteString(fmt.Sprintf(color.HiCyanString("➡️ %s\n"), base))
220+
} else {
221+
b.WriteString(fmt.Sprintf(color.CyanString(" %s\n"), base))
222+
}
223+
}
224+
return b.String()
225+
}
226+
227+
func (m *pushModel) finishLoading() {
228+
m.loadMsg = ""
229+
}
230+
231+
func (m *pushModel) initSpinner() {
232+
m.spinner = spinner.New()
233+
m.spinner.Style = spinnerStyle
234+
m.spinner.Spinner = spinner.Globe
235+
}
236+
237+
func (m *pushModel) focusInPRTitle() {
238+
input := m.prInput.titleInput
239+
input.Focus()
240+
input.SetValue(m.pr.Title)
241+
input.CharLimit = 100
242+
input.Width = 100
243+
m.prInput.titleInput = input
244+
}
245+
246+
func (m *pushModel) focusInPRBody() {
247+
input := m.prInput.bodyInput
248+
input.Focus()
249+
input.SetValue(m.pr.Body)
250+
input.CharLimit = 5000
251+
input.SetWidth(200)
252+
m.prInput.bodyInput = input
253+
}
254+
255+
func (m *pushModel) updateTitleInput(msg tea.Msg) tea.Cmd {
256+
var cmd tea.Cmd
257+
m.prInput.titleInput, cmd = m.prInput.titleInput.Update(msg)
258+
return cmd
259+
}
260+
261+
func (m *pushModel) updateBodyInput(msg tea.Msg) tea.Cmd {
262+
var cmd tea.Cmd
263+
m.prInput.bodyInput, cmd = m.prInput.bodyInput.Update(msg)
264+
return cmd
265+
}

cmd/suggest.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func NewSuggestModel() *suggestModel {
123123
ti.Focus()
124124

125125
// suggestコマンドのサービスの取得
126-
inputOutput := gateway.NewInputOutputGateway()
126+
github := gateway.NewGithubGateway()
127127
var commitMessageService service.CommitMessageService
128128
config, err := entity.ReadConfig()
129129
if err != nil {
@@ -136,7 +136,7 @@ func NewSuggestModel() *suggestModel {
136136
case entity.Server:
137137
commitMessageService = gateway.NewGrpcServerGateway()
138138
}
139-
suggestCmdUsecase := usecase.NewSuggestCmdUsecase(commitMessageService, inputOutput)
139+
suggestCmdUsecase := usecase.NewSuggestCmdUsecase(commitMessageService, github)
140140

141141
return &suggestModel{
142142
choices: []string{""},

go.mod

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ require (
66
github.com/charmbracelet/bubbles v0.16.1
77
github.com/charmbracelet/bubbletea v0.24.2
88
github.com/charmbracelet/lipgloss v0.7.1
9-
github.com/cocoide/commitify-grpc-server v0.0.0-20230925123729-e460fb67f971
109
github.com/fatih/color v1.15.0
11-
github.com/golang/mock v1.6.0
10+
github.com/golang/mock v1.4.4
11+
github.com/pkg/errors v0.9.1
1212
github.com/sashabaranov/go-openai v1.15.2
1313
github.com/spf13/cobra v1.7.0
1414
github.com/spf13/viper v1.16.0
@@ -48,6 +48,7 @@ require (
4848
github.com/muesli/reflow v0.3.0 // indirect
4949
github.com/muesli/termenv v0.15.1 // indirect
5050
github.com/rivo/uniseg v0.2.0 // indirect
51+
github.com/stretchr/testify v1.8.4 // indirect
5152
golang.org/x/sync v0.3.0 // indirect
5253
golang.org/x/sys v0.12.0 // indirect
5354
golang.org/x/term v0.12.0 // indirect

go.sum

+3-11
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
5656
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
5757
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
5858
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
59-
github.com/cocoide/commitify-grpc-server v0.0.0-20230925123729-e460fb67f971 h1:u0ooNLw6PuHWUDLoVx5NiNt9858HvXqvvPNOpL+tpZw=
60-
github.com/cocoide/commitify-grpc-server v0.0.0-20230925123729-e460fb67f971/go.mod h1:iDkIWp+CfRdHHSm4Nix6uS9dVzEgDsYPeCn+yklpCJc=
6159
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY=
6260
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
6361
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
@@ -88,9 +86,8 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU
8886
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
8987
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
9088
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
89+
github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
9190
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
92-
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
93-
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
9491
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
9592
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
9693
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -182,6 +179,7 @@ github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs
182179
github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ=
183180
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
184181
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
182+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
185183
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
186184
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
187185
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -218,13 +216,13 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
218216
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
219217
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
220218
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
219+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
221220
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
222221
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
223222
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
224223
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
225224
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
226225
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
227-
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
228226
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
229227
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
230228
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@@ -271,7 +269,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
271269
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
272270
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
273271
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
274-
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
275272
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
276273
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
277274
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -303,7 +300,6 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY
303300
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
304301
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
305302
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
306-
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
307303
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
308304
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
309305
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
@@ -326,7 +322,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
326322
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
327323
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
328324
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
329-
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
330325
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
331326
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
332327
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -361,10 +356,8 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w
361356
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
362357
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
363358
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
364-
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
365359
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
366360
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
367-
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
368361
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
369362
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
370363
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -435,7 +428,6 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f
435428
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
436429
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
437430
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
438-
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
439431
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
440432
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
441433
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

0 commit comments

Comments
 (0)