Skip to content

v0.13.0

Choose a tag to compare

@clemlesne clemlesne released this 27 Jun 19:22

File operands inside a Git worktree now route through the repo's scoped Git index instead of a separate per-file corpus. seek 'needle' ./cmd/seek/searcher.go keeps Git ignore and local-change behavior, reuses the repo's index, and reads back as the file you selected.

Upgrade. No flag changes. Exact files inside a Git repo now route to the repo's Git corpus (scoped to your selection), not a standalone single-file corpus — files and directories take the same routing decision. .gitignore-excluded files and folders, and anything outside a worktree, fall back to a plain file/folder corpus. The Git corpus identity is unchanged; a file newly routed to it may build a scoped committed/dirty layer on first use, and an ignored fallback may build a folder/file corpus.

What changes for you

  • In-repo files reuse the Git index. A tracked or untracked-visible file routes to its worktree's Git corpus, scoped to the selection — no per-file corpus, consistent ignore + dirty-layer behavior.
  • Ignored folders are searchable. An exact .gitignore-excluded file or folder now searches via a fallback corpus. Previously only ignored files.
  • Selected files read as what you picked. Single-corpus mode shows the basename; multi-corpus mode keeps the absolute, openable path.
  • Files follow nested-Git ownership. A file routes through its parent dir: into the inner repo when nested, collapsed to one plan when multiple files share a repo or a selected directory already covers them.
  • Predictable at boundaries. git check-ignore runs index-aware (tracked-but-ignored stays tracked); submodule-interior paths fall back per path; case/normalization-insensitive filesystems are corrected to the real on-disk name so a mistyped-case operand isn't silently missed.
  • Pathspec-safe operands. Paths are fed as literals (./-prefixed), so a :-leading name isn't misparsed as pathspec magic; a symlink to a gitignored in-worktree file falls back instead of vanishing.

Dev/test

  • 3-phase operand router (resolve → classify visibility → route), one git check-ignore batch per repo root, core.fsmonitor=false to skip the fsmonitor IPC tax.
  • Extracted git_scope.go, git_visibility.go, corpus_id.go.
  • realCaseWithin corrects case/NFC-NFD names by os.SameFile identity before they drive the byte-exact Git scope.
  • Regression coverage: classify gap (tracked/untracked/ignored/nested/collapse), visibility matrix (submodule-interior, leading-colon, all-prefiltered), case-mismatch, symlink-to-ignored, operand-order independence, frozen golden guard on the dirty-scope cache key. Refreshed README and CLI help.

Full changelog: v0.12.0...v0.13.0