mirror of
https://github.com/anchore/syft.git
synced 2025-11-17 00:13:15 +01:00
--------- Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com> Co-authored-by: spiffcs <32073428+spiffcs@users.noreply.github.com>
67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package ruby
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"strings"
|
|
|
|
"github.com/scylladb/go-set/strset"
|
|
|
|
"github.com/anchore/syft/internal/unknown"
|
|
"github.com/anchore/syft/syft/artifact"
|
|
"github.com/anchore/syft/syft/file"
|
|
"github.com/anchore/syft/syft/pkg"
|
|
"github.com/anchore/syft/syft/pkg/cataloger/generic"
|
|
)
|
|
|
|
var _ generic.Parser = parseGemFileLockEntries
|
|
|
|
var sectionsOfInterest = strset.New("GEM", "GIT", "PATH", "PLUGIN SOURCE")
|
|
|
|
// parseGemFileLockEntries is a parser function for Gemfile.lock contents, returning all Gems discovered.
|
|
func parseGemFileLockEntries(_ context.Context, _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) {
|
|
var pkgs []pkg.Package
|
|
scanner := bufio.NewScanner(reader)
|
|
|
|
var currentSection string
|
|
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
sanitizedLine := strings.TrimSpace(line)
|
|
|
|
if len(line) > 1 && line[0] != ' ' {
|
|
// start of section
|
|
currentSection = sanitizedLine
|
|
continue
|
|
} else if !sectionsOfInterest.Has(currentSection) {
|
|
// skip this line, we're in the wrong section
|
|
continue
|
|
}
|
|
|
|
if isDependencyLine(line) {
|
|
candidate := strings.Fields(sanitizedLine)
|
|
if len(candidate) != 2 {
|
|
continue
|
|
}
|
|
pkgs = append(pkgs,
|
|
newGemfileLockPackage(
|
|
candidate[0],
|
|
strings.Trim(candidate[1], "()"),
|
|
reader.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation),
|
|
),
|
|
)
|
|
}
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return pkgs, nil, unknown.IfEmptyf(pkgs, "unable to determine packages")
|
|
}
|
|
|
|
func isDependencyLine(line string) bool {
|
|
if len(line) < 5 {
|
|
return false
|
|
}
|
|
return strings.Count(line[:5], " ") == 4
|
|
}
|