Skip to content

v0.10.0

Choose a tag to compare

@clemlesne clemlesne released this 16 Jun 15:52

Search a parent dir holding many repos: each indexes as its own corpus. Multi-GiB folder corpora no longer wedge. CLI errors actually tell you what went wrong. seek gc shows you what it evicted.

Upgrade. Folder corpora indexed under v0.9.x re-index once on first search (cache layout v2 → v3). Git corpora untouched. CLI flags and on-disk paths unchanged.

What changes for you

  • Multi-repo parent folders. seek 'foo' ~/dev now discovers nested git repos inside the parent and indexes each one separately — gitignore honored per repo, results disambiguated by corpus. Capped at 64 nested repos per query (Warn on cap).
  • No more wedged folder searches. The deadlock that hung indefinitely on multi-GiB folder corpora is fixed. Per-corpus content cap raised 5 GiB → 10 GiB; peak RSS still bounded.
  • Multi-corpus searches run in parallel. Up to 4 corpora index concurrently. Same physical repo reached via symlinks or multiple operands indexes once.
  • CLI errors that help.
    • seek gccunknown subcommand "gcc" (did you mean "gc"?)
    • seek --verbos foounknown flag: --verbos (did you mean --verbose?)
    • seek -file:test (single-dash Zoekt query) still passes through unchanged.
  • seek gc --force is no longer silent. Live banner + per-corpus table + summary, same shape as --dry-run. ACTION column: evicted / kept / locked / gone / trashed: <err> / failed: <err>.
  • Wedged-indexer signal. A stuck indexer used to silently degrade every search to stale shards forever. Now you get a Warn naming the lock so you can find and kill it.
  • seek gc subcommand. Promoted to a real subcommand with --force, --dry-run, --all. Alias: garbage-collect.

Performance

Microbenchmarks (Apple M1 Max, benchstat over 5 samples):

Benchmark Δ ns/op
FolderCorpus_ColdIndex −41.0%
FolderCorpus_WarmSearch −20.1%
SmallRepo executeParsedSearchScoped −52.7%
SmallRepo planCurrentGitCorpus −21.3%
SmallRepo ensureUntrackedCache −31.6%
SmallRepo indexUncommitted_1file −12.1%
SmallRepo postVerify_restat −21.5%
PlannedGitCorpus_DirtyReindex −9.2%
geomean (16 benches) −18.4%

Field benchmarks — git + non-git, PR-scale dirty re-index at 1% and 10%:

Kind Workload Files Cold index Warm search Dirty 1% Dirty 10%
git spf13/cobra 66 470ms 80ms 120ms 130ms
git prometheus/prometheus 1,635 1.8s 90ms 150ms 380ms
git kubernetes/kubernetes 30,507 11.0s 180ms 700ms 4.3s
folder synthetic-10k 10,000 6.0s 100ms 250ms 750ms
folder synthetic-100k 100,000 33.5s 250ms 1.3s 7.8s

Reproduce: ./cicd/bench-field.sh [--no-linux] [--keep].

Breaking

  • Cache layout v2 → v3 — folder corpora re-index once on first search.
  • Internal Go API: streamFiles requires context.Context; acquireSearchLock requires indexDir string; fileContent.weight Release contract (see docstring); gitPaths.ExcludePath removed.

Dev/test

  • 19 new test files: cancellation with goleak, pressure (4 MiB swap), property/fuzz, deadlock guard, discovery fixtures, git-boundary detection, Cobra CLI surface, soak (gated //go:build soak + SEEK_SOAK=1).
  • cicd/bench-field.sh — self-contained field-benchmark harness, sandboxed via SEEK_CACHE_DIR.
  • make test-bench-compare wraps benchstat.
  • New deps: cobra, pflag, goleak (test-only).

Full changelog: v0.9.0...v0.10.0