Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ A fast, flexible CLI tool for enforcing test coverage thresholds in Go projects.
- Colored `json` and `yaml` output.
- Built-in file or package regex filtering with `--skip`.
- Save and compare against historical results from a commit, branch, tag, or user defined label.
- **Post coverage results as comments to GitHub, GitLab, and Gitea pull/merge requests.**
- Works seamlessly in CI/CD environments.

## 🚫 Not Supported
Expand Down Expand Up @@ -318,6 +319,78 @@ $ go-covercheck --delete-history nonexistent
Error: no history entry found for ref: nonexistent
```

## 💬 Comment Posting

`go-covercheck` can post coverage results as comments to GitHub, GitLab, and Gitea pull requests or merge requests. This is particularly useful in CI/CD pipelines as a pre-merge gate.

### ⚙️ Configuration

Comment posting can be configured via the config file or CLI flags:

```yaml
comment:
enabled: true
platform:
type: github # github|gitlab|gitea|gogs
baseUrl: https://api.github.com # optional for self-hosted instances
token: ghp_xxxxxxxxxxxxxxxxxxxx # API authentication token
repository: owner/repo-name # repository identifier
pullRequestId: 123 # PR/MR ID
includeColors: true # include emojis and formatting
updateExisting: false # update existing comment vs create new
```

### 🚀 CLI Usage

```bash
# Post results to GitHub PR
go-covercheck coverage.out \
--comment \
--comment-platform github \
--comment-token $GITHUB_TOKEN \
--comment-repository owner/repo \
--comment-pr 123

# Post results to GitLab MR
go-covercheck coverage.out \
--comment \
--comment-platform gitlab \
--comment-token $GITLAB_TOKEN \
--comment-repository group/project \
--comment-pr 456

