commit | e2e235359ccdc4b6a122586b9d7c99abbddd65f5 | [log] [tgz] |
---|---|---|
author | nharmata <nharmata@google.com> | Wed Feb 06 21:00:01 2019 -0800 |
committer | Copybara-Service <copybara-piper@google.com> | Wed Feb 06 21:01:52 2019 -0800 |
tree | 9c34e0fb9ff3f58d101ebeec8993024067d21671 | |
parent | 4eaadfe13847313f14cc2cc2ba8917a2c3ff86e3 [diff] |
Fix blatant logic bug in FileFunction that causes incorrect FileValues on incremental evaluations. For a path like "<prefix>/b", we should be using FileStateValue(r/b), where "r" is the fully resolved path of "<prefix>", when we construct the FileValue. This is important in the case where "<prefix>" has a different resolved path (due to ancestor directory symlinks). This was the intent of the FileFunction + FileStateValue algorithm, but the code's structure hid the bug. While I'm here, also slightly improve this. The bug is: if "r/b" changes (e.g. goes from a directory to a symlink, or goes from a symlink pointing to t1 to a symlink pointing to t2), then the Skyframe's diff will correctly contain FileStateValue(r/b). But if FileFunction(<prefix>/b) uses FileStateValue(<prefix>/b), then FileValue(<prefix>/b) will be wrong. Note that FileFunction#resolveFromAncestors is already aptly declaring the dep on FileValue(r/b) -- the bug is that we're not using it when constructing the FileValue! Fwiw, this bug is most easily exploited when multiple levels of directory symlinks are involved. That's a fairly obscure setup, so I'm not super surprised it took us this long to notice this bug. RELNOTES: None PiperOrigin-RevId: 232803261
{Fast, Correct} - Choose two
Build and test software of any size, quickly and reliably.
Speed up your builds and tests: Bazel only rebuilds what is necessary. With advanced local and distributed caching, optimized dependency analysis and parallel execution, you get fast and incremental builds.
One tool, multiple languages: Build and test Java, C++, Android, iOS, Go, and a wide variety of other language platforms. Bazel runs on Windows, macOS, and Linux.
Scalable: Bazel helps you scale your organization, codebase, and continuous integration solution. It handles codebases of any size, in multiple repositories or a huge monorepo.
Extensible to your needs: Easily add support for new languages and platforms with Bazel's familiar extension language. Share and re-use language rules written by the growing Bazel community.
Follow our tutorials:
See CONTRIBUTING.md
Bazel is released in ‘Beta’. See the product roadmap to learn about the path toward a stable 1.0 release.