Skip to content

Commit adb5a3e

Browse files
authored
Merge pull request #31 from b4b4r07/feature/check
Add new command to check updates on each package
2 parents 7726218 + 35af280 commit adb5a3e

19 files changed

+316
-33
lines changed

cmd/check.go

+147
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package cmd
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"os"
8+
"os/signal"
9+
10+
"github.com/b4b4r07/afx/pkg/config"
11+
"github.com/b4b4r07/afx/pkg/errors"
12+
"github.com/b4b4r07/afx/pkg/helpers/templates"
13+
"github.com/b4b4r07/afx/pkg/state"
14+
"github.com/spf13/cobra"
15+
"golang.org/x/sync/errgroup"
16+
)
17+
18+
type checkCmd struct {
19+
metaCmd
20+
}
21+
22+
var (
23+
// checkLong is long description of fmt command
24+
checkLong = templates.LongDesc(``)
25+
26+
// checkExample is examples for fmt command
27+
checkExample = templates.Examples(`
28+
afx check [args...]
29+
30+
By default, it tries to check packages if new version is
31+
available or not.
32+
If any args are given, it tries to check only them.
33+
`)
34+
)
35+
36+
// newCheckCmd creates a new fmt command
37+
func (m metaCmd) newCheckCmd() *cobra.Command {
38+
c := &checkCmd{metaCmd: m}
39+
40+
checkCmd := &cobra.Command{
41+
Use: "check",
42+
Short: "Check new updates on each package",
43+
Long: checkLong,
44+
Example: checkExample,
45+
Aliases: []string{"c"},
46+
DisableFlagsInUseLine: true,
47+
SilenceUsage: true,
48+
SilenceErrors: true,
49+
Args: cobra.MinimumNArgs(0),
50+
ValidArgs: state.Keys(m.state.NoChanges),
51+
RunE: func(cmd *cobra.Command, args []string) error {
52+
resources := m.state.NoChanges
53+
if len(resources) == 0 {
54+
fmt.Println("No packages to check")
55+
return nil
56+
}
57+
58+
var tmp []state.Resource
59+
for _, arg := range args {
60+
resource, ok := state.Map(resources)[arg]
61+
if !ok {
62+
return fmt.Errorf("%s: not installed yet", arg)
63+
}
64+
tmp = append(tmp, resource)
65+
}
66+
if len(tmp) > 0 {
67+
resources = tmp
68+
}
69+
70+
yes, _ := m.askRunCommand(*c, state.Keys(resources))
71+
if !yes {
72+
fmt.Println("Cancelled")
73+
return nil
74+
}
75+
76+
pkgs := m.GetPackages(resources)
77+
m.env.AskWhen(map[string]bool{
78+
"GITHUB_TOKEN": config.HasGitHubReleaseBlock(pkgs),
79+
})
80+
81+
return c.run(pkgs)
82+
},
83+
PostRunE: func(cmd *cobra.Command, args []string) error {
84+
return m.printForUpdate()
85+
},
86+
}
87+
88+
return checkCmd
89+
}
90+
91+
type checkResult struct {
92+
Package config.Package
93+
Error error
94+
}
95+
96+
func (c *checkCmd) run(pkgs []config.Package) error {
97+
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
98+
defer stop()
99+
100+
progress := config.NewProgress(pkgs)
101+
completion := make(chan config.Status)
102+
limit := make(chan struct{}, 16)
103+
results := make(chan checkResult)
104+
105+
go func() {
106+
progress.Print(completion)
107+
}()
108+
109+
log.Printf("[DEBUG] (check): start to run each pkg.Check()")
110+
eg := errgroup.Group{}
111+
for _, pkg := range pkgs {
112+
pkg := pkg
113+
eg.Go(func() error {
114+
limit <- struct{}{}
115+
defer func() { <-limit }()
116+
err := pkg.Check(ctx, completion)
117+
select {
118+
case results <- checkResult{Package: pkg, Error: err}:
119+
return nil
120+
case <-ctx.Done():
121+
return errors.Wrapf(ctx.Err(), "%s: cancelled checking", pkg.GetName())
122+
}
123+
})
124+
}
125+
126+
go func() {
127+
eg.Wait()
128+
close(results)
129+
}()
130+
131+
var exit errors.Errors
132+
for result := range results {
133+
exit.Append(result.Error)
134+
}
135+
if err := eg.Wait(); err != nil {
136+
log.Printf("[ERROR] failed to check: %s", err)
137+
exit.Append(err)
138+
}
139+
140+
defer func(err error) {
141+
if err != nil {
142+
c.env.Refresh()
143+
}
144+
}(exit.ErrorOrNil())
145+
146+
return exit.ErrorOrNil()
147+
}

