Files
syft/internal/index/README.md
T
Alex Goodman 8e2cdf2429 chore: drop the locking and JSON support from internal/index
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>
2026-09-24 13:42:59 -04:00

37 lines
1.7 KiB
Markdown

# 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, so `pom.xml` and `pom.properties` share a
`pom.` node.
- `PrefixSuffix[T]`: two `KeySplitIndex` values, one keyed by the string and one by its reverse, so
`ByPrefix("pom")` and `BySuffix(".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; `reverse` works on runes so a multi-byte name reverses correctly.
- `_find`, `_collect` and `_makeNodeP` are the prototype's internals and are left with its naming.