)]}'
{
  "commit": "29b094247ee72aa228e69a49486d46eddea510e3",
  "tree": "66f1b4f68db2abe8f5e8baa6cf898edb1272cb1e",
  "parents": [
    "8c780dcbde77c3b0195494c5557eb3235aced282"
  ],
  "author": {
    "name": "James Neufeld",
    "email": "106800782+jpneufeld@users.noreply.github.com",
    "time": "Fri Oct 16 09:16:56 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Oct 16 09:16:56 2026 +0000"
  },
  "message": "fix(zipapp): forward termination signals (#4161)\n\nzip launchers can intercept termination signals, leaving the Python\napplication running as an orphan. This change uses `exec` for POSIX\nshell launchers and signal forwarding for POSIX Python launchers, while\npreserving exit status and extraction cleanup. Covers executable\nzipapps, `python app.pyz`, and both legacy zip bootstrap\nimplementations.\n\nSummary\n* Apply Frank Liu\u0027s #4210 cleanup watcher to both shell ZIP launchers.\nIt removes temporary extractions after exit or signals, including\nSIGKILL and before zombie reaping. Keep EXIT traps for startup failures\nand retain persistent caches and verbose-mode shell extractions.\n* Forward SIGHUP, SIGINT, SIGQUIT, and SIGTERM from Python launchers\nwhile preserving inherited `SIG_IGN`. Keep `Popen.wait()` as the sole\nchild reaper.\n* Remove the unused `RULES_PYTHON_ZIP_DIR` interpreter option; launcher\nparents and watchers own cleanup. On Windows, clear read-only attributes\nand retry deletion without replacing the application\u0027s exit status on\ncleanup errors.\n\nFixes #3809\nBuilds on #4210\n\n---------\n\nCo-authored-by: Richard Levasseur \u003crichardlev@gmail.com\u003e\nCo-authored-by: Frank Liu \u003cgfrankliu@gmail.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "5654df12667dcaa26466b4b091193be4e2970d57",
      "old_mode": 33188,
      "old_path": ".bazelrc.deleted_packages",
      "new_id": "3eec28298eda93b035972da2b3d30c71cc4e30ef",
      "new_mode": 33188,
      "new_path": ".bazelrc.deleted_packages"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f8c6d09df34ec0906d7167265afdb74c2c0ffa30",
      "new_mode": 33188,
      "new_path": "news/3809.fixed.md"
    },
    {
      "type": "modify",
      "old_id": "ee5aec9728f17f2437483e80dd185ed00b375b7a",
      "old_mode": 33188,
      "old_path": "python/private/python_bootstrap_template.txt",
      "new_id": "d3f26bbdc0e135b4cd63806f747610337290210c",
      "new_mode": 33188,
      "new_path": "python/private/python_bootstrap_template.txt"
    },
    {
      "type": "modify",
      "old_id": "4374ff95b0d7d041581d6c4b0596c0ea69522b39",
      "old_mode": 33188,
      "old_path": "python/private/stage1_bootstrap_template.sh",
      "new_id": "ef098127fd7ddc9cfe1c57bb2f639838db326efd",
      "new_mode": 33188,
      "new_path": "python/private/stage1_bootstrap_template.sh"
    },
    {
      "type": "modify",
      "old_id": "709e08815cb7831693efc9cf746c0e2f46e43947",
      "old_mode": 33188,
      "old_path": "python/private/zipapp/zip_main_template.py",
      "new_id": "c93f21b4f27ed29271211155a8ea5da924dbeed3",
      "new_mode": 33188,
      "new_path": "python/private/zipapp/zip_main_template.py"
    },
    {
      "type": "modify",
      "old_id": "d79331444a2c865b5d534a8157005159b80fea88",
      "old_mode": 33188,
      "old_path": "python/private/zipapp/zip_shell_template.sh",
      "new_id": "f333765622212c73966e219fe4b27f050e579dd3",
      "new_mode": 33188,
      "new_path": "python/private/zipapp/zip_shell_template.sh"
    },
    {
      "type": "modify",
      "old_id": "0713b5f1be814f4d2f4d00a2731a4fc9144b381b",
      "old_mode": 33188,
      "old_path": "tests/bootstrap_impls/bin.py",
      "new_id": "7ebe0c047eb801d88568c597df58af1dd3736f42",
      "new_mode": 33188,
      "new_path": "tests/bootstrap_impls/bin.py"
    },
    {
      "type": "modify",
      "old_id": "77fe4d3609efa39a16018182a8296940c7d5eb87",
      "old_mode": 33261,
      "old_path": "tests/bootstrap_impls/run_binary_zip_yes_test.sh",
      "new_id": "43afc5fda5bd008686fb7d024fa65d4903d3f598",
      "new_mode": 33261,
      "new_path": "tests/bootstrap_impls/run_binary_zip_yes_test.sh"
    },
    {
      "type": "modify",
      "old_id": "e0f878cbe1d6b15bd03a2eb66ff0c5056e7577fb",
      "old_mode": 33188,
      "old_path": "tests/py_zipapp/BUILD.bazel",
      "new_id": "ede19baff85d241a560d7b133cc9f1562c5e21a2",
      "new_mode": 33188,
      "new_path": "tests/py_zipapp/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "5770170d2c7ad8e51e59513bf2cf449d93dc67af",
      "old_mode": 33188,
      "old_path": "tests/py_zipapp/main.py",
      "new_id": "595bed754ef60a279b385f879d50dfcb9c0365cc",
      "new_mode": 33188,
      "new_path": "tests/py_zipapp/main.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2fc519a2ee54c2b27e56dcafa8a1c809ecb2ff90",
      "new_mode": 33188,
      "new_path": "tests/py_zipapp/signals_main.py"
    },
    {
      "type": "modify",
      "old_id": "7c3e2deeaff02917d4d09d19106509ea7c2a0e7d",
      "old_mode": 33188,
      "old_path": "tests/py_zipapp/system_python_zipapp_test.py",
      "new_id": "2ea85e8fc3ccc35ff382e58edb0b68b185698261",
      "new_mode": 33188,
      "new_path": "tests/py_zipapp/system_python_zipapp_test.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e6221f39ed23e51880b9691b5bfe50c1481e2e92",
      "new_mode": 33188,
      "new_path": "tests/py_zipapp/zipapp_signals_test.py"
    }
  ]
}
