Skip to content

Commit 6380837

Browse files
authored
Add twine support (#2699)
1 parent 741dc7f commit 6380837

File tree

15 files changed

+243
-61
lines changed

15 files changed

+243
-61
lines changed

.github/workflows/pythonTests.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ jobs:
3838
if: ${{ matrix.suite == 'pipenv' }}
3939
run: python -m pip install pipenv
4040

41+
- name: Setup Twine
42+
if: ${{ matrix.suite == 'pip' }}
43+
run: python -m pip install twine
44+
4145
- name: Setup Go with cache
4246
uses: jfrog/.github/actions/install-go-with-cache@main
4347

buildtools/cli.go

Lines changed: 88 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"github.com/jfrog/jfrog-cli-security/commands/scan"
3434
terraformdocs "github.com/jfrog/jfrog-cli/docs/artifactory/terraform"
3535
"github.com/jfrog/jfrog-cli/docs/artifactory/terraformconfig"
36+
twinedocs "github.com/jfrog/jfrog-cli/docs/artifactory/twine"
3637
"github.com/jfrog/jfrog-cli/docs/buildtools/docker"
3738
dotnetdocs "github.com/jfrog/jfrog-cli/docs/buildtools/dotnet"
3839
"github.com/jfrog/jfrog-cli/docs/buildtools/dotnetconfig"
@@ -402,6 +403,18 @@ func GetCommands() []cli.Command {
402403
Category: buildToolsCategory,
403404
Action: terraformCmd,
404405
},
406+
{
407+
Name: "twine",
408+
Flags: cliutils.GetCommandFlags(cliutils.Twine),
409+
Usage: twinedocs.GetDescription(),
410+
HelpName: corecommon.CreateUsage("twine", twinedocs.GetDescription(), twinedocs.Usage),
411+
UsageText: twinedocs.GetArguments(),
412+
ArgsUsage: common.CreateEnvVars(),
413+
SkipFlagParsing: true,
414+
BashComplete: corecommon.CreateBashCompletionFunc(),
415+
Category: buildToolsCategory,
416+
Action: twineCmd,
417+
},
405418
})
406419
}
407420

@@ -410,13 +423,11 @@ func MvnCmd(c *cli.Context) (err error) {
410423
return err
411424
}
412425

413-
configFilePath, exists, err := project.GetProjectConfFilePath(project.Maven)
426+
configFilePath, err := getProjectConfigPathOrThrow(project.Maven, "mvn", "mvn-config")
414427
if err != nil {
415428
return err
416429
}
417-
if !exists {
418-
return errors.New("no config file was found! Before running the mvn command on a project for the first time, the project should be configured with the mvn-config command")
419-
}
430+
420431
if c.NArg() < 1 {
421432
return cliutils.WrongNumberOfArgumentsHandler(c)
422433
}
@@ -469,13 +480,11 @@ func GradleCmd(c *cli.Context) (err error) {
469480
return err
470481
}
471482

