Skip to content

Commit 83f7a10

Browse files
authored
Merge pull request #7 from permafrost-dev/add-notifications
Add slack and telegram integrations for sending notifications
2 parents 10b259a + 9008cc5 commit 83f7a10

File tree

11 files changed

+498
-45
lines changed

11 files changed

+498
-45
lines changed

.golangci.yaml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Options for analysis running.
22
run:
33
# Timeout for analysis, e.g. 30s, 5m. Default: 1m
4-
timeout: 30s
4+
timeout: 15s
55
modules-download-mode: mod
66

77
# Include test files or not. Default: true
@@ -15,6 +15,8 @@ run:
1515
skip-dirs:
1616
- .custom-hooks
1717
- .github
18+
- .task
19+
- .trunk
1820
- .vscode
1921
- assets
2022
- build
@@ -34,9 +36,11 @@ run:
3436

3537
# Allow multiple parallel golangci-lint instances running; If false (default) - golangci-lint acquires file lock on start.
3638
allow-parallel-runners: true
37-
concurrency: 8
39+
concurrency: 4
40+
3841

3942
linters:
43+
fast: true
4044
disable:
4145
- errcheck
4246
- gosimple
@@ -45,6 +49,7 @@ linters:
4549
- typecheck
4650
- unused
4751
enable:
52+
- gocyclo
4853
- govet
4954
- maintidx
5055
- misspell
@@ -67,7 +72,11 @@ severity:
6772
default-severity: warning
6873
case-sensitive: false
6974

75+
7076
linters-settings:
77+
gocyclo:
78+
min-complexity: 20
79+
7180
funlen:
7281
lines: 100
7382
statements: 80

README.md

Lines changed: 129 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,60 @@
66

77
---
88

9-
A single application to spin up your entire dev stack.
10-
11-
## Features
9+
Spin up your entire dev stack with one command.
1210

1311
`StackUp` offers many features and advanced functionality. Here are some of the highlights:
1412

