Skip to content

Commit 4fd421b

Browse files
authored
Update Repository Formats (#30)
1 parent ecd4c4a commit 4fd421b

6 files changed

Lines changed: 119 additions & 50 deletions

File tree

README.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ Install the latest release.
9797
ir owner/repo
9898
```
9999

100-
Include pre-releases.
100+
Include the latest pre-releases.
101101

102102
```shell
103103
ir owner/repo --pre
@@ -106,7 +106,18 @@ ir owner/repo --pre
106106
Install a specific version/tag.
107107

108108
```shell
109-
ir owner/repo v4.2.0
109+
ir owner/repo v1.0.0
110+
```
111+
112+
Install using many formats:
113+
114+
```shell
115+
ir owner repo
116+
ir owner repo tag
117+
ir owner/repo
118+
ir owner/repo tag
119+
ir owner/repo:tag
120+
ir owner/repo@tag
110121
```
111122

112123
Skip the asset and name prompts.
@@ -115,10 +126,10 @@ Skip the asset and name prompts.
115126
ir owner/repo -y
116127
```
117128

118-
Set the name and asset programmatically.
129+
Set the asset and name inline.
119130

120131
```shell
121-
ir owner/repo -n name -a name_asset.zip
132+
ir owner/repo -n name -a asset_name.zip
122133
```
123134

124135
Install to a different bin directory.

cmd/info.go

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"github.com/charmbracelet/log"
66
"github.com/dustin/go-humanize"
7+
"github.com/google/go-github/v58/github"
78
"github.com/smashedr/install-release/internal/styles"
89
"github.com/spf13/cobra"
910
"github.com/spf13/viper"
@@ -23,16 +24,12 @@ var infoCmd = &cobra.Command{
2324
log.Debug("infoCmd", "args", args, "binPath", binPath, "preRelease", preRelease)
2425

2526
if len(args) >= 1 && strings.Contains(args[0], "/") {
26-
owner, repo, err := parseRepository(args[0])
27+
owner, repo, tag, err := parseRepository(args)
2728
if err != nil {
2829
_ = cmd.Help()
2930
log.Fatal(err)
3031
}
31-
tag := "latest"
32-
if len(args) > 1 {
33-
tag = args[1]
34-
}
35-
log.Info("Repository", "owner", owner, "repo", repo)
32+
log.Info("Repository", "owner", owner, "repo", repo, "tag", tag)
3633
client := getClient()
3734
release, err := getRelease(client, owner, repo, tag, preRelease)
3835
if err != nil {
@@ -41,19 +38,7 @@ var infoCmd = &cobra.Command{
4138
if verbose >= 3 {
4239
log.Debugf("%v", release)
4340
}
44-
45-
releaseTime := release.GetCreatedAt().Time // Timestamp → time.Time
46-
formattedDate := releaseTime.Format("15:04 on 2 Jan 2006")
47-
48-
rows := [][]string{
49-
{"Tag", release.GetTagName()},
50-
{"Name", release.GetName()},
51-
{"Date", formattedDate},
52-
{"Time", humanize.Time(releaseTime)},
53-
{"Author", release.GetAuthor().GetLogin()},
54-
{"Assets", strconv.Itoa(len(release.Assets))},
55-
}
56-
styles.RenderTable(rows, "Info", "Details")
41+
renderReleaseTable(release)
5742
return
5843
}
5944

@@ -74,6 +59,23 @@ var infoCmd = &cobra.Command{
7459
},
7560
}
7661

62+
func renderReleaseTable(release *github.RepositoryRelease) {
63+
releaseTime := release.GetCreatedAt().Time // Timestamp → time.Time
64+
formattedDate := releaseTime.Format("15:04 on 2 Jan 2006")
65+
66+
rows := [][]string{
67+
{"Name", release.GetName()},
68+
{"Tag", release.GetTagName()},
69+
{"Prerelease", strconv.FormatBool(release.GetPrerelease())},
70+
{"Date", formattedDate},
71+
{"Time", humanize.Time(releaseTime)},
72+
{"Author", release.GetAuthor().GetLogin()},
73+
{"Assets", strconv.Itoa(len(release.Assets))},
74+
//{"URL", release.GetHTMLURL()},
75+
}
76+
styles.RenderTable(rows, "Info", "Details")
77+
}
78+
7779
func init() {
7880
rootCmd.AddCommand(infoCmd)
7981
//infoCmd.Flags().BoolP("summary", "s", false, "only show summary")

cmd/install.go

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cmd
22

33
import (
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
}

docs/index.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Install the latest release.
5959
ir owner/repo
6060
```
6161

62-
Include pre-releases.
62+
Include the latest pre-releases.
6363

6464
```shell
6565
ir owner/repo --pre
@@ -68,7 +68,18 @@ ir owner/repo --pre
6868
Install a specific version/tag.
6969

7070
```shell
71-
ir owner/repo v4.2.0
71+
ir owner/repo v1.0.0
72+
```
73+
74+
Install using many formats:
75+
76+
```shell
77+
ir owner repo
78+
ir owner repo tag
79+
ir owner/repo
80+
ir owner/repo tag
81+
ir owner/repo:tag
82+
ir owner/repo@tag
7283
```
7384

7485
Skip the asset and name prompts.
@@ -77,10 +88,10 @@ Skip the asset and name prompts.
7788
ir owner/repo -y
7889
```
7990

80-
Set the name and asset programmatically.
91+
Set the asset and name inline.
8192

8293
```shell
83-
ir owner/repo -n name -a name_asset.zip
94+
ir owner/repo -n name -a asset_name.zip
8495
```
8596

8697
Install to a different bin directory.

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ require (
3232
github.com/charmbracelet/x/exp/strings v0.1.0 // indirect
3333
github.com/charmbracelet/x/term v0.2.2 // indirect
3434
github.com/clipperhouse/displaywidth v0.10.0 // indirect
35-
github.com/clipperhouse/uax29/v2 v2.6.0 // indirect
35+
github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
3636
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect
3737
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
3838
github.com/fsnotify/fsnotify v1.9.0 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ github.com/charmbracelet/x/xpty v0.1.2 h1:Pqmu4TEJ8KeA9uSkISKMU3f+C1F6OGBn8ABuGl
5252
github.com/charmbracelet/x/xpty v0.1.2/go.mod h1:XK2Z0id5rtLWcpeNiMYBccNNBrP2IJnzHI0Lq13Xzq4=
5353
github.com/clipperhouse/displaywidth v0.10.0 h1:GhBG8WuerxjFQQYeuZAeVTuyxuX+UraiZGD4HJQ3Y8g=
5454
github.com/clipperhouse/displaywidth v0.10.0/go.mod h1:XqJajYsaiEwkxOj4bowCTMcT1SgvHo9flfF3jQasdbs=
55-
github.com/clipperhouse/uax29/v2 v2.6.0 h1:z0cDbUV+aPASdFb2/ndFnS9ts/WNXgTNNGFoKXuhpos=
56-
github.com/clipperhouse/uax29/v2 v2.6.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
55+
github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=
56+
github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
5757
github.com/confluentinc/go-editor v0.11.0 h1:fcEALYHj7xV/fRSp54/IHi2DS4GlZMJWVgrYvi/llvU=
5858
github.com/confluentinc/go-editor v0.11.0/go.mod h1:nEjwqdqx8S7ZGjXsDvRgawsA04Fu2P/KAtA8fa5afMI=
5959
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=

0 commit comments

Comments
 (0)