)]}'
{
  "commit": "cd9864892553166300a6ac8fec6d2445d30fa513",
  "tree": "7eb13c5587fe112bd009ce3427d86cfd21e4707b",
  "parents": [
    "8578a0a87f4fbce8c34d4069491a197e038a995d"
  ],
  "author": {
    "name": "Nico Weber",
    "email": "thakis@chromium.org",
    "time": "Tue May 05 17:51:49 2026 -0400"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue May 05 21:51:49 2026 +0000"
  },
  "message": "[gn] use action() instead of copy() for libcxx headers (#195948)\n\ncopy() doesn\u0027t handle file deletions. Use an action() that syncs the\noutput directory with the input list via a response file, removing files\nthat are no longer in the list.\n\nThis works because if files are added or removed, ninja\u0027s command line\ntracking re-runs the script, and if contents of existing files change,\nninja\u0027s input mtime checking reruns it.\n\nThis also makes the remove_float_h workaround unnecessary.\n\nMotivated by all the recent header removals in libc++.",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7f6f9a2a99724f0d3a005648b8f268c5ced76590",
      "new_mode": 33188,
      "new_path": "llvm/utils/gn/build/sync_source_dir.py"
    },
    {
      "type": "modify",
      "old_id": "be2a650681e7eed47dbc9a707400e18300dc652c",
      "old_mode": 33188,
      "old_path": "llvm/utils/gn/secondary/libcxx/include/BUILD.gn",
      "new_id": "797cdccfe33a33c0b9db65efdceeda7629b62602",
      "new_mode": 33188,
      "new_path": "llvm/utils/gn/secondary/libcxx/include/BUILD.gn"
    }
  ]
}
