Peter Kurfer
c1c1667d9f
lint-pr runs golangci-lint, captures the result and uses it directly without temporary files It also allows to automatically retrieve the PRs base commit and run golangci-lint only against changes in the current PR
158 lines
4.3 KiB
Go
158 lines
4.3 KiB
Go
package commands
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
giteaSdk "code.gitea.io/sdk/gitea"
|
|
"github.com/spf13/cobra"
|
|
|
|
"code.icb4dc0.de/prskr/nitter/nitters/gitea"
|
|
)
|
|
|
|
type reviewStateTypeValue giteaSdk.ReviewStateType
|
|
|
|
func (r *reviewStateTypeValue) String() string {
|
|
return string(*r)
|
|
}
|
|
|
|
func (r *reviewStateTypeValue) Set(s string) error {
|
|
switch strings.ToUpper(s) {
|
|
case string(giteaSdk.ReviewStateApproved):
|
|
*r = reviewStateTypeValue(giteaSdk.ReviewStateApproved)
|
|
return nil
|
|
case string(giteaSdk.ReviewStateRequestChanges):
|
|
*r = reviewStateTypeValue(giteaSdk.ReviewStateRequestChanges)
|
|
return nil
|
|
case string(giteaSdk.ReviewStateComment):
|
|
*r = reviewStateTypeValue(giteaSdk.ReviewStateComment)
|
|
return nil
|
|
default:
|
|
return fmt.Errorf("value %s doesn't match any expected state type", s)
|
|
}
|
|
}
|
|
|
|
func (r *reviewStateTypeValue) Type() string {
|
|
return "string"
|
|
}
|
|
|
|
var errorReviewStateType = reviewStateTypeValue(giteaSdk.ReviewStateComment)
|
|
|
|
//nolint:lll //flag setup causes long lines
|
|
func Gitea() *cobra.Command {
|
|
giteaCmd := &cobra.Command{
|
|
Use: "gitea",
|
|
Short: "Parent command to Gitea related actions",
|
|
}
|
|
|
|
giteaCmd.PersistentFlags().StringP("base-address", "a", "", "Base URL of your Gitea/Forgejo instance [$NITTER_BASE_ADDRESS]")
|
|
giteaCmd.PersistentFlags().StringP("token", "t", "", "Access token to interact with Gitea/Forgejo API [$NITTER_TOKEN]")
|
|
|
|
pr := &cobra.Command{
|
|
Use: "pull-request",
|
|
Short: "Read golangci-lint result and create a PR review",
|
|
Aliases: []string{"merge-request", "pr", "pull"},
|
|
RunE: runGiteaPRNitting,
|
|
}
|
|
|
|
pr.Flags().Int64P(
|
|
"pull-index",
|
|
"i",
|
|
-1,
|
|
"PR index to add reviews to - note, this is not the ID of the PR but its number [$NITTER_PULL_INDEX]",
|
|
)
|
|
|
|
pr.Flags().Var(&errorReviewStateType, "review-state", "state in which to create the review if there are issues [comment,approved,]")
|
|
pr.Flags().StringP("result-file", "f", "", "path to the golangci-lint JSON output [$NITTER_RESULT_FILE]")
|
|
|
|
lintPr := &cobra.Command{
|
|
Use: "lint-pull-request",
|
|
Short: "Run golangci-lint directly and create a PR review based on the captured results - required golangci-lint being in $PATH",
|
|
Aliases: []string{"lint-pr", "lint-pull"},
|
|
RunE: runGiteaPRLintNitting,
|
|
}
|
|
|
|
lintPr.Flags().Var(&errorReviewStateType, "review-state", "state in which to create the review if there are issues [comment,approved,]")
|
|
|
|
lintPr.Flags().Int64P(
|
|
"pull-index",
|
|
"i",
|
|
-1,
|
|
"PR index to add reviews to - note, this is not the ID of the PR but its number [$NITTER_PULL_INDEX]",
|
|
)
|
|
|
|
lintPr.Flags().Bool(
|
|
"from-pr-base",
|
|
false,
|
|
"if enabled, nitter will get the PRs metadata and start golangci-lint with --new-from-rev=<PR base commit>",
|
|
)
|
|
|
|
lintPr.Flags().StringSlice(
|
|
"golangci-lint-extra-args",
|
|
nil,
|
|
"Extra args to append to golangci-lint run commands, keep in mind that out-format will be set to JSON and --new-from-rev if you enable --from-pr-base",
|
|
)
|
|
|
|
giteaCmd.AddCommand(pr, lintPr)
|
|
|
|
return giteaCmd
|
|
}
|
|
|
|
func runGiteaPRNitting(cmd *cobra.Command, args []string) error {
|
|
cfg, err := LoadConfig[gitea.GiteaPRConfig](cmd.Flags())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = cfg.Validate(); err != nil {
|
|
return err
|
|
}
|
|
|
|
report, issues, err := ReadResultsFile(cmd.Flag("result-file").Value.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
giteaClient, err := giteaSdk.NewClient(cfg.BaseAddress, giteaSdk.SetContext(cmd.Context()), giteaSdk.SetToken(cfg.Token))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
nitter := gitea.NewPRNitter(giteaClient, cfg)
|
|
|
|
return nitter.Report(report, issues)
|
|
}
|
|
|
|
func runGiteaPRLintNitting(cmd *cobra.Command, args []string) error {
|
|
cfg, err := LoadConfig[gitea.GiteaPRLintConfig](cmd.Flags())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = cfg.Validate(); err != nil {
|
|
return err
|
|
}
|
|
|
|
giteaClient, err := giteaSdk.NewClient(cfg.BaseAddress, giteaSdk.SetContext(cmd.Context()), giteaSdk.SetToken(cfg.Token))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if cfg.FromPRBase {
|
|
var pr *giteaSdk.PullRequest
|
|
if pr, _, err = giteaClient.GetPullRequest(cfg.Namespace, cfg.Repo, cfg.PRIndex); err != nil {
|
|
return err
|
|
} else {
|
|
cfg.ExtraArgs = append(cfg.ExtraArgs, fmt.Sprintf("--new-from-rev=%s", pr.Base.Sha))
|
|
}
|
|
}
|
|
|
|
report, issues, err := RunGolangCiLint(cmd.Context(), cfg.ExtraArgs)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
nitter := gitea.NewPRNitter(giteaClient, &cfg.GiteaPRConfig)
|
|
|
|
return nitter.Report(report, issues)
|
|
}
|