-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4 from opensourceways/lyh_init
添加 go module,readme,同时更新构建镜像源以修复镜像漏洞,更新lib包
- Loading branch information
Showing
6 changed files
with
368 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
FROM openeuler/go:1.23.4-oe2403lts as BUILDER | ||
RUN dnf -y install git gcc | ||
|
||
ARG USER | ||
ARG PASS | ||
RUN echo "machine github.com login $USER password $PASS" > ~/.netrc | ||
|
||
# build binary | ||
WORKDIR /opt/source | ||
COPY . . | ||
RUN go env -w GO111MODULE=on && \ | ||
go env -w CGO_ENABLED=1 && \ | ||
go build -a -o robot-universal-review -buildmode=pie -ldflags "-s -linkmode 'external' -extldflags '-Wl,-z,now'" . | ||
|
||
# copy binary config and utils | ||
FROM openeuler/openeuler:24.03-lts | ||
RUN dnf -y upgrade && \ | ||
dnf in -y shadow && \ | ||
groupadd -g 1000 robot && \ | ||
useradd -u 1000 -g robot -s /bin/bash -m robot | ||
|
||
USER robot | ||
|
||
COPY --chown=robot --from=BUILDER /opt/source/robot-universal-review /opt/app/robot-universal-review | ||
|
||
ENTRYPOINT ["/opt/app/robot-universal-review"] | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,61 @@ | ||
# robot-universal-review | ||
Open source community PR merge bots for different code hosting platforms | ||
# robot-gitee-openeuler-review | ||
[中文README](README_zh_CN.md) | ||
### Overview | ||
|
||
The bot provides Code Review-related functionality for the community. Provides `lgtm`, `approved` labels, PR merge command and tracking PR source code changes to automatically remove obsolete `lgtm`, `approved` labels and automatically merge PR when PR merge conditions are met. | ||
|
||
### Features | ||
|
||
- **Command** | ||
|
||
The following command are provided: | ||
|
||
| command | example | description | who can use | | ||
| ----------------- | ---------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | ||
| /lgtm [cancel] | /lgtm<br/>/lgtm cancel | Add or remove the `lgtm` label for a Pull Request, this label will be used for Pull Request merge determination. | Collaborators of this repository.<br/>Pull Request authors can use the `/lgtm cancel` command, but cannot use the `/lgtm` command. | | ||
| /approve [cancel] | /approve<br/>/approve cancel | Add or remove the `approved` label for a Pull Request, this label will be used for Pull Request merge determination. | Collaborators of this repository. | | ||
| /check-pr | /check-pr | Check whether the current PR's tag meets the condition, if it does, it is merged into the PR. | Anyone can trigger such a command on a Pull Request. | | ||
|
||
- **Specify the number of lgtm labels** | ||
|
||
The [configuration item](#configuration) provides a setting for the number of PR `lgtm` tags. When this configuration item is greater than 1, the contents of the `lgtm` tags consist of `lgtm-user`. ps:the `user` is the login id of the user using /lgtm command in the gitee platform. | ||
|
||
- **Automatic cleaning of lgtm labels** | ||
|
||
We will remove the existing `lgtm` labels when a new commit is submitted for the PR. | ||
|
||
- **Merge PR** | ||
|
||
1. Auto-merge: automatically detects the conditions for PR merge, and automatically merges in when the merge conditions are met. | ||
2. Manual check-trigger merge-in: Use the **/check-pr** command to trigger the robot to check the current merge-in condition of the PR, and give the corresponding prompt when the merge-in condition is not met, otherwise the PR is merged in. | ||
|
||
### Configuration<a id="configuration"/> | ||
|
||
example: | ||
|
||
```yaml | ||
#no additional description of the configuration items are not required | ||
config_items: | ||
- repos: #list of warehouses to be managed by robot (required) | ||
- owner/repo | ||
- owner1 | ||
excluded_repos: #robot manages the list of repositories to be excluded | ||
- owner1/repo1 | ||
lgtm_counts_required: 1 #lgtm label threshold | ||
labels_for_merge: #labels required for PR merging | ||
- ci-pipline-success | ||
missing_labels_for_merge: #labels that cannot exist when PR is merged in | ||
- ci-pipline-failed | ||
# specify it should check the devepler's permission besed on the owners file in sig directory when the developer comment /lgtm or /approve command. | ||
check_permission_based_on_sig_owners: true | ||
# is the directory of Sig. It must be set when CheckPermissionBasedOnSigOwners is true. | ||
sigs_dir: sig | ||
# merge_method is the method to merge PR.The default method of merge. valid options are squash and merge. | ||
merge_method: merge | ||
unable_checking_reviewer_for_pr: true #Whether to check the reviewer | ||
``` | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
# robot-gitee-openeuler-review | ||
|
||
### 概述 | ||
|
||
该机器人为社区提供了Code Review 相关功能。提供了`lgtm`、`approved`标签、PR合入指令以及跟踪PR源代码改变自动清除过时的`lgtm`、`approved`标签,并在满足PR合入的条件自动合入PR。 | ||
|
||
### 功能 | ||
|
||
- **命令** | ||
|
||
提供如下指令: | ||
|
||
| 命令 | 示例 | 描述 | 谁能使用 | | ||
| ----------------- | ---------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | ||
| /lgtm [cancel] | /lgtm<br/>/lgtm cancel | 为一个Pull Request添加或者删除`lgtm`标签,这个标签将用于Pull Request合入判断。 | 这个仓库的协作者。Pull Request作者能使用`/lgtm cancel`命令,但是不能使用`/lgtm`命令。 | | ||
| /approve [cancel] | /approve<br/>/approve cancel | 为一个Pull Request添加或者删除`approved`标签,这个标签将用于Pull Request合入判断。 | 这个仓库的协作者。 | | ||
| /check-pr | /check-pr | 检测当前PR的标签是否满足条件,如果满足即合入PR。 | 任何人都能在一个Pull Request上触发这种命令。 | | ||
|
||
- **指定lgtm标签个数** | ||
|
||
[配置项](#configuration)提供了PR `lgtm`标签的个数设置,当该配置项大于1时,`lgtm`标签的内容以`lgtm-user`组成。ps: user为使用/lgtm命令的用户在码云平台的login id。 | ||
|
||
- **自动清理lgtm标签** | ||
|
||
当PR有新的commit提交时我们将会移除已存在的`lgtm`标签。 | ||
|
||
- **PR合入** | ||
|
||
1. 自动合入:自动检测PR合入的条件,满足合入条件即自动合入。 | ||
2. 手动检查触发合入:使用**/check-pr**指令可以触发机器人检查PR当前的合入条件,不满足合入条件时给与相应提示,否则PR合入。 | ||
|
||
|
||
### 配置<a id="configuration"/> | ||
|
||
例子: | ||
|
||
```yaml | ||
#无额外说明配置项为非必须项 | ||
config_items: | ||
- repos: #robot需管理的仓库列表(必需) | ||
- owner/repo | ||
- owner1 | ||
excluded_repos: #robot 管理列表中需排除的仓库 | ||
- owner1/repo1 | ||
lgtm_counts_required: 1 #lgtm标签阈值 | ||
labels_for_merge: #PR合入需要的标签 | ||
- ci-pipline-success | ||
missing_labels_for_merge: #PR合入时不能存在的标签 | ||
- ci-pipline-failed | ||
# 指定在开发者评论/lgtm 或/approve 命令时根据sig 目录下的owners 文件检查开发者的权限。 | ||
check_permission_based_on_sig_owners: true | ||
# Sig 的目录。当 CheckPermissionBasedOnSigOwners 为真时必须设置它。 | ||
sigs_dir: sig | ||
merge_method: merge #PR合入时使用的方式,可选项:merge、squash.默认merge. | ||
unable_checking_reviewer_for_pr: true #是否检查审核人 | ||
``` | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
package main | ||
|
||
import ( | ||
"fmt" | ||
"regexp" | ||
"strings" | ||
|
||
"github.com/opensourceways/robot-framework-lib/client" | ||
"k8s.io/apimachinery/pkg/util/sets" | ||
) | ||
|
||
var regCheckPr = regexp.MustCompile(`(?mi)^/check-pr\s*$`) | ||
|
||
func (bot *robot) clearLabel(evt *client.GenericEvent, org, repo, number string) error { | ||
|
||
labels := bot.getPRLabelSet(org, repo, number) | ||
v := getLGTMLabelsOnPR(labels) | ||
|
||
if labels.Has(approvedLabel) { | ||
v = append(v, approvedLabel) | ||
} | ||
|
||
if len(v) > 0 { | ||
|
||
if ok := bot.cli.RemovePRLabels(org, repo, number, v); !ok { | ||
return nil | ||
} | ||
|
||
var noteComment string | ||
if bot.cli.CheckIfPRSourceCodeUpdateEvent(evt) { | ||
noteComment = commentClearLabelCaseByReopenPR | ||
} | ||
|
||
if bot.cli.CheckIfPRSourceCodeUpdateEvent(evt) { | ||
noteComment = commentClearLabelCaseByPRUpdate | ||
} | ||
|
||
bot.cli.CreatePRComment( | ||
org, repo, number, | ||
fmt.Sprintf(noteComment, strings.Join(v, ", ")), | ||
) | ||
} | ||
|
||
return nil | ||
} | ||
func (bot *robot) checkCommenterPermission(org, repo, author, commenter string, fn func()) (pass bool) { | ||
if author == commenter { | ||
return true | ||
} | ||
pass, success := bot.cli.CheckPermission(org, repo, commenter) | ||
bot.log.Infof("request success: %t, the %s has permission to the repo[%s/%s]: %t", success, commenter, org, repo, pass) | ||
|
||
if success && !pass { | ||
fn() | ||
} | ||
return pass && success | ||
} | ||
|
||
func (bot *robot) getPRLabelSet(org, repo, number string) sets.Set[string] { | ||
res := sets.New[string]() | ||
|
||
labels, ok := bot.cli.GetPullRequestLabels(org, repo, number) | ||
if !ok { | ||
return res | ||
} | ||
|
||
for _, v := range labels { | ||
res.Insert(v) | ||
} | ||
|
||
if res.Has("") { | ||
res.Delete("") | ||
} | ||
|
||
return res | ||
} | ||
|
||
func (bot *robot) genMergeMethod(org, repo, number string) string { | ||
mergeMethod := "merge" | ||
|
||
prLabels := bot.getPRLabelSet(org, repo, number) | ||
|
||
for p := range prLabels { | ||
if strings.HasPrefix(p, "merge/") { | ||
if strings.Split(p, "/")[1] == "squash" { | ||
return "squash" | ||
} | ||
|
||
return strings.Split(p, "/")[1] | ||
} | ||
} | ||
|
||
return mergeMethod | ||
} | ||
|
||
func (bot *robot) handleCheckPR(configmap *repoConfig, comment, commenter, org, repo, number string) error { | ||
if !regCheckPr.MatchString(comment) { | ||
return nil | ||
} | ||
if err := bot.handleMerge(configmap, org, repo, number); err != nil { | ||
claYesLabel := "" | ||
for _, labelForMerge := range configmap.LabelsForMerge { | ||
if strings.Contains(labelForMerge, "-cla/yes") { | ||
claYesLabel = labelForMerge | ||
break | ||
} | ||
} | ||
comment := fmt.Sprintf("@%s, this pr is not mergeable and the reasons are below:\n%s\n\n***lgtm***: "+ | ||
"A label mandatory for merging a pull request. The repository collaborators can comment '/lgtm' to "+ | ||
"add the label. The creator of a pull request can comment '/lgtm cancel' to remove the label, but "+ | ||
"cannot run the '/lgtm' command to add the label.\n***approved***: A label mandatory for merging a "+ | ||
"pull request. The repository collaborators can comment '/approve' to add the label and comment "+ | ||
"'/approve cancel' to remove the label.\n***%s***: A label mandatory for merging a pull request. "+ | ||
"The author of each commit of a pull request must sign the Contributor License Agreement (CLA). "+ | ||
"Otherwise, the pull request will fail to be merged. After signing the CLA, the author can comment "+ | ||
"'/check-cla' to check the CLA status again.\n***wait_confirm***: A label for confirming pull request "+ | ||
"merging. A pull request with this label cannot be automatically merged. This label is added because "+ | ||
"members (including maintainers, committers, and repository administrators) are to be added to "+ | ||
"sig-info.yaml in the pull request. To remove the label, all members to be added must comment "+ | ||
"'/lgtm' in the pull request.", | ||
commenter, err.Error(), claYesLabel) | ||
bot.cli.CreatePRComment(org, repo, number, comment) | ||
return err | ||
} | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
module github.com/opensourceways/robot-universal-review | ||
|
||
go 1.21 | ||
|
||
require ( | ||
github.com/opensourceways/robot-framework-lib v0.2.1 | ||
github.com/opensourceways/server-common-lib v1.0.0 | ||
github.com/sirupsen/logrus v1.9.3 | ||
k8s.io/apimachinery v0.29.4 | ||
) | ||
|
||
require ( | ||
github.com/go-resty/resty/v2 v2.11.0 // indirect | ||
github.com/opensourceways/go-gitcode v0.2.0 // indirect | ||
golang.org/x/net v0.23.0 // indirect | ||
golang.org/x/sys v0.18.0 // indirect | ||
gopkg.in/yaml.v2 v2.4.0 // indirect | ||
sigs.k8s.io/yaml v1.3.0 // indirect | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
github.com/agiledragon/gomonkey/v2 v2.12.0 h1:ek0dYu9K1rSV+TgkW5LvNNPRWyDZVIxGMCFI6Pz9o38= | ||
github.com/agiledragon/gomonkey/v2 v2.12.0/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= | ||
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/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= | ||
github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= | ||
github.com/opensourceways/go-gitcode v0.2.0 h1:+JJTHp4fnuQj5zfL3Y5nIxixTMbB/eGe+2/o/Xdz1K8= | ||
github.com/opensourceways/go-gitcode v0.2.0/go.mod h1:2BDl00PrpmMeVmD4NxO99DZiRcqx5jszNlGwPs1i9TQ= | ||
github.com/opensourceways/robot-framework-lib v0.2.1 h1:2mtwMwqzzSYZb7kEEUEiMqNYIp89vW3ude+wB5Rdoo0= | ||
github.com/opensourceways/robot-framework-lib v0.2.1/go.mod h1:LT6nNkE9Qd+3T/ILg3LbX9j/ip9YF1Jocia4czEJZ+Y= | ||
github.com/opensourceways/server-common-lib v1.0.0 h1:uZikXrFsibI3fmSqVVWPYLBFNOM9IO8Hsux5b5neJLI= | ||
github.com/opensourceways/server-common-lib v1.0.0/go.mod h1:AVDRCS30/uJXO7WONPa1U+AQePXr488+7qZFC7EjJzE= | ||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= | ||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= | ||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= | ||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | ||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= | ||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | ||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | ||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= | ||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= | ||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= | ||
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= | ||
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= | ||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= | ||
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | ||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= | ||
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= | ||
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.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | ||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= | ||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= | ||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | ||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= | ||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | ||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | ||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | ||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||
k8s.io/apimachinery v0.29.4 h1:RaFdJiDmuKs/8cm1M6Dh1Kvyh59YQFDcFuFTSmXes6Q= | ||
k8s.io/apimachinery v0.29.4/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y= | ||
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= | ||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= |