From d9bfa606ccce89fce82b5a7809423cd6157a7838 Mon Sep 17 00:00:00 2001 From: Azeem Sajid Date: Tue, 11 Feb 2025 12:56:32 +0500 Subject: [PATCH] Fix `gh gist create` for multiple filenames and glob patterns --- pkg/cmd/gist/create/create.go | 14 +++++++++----- pkg/cmd/release/shared/upload.go | 28 ++++------------------------ pkg/cmdutil/args.go | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/pkg/cmd/gist/create/create.go b/pkg/cmd/gist/create/create.go index 4403df9be..ad697e2ce 100644 --- a/pkg/cmd/gist/create/create.go +++ b/pkg/cmd/gist/create/create.go @@ -85,7 +85,7 @@ func NewCmdCreate(f *cmdutil.Factory, runF func(*CreateOptions) error) *cobra.Co }, Aliases: []string{"new"}, RunE: func(c *cobra.Command, args []string) error { - opts.Filenames = args + opts.Filenames = args[:] if runF != nil { return runF(&opts) @@ -102,12 +102,16 @@ func NewCmdCreate(f *cmdutil.Factory, runF func(*CreateOptions) error) *cobra.Co } func createRun(opts *CreateOptions) error { - fileArgs := opts.Filenames - if len(fileArgs) == 0 { - fileArgs = []string{"-"} + filenames, err := cmdutil.GlobWindowsPaths(opts.Filenames) + if err != nil { + return err } - files, err := processFiles(opts.IO.In, opts.FilenameOverride, fileArgs) + if len(filenames) == 0 { + filenames = []string{"-"} + } + + files, err := processFiles(opts.IO.In, opts.FilenameOverride, filenames) if err != nil { return fmt.Errorf("failed to collect files for posting: %w", err) } diff --git a/pkg/cmd/release/shared/upload.go b/pkg/cmd/release/shared/upload.go index 10da2e556..159f86e23 100644 --- a/pkg/cmd/release/shared/upload.go +++ b/pkg/cmd/release/shared/upload.go @@ -4,20 +4,18 @@ import ( "context" "encoding/json" "errors" - "fmt" "io" "mime" "net/http" "net/url" "os" "path" - "path/filepath" - "runtime" "strings" "time" "github.com/cenkalti/backoff/v4" "github.com/cli/cli/v2/api" + "github.com/cli/cli/v2/pkg/cmdutil" "golang.org/x/sync/errgroup" ) @@ -39,11 +37,9 @@ type AssetForUpload struct { } func AssetsFromArgs(args []string) (assets []*AssetForUpload, err error) { - if runtime.GOOS == "windows" { - args, err = globAssetPatterns(args) - if err != nil { - return nil, err - } + args, err = cmdutil.GlobWindowsPaths(args) + if err != nil { + return nil, err } for _, arg := range args { var label string @@ -72,22 +68,6 @@ func AssetsFromArgs(args []string) (assets []*AssetForUpload, err error) { return } -func globAssetPatterns(patterns []string) ([]string, error) { - var assets []string - for _, pattern := range patterns { - matches, err := filepath.Glob(pattern) - if err != nil { - return nil, fmt.Errorf("%s: %s", pattern, err) - } - if len(matches) > 0 { - assets = append(assets, matches...) - } else { - assets = append(assets, pattern) - } - } - return assets, nil -} - func typeForFilename(fn string) string { ext := fileExt(fn) switch ext { diff --git a/pkg/cmdutil/args.go b/pkg/cmdutil/args.go index 0f03a07bd..9dfbce2b1 100644 --- a/pkg/cmdutil/args.go +++ b/pkg/cmdutil/args.go @@ -2,6 +2,8 @@ package cmdutil import ( "fmt" + "path/filepath" + "runtime" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -57,3 +59,22 @@ func NoArgsQuoteReminder(cmd *cobra.Command, args []string) error { return FlagErrorf("%s", errMsg) } + +func GlobWindowsPaths(patterns []string) ([]string, error) { + if runtime.GOOS != "windows" { + return patterns, nil + } + var expansions []string + for _, pattern := range patterns { + matches, err := filepath.Glob(pattern) + if err != nil { + return nil, fmt.Errorf("%s: %s", pattern, err) + } + if len(matches) > 0 { + expansions = append(expansions, matches...) + } else { + expansions = append(expansions, pattern) + } + } + return expansions, nil +}