@@ -2,6 +2,7 @@ package cmd
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "github.com/bartventer/httpcache"
78 _ "github.com/bartventer/httpcache/store/fscache"
@@ -18,7 +19,6 @@ import (
1819 "net/http"
1920 "os"
2021 "path/filepath"
21- "regexp"
2222 "runtime"
2323 "strings"
2424 "time"
@@ -45,19 +45,24 @@ func runInstall(cmd *cobra.Command, args []string) error { // NOSONAR
4545 return fmt .Errorf ("repository must be in format: owner/repo" )
4646 }
4747
48- owner , repo , err := parseRepository (args [ 0 ] )
48+ owner , repo , tag , err := parseRepository (args )
4949 if err != nil {
5050 _ = cmd .Help ()
5151 return err
5252 }
53-
54- tag := "latest"
55- if len (args ) > 1 {
56- tag = args [1 ]
57- }
53+ log .Info ("Repository" , "owner" , owner , "repo" , repo , "tag" , tag )
5854
5955 log .Info ("runtime" , "GOOS" , runtime .GOOS , "GOARCH" , runtime .GOARCH )
60- styles .PrintKV ("Repository:" , fmt .Sprintf ("%s/%s:%s" , owner , repo , tag ))
56+
57+ tagDisplay := tag
58+ if tag == "" {
59+ if preRelease {
60+ tagDisplay = "pre-release"
61+ } else {
62+ tagDisplay = "latest"
63+ }
64+ }
65+ styles .PrintKV ("Repository:" , fmt .Sprintf ("%s/%s:%s" , owner , repo , tagDisplay ))
6166
6267 client := getClient ()
6368
@@ -69,7 +74,8 @@ func runInstall(cmd *cobra.Command, args []string) error { // NOSONAR
6974 log .Debugf ("release: %v" , release )
7075 }
7176
72- styles .PrintKV ("Version:" , fmt .Sprintf ("%s (%s)" , release .GetTagName (), release .GetName ()))
77+ //styles.PrintKV("Version:", fmt.Sprintf("%s (%s)", release.GetTagName(), release.GetName()))
78+ renderReleaseTable (release )
7379
7480 // Asset
7581 var asset * github.ReleaseAsset
@@ -384,12 +390,15 @@ func getRelease(client *github.Client, owner, repo, tag string, pre bool) (*gith
384390 ctx := context .Background ()
385391 var release * github.RepositoryRelease
386392 var err error
387- if pre {
393+ if tag != "" {
394+ log .Debugf ("client.Repositories.GetReleaseByTag: %v" , tag )
395+ release , _ , err = client .Repositories .GetReleaseByTag (ctx , owner , repo , tag )
396+ } else if pre {
397+ log .Debugf ("GetLatestRelease - Including Pre-Releases" )
388398 release , err = getLatestRelease (client , owner , repo )
389- } else if tag == "" || tag == "latest" {
390- release , _ , err = client .Repositories .GetLatestRelease (ctx , owner , repo )
391399 } else {
392- release , _ , err = client .Repositories .GetReleaseByTag (ctx , owner , repo , tag )
400+ log .Debugf ("client.Repositories.GetLatestRelease" )
401+ release , _ , err = client .Repositories .GetLatestRelease (ctx , owner , repo )
393402 }
394403 if err != nil {
395404 return nil , fmt .Errorf ("get release error: %w" , err )
@@ -403,10 +412,10 @@ func getLatestRelease(client *github.Client, owner, repo string) (*github.Reposi
403412 if err != nil {
404413 return nil , err
405414 }
406-
407415 if len (releases ) > 0 {
408416 return releases [0 ], nil
409417 }
418+ // TODO: Consider returning an error here...
410419 return nil , nil
411420}
412421
@@ -420,12 +429,48 @@ func ensureWinExt(destName string) string {
420429 return destName
421430}
422431
423- func parseRepository (repository string ) (owner , repo string , err error ) {
424- var repoPattern = regexp .MustCompile (`^[a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+$` )
432+ func parseRepository (args []string ) (owner , repo , tag string , err error ) {
433+ helpErr := errors .New ("repository must be in format: owner/repo[:tag]" )
434+ log .Debugf ("parseRepository: %v" , len (args ))
435+ switch len (args ) {
436+ case 0 :
437+ return "" , "" , "" , helpErr
438+ case 1 :
439+ repository := args [0 ]
440+ if strings .Contains (repository , ":" ) {
441+ split := strings .Split (repository , ":" )
442+ repository = split [0 ]
443+ tag = split [1 ]
444+ } else if strings .Contains (repository , "@" ) {
445+ split := strings .Split (repository , "@" )
446+ repository = split [0 ]
447+ tag = split [1 ]
448+ }
449+ split := strings .Split (repository , "/" )
450+ if len (split ) != 2 {
451+ return "" , "" , "" , helpErr
452+ }
453+ owner = split [0 ]
454+ repo = split [1 ]
455+ case 2 :
456+ if strings .Contains (args [0 ], "/" ) {
457+ split := strings .Split (args [0 ], "/" )
458+ owner = split [0 ]
459+ repo = split [1 ]
460+ tag = args [1 ]
461+ } else {
462+ owner = args [0 ]
463+ repo = args [1 ]
464+ }
465+ default :
466+ owner = args [0 ]
467+ repo = args [1 ]
468+ tag = args [2 ]
469+ }
425470
426- if ! repoPattern .MatchString (repository ) {
427- return "" , "" , fmt .Errorf ("repository must be in format: owner/repo" )
471+ if owner == "" || repo == "" {
472+ log .Infof ("owner/repo are blank" )
473+ return "" , "" , "" , helpErr
428474 }
429- split := strings .Split (repository , "/" )
430- return split [0 ], split [1 ], nil
475+ return
431476}
0 commit comments