472-
configFilePath, exists, err := project.GetProjectConfFilePath(project.Gradle)
483+
configFilePath, err := getProjectConfigPathOrThrow(project.Gradle, "gradle", "gradle-config")
473484
if err != nil {
474485
return err
475486
}
476-
if !exists {
477-
return errors.New("no config file was found! Before running the gradle command on a project for the first time, the project should be configured with the gradle-config command")
478-
}
487+
479488
// Found a config file. Continue as native command.
480489
if c.NArg() < 1 {
481490
return cliutils.WrongNumberOfArgumentsHandler(c)
@@ -525,13 +534,10 @@ func YarnCmd(c *cli.Context) error {
525534
return err
526535
}
527536

528-
configFilePath, exists, err := project.GetProjectConfFilePath(project.Yarn)
537+
configFilePath, err := getProjectConfigPathOrThrow(project.Yarn, "yarn", "yarn-config")
529538
if err != nil {
530539
return err
531540
}
532-
if !exists {
533-
return fmt.Errorf("no config file was found! Before running the yarn command on a project for the first time, the project should be configured using the yarn-config command")
534-
}
535541

536542
yarnCmd := yarn.NewYarnCommand().SetConfigFilePath(configFilePath).SetArgs(c.Args())
537543
return commands.Exec(yarnCmd)
@@ -544,15 +550,12 @@ func NugetCmd(c *cli.Context) error {
544550
if c.NArg() < 1 {
545551
return cliutils.WrongNumberOfArgumentsHandler(c)
546552
}
547-
configFilePath, exists, err := project.GetProjectConfFilePath(project.Nuget)
553+
554+
configFilePath, err := getProjectConfigPathOrThrow(project.Nuget, "nuget", "nuget-config")
548555
if err != nil {
549556
return err
550557
}
551558

552-
if !exists {
553-
return fmt.Errorf("no config file was found! Before running the nuget command on a project for the first time, the project should be configured using the nuget-config command")
554-
}
555-
556559
rtDetails, targetRepo, useNugetV2, err := getNugetAndDotnetConfigFields(configFilePath)
557560
if err != nil {
558561
return err
@@ -584,13 +587,10 @@ func DotnetCmd(c *cli.Context) error {
584587
}
585588

586589
// Get configuration file path.
587-
configFilePath, exists, err := project.GetProjectConfFilePath(project.Dotnet)
590+
configFilePath, err := getProjectConfigPathOrThrow(project.Dotnet, "dotnet", "dotnet-config")
588591
if err != nil {
589592
return err
590593
}
591-
if !exists {
592-
return fmt.Errorf("no config file was found! Before running the dotnet command on a project for the first time, the project should be configured using the dotnet-config command")
593-
}
594594

595595
rtDetails, targetRepo, useNugetV2, err := getNugetAndDotnetConfigFields(configFilePath)
596596
if err != nil {
@@ -690,14 +690,12 @@ func goCmdVerification(c *cli.Context) (string, error) {
690690
if c.NArg() < 1 {
691691
return "", cliutils.WrongNumberOfArgumentsHandler(c)
692692
}
693-
configFilePath, exists, err := project.GetProjectConfFilePath(project.Go)
693+
694+
configFilePath, err := getProjectConfigPathOrThrow(project.Go, "go", "go-config")
694695
if err != nil {
695696
return "", err
696697
}
697-
// Verify config file is found.
698-
if !exists {
699-
return "", fmt.Errorf("no config file was found! Before running the go command on a project for the first time, the project should be configured using the go-config command")
700-
}
698+
701699
log.Debug("Go config file was found in:", configFilePath)
702700
return configFilePath, nil
703701
}
@@ -887,13 +885,9 @@ func NpmPublishCmd(c *cli.Context) (err error) {
887885
}
888886

889887
func GetNpmConfigAndArgs(c *cli.Context) (configFilePath string, args []string, err error) {
890-
configFilePath, exists, err := project.GetProjectConfFilePath(project.Npm)
888+
configFilePath, err = getProjectConfigPathOrThrow(project.Npm, "npm", "npm-config")
891889
if err != nil {
892-
return "", nil, err
893-
}
894-
895-
if !exists {
896-
return "", nil, errorutils.CheckErrorf("no config file was found! Before running the npm command on a project for the first time, the project should be configured using the npm-config command")
890+
return
897891
}
898892
_, args = getCommandName(c.Args())
899893
return
@@ -970,13 +964,9 @@ func terraformCmd(c *cli.Context) error {
970964
}
971965

972966
func getTerraformConfigAndArgs(c *cli.Context) (configFilePath string, args []string, err error) {
973-
configFilePath, exists, err := project.GetProjectConfFilePath(project.Terraform)
967+
configFilePath, err = getProjectConfigPathOrThrow(project.Terraform, "terraform", "terraform-config")
974968
if err != nil {
975-
return "", nil, err
976-
}
977-
978-
if !exists {
979-
return "", nil, errors.New("no config file was found! Before running the terraform command on a project for the first time, the project should be configured using the terraform-config command")
969+
return
980970
}
981971
args = cliutils.ExtractCommand(c)
982972
return
@@ -992,3 +982,63 @@ func terraformPublishCmd(configFilePath string, args []string, c *cli.Context) e
992982
result := terraformCmd.Result()
993983
return cliutils.PrintBriefSummaryReport(result.SuccessCount(), result.FailCount(), cliutils.IsFailNoOp(c), err)
994984
}
985+
986+
func getProjectConfigPathOrThrow(projectType project.ProjectType, cmdName, configCmdName string) (configFilePath string, err error) {
987+
configFilePath, exists, err := project.GetProjectConfFilePath(projectType)
988+
if err != nil {
989+
return
990+
}
991+
if !exists {
992+
return "", errorutils.CheckErrorf(getMissingConfigErrMsg(cmdName, configCmdName))
993+
}
994+
return
995+
}
996+
997+
func getMissingConfigErrMsg(cmdName, configCmdName string) string {
998+
return fmt.Sprintf("no config file was found! Before running the 'jf %s' command on a project for the first time, the project should be configured with the 'jf %s' command", cmdName, configCmdName)
999+
}
1000+
1001+
func twineCmd(c *cli.Context) error {
1002+
if show, err := cliutils.ShowCmdHelpIfNeeded(c, c.Args()); show || err != nil {
1003+
return err
1004+
}
1005+
serverDetails, targetRepo, err := getTwineConfigAndArgs()
1006+
if err != nil {
1007+
return err
1008+
}
1009+
cmdName, filteredArgs := getCommandName(cliutils.ExtractCommand(c))
1010+
return python.NewTwineCommand(cmdName).SetServerDetails(serverDetails).SetTargetRepo(targetRepo).SetArgs(filteredArgs).Run()
1011+
}
1012+
1013+
func getTwineConfigAndArgs() (serverDetails *coreConfig.ServerDetails, targetRepo string, err error) {
1014+
configFilePath, err := getTwineConfigPath()
1015+
if err != nil {
1016+
return
1017+
}
1018+
1019+
vConfig, err := project.ReadConfigFile(configFilePath, project.YAML)
1020+
if err != nil {
1021+
return nil, "", fmt.Errorf("failed while reading configuration file '%s'. Error: %s", configFilePath, err.Error())
1022+
}
1023+
projectConfig, err := project.GetRepoConfigByPrefix(configFilePath, project.ProjectConfigDeployerPrefix, vConfig)
1024+
if err != nil {
1025+
return nil, "", err
1026+
}
1027+
serverDetails, err = projectConfig.ServerDetails()
1028+
if err != nil {
1029+
return nil, "", err
1030+
}
1031+
targetRepo = projectConfig.TargetRepo()
1032+
return
1033+
}
1034+
1035+
func getTwineConfigPath() (configFilePath string, err error) {
1036+
var exists bool
1037+
for _, projectType := range []project.ProjectType{project.Pip, project.Pipenv} {
1038+
configFilePath, exists, err = project.GetProjectConfFilePath(projectType)
1039+
if err != nil || exists {
1040+
return
1041+
}
1042+
}
1043+
return "", errorutils.CheckErrorf(getMissingConfigErrMsg("twine", "pip-config OR pipenv-config"))
1044+
}

docs/artifactory/twine/help.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package twinedocs
2+
3+
var Usage = []string{"twine <twine arguments> [command options]"}
4+
5+
func GetDescription() string {
6+
return "Runs twine "
7+
}
8+
9+
func GetArguments() string {
10+
return ` twine commands
11+
Arguments and options for the twine command.`
12+
}

go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ require (
2929
github.com/testcontainers/testcontainers-go v0.33.0
3030
github.com/urfave/cli v1.22.15
3131
github.com/xeipuuv/gojsonschema v1.2.0
32-
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e
32+
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
3333
gopkg.in/yaml.v2 v2.4.0
3434
)
3535

@@ -156,7 +156,7 @@ require (
156156
go.uber.org/multierr v1.11.0 // indirect
157157
golang.org/x/crypto v0.27.0 // indirect
158158
golang.org/x/mod v0.21.0 // indirect
159-
golang.org/x/net v0.28.0 // indirect
159+
golang.org/x/net v0.29.0 // indirect
160160
golang.org/x/oauth2 v0.18.0 // indirect
161161
golang.org/x/sync v0.8.0 // indirect
162162
golang.org/x/sys v0.25.0 // indirect
@@ -170,12 +170,12 @@ require (
170170
gopkg.in/yaml.v3 v3.0.1 // indirect
171171
)
172172

173-
replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240909132328-33f3a1ec52c1
173+
replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240918150651-0d4ff6b567ce
174174

175175
// replace github.com/jfrog/jfrog-cli-security => github.com/attiasas/jfrog-cli-security v0.0.0-20240904061406-f368939ce3a0
176176

177-
// replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20240806162439-01bb7dcd43fc
177+
replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20240918081224-1c584cc334c7
178178

179-
// replace github.com/jfrog/build-info-go => github.com/asafambar/build-info-go v1.8.9-0.20240819133117-c3f52700927d
179+
replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20240918150101-ad5b10435a12
180180

181181
// replace github.com/jfrog/gofrog => github.com/jfrog/gofrog dev

go.sum

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -931,8 +931,8 @@ github.com/jedib0t/go-pretty/v6 v6.5.9 h1:ACteMBRrrmm1gMsXe9PSTOClQ63IXDUt03H5U+
931931
github.com/jedib0t/go-pretty/v6 v6.5.9/go.mod h1:zbn98qrYlh95FIhwwsbIip0LYpwSG8SUOScs+v9/t0E=
932932
github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI=
933933
github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw=
934-
github.com/jfrog/build-info-go v1.9.36 h1:bKoYW3o+U70Zbz2kt5NT84N5JWNxdDXHOf+kVdzK+j4=
935-
github.com/jfrog/build-info-go v1.9.36/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE=
934+
github.com/jfrog/build-info-go v1.8.9-0.20240918150101-ad5b10435a12 h1:OWxdvdurW6LRRBDEgVl8WFcjJbk9TyBcVGgXX4k5atc=
935+
github.com/jfrog/build-info-go v1.8.9-0.20240918150101-ad5b10435a12/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE=
936936
github.com/jfrog/froggit-go v1.16.1 h1:FBIM1qevX/ag9unfmpGzfmZ36D8ulOJ+DPTSFUk3l5U=
937937
github.com/jfrog/froggit-go v1.16.1/go.mod h1:TEJSzgiV+3D/GVGE8Y6j46ut1jrBLD1FL6WdMdKwwCE=
938938
github.com/jfrog/gofrog v1.7.6 h1:QmfAiRzVyaI7JYGsB7cxfAJePAZTzFz0gRWZSE27c6s=
@@ -941,14 +941,14 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL
941941
github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w=
942942
github.com/jfrog/jfrog-cli-artifactory v0.1.6 h1:bMfJsrLQJw0dZp4nqUf1xOmtY0rpCatW/I5q88x+fhQ=
943943
github.com/jfrog/jfrog-cli-artifactory v0.1.6/go.mod h1:jbNb22ebtupcjdhrdGq0VBew2vWG6VUK04xxGNDfynE=
944-
github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240909132328-33f3a1ec52c1 h1:+eqMs31Ms+O9nm4gondTNIj3scd69Kmag6zzuF1Bi3k=
945-
github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240909132328-33f3a1ec52c1/go.mod h1:24P424ysZzA0kVw/xESKELRJ+rFybRVf5zJiH18p72k=
944+
github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240918150651-0d4ff6b567ce h1:j3qKnp+YdB5MO44/hD2EUpfJEyLmP56tMEwL8StFO/E=
945+
github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240918150651-0d4ff6b567ce/go.mod h1:bEnACPygif5dz9d0Ve0/Apnek7ZohyNkI6OH0fbICVo=
946946
github.com/jfrog/jfrog-cli-platform-services v1.3.0 h1:IblSDZFBjL7WLRi37Ni2DmHrXJJ6ysSMxx7t41AvyDA=
947947
github.com/jfrog/jfrog-cli-platform-services v1.3.0/go.mod h1:Ky4SDXuMeaiNP/5zMT1YSzIuXG+cNYYOl8BaEA7Awbc=
948948
github.com/jfrog/jfrog-cli-security v1.8.0 h1:jp/AVaQcItUNXRCud5PMyl8VVjPuzfrNHJWQvWAMnms=
949949
github.com/jfrog/jfrog-cli-security v1.8.0/go.mod h1:DjufYZpsTwILOFJlx7tR/y63oLBRmtPtFIz1WgiP/X4=
950-
github.com/jfrog/jfrog-client-go v1.46.2 h1:1rk7PliYGc7zVSFVE2/RO77JOR1KdEtr28os8GQiLyI=
951-
github.com/jfrog/jfrog-client-go v1.46.2/go.mod h1:qtQ9ML8xrRJmUwU/t6QRsov7C5mIZndTDY3qulgB5hA=
950+
github.com/jfrog/jfrog-client-go v1.28.1-0.20240918081224-1c584cc334c7 h1:h/bLASJGFaI3QOow1Ix63RZB8kZpAClkA/NpAVWRroc=
951+
github.com/jfrog/jfrog-client-go v1.28.1-0.20240918081224-1c584cc334c7/go.mod h1:kk0lbMJbZF9961lGLw1aKKH4PNcXZFB0pAwvZHGwYSw=
952952
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
953953
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
954954
github.com/jszwec/csvutil v1.10.0 h1:upMDUxhQKqZ5ZDCs/wy+8Kib8rZR8I8lOR34yJkdqhI=
@@ -1249,8 +1249,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
12491249
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
12501250
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
12511251
golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
1252-
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
1253-
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
1252+
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
1253+
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
12541254
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
12551255
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
12561256
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -1356,8 +1356,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
13561356
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
13571357
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
13581358
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
1359-
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
1360-
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
1359+
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
1360+
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
13611361
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
13621362
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
13631363
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1608,8 +1608,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
16081608
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
16091609
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
16101610
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
1611-
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
1612-
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
1611+
golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
1612+
golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
16131613
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
16141614
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
16151615
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

0 commit comments

Comments
 (0)