)]}'
{
  "commit": "b1eed289a766d8fe820cf45ffc277d29b3d8ddca",
  "tree": "5f60217283727780bf98151b4dedd3ed58ae1c30",
  "parents": [
    "381dfc3aae6cf185d12bf54691ce5f1d19aeb69d"
  ],
  "author": {
    "name": "Fabian Meumertzheim",
    "email": "fabian@meumertzhe.im",
    "time": "Mon Sep 14 17:29:19 2026 +0200"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Sep 14 17:29:19 2026 +0200"
  },
  "message": "Resolve relative manifest targets like the runfiles directory does (#69)\n\nThe target of a runfiles manifest entry is an absolute path, except for\nunresolved symlinks (`ctx.actions.declare_symlink`), whose target Bazel\ncopies into the manifest verbatim:\n[`SourceManifestAction#writeFile`](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/SourceManifestAction.java)\nwrites `metadata.getUnresolvedSymlinkTarget()`, which may be relative.\nIn a runfiles directory, sandboxes and\n`SymlinkTreeHelper#createRunfilesSymlinks` create such an entry\ntextually (\"Unresolved symlinks are created textually\"), so the file\nsystem resolves it relative to the directory containing the symlink.\n\nA manifest-based lookup returned that raw target instead, i.e. a path\nrelative to the current working directory. `rlocation` thus either\nfailed or, worse, returned an unrelated file that happened to exist\nrelative to the working directory.\n\nThis change makes it so that a relative target resolves as an rlocation\npath relative to the directory of its entry and looks that up in the\nmanifest again, which is what resolving the symlink in a materialized\nrunfiles directory amounts to. Targets that escape the runfiles root\ncannot be resolved this way and are reported as missing, as are cycles,\nwhich are broken after 32 levels.\n\nThe test runs the same lookups against both backends:\n`write_relative_symlink_target_layout` emits the same set of unresolved\nsymlinks as a manifest and as a materialized runfiles directory, and\n`assert_relative_symlink_target_lookups` asserts that each resolves to\nthe same file. Before this change, the directory-backed half passes and\nthe manifest-backed one fails on its first assertion. The only case in\nwhich the two cannot agree is a relative target that leaves the runfiles\ntree, which the file system resolves against the directory\u0027s parent; the\nmanifest offers no way to reach it, so it is reported as missing.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "b6bbdfe40972baccc31a43e46e5dc5804f2d7594",
      "old_mode": 33188,
      "old_path": "shell/runfiles/runfiles.bash",
      "new_id": "161b8c5b9ee1110cfa4d80f34f31849f14ec6502",
      "new_mode": 33188,
      "new_path": "shell/runfiles/runfiles.bash"
    },
    {
      "type": "modify",
      "old_id": "fd60eee1b2c5c209b7fa94a1bcabb2ba6cbf467b",
      "old_mode": 33261,
      "old_path": "tests/runfiles/runfiles_test.bash",
      "new_id": "fd11d97a6d43be913766e4f743e711c9ed19c639",
      "new_mode": 33261,
      "new_path": "tests/runfiles/runfiles_test.bash"
    }
  ]
}
