Skip to content

Commit 7ffc9d7

Browse files
feat: new flag options for cache (#204)
* feat: new flag options for cache * fix: invalid usage message * fix: check first arg is allowed * chore: Usage func and change comment * fix: process invalid cmd flags with custom message * fix: improve command validation * (docs) specify package (#210) --------- Co-authored-by: Pulkit Kathuria <kevincobain2000@gmail.com>
1 parent b13d6ae commit 7ffc9d7

File tree

8 files changed

+82
-69
lines changed

8 files changed

+82
-69
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,3 +377,13 @@ export GOPATH="$HOME/.gobrew/current/go"
377377
- v1.9.4 - `gobrew` interactive
378378
- v1.9.8 - bug fix where 1.21 is not detected as 1.21.0
379379
- v1.10.10 - `ls-remote` is blazing fast, cached.
380+
- v1.10.11 - Optional options for cache and ttl.
381+
382+
383+
# DEVELOPMENT NOTES
384+
385+
```sh
386+
go run ./cmd/gobrew -h
387+
golangci-lint run ./...
388+
go test -v ./...
389+
```

cmd/gobrew/main.go

Lines changed: 41 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,46 @@
11
package main
22

33
import (
4-
"flag"
4+
"fmt"
55
"log"
66
"os"
77
"strconv"
88
"strings"
9+
"time"
10+
11+
"github.com/gookit/color"
12+
"github.com/spf13/pflag"
913

1014
"github.com/kevincobain2000/gobrew"
1115
"github.com/kevincobain2000/gobrew/utils"
1216
)
1317

14-
var args []string
1518
var actionArg = ""
1619
var versionArg = ""
1720
var version = "dev"
1821

19-
var allowedArgs = []string{
20-
"h",
21-
"help",
22-
"ls",
23-
"list",
24-
"ls-remote",
25-
"install",
26-
"use",
27-
"uninstall",
28-
"interactive",
29-
"noninteractive",
30-
"prune",
31-
"version",
32-
"self-update",
33-
}
22+
var help bool
23+
var clearCache bool
24+
var ttl time.Duration
25+
var disableCache bool
3426

3527
func init() {
3628
log.SetFlags(0)
3729

38-
if !isArgAllowed() {
39-
log.Println("[Info] Invalid usage")
40-
log.Print(usage())
41-
return
30+
flag := pflag.NewFlagSet("gobrew", pflag.ContinueOnError)
31+
flag.BoolVarP(&disableCache, "disable-cache", "d", false, "disable local cache")
32+
flag.BoolVarP(&clearCache, "clear-cache", "c", false, "clear local cache")
33+
flag.DurationVarP(&ttl, "ttl", "t", 20*time.Minute, "set cache duration in minutes")
34+
35+
flag.BoolVarP(&help, "help", "h", false, "show usage message")
36+
37+
if err := flag.Parse(os.Args[1:]); err != nil {
38+
color.Errorln("[Error] Invalid usage")
39+
Usage()
40+
os.Exit(2)
4241
}
4342

44-
flag.Parse()
45-
args = flag.Args()
43+
args := flag.Args()
4644
if len(args) == 0 {
4745
actionArg = "interactive"
4846
} else {
@@ -74,6 +72,11 @@ func init() {
7472
}
7573

7674
func main() {
75+
if help {
76+
Usage()
77+
return
78+
}
79+
7780
rootDir := os.Getenv("GOBREW_ROOT")
7881
if rootDir == "" {
7982
var err error
@@ -92,6 +95,9 @@ func main() {
9295
GobrewDownloadURL: gobrew.DownloadURL,
9396
GobrewTags: gobrew.TagsAPI,
9497
GobrewVersionsURL: gobrew.VersionsURL,
98+
TTL: ttl,
99+
DisableCache: disableCache,
100+
ClearCache: clearCache,
95101
}
96102

97103
gb := gobrew.NewGoBrew(config)
@@ -101,7 +107,7 @@ func main() {
101107
case "noninteractive":
102108
gb.Interactive(false)
103109
case "h", "help":
104-
log.Print(usage())
110+
Usage()
105111
case "ls", "list":
106112
gb.ListVersions()
107113
case "ls-remote":
@@ -121,46 +127,14 @@ func main() {
121127
gb.Version(version)
122128
case "self-update":
123129
gb.Upgrade(version)
130+
default:
131+
color.Errorln("[Error] Invalid usage")
132+
Usage()
133+
os.Exit(2)
124134
}
125135
}
126136

127-
func isArgAllowed() bool {
128-
ok := true
129-
if len(os.Args) > 1 {
130-
_, ok = Find(allowedArgs, os.Args[1])
131-
if !ok {
132-
return false
133-
}
134-
}
135-
136-
if len(os.Args) > 2 {
137-
_, ok = Find(allowedArgs, os.Args[1])
138-
if !ok {
139-
return false
140-
}
141-
}
142-
143-
return ok
144-
}
145-
146-
// Find takes a slice and looks for an element in it. If found it will
147-
// return it's key, otherwise it will return -1 and a bool of false.
148-
func Find(slice []string, val string) (int, bool) {
149-
for i, item := range slice {
150-
if item == val {
151-
return i, true
152-
}
153-
}
154-
return -1, false
155-
}
156-
157-
func usage() string {
158-
usageMsg :=
159-
`
160-
# Add gobrew to your ~/.bashrc or ~/.zshrc
161-
export PATH="$HOME/.gobrew/current/bin:$HOME/.gobrew/bin:$PATH"
162-
export GOROOT="$HOME/.gobrew/current/go"
163-
`
137+
var Usage = func() {
164138
msg := `
165139
gobrew ` + version + `
166140
@@ -178,6 +152,11 @@ Usage:
178152
gobrew version Show gobrew version
179153
gobrew help Show this message
180154
155+
Options:
156+
gobrew [--clear-cache | -c] clear gobrew cache
157+
gobrew [--disable-cache | -d] disable gobrew cache
158+
gobrew [--ttl=20m | -t 20m] set gobrew cache ttl, default 20m
159+
181160
Examples:
182161
gobrew use 1.16 # use go version 1.16
183162
gobrew use 1.16.1 # use go version 1.16.1
@@ -195,5 +174,5 @@ Examples:
195174
Installation Path:
196175
` + usageMsg
197176

198-
return msg
177+
fmt.Fprintf(os.Stderr, "%s\n", msg)
199178
}

cmd/gobrew/main_unix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
package main
44

5-
const usageMsg = `
5+
const usageMsg string = `
66
# Add gobrew to your ~/.bashrc or ~/.zshrc
77
export PATH="$HOME/.gobrew/current/bin:$HOME/.gobrew/bin:$PATH"
88
export GOROOT="$HOME/.gobrew/current/go"

cmd/gobrew/main_windows.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
package main
44

5-
const usageMsg = `
5+
const usageMsg string = `
66
# Add gobrew to your environment variables
77
PATH="%USERPROFILE%\.gobrew\current\bin;%USERPROFILE%\.gobrew\bin;%PATH%"
88
GOROOT="%USERPROFILE%\.gobrew\current\go"

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ require (
1919
github.com/pkg/errors v0.9.1 // indirect
2020
github.com/pmezard/go-difflib v1.0.0 // indirect
2121
github.com/rivo/uniseg v0.4.7 // indirect
22+
github.com/spf13/pflag v1.0.5 // indirect
2223
github.com/ulikunitz/xz v0.5.11 // indirect
2324
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
2425
golang.org/x/sys v0.17.0 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
3333
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
3434
github.com/schollz/progressbar/v3 v3.14.1 h1:VD+MJPCr4s3wdhTc7OEJ/Z3dAeBzJ7yKH/P4lC5yRTI=
3535
github.com/schollz/progressbar/v3 v3.14.1/go.mod h1:Zc9xXneTzWXF81TGoqL71u0sBPjULtEHYtj/WVgVy8E=
36+
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
37+
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
3638
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
3739
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
3840
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=

gobrew.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"sort"
1212
"strconv"
1313
"strings"
14+
"time"
1415

1516
"github.com/Masterminds/semver"
1617
"github.com/gookit/color"
@@ -56,6 +57,7 @@ type GoBrew struct {
5657
currentBinDir string
5758
currentGoDir string
5859
downloadsDir string
60+
cacheFile string
5961
Config
6062
}
6163

@@ -65,11 +67,18 @@ type Config struct {
6567
GobrewDownloadURL string
6668
GobrewTags string
6769
GobrewVersionsURL string
70+
71+
// cache settings
72+
TTL time.Duration
73+
DisableCache bool
74+
ClearCache bool
6875
}
6976

7077
// NewGoBrew instance
7178
func NewGoBrew(config Config) GoBrew {
7279
installDir := filepath.Join(config.RootDir, goBrewDir)
80+
cacheFile := filepath.Join(installDir, "cache.json")
81+
7382
gb := GoBrew{
7483
Config: config,
7584
installDir: installDir,
@@ -78,6 +87,11 @@ func NewGoBrew(config Config) GoBrew {
7887
currentBinDir: filepath.Join(installDir, "current", "bin"),
7988
currentGoDir: filepath.Join(installDir, "current", "go"),
8089
downloadsDir: filepath.Join(installDir, "downloads"),
90+
cacheFile: cacheFile,
91+
}
92+
93+
if gb.ClearCache {
94+
_ = os.RemoveAll(gb.cacheFile)
8195
}
8296

8397
return gb

helpers.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -528,9 +528,12 @@ type Cache struct {
528528
}
529529

530530
func (gb *GoBrew) getVersionsFromCache() []string {
531-
cacheFile := filepath.Join(gb.installDir, "cache.json")
532-
if _, err := os.Stat(cacheFile); err == nil {
533-
data, e := os.ReadFile(cacheFile)
531+
if gb.DisableCache {
532+
return []string{}
533+
}
534+
535+
if _, err := os.Stat(gb.cacheFile); err == nil {
536+
data, e := os.ReadFile(gb.cacheFile)
534537
if e != nil {
535538
return []string{}
536539
}
@@ -545,8 +548,8 @@ func (gb *GoBrew) getVersionsFromCache() []string {
545548
return []string{}
546549
}
547550

548-
// cache for 20 minutes
549-
if time.Now().UTC().After(timestamp.Add(20 * time.Minute)) {
551+
// cache for gb.TTL duration
552+
if time.Now().UTC().After(timestamp.Add(gb.TTL)) {
550553
return []string{}
551554
}
552555

@@ -557,6 +560,10 @@ func (gb *GoBrew) getVersionsFromCache() []string {
557560
}
558561

559562
func (gb *GoBrew) saveVersionsToCache(versions []string) {
563+
if gb.DisableCache {
564+
return
565+
}
566+
560567
cacheFile := filepath.Join(gb.installDir, "cache.json")
561568
var cache = Cache{
562569
Timestamp: time.Now().UTC().Format(time.RFC3339),

0 commit comments

Comments
 (0)