mirror of
https://github.com/anchore/syft.git
synced 2026-11-04 08:26:38 +01:00
* remove internal string set Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * incorporate changes from #2227 Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * beef up the pkg.License.Merg() doc string Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> --------- Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
package ruby
|
|
|
|
import (
|
|
"bufio"
|
|
"strings"
|
|
|
|
"github.com/scylladb/go-set/strset"
|
|
|
|
"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(_ 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.Location.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation),
|
|
),
|
|
)
|
|
}
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return pkgs, nil, nil
|
|
}
|
|
|
|
func isDependencyLine(line string) bool {
|
|
if len(line) < 5 {
|
|
return false
|
|
}
|
|
return strings.Count(line[:5], " ") == 4
|
|
}
|