cmd/init.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func (m metaCmd) newInitCmd() *cobra.Command {
4444
Run: func(cmd *cobra.Command, args []string) {
4545
for _, pkg := range m.packages {
4646
if err := pkg.Init(); err != nil {
47-
log.Printf("[ERROR] %s: failed to init pacakge: %v\n", pkg.GetName(), err)
47+
log.Printf("[ERROR] %s: failed to init package: %v\n", pkg.GetName(), err)
4848
// do not return err to continue to load even if failed
4949
continue
5050
}

cmd/install.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func (m metaCmd) newInstallCmd() *cobra.Command {
5959
for _, arg := range args {
6060
resource, ok := state.Map(resources)[arg]
6161
if !ok {
62-
continue
62+
return fmt.Errorf("%s: no such package in config", arg)
6363
}
6464
tmp = append(tmp, resource)
6565
}

cmd/meta.go

+2
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,8 @@ func (m *metaCmd) askRunCommand(op interface{}, pkgs []string) (bool, error) {
226226
do = "uninstall"
227227
case updateCmd:
228228
do = "update"
229+
case checkCmd:
230+
do = "check"
229231
default:
230232
return false, errors.New("unsupported command type")
231233
}

cmd/root.go

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ func newRootCmd(m metaCmd) *cobra.Command {
6868
m.newInstallCmd(),
6969
m.newUninstallCmd(),
7070
m.newUpdateCmd(),
71+
m.newCheckCmd(),
7172
m.newSelfUpdateCmd(),
7273
m.newShowCmd(),
7374
m.newCompletionCmd(),

cmd/uninstall.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (m metaCmd) newUninstallCmd() *cobra.Command {
5555
for _, arg := range args {
5656
resource, ok := state.Map(resources)[arg]
5757
if !ok {
58-
continue
58+
return fmt.Errorf("%s: no such package to be uninstalled", arg)
5959
}
6060
tmp = append(tmp, resource)
6161
}

cmd/update.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func (m metaCmd) newUpdateCmd() *cobra.Command {
5959
for _, arg := range args {
6060
resource, ok := state.Map(resources)[arg]
6161
if !ok {
62-
continue
62+
return fmt.Errorf("%s: no such package in config", arg)
6363
}
6464
tmp = append(tmp, resource)
6565
}

docs/index.md

+2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ $ afx help
99
Package manager for CLI
1010

1111
Usage:
12+
afx [flags]
1213
afx [command]
1314

1415
Available Commands:
16+
check Check new updates on each package
1517
completion Generate completion script
1618
help Help about any command
1719
init Initialize installed packages

go.mod

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ go 1.12
55
require (
66
github.com/AlecAivazis/survey/v2 v2.3.2
77
github.com/MakeNowJust/heredoc v1.0.0
8+
github.com/Masterminds/semver v1.5.0
89
github.com/Netflix/go-expect v0.0.0-20190729225929-0e00d9168667 // indirect
9-
github.com/agext/levenshtein v1.2.2 // indirect
1010
github.com/cli/cli/v2 v2.5.1
1111
github.com/creativeprojects/go-selfupdate v0.6.1
1212
github.com/deckarep/golang-set v1.8.0
@@ -19,7 +19,7 @@ require (
1919
github.com/h2non/filetype v1.0.10
2020
github.com/hashicorp/go-multierror v1.1.1
2121
github.com/hashicorp/go-version v1.3.0
22-
github.com/hashicorp/hcl/v2 v2.2.0
22+
github.com/hashicorp/hcl/v2 v2.11.1
2323
github.com/hashicorp/logutils v1.0.0
2424
github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c // indirect
2525
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf
@@ -28,7 +28,6 @@ require (
2828
github.com/mattn/go-shellwords v1.0.12
2929
github.com/mattn/go-zglob v0.0.1
3030
github.com/mholt/archiver v3.1.1+incompatible
31-
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
3231
github.com/nwaples/rardecode v1.1.0 // indirect
3332
github.com/pierrec/lz4 v2.2.6+incompatible // indirect
3433
github.com/pkg/errors v0.9.1 // indirect

go.sum

+14-8
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,16 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
5555
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
5656
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
5757
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
58+
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
59+
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
5860
github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvoqmMUQk=
5961
github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
6062
github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc=
6163
github.com/Netflix/go-expect v0.0.0-20190729225929-0e00d9168667 h1:l2RCK7mjLhjfZRIcCXTVHI34l67IRtKASBjusViLzQ0=
6264
github.com/Netflix/go-expect v0.0.0-20190729225929-0e00d9168667/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc=
6365
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
66+
github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8=
6467
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
65-
github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
66-
github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
6768
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
6869
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
6970
github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s=
@@ -77,6 +78,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
7778
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
7879
github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
7980
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
81+
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
82+
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
8083
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
8184
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
8285
github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
@@ -302,8 +305,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
302305
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
303306
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
304307
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
305-
github.com/hashicorp/hcl/v2 v2.2.0 h1:ZQ1eNLggMfTyFBhV8swxT081mlaRjr4EG85NEjjLB84=
306-
github.com/hashicorp/hcl/v2 v2.2.0/go.mod h1:MD4q2LOluJ5pRwTVkCXmJOY7ODWDXVXGVB8LY0t7wig=
308+
github.com/hashicorp/hcl/v2 v2.11.1 h1:yTyWcXcm9XB0TEkyU/JCRU6rYy4K+mgLtzn2wlrJbcc=
309+
github.com/hashicorp/hcl/v2 v2.11.1/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg=
307310
github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
308311
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
309312
github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
@@ -405,9 +408,8 @@ github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0
405408
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
406409
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
407410
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
411+
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM=
408412
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
409-
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
410-
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
411413
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
412414
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
413415
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
@@ -501,6 +503,8 @@ github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oW
501503
github.com/ulikunitz/xz v0.5.9 h1:RsKRIA2MO8x56wkkcd3LbtcE/uMszhb6DpRf+3uwa3I=
502504
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
503505
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
506+
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
507+
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
504508
github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
505509
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
506510
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
@@ -512,8 +516,10 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
512516
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
513517
github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg=
514518
github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ=
515-
github.com/zclconf/go-cty v1.1.1 h1:Shl2p9Dat0cqJfXu0DZa+cOTRPhXQjK8IYWD6GVfiqo=
516-
github.com/zclconf/go-cty v1.1.1/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
519+
github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
520+
github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA=
521+
github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
522+
github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8=
517523
go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
518524
go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
519525
go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs=

pkg/config/gist.go

+5
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,8 @@ func (c Gist) GetDependsOn() []string {
177177
func (c Gist) GetResource() state.Resource {
178178
return getResource(c)
179179
}
180+
181+
func (c Gist) Check(ctx context.Context, status chan<- Status) error {
182+
status <- Status{Name: c.GetName(), Done: true, Err: false, Message: "(gist)", NoColor: true}
183+
return nil
184+
}

0 commit comments

Comments
 (0)