)]}'
{
  "commit": "f4c9d7267e593bd92a3f01a3c55fc260dac0552f",
  "tree": "e705b512ac0cee4a94f7a1bca89427d0349fd3ab",
  "parents": [
    "311003f8ea3500f8ce87c43ff61aec6f4066dac2"
  ],
  "author": {
    "name": "Henrique Ferreiro",
    "email": "hferreiro@igalia.com",
    "time": "Thu Nov 12 14:34:35 2026 +0100"
  },
  "committer": {
    "name": "gn-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "gn-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Fri Nov 13 09:03:01 2026 -0800"
  },
  "message": "Report programs that can\u0027t be started\n\nOn POSIX, ExecProcess() forks and calls execvp() in the child, which\nexits with 127 when that fails. So a program that couldn\u0027t be started\nlooked like one that ran and failed: a missing ninja was reported as\n\"Ninja has quit with exit code 127\", without naming it, and a missing\nexec_script() interpreter as a script that returned a non-zero exit\ncode.\n\nHave the child send the error of execvp(), or of its setup before it,\nthrough a pipe that\u0027s closed when the program starts. Also, return why\nthe program couldn\u0027t be started in std_err, and show it in the errors.\n\nA program killed by a signal also made ExecProcess() return false, which\ncallers reported as a program that couldn\u0027t be executed. Report it as\nexiting with 128 plus the signal instead, like shells do.\n\nWhen exec_script() couldn\u0027t run its command, the error always said it\nwas trying to execute the interpreter. Show the program that was\nactually run, and say whether it was the interpreter or the script.\n\nChange-Id: I878e9afa1e03b340c0623d416c814ae7a30035f5\nReviewed-on: https://gn-review.googlesource.com/c/gn/+/28641\nReviewed-by: Andrew Grieve \u003cagrieve@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Turner \u003cdigit@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "26c24e97c39f2aa2aca07bea5cbf6b41168a5136",
      "old_mode": 33188,
      "old_path": "src/gn/exec_process.cc",
      "new_id": "0b9da04370a2a155b5836ae82db27d6557df5c4d",
      "new_mode": 33188,
      "new_path": "src/gn/exec_process.cc"
    },
    {
      "type": "modify",
      "old_id": "91ee876fd1e15d6adcdee2b3f0214f5b90dc9b6f",
      "old_mode": 33188,
      "old_path": "src/gn/exec_process.h",
      "new_id": "28d62ab52a4d32b3ac20b345e76e48a92c33cb87",
      "new_mode": 33188,
      "new_path": "src/gn/exec_process.h"
    },
    {
      "type": "modify",
      "old_id": "599892d3867d09a19c0b6c2e1ceaac2cfccef9fa",
      "old_mode": 33188,
      "old_path": "src/gn/exec_process_unittest.cc",
      "new_id": "317f7602995af6c978fee707baac6c7d66d3f272",
      "new_mode": 33188,
      "new_path": "src/gn/exec_process_unittest.cc"
    },
    {
      "type": "modify",
      "old_id": "966dbfcf26bc013d5853d98bf38ac8e08f2ece59",
      "old_mode": 33188,
      "old_path": "src/gn/function_exec_script.cc",
      "new_id": "b7afdc8302470ef474e23ee7967f826571137bf9",
      "new_mode": 33188,
      "new_path": "src/gn/function_exec_script.cc"
    },
    {
      "type": "modify",
      "old_id": "52db7563034069e10cab87bf5c409af4978d356d",
      "old_mode": 33188,
      "old_path": "src/gn/invoke_python.cc",
      "new_id": "1e79e1ba98f03ba26def62de568f656c76d57237",
      "new_mode": 33188,
      "new_path": "src/gn/invoke_python.cc"
    },
    {
      "type": "modify",
      "old_id": "dce4639079e260db385a578157a7022fef57fbf2",
      "old_mode": 33188,
      "old_path": "src/gn/ninja_tools.cc",
      "new_id": "8b999f1f7665584d055ba2155451c1469d1d060c",
      "new_mode": 33188,
      "new_path": "src/gn/ninja_tools.cc"
    }
  ]
}
