From e2ed05193620b8fdcbc1e046ec55802bab3d4679 Mon Sep 17 00:00:00 2001 From: Kemal Akkoyun Date: Wed, 3 Sep 2025 14:04:32 +0300 Subject: [PATCH 1/6] feat: add lint command with go-errorlint analyzer - Add new 'orchestrion lint' command - Use multichecker framework to run static analysis checks - Include custom help formatting to maintain Orchestrion CLI consistency - Add go-errorlint as the first linter - Enable comparison and asserts checks by default for error handling validation Signed-off-by: Kemal Akkoyun --- go.mod | 3 +++ go.sum | 2 ++ internal/cmd/lint.go | 62 ++++++++++++++++++++++++++++++++++++++++++++ main.go | 1 + 4 files changed, 68 insertions(+) create mode 100644 internal/cmd/lint.go diff --git a/go.mod b/go.mod index 57ced8d02..cdb1d263a 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module github.com/DataDog/orchestrion go 1.24.0 +replace github.com/polyfloyd/go-errorlint => github.com/kakkoyun/go-errorlint v0.0.0-20250903093155-8eaa0fc8fca5 + require ( github.com/DataDog/dd-trace-go/v2 v2.2.3 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb @@ -15,6 +17,7 @@ require ( github.com/nats-io/nats-server/v2 v2.11.8 github.com/nats-io/nats.go v1.45.0 github.com/otiai10/copy v1.14.1 + github.com/polyfloyd/go-errorlint v1.8.0 github.com/rs/zerolog v1.34.0 github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 github.com/shirou/gopsutil/v4 v4.25.8 diff --git a/go.sum b/go.sum index 93fb02d40..76bb82361 100644 --- a/go.sum +++ b/go.sum @@ -120,6 +120,8 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kakkoyun/go-errorlint v0.0.0-20250903093155-8eaa0fc8fca5 h1:xDktVYWuPepO6AedpAynwzbe4EH+qbBvuIj4vH5deYo= +github.com/kakkoyun/go-errorlint v0.0.0-20250903093155-8eaa0fc8fca5/go.mod h1:msT1JMnFNM1gqj7rtZYaA0EtpIYNeLQSsKJChZNA+5A= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= diff --git a/internal/cmd/lint.go b/internal/cmd/lint.go new file mode 100644 index 000000000..eb488fcca --- /dev/null +++ b/internal/cmd/lint.go @@ -0,0 +1,62 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package cmd + +import ( + "fmt" + "os" + "slices" + "strings" + "text/template" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/polyfloyd/go-errorlint/errorlint" + "github.com/urfave/cli/v2" + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/multichecker" +) + +var Lint = &cli.Command{ + Name: "lint", + Usage: "Run selected static analysis checks on Go code for Orchestrion to work better for certain features.", + UsageText: "orchestrion lint [lint arguments...]", + Args: true, + SkipFlagParsing: true, + Action: func(clictx *cli.Context) (err error) { + span, _ := tracer.StartSpanFromContext(clictx.Context, "lint", + tracer.ResourceName(strings.Join(clictx.Args().Slice(), " ")), + ) + defer func() { span.Finish(tracer.WithError(err)) }() + + // Check if help was requested and print Orchestrion-style header. + args := clictx.Args().Slice() + if slices.Contains(args, "-help") || slices.Contains(args, "--help") || slices.Contains(args, "-h") { + tmpl := template.Must(template.New("help").Parse(cli.CommandHelpTemplate)) + if err := tmpl.Execute(os.Stdout, clictx.Command); err != nil { + fmt.Printf("NAME:\n orchestrion lint - %s\n\n", clictx.Command.Usage) + fmt.Printf("USAGE:\n %s\n\n", clictx.Command.UsageText) + fmt.Println() + } + } + + // Set up os.Args to include the lint subcommand args. + // Replace "orchestrion lint" with "orchestrion-lint", + // so multichecker sees proper args + args = append([]string{"orchestrion-lint"}, args...) + os.Args = args + + // Run multichecker. This will take over with its own flags. + analyzers := []*analysis.Analyzer{ + errorlint.NewAnalyzer( + errorlint.WithComparison(true), + errorlint.WithAsserts(true), + ), + } + multichecker.Main(analyzers...) + + return nil + }, + } diff --git a/main.go b/main.go index 20d6fd57d..a7e155453 100644 --- a/main.go +++ b/main.go @@ -145,6 +145,7 @@ func main() { cmd.Version, cmd.Server, cmd.Diff, + cmd.Lint, }, Before: func(ctx *cli.Context) error { profiles := ctx.StringSlice("profile") From a7b16ff80b3add3b7c4971ff6a405a4fdd6a6f6c Mon Sep 17 00:00:00 2001 From: "dd-k9-library-go[bot]" <214463715+dd-k9-library-go[bot]@users.noreply.github.com> Date: Wed, 3 Sep 2025 11:07:43 +0000 Subject: [PATCH 2/6] chore: update generated files --- LICENSE-3rdparty.csv | 1 + _docs/go.mod | 1 + _docs/go.sum | 2 ++ instrument/go.mod | 1 + instrument/go.sum | 2 ++ samples/go.mod | 1 + samples/go.sum | 2 ++ 7 files changed, 10 insertions(+) diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index a56fc1e47..0dacdbcf9 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -66,6 +66,7 @@ orchestrion,github.com/outcaste-io/ristretto/z,MIT,unknown orchestrion,github.com/philhofer/fwd,MIT,"Copyright (c) 2014-2015, Philip Hofer" orchestrion,github.com/pkg/errors,BSD-2-Clause,"Copyright (c) 2015, Dave Cheney " orchestrion,github.com/planetscale/vtprotobuf/protohelpers,BSD-3-Clause,"Copyright (c) 2021, PlanetScale Inc. All rights reserved. | Copyright (c) 2013, The GoGo Authors. All rights reserved. | Copyright (c) 2018 The Go Authors. All rights reserved." +orchestrion,github.com/polyfloyd/go-errorlint/errorlint,MIT,Copyright (c) 2019 polyfloyd orchestrion,github.com/puzpuzpuz/xsync/v3,Apache-2.0,unknown orchestrion,github.com/rivo/uniseg,MIT,Copyright (c) 2019 Oliver Kuederle orchestrion,github.com/rs/zerolog,MIT,Copyright (c) 2017 Olivier Poitrey diff --git a/_docs/go.mod b/_docs/go.mod index 8a9845d09..099f52a27 100644 --- a/_docs/go.mod +++ b/_docs/go.mod @@ -333,6 +333,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/polyfloyd/go-errorlint v1.8.0 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/prometheus/common v0.62.0 // indirect github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect diff --git a/_docs/go.sum b/_docs/go.sum index 634ce43bf..478540ee8 100644 --- a/_docs/go.sum +++ b/_docs/go.sum @@ -1072,6 +1072,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q= +github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= diff --git a/instrument/go.mod b/instrument/go.mod index 3e9ec681f..bd4426df4 100644 --- a/instrument/go.mod +++ b/instrument/go.mod @@ -221,6 +221,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/polyfloyd/go-errorlint v1.8.0 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect diff --git a/instrument/go.sum b/instrument/go.sum index 339ed548d..93fc5f2e3 100644 --- a/instrument/go.sum +++ b/instrument/go.sum @@ -793,6 +793,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q= +github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= diff --git a/samples/go.mod b/samples/go.mod index 2e2dd5695..bcbc85be0 100644 --- a/samples/go.mod +++ b/samples/go.mod @@ -245,6 +245,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/polyfloyd/go-errorlint v1.8.0 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect diff --git a/samples/go.sum b/samples/go.sum index 5e290fb34..f5dd5f23e 100644 --- a/samples/go.sum +++ b/samples/go.sum @@ -794,6 +794,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q= +github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= From d3c82cb4c1792b48abb92962153c0bff50a09aed Mon Sep 17 00:00:00 2001 From: Kemal Akkoyun Date: Wed, 3 Sep 2025 18:51:34 +0300 Subject: [PATCH 3/6] chore: Fix formatting Signed-off-by: Kemal Akkoyun --- internal/cmd/lint.go | 78 ++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/internal/cmd/lint.go b/internal/cmd/lint.go index eb488fcca..5baed6b51 100644 --- a/internal/cmd/lint.go +++ b/internal/cmd/lint.go @@ -20,43 +20,43 @@ import ( ) var Lint = &cli.Command{ - Name: "lint", - Usage: "Run selected static analysis checks on Go code for Orchestrion to work better for certain features.", - UsageText: "orchestrion lint [lint arguments...]", - Args: true, - SkipFlagParsing: true, - Action: func(clictx *cli.Context) (err error) { - span, _ := tracer.StartSpanFromContext(clictx.Context, "lint", - tracer.ResourceName(strings.Join(clictx.Args().Slice(), " ")), - ) - defer func() { span.Finish(tracer.WithError(err)) }() - - // Check if help was requested and print Orchestrion-style header. - args := clictx.Args().Slice() - if slices.Contains(args, "-help") || slices.Contains(args, "--help") || slices.Contains(args, "-h") { - tmpl := template.Must(template.New("help").Parse(cli.CommandHelpTemplate)) - if err := tmpl.Execute(os.Stdout, clictx.Command); err != nil { - fmt.Printf("NAME:\n orchestrion lint - %s\n\n", clictx.Command.Usage) - fmt.Printf("USAGE:\n %s\n\n", clictx.Command.UsageText) - fmt.Println() - } + Name: "lint", + Usage: "Run selected static analysis checks on Go code for Orchestrion to work better for certain features.", + UsageText: "orchestrion lint [lint arguments...]", + Args: true, + SkipFlagParsing: true, + Action: func(clictx *cli.Context) (err error) { + span, _ := tracer.StartSpanFromContext(clictx.Context, "lint", + tracer.ResourceName(strings.Join(clictx.Args().Slice(), " ")), + ) + defer func() { span.Finish(tracer.WithError(err)) }() + + // Check if help was requested and print Orchestrion-style header. + args := clictx.Args().Slice() + if slices.Contains(args, "-help") || slices.Contains(args, "--help") || slices.Contains(args, "-h") { + tmpl := template.Must(template.New("help").Parse(cli.CommandHelpTemplate)) + if err := tmpl.Execute(os.Stdout, clictx.Command); err != nil { + fmt.Printf("NAME:\n orchestrion lint - %s\n\n", clictx.Command.Usage) + fmt.Printf("USAGE:\n %s\n\n", clictx.Command.UsageText) + fmt.Println() } - - // Set up os.Args to include the lint subcommand args. - // Replace "orchestrion lint" with "orchestrion-lint", - // so multichecker sees proper args - args = append([]string{"orchestrion-lint"}, args...) - os.Args = args - - // Run multichecker. This will take over with its own flags. - analyzers := []*analysis.Analyzer{ - errorlint.NewAnalyzer( - errorlint.WithComparison(true), - errorlint.WithAsserts(true), - ), - } - multichecker.Main(analyzers...) - - return nil - }, - } + } + + // Set up os.Args to include the lint subcommand args. + // Replace "orchestrion lint" with "orchestrion-lint", + // so multichecker sees proper args + args = append([]string{"orchestrion-lint"}, args...) + os.Args = args + + // Run multichecker. This will take over with its own flags. + analyzers := []*analysis.Analyzer{ + errorlint.NewAnalyzer( + errorlint.WithComparison(true), + errorlint.WithAsserts(true), + ), + } + multichecker.Main(analyzers...) + + return nil + }, +} From 39f8feef0e9e01857fd8bad151d7d36ac82b0f6a Mon Sep 17 00:00:00 2001 From: Kemal Akkoyun Date: Thu, 11 Sep 2025 13:25:26 +0200 Subject: [PATCH 4/6] chore: Update dependency Signed-off-by: Kemal Akkoyun --- go.mod | 4 +--- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index cdb1d263a..b35f92b6f 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module github.com/DataDog/orchestrion go 1.24.0 -replace github.com/polyfloyd/go-errorlint => github.com/kakkoyun/go-errorlint v0.0.0-20250903093155-8eaa0fc8fca5 - require ( github.com/DataDog/dd-trace-go/v2 v2.2.3 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb @@ -17,7 +15,7 @@ require ( github.com/nats-io/nats-server/v2 v2.11.8 github.com/nats-io/nats.go v1.45.0 github.com/otiai10/copy v1.14.1 - github.com/polyfloyd/go-errorlint v1.8.0 + github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea github.com/rs/zerolog v1.34.0 github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 github.com/shirou/gopsutil/v4 v4.25.8 diff --git a/go.sum b/go.sum index 76bb82361..e00f394a6 100644 --- a/go.sum +++ b/go.sum @@ -120,8 +120,6 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kakkoyun/go-errorlint v0.0.0-20250903093155-8eaa0fc8fca5 h1:xDktVYWuPepO6AedpAynwzbe4EH+qbBvuIj4vH5deYo= -github.com/kakkoyun/go-errorlint v0.0.0-20250903093155-8eaa0fc8fca5/go.mod h1:msT1JMnFNM1gqj7rtZYaA0EtpIYNeLQSsKJChZNA+5A= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= @@ -187,6 +185,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea h1:0hdZfdf74rU/bEndy2uZJyNeY21jmH751KmdAjOmEiA= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea/go.mod h1:msT1JMnFNM1gqj7rtZYaA0EtpIYNeLQSsKJChZNA+5A= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= From d545489f1c6f5aaf43ef76e1945271ea868f749f Mon Sep 17 00:00:00 2001 From: Kemal Akkoyun Date: Thu, 11 Sep 2025 17:30:18 +0200 Subject: [PATCH 5/6] chore(cmd/lint): Add tests Signed-off-by: Kemal Akkoyun --- _docs/generator/tools.go | 1 + _docs/go.mod | 4 +- _docs/go.sum | 4 +- internal/cmd/lint_test.go | 166 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 internal/cmd/lint_test.go diff --git a/_docs/generator/tools.go b/_docs/generator/tools.go index 4698374cd..791a0fdc5 100644 --- a/_docs/generator/tools.go +++ b/_docs/generator/tools.go @@ -53,6 +53,7 @@ import ( _ "github.com/twitchtv/twirp" _ "github.com/valkey-io/valkey-go" _ "go.mongodb.org/mongo-driver/mongo/options" + _ "go.mongodb.org/mongo-driver/v2/mongo/options" _ "google.golang.org/grpc" _ "gorm.io/gorm" _ "k8s.io/client-go/rest" diff --git a/_docs/go.mod b/_docs/go.mod index 099f52a27..8a1142301 100644 --- a/_docs/go.mod +++ b/_docs/go.mod @@ -50,6 +50,7 @@ require ( github.com/twitchtv/twirp v8.1.3+incompatible github.com/valkey-io/valkey-go v1.0.64 go.mongodb.org/mongo-driver v1.17.4 + go.mongodb.org/mongo-driver/v2 v2.3.0 golang.org/x/tools v0.36.0 google.golang.org/grpc v1.75.0 gorm.io/gorm v1.30.3 @@ -333,7 +334,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/polyfloyd/go-errorlint v1.8.0 // indirect + github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/prometheus/common v0.62.0 // indirect github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect @@ -381,7 +382,6 @@ require ( github.com/yuin/goldmark-emoji v1.0.4 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zeebo/errs v1.4.0 // indirect - go.mongodb.org/mongo-driver/v2 v2.3.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/collector/component v1.40.0 // indirect diff --git a/_docs/go.sum b/_docs/go.sum index 478540ee8..94ffc3387 100644 --- a/_docs/go.sum +++ b/_docs/go.sum @@ -1072,8 +1072,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q= -github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea h1:0hdZfdf74rU/bEndy2uZJyNeY21jmH751KmdAjOmEiA= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea/go.mod h1:msT1JMnFNM1gqj7rtZYaA0EtpIYNeLQSsKJChZNA+5A= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= diff --git a/internal/cmd/lint_test.go b/internal/cmd/lint_test.go new file mode 100644 index 000000000..3ff1494a1 --- /dev/null +++ b/internal/cmd/lint_test.go @@ -0,0 +1,166 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package cmd_test + +import ( + "bytes" + "context" + "flag" + "os" + "testing" + + "github.com/DataDog/orchestrion/internal/cmd" + "github.com/stretchr/testify/require" + "github.com/urfave/cli/v2" +) + +func TestLint(t *testing.T) { + // Save original os.Args to restore after tests + originalArgs := os.Args + defer func() { os.Args = originalArgs }() + + t.Run("help flags", func(t *testing.T) { + helpTests := []struct { + name string + args []string + }{ + {"short help", []string{"-h"}}, + {"long help", []string{"--help"}}, + {"help flag", []string{"-help"}}, + } + + for _, tt := range helpTests { + t.Run(tt.name, func(t *testing.T) { + var output bytes.Buffer + set := flag.NewFlagSet("test", flag.ContinueOnError) + set.Parse(tt.args) + ctx := cli.NewContext(&cli.App{Writer: &output}, set, nil) + ctx.Command = cmd.Lint + + // Since multichecker.Main() will exit the program, we need to handle this carefully + // For help flags, the command should display help and call multichecker.Main() + // We can't easily test the multichecker.Main() call without it exiting + // So we'll focus on testing the help output preparation + + // Set up arguments that include help + testArgs := append([]string{"orchestrion", "lint"}, tt.args...) + os.Args = testArgs + + // The lint command will call multichecker.Main() which exits + // We can't easily test this without complex mocking + // Instead, let's verify the command structure and help template handling + + require.NotNil(t, cmd.Lint.Action) + require.Equal(t, "lint", cmd.Lint.Name) + require.Equal(t, "Run selected static analysis checks on Go code for Orchestrion to work better for certain features.", cmd.Lint.Usage) + require.True(t, cmd.Lint.SkipFlagParsing) + }) + } + }) + + t.Run("command configuration", func(t *testing.T) { + // Test command properties + require.Equal(t, "lint", cmd.Lint.Name) + require.Equal(t, "Run selected static analysis checks on Go code for Orchestrion to work better for certain features.", cmd.Lint.Usage) + require.Equal(t, "orchestrion lint [lint arguments...]", cmd.Lint.UsageText) + require.True(t, cmd.Lint.Args) + require.True(t, cmd.Lint.SkipFlagParsing) + require.NotNil(t, cmd.Lint.Action) + }) + + t.Run("os.Args manipulation", func(t *testing.T) { + // Test that os.Args gets properly modified for multichecker + + // We can't easily test the full execution without multichecker.Main() exiting + // But we can verify the argument preparation logic + + args := []string{"-checks=all", "./..."} + expectedArgs := append([]string{"orchestrion-lint"}, args...) + + require.Equal(t, []string{"orchestrion-lint", "-checks=all", "./..."}, expectedArgs) + }) + + t.Run("context with tracing", func(t *testing.T) { + // Test that the command can be called with a context (for tracing) + var output bytes.Buffer + set := flag.NewFlagSet("test", flag.ContinueOnError) + set.Parse([]string{"./..."}) + + app := &cli.App{Writer: &output} + ctx := cli.NewContext(app, set, nil) + ctx.Context = context.Background() + ctx.Command = cmd.Lint + + // Verify command is set up with tracing context + require.NotNil(t, ctx.Context) + require.Equal(t, cmd.Lint, ctx.Command) + }) + + t.Run("analyzer configuration", func(t *testing.T) { + // While we can't directly test the analyzer setup due to multichecker.Main() exiting, + // we can verify that the command is properly structured to use go-errorlint + + // The lint command should be configured to use errorlint analyzer with: + // - WithComparison(true) + // - WithAsserts(true) + + // This is validated by the command existing and being properly configured + require.NotNil(t, cmd.Lint) + require.NotNil(t, cmd.Lint.Action) + }) +} + +func TestLintIntegration(t *testing.T) { + t.Run("help flag functionality", func(t *testing.T) { + // Create a more realistic test to verify help flags are detected + helpFlags := [][]string{ + {"-h"}, + {"--help"}, + {"-help"}, + {"./...", "-h"}, // help mixed with other args + } + + for _, args := range helpFlags { + // Test that help flags are properly detected in argument slices + containsHelp := containsHelpFlag(args) + + hasHelpFlag := false + for _, arg := range args { + if arg == "-h" || arg == "--help" || arg == "-help" { + hasHelpFlag = true + break + } + } + + require.Equal(t, hasHelpFlag, containsHelp) + } + }) + + t.Run("command execution setup", func(t *testing.T) { + // Test the command setup process that would happen before multichecker.Main() + originalArgs := []string{"orchestrion", "lint", "-checks=all", "./..."} + + // Simulate the argument transformation from the lint command + args := originalArgs[2:] // Remove "orchestrion lint" + modifiedArgs := append([]string{"orchestrion-lint"}, args...) + + // Verify the transformation + require.Equal(t, "orchestrion-lint", modifiedArgs[0]) + require.Contains(t, modifiedArgs, "-checks=all") + require.Contains(t, modifiedArgs, "./...") + require.Len(t, modifiedArgs, 3) + }) +} + +// Helper function to simulate help flag detection logic +func containsHelpFlag(args []string) bool { + for _, arg := range args { + if arg == "-h" || arg == "--help" || arg == "-help" { + return true + } + } + return false +} From f05506c2297f7d259693ad1623e2c48ebcc164de Mon Sep 17 00:00:00 2001 From: "dd-k9-library-go[bot]" <214463715+dd-k9-library-go[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 15:37:33 +0000 Subject: [PATCH 6/6] chore: update generated files --- instrument/go.mod | 2 +- instrument/go.sum | 4 ++-- samples/go.mod | 2 +- samples/go.sum | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/instrument/go.mod b/instrument/go.mod index bd4426df4..9cff69ed2 100644 --- a/instrument/go.mod +++ b/instrument/go.mod @@ -221,7 +221,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/polyfloyd/go-errorlint v1.8.0 // indirect + github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect diff --git a/instrument/go.sum b/instrument/go.sum index 93fc5f2e3..845978662 100644 --- a/instrument/go.sum +++ b/instrument/go.sum @@ -793,8 +793,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q= -github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea h1:0hdZfdf74rU/bEndy2uZJyNeY21jmH751KmdAjOmEiA= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea/go.mod h1:msT1JMnFNM1gqj7rtZYaA0EtpIYNeLQSsKJChZNA+5A= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= diff --git a/samples/go.mod b/samples/go.mod index bcbc85be0..cb1329224 100644 --- a/samples/go.mod +++ b/samples/go.mod @@ -245,7 +245,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/polyfloyd/go-errorlint v1.8.0 // indirect + github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect diff --git a/samples/go.sum b/samples/go.sum index f5dd5f23e..7d16a3972 100644 --- a/samples/go.sum +++ b/samples/go.sum @@ -794,8 +794,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q= -github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea h1:0hdZfdf74rU/bEndy2uZJyNeY21jmH751KmdAjOmEiA= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea/go.mod h1:msT1JMnFNM1gqj7rtZYaA0EtpIYNeLQSsKJChZNA+5A= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=