mirror of
https://github.com/anchore/syft.git
synced 2026-02-12 10:36:45 +01:00
fix ui race for package count (#2839)
Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
This commit is contained in:
parent
00ff3ffda9
commit
a56eff90d6
@ -36,14 +36,22 @@ type Accessor interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type sbomBuilder struct {
|
type sbomBuilder struct {
|
||||||
sbom *sbom.SBOM
|
sbom *sbom.SBOM
|
||||||
lock *sync.RWMutex
|
lock *sync.RWMutex
|
||||||
|
onWrite []func(*sbom.SBOM)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBuilder(s *sbom.SBOM) Builder {
|
func NewBuilder(s *sbom.SBOM, onWrite ...func(*sbom.SBOM)) Builder {
|
||||||
return &sbomBuilder{
|
return &sbomBuilder{
|
||||||
sbom: s,
|
sbom: s,
|
||||||
lock: &sync.RWMutex{},
|
lock: &sync.RWMutex{},
|
||||||
|
onWrite: onWrite,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b sbomBuilder) onWriteEvent() {
|
||||||
|
for _, fn := range b.onWrite {
|
||||||
|
fn(b.sbom)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,6 +60,7 @@ func (b sbomBuilder) WriteToSBOM(fn func(*sbom.SBOM)) {
|
|||||||
defer b.lock.Unlock()
|
defer b.lock.Unlock()
|
||||||
|
|
||||||
fn(b.sbom)
|
fn(b.sbom)
|
||||||
|
b.onWriteEvent()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b sbomBuilder) ReadFromSBOM(fn func(*sbom.SBOM)) {
|
func (b sbomBuilder) ReadFromSBOM(fn func(*sbom.SBOM)) {
|
||||||
@ -66,6 +75,7 @@ func (b sbomBuilder) AddPackages(p ...pkg.Package) {
|
|||||||
defer b.lock.Unlock()
|
defer b.lock.Unlock()
|
||||||
|
|
||||||
b.sbom.Artifacts.Packages.Add(p...)
|
b.sbom.Artifacts.Packages.Add(p...)
|
||||||
|
b.onWriteEvent()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b sbomBuilder) AddRelationships(relationship ...artifact.Relationship) {
|
func (b sbomBuilder) AddRelationships(relationship ...artifact.Relationship) {
|
||||||
@ -73,6 +83,7 @@ func (b sbomBuilder) AddRelationships(relationship ...artifact.Relationship) {
|
|||||||
defer b.lock.Unlock()
|
defer b.lock.Unlock()
|
||||||
|
|
||||||
b.sbom.Relationships = append(b.sbom.Relationships, relationship...)
|
b.sbom.Relationships = append(b.sbom.Relationships, relationship...)
|
||||||
|
b.onWriteEvent()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b sbomBuilder) SetLinuxDistribution(release linux.Release) {
|
func (b sbomBuilder) SetLinuxDistribution(release linux.Release) {
|
||||||
@ -80,4 +91,5 @@ func (b sbomBuilder) SetLinuxDistribution(release linux.Release) {
|
|||||||
defer b.lock.Unlock()
|
defer b.lock.Unlock()
|
||||||
|
|
||||||
b.sbom.Artifacts.LinuxDistribution = &release
|
b.sbom.Artifacts.LinuxDistribution = &release
|
||||||
|
b.onWriteEvent()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,11 +4,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/dustin/go-humanize"
|
"github.com/dustin/go-humanize"
|
||||||
"github.com/scylladb/go-set/strset"
|
"github.com/scylladb/go-set/strset"
|
||||||
"github.com/wagoodman/go-progress"
|
|
||||||
|
|
||||||
"github.com/anchore/syft/internal/bus"
|
"github.com/anchore/syft/internal/bus"
|
||||||
"github.com/anchore/syft/internal/sbomsync"
|
"github.com/anchore/syft/internal/sbomsync"
|
||||||
@ -63,9 +61,9 @@ func CreateSBOM(ctx context.Context, src source.Source, cfg *CreateSBOMConfig) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
catalogingProgress := monitorCatalogingTask(src.ID(), taskGroups)
|
catalogingProgress := monitorCatalogingTask(src.ID(), taskGroups)
|
||||||
packageCatalogingProgress := monitorPackageCatalogingTask(s.Artifacts.Packages)
|
packageCatalogingProgress := monitorPackageCatalogingTask()
|
||||||
|
|
||||||
builder := sbomsync.NewBuilder(&s)
|
builder := sbomsync.NewBuilder(&s, monitorPackageCount(packageCatalogingProgress))
|
||||||
for i := range taskGroups {
|
for i := range taskGroups {
|
||||||
err := task.NewTaskExecutor(taskGroups[i], cfg.Parallelism).Execute(ctx, resolver, builder, catalogingProgress)
|
err := task.NewTaskExecutor(taskGroups[i], cfg.Parallelism).Execute(ctx, resolver, builder, catalogingProgress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -80,7 +78,14 @@ func CreateSBOM(ctx context.Context, src source.Source, cfg *CreateSBOMConfig) (
|
|||||||
return &s, nil
|
return &s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func monitorPackageCatalogingTask(pkgs *pkg.Collection) *monitor.CatalogerTaskProgress {
|
func monitorPackageCount(prog *monitor.CatalogerTaskProgress) func(s *sbom.SBOM) {
|
||||||
|
return func(s *sbom.SBOM) {
|
||||||
|
count := humanize.Comma(int64(s.Artifacts.Packages.PackageCount()))
|
||||||
|
prog.AtomicStage.Set(fmt.Sprintf("%s packages", count))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func monitorPackageCatalogingTask() *monitor.CatalogerTaskProgress {
|
||||||
info := monitor.GenericTask{
|
info := monitor.GenericTask{
|
||||||
Title: monitor.Title{
|
Title: monitor.Title{
|
||||||
Default: "Packages",
|
Default: "Packages",
|
||||||
@ -90,25 +95,7 @@ func monitorPackageCatalogingTask(pkgs *pkg.Collection) *monitor.CatalogerTaskPr
|
|||||||
ParentID: monitor.TopLevelCatalogingTaskID,
|
ParentID: monitor.TopLevelCatalogingTaskID,
|
||||||
}
|
}
|
||||||
|
|
||||||
prog := bus.StartCatalogerTask(info, -1, "")
|
return bus.StartCatalogerTask(info, -1, "")
|
||||||
|
|
||||||
go func() {
|
|
||||||
ticker := time.NewTicker(200 * time.Millisecond)
|
|
||||||
defer ticker.Stop()
|
|
||||||
|
|
||||||
for {
|
|
||||||
<-ticker.C
|
|
||||||
|
|
||||||
count := humanize.Comma(int64(pkgs.PackageCount()))
|
|
||||||
prog.AtomicStage.Set(fmt.Sprintf("%s packages", count))
|
|
||||||
|
|
||||||
if progress.IsCompleted(prog) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
return prog
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func monitorCatalogingTask(srcID artifact.ID, tasks [][]task.Task) *monitor.CatalogerTaskProgress {
|
func monitorCatalogingTask(srcID artifact.ID, tasks [][]task.Task) *monitor.CatalogerTaskProgress {
|
||||||
|
|||||||
@ -3,14 +3,14 @@ package spdxjson
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"flag"
|
"flag"
|
||||||
"github.com/anchore/syft/syft/artifact"
|
|
||||||
"github.com/anchore/syft/syft/file"
|
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/anchore/syft/syft/artifact"
|
||||||
|
"github.com/anchore/syft/syft/file"
|
||||||
"github.com/anchore/syft/syft/format/internal/spdxutil"
|
"github.com/anchore/syft/syft/format/internal/spdxutil"
|
||||||
"github.com/anchore/syft/syft/format/internal/testutil"
|
"github.com/anchore/syft/syft/format/internal/testutil"
|
||||||
"github.com/anchore/syft/syft/pkg"
|
"github.com/anchore/syft/syft/pkg"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user