mirror of
https://github.com/sbt/sbt.git
synced 2026-09-01 02:27:13 +02:00
A directory declared via Def.declareOutputDirectory is packaged as a sibling <dir>.sbtdir.zip, so deleting the directory leaves the zip behind. On a cache hit, syncFile's up-to-date short-circuit saw the zip in sync (same digest, already a CAS symlink) and returned without the unpack side effect, which only ran from the file-write path: the directory was never restored. For sbt's own compile, whose classes directory is declared this way, rm -rf of the classes directory with a warm cache meant run failed with ClassNotFoundException and no recompile; only deleting the zip as well (or the whole cache) recovered. The up-to-date branch now re-extracts when the extracted directory itself is missing: a single stat on the warm path, per review preference over a manifest-based per-file check. Partial deletions inside a still-existing directory are not repaired, consistent with treating target/ contents as sbt-managed. Refs #9462 (the directory-restoration half; the declareOutput-in-a-loop half is a separate macro-layer issue) Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]> Co-authored-by: eugene yokota <[email protected]>