)]}'
{
  "commit": "70b418daed8c1ff4d6b0f2ee8f49ba88a172dd93",
  "tree": "3de1006eb7e9f2c451373263fb39898acb738764",
  "parents": [
    "25f6bff894a558fd6b7076a22f9e881d807304e6"
  ],
  "author": {
    "name": "Xinhao Yuan",
    "email": "xinhaoyuan@google.com",
    "time": "Tue Aug 04 16:44:40 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Tue Sep 08 16:14:51 2026 -0700"
  },
  "message": "Windows support 1/x: centipede:command.\n\n`Command` previously relied on `posix_spawn` with `/bin/sh`, the POSIX `env` utility for environment variable modifications, and shell `\u003c` redirection syntax in arguments. These mechanisms are not portable to Windows.\n\nRefactor `Command` to support native Windows process management alongside POSIX:\n\n- Introduce `Command::PlatformContext` to encapsulate platform-specific process handles (`HANDLE` on Windows vs. `pid_t` and `ForkServerProps` on POSIX).\n\n- Implement Windows process creation, environment block construction (`Options::env_diff`), and standard stream redirection in `Command::ExecuteAsync()` using `CreateProcessA`.\n\n- Add `Options::stdin_file_path` to handle input redirection directly rather than appending `\"\u003c\"` to command arguments, and update `SymbolTable` to use it.\n\n- Escape command-line arguments, environment variables, and file paths in `Command::ToString()` on both POSIX (`ShellEscape`) and Windows.\n\n- Update `command_test_helper` and `command_test` to verify arguments, environment variables, standard input, and signals portably without relying on `bash`, and enable `centipede:command_test` on Windows CI.\n\n- Update `GetDataDependencyFilepath` to return executable path suffixed with `.exe` under Windows.\n\nPiperOrigin-RevId: 959298250\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1bbcba0d41b0502ce339489fc2741365721e5e76",
      "old_mode": 33188,
      "old_path": ".github/workflows/bazel_test_centipede.yml",
      "new_id": "b9d38b325120137009478eb444077d4ff67881b6",
      "new_mode": 33188,
      "new_path": ".github/workflows/bazel_test_centipede.yml"
    },
    {
      "type": "modify",
      "old_id": "17cbe3f7fe870804ee0ab05c61803bd60f00be32",
      "old_mode": 33188,
      "old_path": "BUILD",
      "new_id": "e8b953e49b59a771795fad8ce4fee0b5f82a6159",
      "new_mode": 33188,
      "new_path": "BUILD"
    },
    {
      "type": "modify",
      "old_id": "0a0dc3eec8a1d4bb56cc417ed911380947a0c041",
      "old_mode": 33188,
      "old_path": "MODULE.bazel",
      "new_id": "f99e39cf6d27423d1aff12799358e719088e4c88",
      "new_mode": 33188,
      "new_path": "MODULE.bazel"
    },
    {
      "type": "modify",
      "old_id": "036f7e2d518f6fc2c15b2a057cc46b4c722143ec",
      "old_mode": 33188,
      "old_path": "centipede/BUILD",
      "new_id": "8150ff2491160b541bdcc2641d2cb11346c93e21",
      "new_mode": 33188,
      "new_path": "centipede/BUILD"
    },
    {
      "type": "modify",
      "old_id": "48ca89ff116a4863717ea033259d6f6a0cffac67",
      "old_mode": 33188,
      "old_path": "centipede/command.cc",
      "new_id": "27e977ef365b4223b494a60273040c523d19142b",
      "new_mode": 33188,
      "new_path": "centipede/command.cc"
    },
    {
      "type": "modify",
      "old_id": "33c1d148226ab3bdf434fb1a47017658f4352851",
      "old_mode": 33188,
      "old_path": "centipede/command.h",
      "new_id": "15d4d70aa4e40e4bee1103221b183cad00e504d5",
      "new_mode": 33188,
      "new_path": "centipede/command.h"
    },
    {
      "type": "modify",
      "old_id": "48f4d07302b3093aab9281d241bf5e32f32e382e",
      "old_mode": 33188,
      "old_path": "centipede/command_test.cc",
      "new_id": "0c91cb1019ac451470ab8605fc475ec162cb09c4",
      "new_mode": 33188,
      "new_path": "centipede/command_test.cc"
    },
    {
      "type": "modify",
      "old_id": "d3153a85317ff486cf6c01b6bf61245991cfcc4d",
      "old_mode": 33188,
      "old_path": "centipede/command_test_helper.cc",
      "new_id": "31b61009a8a34ca15cc1dcea7b1c4673da7c08bd",
      "new_mode": 33188,
      "new_path": "centipede/command_test_helper.cc"
    },
    {
      "type": "modify",
      "old_id": "e693b4817dc91c1f7083088b08d0b35164f23591",
      "old_mode": 33188,
      "old_path": "centipede/symbol_table.cc",
      "new_id": "6e58ebdfe381beaff5b5b09e2ef0f7f46946c523",
      "new_mode": 33188,
      "new_path": "centipede/symbol_table.cc"
    },
    {
      "type": "modify",
      "old_id": "583cc1f2c6b502ad36060b695ffa3e89e947b688",
      "old_mode": 33188,
      "old_path": "centipede/util.cc",
      "new_id": "8a9064e0239efb52af60f82ea0d93ab0d756fde0",
      "new_mode": 33188,
      "new_path": "centipede/util.cc"
    },
    {
      "type": "modify",
      "old_id": "6f26650ecd48e9e61a1910cb998c43591caded8a",
      "old_mode": 33188,
      "old_path": "centipede/util_test.cc",
      "new_id": "52041aa27af6e1e03008c8fc45f9024c784df626",
      "new_mode": 33188,
      "new_path": "centipede/util_test.cc"
    },
    {
      "type": "modify",
      "old_id": "bbdb792b6c7e3799a19d65176a58efd44460d901",
      "old_mode": 33188,
      "old_path": "common/BUILD",
      "new_id": "296b1406f44accb055d995dce3df76ef8937c7a1",
      "new_mode": 33188,
      "new_path": "common/BUILD"
    },
    {
      "type": "modify",
      "old_id": "671195e070ca775f8fab0429eb4994bbc46b90d4",
      "old_mode": 33188,
      "old_path": "common/CMakeLists.txt",
      "new_id": "b7757633467a680d9b2d7ddb32d555dd50b7dacf",
      "new_mode": 33188,
      "new_path": "common/CMakeLists.txt"
    },
    {
      "type": "modify",
      "old_id": "3232d551f93ecd8f1ff5dc20287e1392ced7e55a",
      "old_mode": 33188,
      "old_path": "common/test_util.cc",
      "new_id": "8bc70636cd2fa5868605b9ac970b3f7c91d9cb72",
      "new_mode": 33188,
      "new_path": "common/test_util.cc"
    },
    {
      "type": "modify",
      "old_id": "c859bff9459830fea7a77ec9b8f11108a6f14e30",
      "old_mode": 33188,
      "old_path": "common/test_util.h",
      "new_id": "e363f1868271fd34a80f033ce64c1e9a9a57de33",
      "new_mode": 33188,
      "new_path": "common/test_util.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e9467971b9a82a3682f80a90536d2c8e2fc31665",
      "new_mode": 33188,
      "new_path": "common/windows_includes.h"
    }
  ]
}
