diff --git a/pkg/cmd/release/download/download.go b/pkg/cmd/release/download/download.go index 0521fe12e..2810d68e3 100644 --- a/pkg/cmd/release/download/download.go +++ b/pkg/cmd/release/download/download.go @@ -7,6 +7,7 @@ import ( "os" "path/filepath" + "github.com/MakeNowJust/heredoc" "github.com/cli/cli/api" "github.com/cli/cli/internal/ghrepo" "github.com/cli/cli/pkg/cmd/release/shared" @@ -35,16 +36,32 @@ func NewCmdDownload(f *cmdutil.Factory, runF func(*DownloadOptions) error) *cobr } cmd := &cobra.Command{ - Use: "download []", + Use: "download []", Short: "Download release assets", - Args: cobra.MinimumNArgs(1), + Long: heredoc.Doc(` + Download assets from a GitHub release. + + Without an explicit tag name argument, assets are downloaded from the + latest release in the project. In this case, '--pattern' is required. + `), + Example: heredoc.Doc(` + # download all assets from a specific release + $ gh release download v1.2.3 + + # download only Debian packages for the latest release + $ gh release download --pattern '*.deb' + `), + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { // support `-R, --repo` override opts.BaseRepo = f.BaseRepo - opts.TagName = args[0] - if len(args) > 1 { - opts.FilePattern = args[1] + if len(args) == 0 { + if opts.FilePattern == "" { + return &cmdutil.FlagError{Err: errors.New("the '--pattern' flag is required when downloading the latest release")} + } + } else { + opts.TagName = args[0] } opts.Concurrency = 5 @@ -56,7 +73,8 @@ func NewCmdDownload(f *cmdutil.Factory, runF func(*DownloadOptions) error) *cobr }, } - cmd.Flags().StringVarP(&opts.Destination, "dir", "C", ".", "The directory to download files into") + cmd.Flags().StringVarP(&opts.Destination, "dir", "D", ".", "The directory to download files into") + cmd.Flags().StringVarP(&opts.FilePattern, "pattern", "p", "", "Download only assets that match the glob pattern") return cmd } @@ -72,9 +90,18 @@ func downloadRun(opts *DownloadOptions) error { return err } - release, err := shared.FetchRelease(httpClient, baseRepo, opts.TagName) - if err != nil { - return err + var release *shared.Release + + if opts.TagName == "" { + release, err = shared.FetchLatestRelease(httpClient, baseRepo) + if err != nil { + return err + } + } else { + release, err = shared.FetchRelease(httpClient, baseRepo, opts.TagName) + if err != nil { + return err + } } var toDownload []shared.ReleaseAsset diff --git a/pkg/cmd/release/download/download_test.go b/pkg/cmd/release/download/download_test.go index cd1a5469c..7c16e7fed 100644 --- a/pkg/cmd/release/download/download_test.go +++ b/pkg/cmd/release/download/download_test.go @@ -38,7 +38,7 @@ func Test_NewCmdDownload(t *testing.T) { }, { name: "version and file pattern", - args: "v1.2.3 *.tgz", + args: "v1.2.3 -p *.tgz", isTTY: true, want: DownloadOptions{ TagName: "v1.2.3", @@ -49,7 +49,7 @@ func Test_NewCmdDownload(t *testing.T) { }, { name: "version and destination", - args: "v1.2.3 -C tmp/assets", + args: "v1.2.3 -D tmp/assets", isTTY: true, want: DownloadOptions{ TagName: "v1.2.3", @@ -58,11 +58,22 @@ func Test_NewCmdDownload(t *testing.T) { Concurrency: 5, }, }, + { + name: "download latest", + args: "-p *", + isTTY: true, + want: DownloadOptions{ + TagName: "", + FilePattern: "*", + Destination: ".", + Concurrency: 5, + }, + }, { name: "no arguments", args: "", isTTY: true, - wantErr: "requires at least 1 arg(s), only received 0", + wantErr: "the '--pattern' flag is required when downloading the latest release", }, } for _, tt := range tests { diff --git a/pkg/cmd/release/view/view.go b/pkg/cmd/release/view/view.go index 6de42abc1..63adf9901 100644 --- a/pkg/cmd/release/view/view.go +++ b/pkg/cmd/release/view/view.go @@ -7,6 +7,7 @@ import ( "strings" "time" + "github.com/MakeNowJust/heredoc" "github.com/cli/cli/internal/ghrepo" "github.com/cli/cli/pkg/cmd/release/shared" "github.com/cli/cli/pkg/cmdutil" @@ -32,7 +33,13 @@ func NewCmdView(f *cmdutil.Factory, runF func(*ViewOptions) error) *cobra.Comman cmd := &cobra.Command{ Use: "view []", Short: "View information about a release", - Args: cobra.MaximumNArgs(1), + Long: heredoc.Doc(` + View information about a GitHub release. + + Without an explicit tag name argument, the latest release in the project + is shown. + `), + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { // support `-R, --repo` override opts.BaseRepo = f.BaseRepo