Detect available flags for extensions (#2557)

* draft dump json in help

* polish feature

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Casey Lee <cplee@nektos.com>
This commit is contained in:
ChristopherHX
2025-02-08 20:16:57 +01:00
committed by GitHub
parent 5eae59e0ef
commit e636684948
3 changed files with 29 additions and 0 deletions

View File

@@ -60,6 +60,7 @@ type Input struct {
networkName string networkName string
useNewActionCache bool useNewActionCache bool
localRepository []string localRepository []string
listOptions bool
} }
func (i *Input) resolve(path string) string { func (i *Input) resolve(path string) string {

View File

@@ -20,6 +20,10 @@ type Notice struct {
} }
func displayNotices(input *Input) { func displayNotices(input *Input) {
// Avoid causing trouble parsing the json
if input.listOptions {
return
}
select { select {
case notices := <-noticesLoaded: case notices := <-noticesLoaded:
if len(notices) > 0 { if len(notices) > 0 {

View File

@@ -4,6 +4,7 @@ import (
"bufio" "bufio"
"bytes" "bytes"
"context" "context"
"encoding/json"
"fmt" "fmt"
"os" "os"
"path/filepath" "path/filepath"
@@ -21,6 +22,7 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/cobra/doc" "github.com/spf13/cobra/doc"
"github.com/spf13/pflag"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
"github.com/nektos/act/pkg/artifactcache" "github.com/nektos/act/pkg/artifactcache"
@@ -31,6 +33,13 @@ import (
"github.com/nektos/act/pkg/runner" "github.com/nektos/act/pkg/runner"
) )
type Flag struct {
Name string `json:"name"`
Default string `json:"default"`
Type string `json:"type"`
Description string `json:"description"`
}
// Execute is the entry point to running the CLI // Execute is the entry point to running the CLI
func Execute(ctx context.Context, version string) { func Execute(ctx context.Context, version string) {
input := new(Input) input := new(Input)
@@ -44,6 +53,7 @@ func Execute(ctx context.Context, version string) {
Version: version, Version: version,
SilenceUsage: true, SilenceUsage: true,
} }
rootCmd.Flags().BoolP("watch", "w", false, "watch the contents of the local repo and run when files change") rootCmd.Flags().BoolP("watch", "w", false, "watch the contents of the local repo and run when files change")
rootCmd.Flags().BoolP("list", "l", false, "list workflows") rootCmd.Flags().BoolP("list", "l", false, "list workflows")
rootCmd.Flags().BoolP("graph", "g", false, "draw workflows") rootCmd.Flags().BoolP("graph", "g", false, "draw workflows")
@@ -104,6 +114,7 @@ func Execute(ctx context.Context, version string) {
rootCmd.PersistentFlags().StringVarP(&input.networkName, "network", "", "host", "Sets a docker network name. Defaults to host.") rootCmd.PersistentFlags().StringVarP(&input.networkName, "network", "", "host", "Sets a docker network name. Defaults to host.")
rootCmd.PersistentFlags().BoolVarP(&input.useNewActionCache, "use-new-action-cache", "", false, "Enable using the new Action Cache for storing Actions locally") rootCmd.PersistentFlags().BoolVarP(&input.useNewActionCache, "use-new-action-cache", "", false, "Enable using the new Action Cache for storing Actions locally")
rootCmd.PersistentFlags().StringArrayVarP(&input.localRepository, "local-repository", "", []string{}, "Replaces the specified repository and ref with a local folder (e.g. https://github.com/test/test@v0=/home/act/test or test/test@v0=/home/act/test, the latter matches any hosts or protocols)") rootCmd.PersistentFlags().StringArrayVarP(&input.localRepository, "local-repository", "", []string{}, "Replaces the specified repository and ref with a local folder (e.g. https://github.com/test/test@v0=/home/act/test or test/test@v0=/home/act/test, the latter matches any hosts or protocols)")
rootCmd.PersistentFlags().BoolVar(&input.listOptions, "list-options", false, "Print a json structure of compatible options")
rootCmd.SetArgs(args()) rootCmd.SetArgs(args())
if err := rootCmd.Execute(); err != nil { if err := rootCmd.Execute(); err != nil {
@@ -242,6 +253,16 @@ func generateManPage(cmd *cobra.Command) error {
return nil return nil
} }
func listOptions(cmd *cobra.Command) error {
flags := []Flag{}
cmd.LocalFlags().VisitAll(func(f *pflag.Flag) {
flags = append(flags, Flag{Name: f.Name, Default: f.DefValue, Description: f.Usage, Type: f.Value.Type()})
})
a, err := json.Marshal(flags)
fmt.Println(string(a))
return err
}
func readArgsFile(file string, split bool) []string { func readArgsFile(file string, split bool) []string {
args := make([]string, 0) args := make([]string, 0)
f, err := os.Open(file) f, err := os.Open(file)
@@ -359,6 +380,9 @@ func newRunCommand(ctx context.Context, input *Input) func(*cobra.Command, []str
if ok, _ := cmd.Flags().GetBool("man-page"); ok { if ok, _ := cmd.Flags().GetBool("man-page"); ok {
return generateManPage(cmd) return generateManPage(cmd)
} }
if input.listOptions {
return listOptions(cmd)
}
if ret, err := container.GetSocketAndHost(input.containerDaemonSocket); err != nil { if ret, err := container.GetSocketAndHost(input.containerDaemonSocket); err != nil {
log.Warnf("Couldn't get a valid docker connection: %+v", err) log.Warnf("Couldn't get a valid docker connection: %+v", err)