cmd/mbf: check for updates concurrently
All checks were successful
Test / Create distribution (push) Successful in 59s
Test / Sandbox (push) Successful in 2m39s
Test / Hakurei (push) Successful in 3m43s
Test / ShareFS (push) Successful in 3m50s
Test / Sandbox (race detector) (push) Successful in 4m57s
Test / Hakurei (race detector) (push) Successful in 6m0s
Test / Flake checks (push) Successful in 1m36s
All checks were successful
Test / Create distribution (push) Successful in 59s
Test / Sandbox (push) Successful in 2m39s
Test / Hakurei (push) Successful in 3m43s
Test / ShareFS (push) Successful in 3m50s
Test / Sandbox (race detector) (push) Successful in 4m57s
Test / Hakurei (race detector) (push) Successful in 6m0s
Test / Flake checks (push) Successful in 1m36s
Runs much faster this way. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -12,6 +12,8 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
"unique"
|
"unique"
|
||||||
@@ -265,32 +267,72 @@ func main() {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
{
|
||||||
|
var flagJobs int
|
||||||
c.NewCommand("updates", command.UsageInternal, func([]string) error {
|
c.NewCommand("updates", command.UsageInternal, func([]string) error {
|
||||||
var n int
|
var (
|
||||||
for i := range rosa.PresetEnd {
|
errsMu sync.Mutex
|
||||||
p := rosa.PArtifact(i)
|
errs []error
|
||||||
|
|
||||||
|
n atomic.Uint64
|
||||||
|
)
|
||||||
|
|
||||||
|
w := make(chan rosa.PArtifact)
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
for range max(flagJobs, 1) {
|
||||||
|
wg.Go(func() {
|
||||||
|
for p := range w {
|
||||||
meta := rosa.GetMetadata(p)
|
meta := rosa.GetMetadata(p)
|
||||||
if meta.ID == 0 {
|
if meta.ID == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, err := meta.GetVersions(ctx); err != nil {
|
v, err := meta.GetVersions(ctx)
|
||||||
return err
|
if err != nil {
|
||||||
} else if current, latest :=
|
errsMu.Lock()
|
||||||
rosa.Std.Version(p),
|
errs = append(errs, err)
|
||||||
meta.GetLatest(v); current != latest {
|
errsMu.Unlock()
|
||||||
n++
|
continue
|
||||||
log.Printf("%s %s < %s", meta.Name, current, latest)
|
|
||||||
} else {
|
|
||||||
msg.Verbosef("%s is up to date", meta.Name)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if n > 0 {
|
if current, latest :=
|
||||||
return errors.New(strconv.Itoa(n) + " packages are out of date")
|
rosa.Std.Version(p),
|
||||||
|
meta.GetLatest(v); current != latest {
|
||||||
|
|
||||||
|
n.Add(1)
|
||||||
|
log.Printf("%s %s < %s", meta.Name, current, latest)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.Verbosef("%s is up to date", meta.Name)
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
for i := range rosa.PresetEnd {
|
||||||
|
select {
|
||||||
|
case w <- rosa.PArtifact(i):
|
||||||
|
break
|
||||||
|
case <-ctx.Done():
|
||||||
|
break done
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(w)
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
|
if v := n.Load(); v > 0 {
|
||||||
|
errs = append(errs, errors.New(strconv.Itoa(int(v))+
|
||||||
|
" package(s) are out of date"))
|
||||||
|
}
|
||||||
|
return errors.Join(errs...)
|
||||||
|
}).
|
||||||
|
Flag(
|
||||||
|
&flagJobs,
|
||||||
|
"j", command.IntFlag(32),
|
||||||
|
"Maximum number of simultaneous connections",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
var (
|
var (
|
||||||
@@ -565,6 +607,16 @@ func main() {
|
|||||||
if cache != nil {
|
if cache != nil {
|
||||||
cache.Close()
|
cache.Close()
|
||||||
}
|
}
|
||||||
|
if w, ok := err.(interface{ Unwrap() []error }); !ok {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
} else {
|
||||||
|
errs := w.Unwrap()
|
||||||
|
for i, e := range errs {
|
||||||
|
if i == len(errs)-1 {
|
||||||
|
log.Fatal(e)
|
||||||
|
}
|
||||||
|
log.Println(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user