)]}'
{
  "commit": "c4019b9a52da77a9920237f73845d7bc1239def0",
  "tree": "fb495c96e69a1e688d26687e29e688886ffe56b1",
  "parents": [
    "9fe99e262126467c4cb2f44cf941767d29fb33d8"
  ],
  "author": {
    "name": "David \u0027Digit\u0027 Turner",
    "email": "digit@google.com",
    "time": "Wed Sep 30 16:06:08 2026 +0200"
  },
  "committer": {
    "name": "gn-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "gn-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Fri Oct 02 05:19:50 2026 -0700"
  },
  "message": "Delayed generated_file() writes if they collect validations metadata\n\nWhen a generated_file() target is written to the Ninja build\nplan, delay its output file write if `collect_validations_metadata`\nis true. Instead, the writes will be performed after all targets\nhave been resolved to ensure there are no runtime crashes when\nperforming the metadata walk.\n\nNote that the flag can be set directly in the target\ndefinition, or inherited from the .gn default value set\nthrough experimental_collect_validations_metadata.\n\n- builder_record.h: Add a comment explaining why metadata\n  walks that include validations must be delayed.\n\n- ninja_generated_file_target_writer.cc: If a target\n  has collect_validations_metadata enabled, do not write\n  its output file yet, instead set a boolean flag\n  to indicate the delay.\n\n- ninja_target_writer.cc: Take an optional pointer to\n  a boolean flag to receive notification of delayed\n  writes for generated_file() targets. Pass the pointer\n  to NinjaGeneratedFileWriter properly.\n\n- setup.cc: Add SetPostResolutionCallback() to register\n  a callback to invoke after all items have been resolved\n  in the graph (i.e. after the first scheduler.Run() call).\n\n- setup_unittest.cc: Add new unit-test that verify that\n  metadata walks with validations do not crash and return\n  the correct values (or errors in case of missing deps).\n\n- command_gen.cc: Record delayed generated_file() target\n  pointers during graph resolution, then use a post-resolution\n  callback to write all delayed generated_file() outputs\n  in parallel.\n\nBenchmarking shows that:\n\n- For a medium Fuchsia project (which currently relies on\n  validations metadata walks), using\n  `gn gen --experimental-collect-validations-metadata` is\n  about 15% slower with this patch applied (18.55s to\n  20.3s)\n\n- For a default Android/arm64 Chromium build,\n  `gn gen --experimental-collect-validations-metadata`\n  there is no statical difference (around 3s each).\n\nBug: 566346002\nChange-Id: I58ad0c3bcec71ceec80cf5a617ef00e86415734d\nReviewed-on: https://gn-review.googlesource.com/c/gn/+/27086\nReviewed-by: Takuto Ikuta \u003ctikuta@google.com\u003e\nReviewed-by: Matt Stark \u003cmsta@google.com\u003e\nCommit-Queue: David Turner \u003cdigit@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "b2bef55cc3864e026927c0622e837f93d468fb65",
      "old_mode": 33188,
      "old_path": "src/gn/builder_record.h",
      "new_id": "fbb4eab07b53647e4a6cbb8302dd7cdff0082f7d",
      "new_mode": 33188,
      "new_path": "src/gn/builder_record.h"
    },
    {
      "type": "modify",
      "old_id": "de8b89fe8600e794b4c9ef8b16e7c87020a6608a",
      "old_mode": 33188,
      "old_path": "src/gn/command_gen.cc",
      "new_id": "4e991c331957b697a44c7cdbb926b51481af42c0",
      "new_mode": 33188,
      "new_path": "src/gn/command_gen.cc"
    },
    {
      "type": "modify",
      "old_id": "09aa271e4dce1a593b70c25797c419a3ef3c252c",
      "old_mode": 33188,
      "old_path": "src/gn/ninja_generated_file_target_writer.cc",
      "new_id": "b5508f668849073e5dfc9a6d0a439ea12f2ccc15",
      "new_mode": 33188,
      "new_path": "src/gn/ninja_generated_file_target_writer.cc"
    },
    {
      "type": "modify",
      "old_id": "d39f5fd99fd2e22fe4ea144215abbf092d530c9f",
      "old_mode": 33188,
      "old_path": "src/gn/ninja_generated_file_target_writer.h",
      "new_id": "4765d522b3c87fa031c4fc47229287e386ca2a68",
      "new_mode": 33188,
      "new_path": "src/gn/ninja_generated_file_target_writer.h"
    },
    {
      "type": "modify",
      "old_id": "481db807dcc672b33ac06025baff039f752e5a91",
      "old_mode": 33188,
      "old_path": "src/gn/ninja_generated_file_target_writer_unittest.cc",
      "new_id": "b32f939be03fbbe209ea7541325dcef5b22c5efb",
      "new_mode": 33188,
      "new_path": "src/gn/ninja_generated_file_target_writer_unittest.cc"
    },
    {
      "type": "modify",
      "old_id": "604f2f551d4638fb320789a2280cb84f0cb73293",
      "old_mode": 33188,
      "old_path": "src/gn/ninja_target_writer.cc",
      "new_id": "d19a3aaa3eb47a4b01e0ce58effbb03bff2c6f29",
      "new_mode": 33188,
      "new_path": "src/gn/ninja_target_writer.cc"
    },
    {
      "type": "modify",
      "old_id": "043e8346b6648a96094f695a119fdd33e374ec6f",
      "old_mode": 33188,
      "old_path": "src/gn/ninja_target_writer.h",
      "new_id": "747aa74a8a528f8245c85e9c4fce3336fa016e7f",
      "new_mode": 33188,
      "new_path": "src/gn/ninja_target_writer.h"
    },
    {
      "type": "modify",
      "old_id": "26a805c9e1f32699fd10bcab57c285b9c4564d91",
      "old_mode": 33188,
      "old_path": "src/gn/setup.cc",
      "new_id": "c4c2b8b7cfc5e0be62d6f96ca180efa3bef0952f",
      "new_mode": 33188,
      "new_path": "src/gn/setup.cc"
    },
    {
      "type": "modify",
      "old_id": "7f13c4427ea69a4265c18f4fd2e4fe08c28d87b4",
      "old_mode": 33188,
      "old_path": "src/gn/setup.h",
      "new_id": "c6a190bd4bb317396be903d5668c2f65c9128263",
      "new_mode": 33188,
      "new_path": "src/gn/setup.h"
    },
    {
      "type": "modify",
      "old_id": "0eee1e798659bfcde668cb84b22b3aef750aa4c1",
      "old_mode": 33188,
      "old_path": "src/gn/setup_unittest.cc",
      "new_id": "0b323c39a42ff896c333f3a452f53477dae4d171",
      "new_mode": 33188,
      "new_path": "src/gn/setup_unittest.cc"
    }
  ]
}
