mirror of
https://github.com/anchore/syft.git
synced 2026-10-30 22:12:28 +01:00
the index was ported from a prototype with per-node `RWMutex` lock upgrading and JSON marshalling. Its only consumer (`archive.Resolver`) builds it sequentially during extraction and then only reads it, so neither was used. `lock.go` also compared method-value pointers to tell the read lock from the write lock, which can't distinguish lock instances. removed the locks, the upgrade and retry paths that existed only for concurrent writers, and the JSON methods and their test. The radix logic is unchanged, and the README now points at `archive.Resolver` rather than a nonexistent `archive.Index`. Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
internal/index
A key-split (radix) index over strings, and a forward/reverse pair of them that answers prefix and suffix lookups. Ported from a prototype directory-scan package, minus its locking and JSON support: the only consumer builds an index once and then only reads it, so it is not safe for concurrent writes.
Types
KeySplitIndex[T]/Node[T]: a radix tree. Each node holds at most one value and splits its children on the longest common prefix of their keys, sopom.xmlandpom.propertiesshare apom.node.PrefixSuffix[T]: twoKeySplitIndexvalues, one keyed by the string and one by its reverse, soByPrefix("pom")andBySuffix(".jar")are both a single descent followed by a collect.
Operations
| call | answers |
|---|---|
Get(key) |
the value at exactly key |
Set(key, v) / Update(key, fn) |
store, or read-modify-write, the value at key |
ByPrefix(p) |
every value whose key starts with p |
BySuffix(s) (PrefixSuffix only) |
every value whose key ends with s |
Values are whatever the caller stores; internal/archive stores []*node per base name because a
name repeats across directories.
Where it is used
internal/archive.Resolver keeps one PrefixSuffix[[]*node] of files by base name, and one of directories. A cataloger glob
whose last segment is a literal, *suffix or prefix* (nearly all of them: **/*.jar,
**/pom.properties) is answered from it instead of by walking every path.
Notes
- Lookups are byte-wise;
reverseworks on runes so a multi-byte name reverses correctly. _find,_collectand_makeNodePare the prototype's internals and are left with its naming.