# Post to self-hosted Gogs instance
go-covercheck coverage.out \
--comment \
--comment-platform gogs \
--comment-base-url https://gogs.company.com \
--comment-token $GOGS_TOKEN \
--comment-repository org/repo \
--comment-pr 789
```

### 📝 Comment Format

Comments are posted in Markdown format with:
- Overall pass/fail status with emojis
- Total coverage summary table
- Detailed breakdown of failing files and packages
- Required improvements with specific percentages
- Color coding via emojis (✅❌) and formatting

### 🔒 Authentication

Each platform requires an API token:
- **GitHub**: Personal Access Token or GitHub App token with `repo` scope
- **GitLab**: Personal Access Token or Project Access Token with `api` scope
- **Gitea**: Application Token with repository permissions
- **Gogs**: Access Token with repository permissions

Tokens can be provided via:
- CLI flag: `--comment-token`
- Environment variable: `GITHUB_TOKEN`, `GITLAB_TOKEN`, etc.
- Config file: `comment.platform.token`

## 📤 Output Formats
`go-covercheck` supports multiple output formats. The default is `table`, but you can specify other formats using the
`--format` flag (short form `-f`) or through the `format:` field of the config file.
Expand Down
125 changes: 125 additions & 0 deletions cmd/go-covercheck/root.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"context"
"errors"
"fmt"
"io"
Expand All @@ -11,6 +12,7 @@ import (

"github.com/fatih/color"
"github.com/jedib0t/go-pretty/v6/text"
"github.com/mach6/go-covercheck/pkg/comment"
"github.com/mach6/go-covercheck/pkg/compute"
"github.com/mach6/go-covercheck/pkg/config"
"github.com/mach6/go-covercheck/pkg/output"
Expand Down Expand Up @@ -101,6 +103,27 @@ const (
InitFlag = "init"
InitFlagUsage = "create a sample .go-covercheck.yml config file in the current directory"

CommentFlag = "comment"
CommentFlagUsage = "post coverage results as a comment to PR/MR"

CommentPlatformFlag = "comment-platform"
CommentPlatformFlagUsage = "platform to post comment to [github|gitlab|gitea|gogs]"

CommentBaseURLFlag = "comment-base-url"
CommentBaseURLFlagUsage = "base URL for the platform API (for self-hosted instances)"

CommentTokenFlag = "comment-token"
CommentTokenFlagUsage = "authentication token for platform API"

CommentRepositoryFlag = "comment-repository"
CommentRepositoryFlagUsage = "repository identifier (e.g., owner/repo)"

CommentPRFlag = "comment-pr"
CommentPRFlagUsage = "pull request or merge request ID"

CommentUpdateFlag = "comment-update"
CommentUpdateFlagUsage = "update existing comment instead of creating new one"

// ConfigFilePermissions permissions.
ConfigFilePermissions = 0600
)
Expand Down Expand Up @@ -193,6 +216,11 @@ func run(cmd *cobra.Command, args []string) error {
return err
}

// handle comment posting
if err := handleCommentPosting(results, cfg); err != nil {
return err
}

if failed {
os.Exit(1)
}
Expand Down Expand Up @@ -474,6 +502,30 @@ func applyConfigOverrides(cfg *config.Config, cmd *cobra.Command, noConfigFile b
cfg.ModuleName = v
}

// Comment configuration overrides
if v, _ := cmd.Flags().GetBool(CommentFlag); cmd.Flags().Changed(CommentFlag) ||
noConfigFile {
cfg.Comment.Enabled = v
}
if v, _ := cmd.Flags().GetString(CommentPlatformFlag); cmd.Flags().Changed(CommentPlatformFlag) {
cfg.Comment.Platform.Type = v
}
if v, _ := cmd.Flags().GetString(CommentBaseURLFlag); cmd.Flags().Changed(CommentBaseURLFlag) {
cfg.Comment.Platform.BaseURL = v
}
if v, _ := cmd.Flags().GetString(CommentTokenFlag); cmd.Flags().Changed(CommentTokenFlag) {
cfg.Comment.Platform.Token = v
}
if v, _ := cmd.Flags().GetString(CommentRepositoryFlag); cmd.Flags().Changed(CommentRepositoryFlag) {
cfg.Comment.Platform.Repository = v
}
if v, _ := cmd.Flags().GetInt(CommentPRFlag); cmd.Flags().Changed(CommentPRFlag) {
cfg.Comment.Platform.PullRequestID = v
}
if v, _ := cmd.Flags().GetBool(CommentUpdateFlag); cmd.Flags().Changed(CommentUpdateFlag) {
cfg.Comment.Platform.UpdateExisting = v
}

// set cfg.Total thresholds to the global values, iff no override was specified for each.
if v, _ := cmd.Flags().GetFloat64(StatementThresholdFlag); !cmd.Flags().Changed(TotalStatementThresholdFlag) &&
cfg.Total[config.StatementsSection] == config.StatementThresholdDefault {
Expand Down Expand Up @@ -651,6 +703,79 @@ func initFlags(cmd *cobra.Command) {
false,
InitFlagUsage,
)

cmd.Flags().Bool(
CommentFlag,
false,
CommentFlagUsage,
)

cmd.Flags().String(
CommentPlatformFlag,
"",
CommentPlatformFlagUsage,
)

cmd.Flags().String(
CommentBaseURLFlag,
"",
CommentBaseURLFlagUsage,
)

cmd.Flags().String(
CommentTokenFlag,
"",
CommentTokenFlagUsage,
)

cmd.Flags().String(
CommentRepositoryFlag,
"",
CommentRepositoryFlagUsage,
)

cmd.Flags().Int(
CommentPRFlag,
0,
CommentPRFlagUsage,
)

cmd.Flags().Bool(
CommentUpdateFlag,
false,
CommentUpdateFlagUsage,
)
}

func handleCommentPosting(results compute.Results, cfg *config.Config) error {
// Skip comment posting if not enabled
if !cfg.Comment.Enabled {
return nil
}

// Validate required comment configuration
if cfg.Comment.Platform.Type == "" {
return fmt.Errorf("comment platform type is required when comment posting is enabled")
}

// Create poster based on platform type
poster, err := comment.NewPoster(cfg.Comment.Platform.Type, cfg.Comment.Platform.BaseURL)
if err != nil {
return fmt.Errorf("failed to create comment poster: %w", err)
}

// Set default values for color inclusion (enabled by default unless explicitly disabled)
if cfg.Comment.Platform.IncludeColors == false && !cfg.NoColor {
cfg.Comment.Platform.IncludeColors = true
}

// Post the comment
ctx := context.Background()
if err := poster.PostComment(ctx, results, cfg); err != nil {
return fmt.Errorf("failed to post comment: %w", err)
}

return nil
}

func shouldSkip(filename string, skip []string) bool {
Expand Down
13 changes: 13 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,41 @@ module github.com/mach6/go-covercheck
go 1.24

require (
code.gitea.io/sdk/gitea v0.21.0
github.com/fatih/color v1.18.0
github.com/go-git/go-git/v6 v6.0.0-20250711134917-1f24ae85fe16
github.com/goccy/go-yaml v1.18.0
github.com/google/go-github/v67 v67.0.0
github.com/hokaccha/go-prettyjson v0.0.0-20211117102719-0474bc63780f
github.com/jedib0t/go-pretty/v6 v6.6.8
github.com/mattn/go-colorable v0.1.14
github.com/spf13/cobra v1.9.1
github.com/stretchr/testify v1.10.0
gitlab.com/gitlab-org/api/client-go v0.137.0
golang.org/x/term v0.33.0
golang.org/x/tools v0.35.0
gopkg.in/yaml.v3 v3.0.1
)

require (
dario.cat/mergo v1.0.1 // indirect
github.com/42wim/httpsig v1.2.2 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/ProtonMail/go-crypto v1.3.0 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
github.com/cyphar/filepath-securejoin v0.4.1 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/go-fed/httpsig v1.1.0 // indirect
github.com/go-git/gcfg/v2 v2.0.2 // indirect
github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30 // indirect
github.com/gogits/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 // indirect
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
Expand All @@ -39,6 +50,8 @@ require (
golang.org/x/crypto v0.40.0 // indirect
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.12.0 // indirect
)
44 changes: 44 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4=
code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA=
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA=
github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw=
Expand All @@ -16,6 +20,8 @@ github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGL
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davidmz/go-pageant v1.0.2 h1:bPblRCh5jGU+Uptpz6LgMZGD5hJoOt7otgT454WvHn0=
github.com/davidmz/go-pageant v1.0.2/go.mod h1:P2EDDnMqIwG5Rrp05dTRITj9z2zpGcD9efWSkTNKLIE=
github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
Expand All @@ -24,6 +30,8 @@ github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI=
github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM=
github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo=
github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs=
github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30 h1:4KqVJTL5eanN8Sgg3BV6f2/QzfZEFbCd+rTak1fGRRA=
Expand All @@ -34,8 +42,25 @@ github.com/go-git/go-git/v6 v6.0.0-20250711134917-1f24ae85fe16 h1:LGHFWd3pmIuMug
github.com/go-git/go-git/v6 v6.0.0-20250711134917-1f24ae85fe16/go.mod h1:gI6xSrrkXH4EKP38iovrsY2EYf2XDU3DrIZRshlNDm0=
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/gogits/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 h1:04sojTxgYxu1L4Hn7Tgf7UVtIosVa6CuHtvNY+7T1K4=
github.com/gogits/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85/go.mod h1:cY2AIrMgHm6oOHmR7jY+9TtjzSjQ3iG7tURJG3Y6XH0=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-github/v67 v67.0.0 h1:g11NDAmfaBaCO8qYdI9fsmbaRipHNWRIU/2YGvlh4rg=
github.com/google/go-github/v67 v67.0.0/go.mod h1:zH3K7BxjFndr9QSeFibx4lTKkYS3K9nDanoI1NjaOtY=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48=
github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw=
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hokaccha/go-prettyjson v0.0.0-20211117102719-0474bc63780f h1:7LYC+Yfkj3CTRcShK0KOL/w6iTiKyqqBA9a41Wnggw8=
github.com/hokaccha/go-prettyjson v0.0.0-20211117102719-0474bc63780f/go.mod h1:pFlLw2CfqZiIBOx6BuCeRLCrfxBJipTY0nIOF/VbGcI=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
Expand Down Expand Up @@ -76,21 +101,40 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
gitlab.com/gitlab-org/api/client-go v0.137.0 h1:H26yL44qnb38Czl20pEINCJrcj63W6/BX8iKPVUKQP0=
gitlab.com/gitlab-org/api/client-go v0.137.0/go.mod h1:AcAYES3lfkIS4zhso04S/wyUaWQmDYve2Fd9AF7C6qc=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b h1:QoALfVG9rhQ/M7vYDScfPdWjGL9dlsVVM5VGh7aKoAA=
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
Expand Down
Loading