1513
- Define tasks that run on startup, shutdown, or on a schedule.
1614
- Customize tasks and preconditions using javascript.
1715
- Run tasks on a cron schedule, i.e. running `php artisan schedule:run` once every minute.
18-
- Load shared configurations with remote file includes via http or S3.
19-
- Optional checksum validation of remotely included files.
20-
- Fast in-memory cache for skipping http requests when possible.
21-
- Http request gateway that prevents unwanted access to remote files, domains or content types.
22-
- Domain-specific http header configuration.
16+
- Load remote configurations via http or S3.
17+
- Fast in-memory cache skips http requests when possible.
18+
- Http request gateway prevents unwanted access to remote urls, domains and content types.
19+
- Send notifications with Telegram and Slack integrations.
20+
21+
## Table of Contents
22+
23+
- [StackUp](#stackup)
24+
- [Table of Contents](#table-of-contents)
25+
- [About](#about)
26+
- [Running StackUp](#running-stackup)
27+
- [Configuration](#configuration)
28+
- [Configuration: Settings](#configuration-settings)
29+
- [Configuration: Settings: Gateway](#configuration-settings-gateway)
30+
- [Configuration: Settings: Domains](#configuration-settings-domains)
31+
- [Configuration: Settings: Notifications](#configuration-settings-notifications)
32+
- [Configuration: Settings: Notifications: Telegram](#configuration-settings-notifications-telegram)
33+
- [Configuration: Settings: Notifications: Slack](#configuration-settings-notifications-slack)
34+
- [Configuration: Environment Variables](#configuration-environment-variables)
35+
- [Configuration: Includes](#configuration-includes)
36+
- [Configuration: Preconditions](#configuration-preconditions)
37+
- [Configuration: Tasks](#configuration-tasks)
38+
- [Configuration: Startup \& Shutdown](#configuration-startup--shutdown)
39+
- [Configuration: Servers](#configuration-servers)
40+
- [Configuration: Scheduler](#configuration-scheduler)
41+
- [Example Configurations](#example-configurations)
42+
- [Integrations](#integrations)
43+
- [Integration: dotenv-vault](#integration-dotenv-vault)
44+
- [Integration: Telegram Notifications](#integration-telegram-notifications)
45+
- [Integration: Slack Notifications](#integration-slack-notifications)
46+
- [Scripting](#scripting)
47+
- [Available Functions](#available-functions)
48+
- [Script Classes](#script-classes)
49+
- [`ComposerJson`](#composerjson)
50+
- [`PackageJson`](#packagejson)
51+
- [`RequirementsTxt`](#requirementstxt)
52+
- [`SemVer`](#semver)
53+
- [Environment Variables](#environment-variables)
54+
- [Dynamic Tasks](#dynamic-tasks)
55+
- [Initialization Script](#initialization-script)
56+
- [Setup](#setup)
57+
- [Building the project](#building-the-project)
58+
- [Changelog](#changelog)
59+
- [Contributing](#contributing)
60+
- [Security Vulnerabilities](#security-vulnerabilities)
61+
- [Credits](#credits)
62+
- [License](#license)
2363

2464
## About
2565

@@ -182,27 +222,53 @@ domains:
182222
- 'Accept: application/vnd.github.v3+json'
183223
```
184224

185-
### Configuration: Environment Variables
225+
#### Configuration: Settings: Notifications
186226

187-
Environment variables can be defined in the optional `env` section of the configuration file. These variables can be referenced in other sections of the configuration file using the `env()` function or by prefixing the variable name with `$` (e.g. `$MY_VAR`).
227+
StackUp provides the ability to send notifications via several integrations.
188228

189229
```yaml
190-
env:
191-
- MY_ENV_VAR_ONE=test1234
192-
- MY_ENV_VAR_TWO=1234test
230+
settings:
231+
notifications:
232+
# integration1 settings
233+
# integration2 settings, etc.
193234
```
194235

195-
#### Integration: dotenv-vault
236+
#### Configuration: Settings: Notifications: Telegram
196237

197-
`StackUp` supports loading encrypted values from `.env.vault` files (see the [dotenv-vault website](https://vault.dotenv.org)).
238+
To send notifications via Telegram, add a `telegram` section to the `notifications` section of the configuration file. The `telegram` section should contain an `api-key` and a `chat-ids` field. The `api-key` field should contain the Telegram bot token, and the `chat-ids` field should be an array of chat ids of the users or groups to send notifications to. The chat ids may either be a string, number, or an environment variable that contains a chat id.
198239

199-
To load a `.env.vault` file, add an entry to the `env` section named `dotenv://vault`. This item will cause the `.env.vault` file to
200-
be loaded into the environment, if it exists. If it does not exist, no action is taken.
240+
```yaml
241+
settings:
242+
notifications:
243+
telegram:
244+
api-key: $TELEGRAM_API_KEY
245+
chat-ids: [$TELEGRAM_CHAT_ID1, $TELEGRAM_CHAT_ID2]
246+
```
247+
248+
For more information on the Telegram integration, see the [Telegram Notifications](#integration-telegram-notifications) section of the [Integrations](#integrations) documentation.
249+
250+
#### Configuration: Settings: Notifications: Slack
251+
252+
To send notifications via Slack, add a `slack` section to the `notifications` section of the configuration file. The `slack` section should contain `webhook-url` and `channel-ids` fields. The `webhook-url` field should contain the Slack webhook url to send notifications to, and the `channel-ids` field should be an array of channel names to send notifications to.
253+
254+
```yaml
255+
settings:
256+
notifications:
257+
slack:
258+
webhook-url: $SLACK_WEBHOOK_URL
259+
channel-ids: [$SLACK_CHANNEL_1, $SLACK_CHANNEL_2]
260+
```
261+
262+
For more information about the Slack integration, see the [Slack Notifications](#integration-slack-notifications) section of the [Integrations](#integrations) documentation.
263+
264+
### Configuration: Environment Variables
265+
266+
Environment variables can be defined in the optional `env` section of the configuration file. These variables can be referenced in other sections of the configuration file using the `env()` function or by prefixing the variable name with `$` (e.g. `$MY_VAR`).
201267

202268
```yaml
203269
env:
204270
- MY_ENV_VAR_ONE=test1234
205-
- dotenv://vault # loads .env.vault, if it exists
271+
- MY_ENV_VAR_TWO=1234test
206272
```
207273

208274
### Configuration: Includes
@@ -410,6 +476,51 @@ See the [example configuration](./templates/stackup.dist.yaml) for a more comple
410476

411477
Working on a standalone Laravel application? Check out the [example laravel configuration](./templates/stackup.laravel.yaml).
412478

479+
## Integrations
480+
481+
StackUp supports several integrations that provide additional functionality.
482+
483+
### Integration: dotenv-vault
484+
485+
`StackUp` includes an integration for `dotenv-vault` and loading encrypted values from `.env.vault` files (see the [dotenv-vault website](https://vault.dotenv.org)).
486+
487+
To load a `.env.vault` file, add an entry to the `env` section named `dotenv://vault`. This item will cause the `.env.vault` file to
488+
be loaded into the environment, if it exists. If it does not exist, no action is taken.
489+
490+
```yaml
491+
env:
492+
- MY_ENV_VAR_ONE=test1234
493+
- dotenv://vault # loads .env.vault, if it exists
494+
```
495+
496+
### Integration: Telegram Notifications
497+
498+
`StackUp` includes an integration for sending notifications via Telegram. To configure the integration, see the [Telegram Notifications](#configuration-settings-notifications-telegram) section of the [Configuration: Settings](#configuration-settings) documentation.
499+
500+
Notifications are sent using javascript:
501+
502+
```js
503+
// send a notification to all configured chat ids
504+
notifications.Telegram().Message("hello from stackup, test 123").Send()
505+
506+
// send a notification to a specific chat id
507+
notifications.Telegram().Message("hello from stackup, test 456").To($TELEGRAM_CHAT_ID_1).Send()
508+
```
509+
510+
### Integration: Slack Notifications
511+
512+
`StackUp` includes an integration for sending messages to Slack channels. To configure the integration, see the [Slack Notifications](#configuration-settings-notifications-slack) section of the [Configuration: Settings](#configuration-settings) documentation.
513+
514+
Notifications are sent using javascript:
515+
516+
```js
517+
// send a notification to all configured chat ids
518+
notifications.Slack().Message("hello from stackup, test 123").Send()
519+
520+
// send a notification to a specific chat id
521+
notifications.Slack().Message("hello from stackup, test 456").To($SLACK_CHANNEL_1).Send()
522+
```
523+
413524
## Scripting
414525

415526
Many of the fields in a `Task` can be defined using javascript. To specify an expression to be evaluated, wrap the content in double braces: `{{ env("HOME") }}`.

go.mod

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ require (
1515

1616
require (
1717
github.com/creack/pty v1.1.18 // indirect
18+
github.com/davecgh/go-spew v1.1.1 // indirect
1819
github.com/dustin/go-humanize v1.0.1 // indirect
20+
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect
1921
github.com/google/uuid v1.3.0 // indirect
22+
github.com/gorilla/websocket v1.5.0 // indirect
2023
github.com/json-iterator/go v1.1.12 // indirect
2124
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
2225
github.com/klauspost/compress v1.16.7 // indirect
@@ -28,16 +31,24 @@ require (
2831
github.com/minio/sha256-simd v1.0.1 // indirect
2932
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3033
github.com/modern-go/reflect2 v1.0.2 // indirect
34+
github.com/nikoksr/notify v0.41.0 // indirect
35+
github.com/pkg/errors v0.9.1 // indirect
36+
github.com/pmezard/go-difflib v1.0.0 // indirect
3137
github.com/rs/xid v1.5.0 // indirect
3238
github.com/sirupsen/logrus v1.9.3 // indirect
39+
github.com/slack-go/slack v0.12.2 // indirect
40+
github.com/stretchr/objx v0.5.0 // indirect
3341
github.com/stretchr/testify v1.8.4 // indirect
42+
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
3443
golang.org/x/crypto v0.11.0 // indirect
3544
golang.org/x/net v0.12.0 // indirect
45+
golang.org/x/sync v0.3.0 // indirect
3646
golang.org/x/sys v0.10.0 // indirect
3747
golang.org/x/term v0.10.0 // indirect
3848
golang.org/x/text v0.11.0 // indirect
3949
gopkg.in/ini.v1 v1.67.0 // indirect
4050
gopkg.in/sourcemap.v1 v1.0.5 // indirect
51+
gopkg.in/yaml.v3 v3.0.1 // indirect
4152
)
4253

4354
require (

go.sum

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,19 @@ github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJ
2424
github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg=
2525
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
2626
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
27+
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU=
28+
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
29+
github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
2730
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
2831
github.com/golang-module/carbon/v2 v2.2.3 h1:WvGIc5+qzq9drNzH+Gnjh1TZ0JgDY/IA+m2Dvk7Qm4Q=
2932
github.com/golang-module/carbon/v2 v2.2.3/go.mod h1:LdzRApgmDT/wt0eNT8MEJbHfJdSqCtT46uZhfF30dqI=
33+
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
3034
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
3135
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
3236
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
37+
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
38+
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
39+
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
3340
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
3441
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
3542
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
@@ -77,7 +84,10 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
7784
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
7885
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
7986
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
87+
github.com/nikoksr/notify v0.41.0 h1:4LGE41GpWdHX5M3Xo6DlWRwS2WLDbOq1Rk7IzY4vjmQ=
88+
github.com/nikoksr/notify v0.41.0/go.mod h1:FoE0UVPeopz1Vy5nm9vQZ+JVmYjEIjQgbFstbkw+cRE=
8089
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
90+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
8191
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
8292
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
8393
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -99,11 +109,15 @@ github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIH
99109
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
100110
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
101111
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
112+
github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
113+
github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
102114
github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
103115
github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
104116
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
105117
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
118+
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
106119
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
120+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
107121
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
108122
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
109123
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@@ -112,6 +126,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
112126
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
113127
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
114128
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
129+
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
130+
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
115131
github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
116132
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
117133
go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ=
@@ -128,6 +144,8 @@ golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
128144
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
129145
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
130146
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
147+
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
148+
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
131149
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
132150
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
133151
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -156,6 +174,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
156174
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
157175
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
158176
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
177+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
159178
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
160179
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
161180
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

0 commit comments

Comments
 (0)