)]}'
{
  "log": [
    {
      "commit": "b59359dc07fc7bbf79ba70d0d6ff357bf58e831b",
      "tree": "51563321d30657295611ade79749b11cac9e62bc",
      "parents": [
        "e036faaf3c0b2c3262410dd8b8c4298fac37fd4f"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue May 05 12:01:57 2026 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue May 05 13:19:00 2026 +0200"
      },
      "message": "Adjust start time of delayed edges after completion.\n\nThis CL adjust the recorded start time of edges that were\nbuilt together through a delayed worker script. The original\nstart time corresponds to when Ninja originally saw the edge\nas ready to run then added it to the delayed queue, but this\ndoesn\u0027t correspond to any usable timestamp.\n\nNote that this works because all backends that report\ntime start/end/duration take the values from Status::BuildEdgeFinished()\nparameters (and ignore the start_time in Status::BuildEdgeStarted()).\n\nFuchsia-Topic: delayed-commands\nChange-Id: I80052192b6f985f10c214eedf3fb19b1310b056a\n"
    },
    {
      "commit": "e036faaf3c0b2c3262410dd8b8c4298fac37fd4f",
      "tree": "e7366df055b14d3b5a3d3f2996e0a42276df72dc",
      "parents": [
        "bf331cab7fe290a1cf9b2024b4bf32b34d8b336a"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue May 05 11:51:28 2026 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue May 05 13:18:53 2026 +0200"
      },
      "message": "Fix metrics / logging in the case of failed delayed commands.\n\nWhen the failed delayed worker script returns failure, ensure\nthat it is properly reported for each delayed edge. This ensures\nthat the error / chrome trace / resultstore logs containing the\nright information.\n\nFuchsia-Topic: delayed-commands\nChange-Id: I423d9c56b9d49bf77d3d459028480fdcfaa3e10b\n"
    },
    {
      "commit": "bf331cab7fe290a1cf9b2024b4bf32b34d8b336a",
      "tree": "9c3bd55c478a1a52d006e0f8175b69a57f762ebc",
      "parents": [
        "e8ba42d141457d872e9c344cc2cf995c591df8af"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue May 05 11:36:23 2026 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue May 05 13:17:27 2026 +0200"
      },
      "message": "Ensure that Ninja stops printing its status table when delayed commands run.\n\nBecause our Bazel delayed commands are in the console pool, ensure that\nStatusPrinter clears the table of commands and stops the timer that\nrefreshes the table when delayed commands are run.\n\nThis removes an annoying UI issue where both the delayed worker and\nNinja would print to stdout at the same time in random order, resulting\nin garbled output.\n\nFuchsia-Topic: delayed-commands\nChange-Id: I6b32aa83aa78c9c4ee66eed7bc941cc7afc47d71\n"
    },
    {
      "commit": "e8ba42d141457d872e9c344cc2cf995c591df8af",
      "tree": "07525288d29a490f09068302af840f362f217ad2",
      "parents": [
        "072234aac0f0c336139bc24f32dc6bb26dcb34d1"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 22 19:16:27 2026 +0000"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Apr 27 07:31:28 2026 -0700"
      },
      "message": "[process_tree] non-blocking read /proc/pid/{cmdline,stat}\n\nIf a subprocess is in an uninterruptible sleep (D state), a standard\nblocking read of its /proc entry will hang the reader.\nTo prevent hanging, use O_NONBLOCK and a direct read()\nwhile attempting to gather process tree diagnostics during\nshutdown. This now applies to both cmdline and stat files.\n\nBug: 496223255\nBug: 498320348\nChange-Id: Ida2ddcd9dfb1a4f70fd4d0c46805a32dbd74cdca\n"
    },
    {
      "commit": "072234aac0f0c336139bc24f32dc6bb26dcb34d1",
      "tree": "125afba9a1c44ef55eba10c559770ab8337227da",
      "parents": [
        "203b59e710b9e7d033e517ce99010147d40705e3"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 22 18:42:34 2026 +0000"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Apr 27 07:31:23 2026 -0700"
      },
      "message": "[process_tree] fix tree links in diagnostics\n\nEnsure that system process snapshot is gathered all at once before\nsending termination signals.\n\nFix a regression where process tree snapshots were only captured for\nSIGTERM, leaving SIGINT (Ctrl-C) diagnostics empty. Take the snapshot\nfor any interruption signal to ensure consistent reporting.\n\nUpdate fuchsia_features_test.py to expect the more detailed descendant\ntrees in the graceful shutdown test. Added normalization to handle the\nrace condition where /proc/pid/cmdline might disappear before it can be\nread, causing the output to flit between full command lines and short\nbracketed names.\n\nBug: 496223255\nBug: 498320348\nChange-Id: Id1f8f73ecf59b389a62ba4f3e26d5114619ce937\n"
    },
    {
      "commit": "203b59e710b9e7d033e517ce99010147d40705e3",
      "tree": "efc883d45d398c269d6c502d966dd8db394817fc",
      "parents": [
        "fcff28da5f6f55dd35bd5090b43688e80c594889"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Apr 23 19:26:14 2026 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Apr 24 11:03:44 2026 +0200"
      },
      "message": "Refine the way Ninja waits for subprocess completion.\n\nThis CL refactors how the Posix SubprocessSet implementation\ndelays with subprocess completion. Before this CL, the\nFuchsia version of Ninja would always wait for the output\npipe of a command to be closed to determine that the\ncorresponding \"work\" has completed.\n\nThis is important because a command sub-process can launch\nchild programs in the background and passing them their\nstdout/stderr descriptors, and may exit *before* the child\nitself.\n\nHowever, this doesn\u0027t work in certain cases, for example if\nthe child process daemonizes itself, and keeps the output\ndescriptor opened, without writing anything to it. It is\nsuspected that this is the root cause of the Ninja\nbuild timeouts that were are experiencing in CI (see\nassociated bug).\n\nAs a work-around, this CL changes the logic to used by\nNinja to the following:\n\n- Each Subprocess instance can be in one of three\n  states now:\n\n  * Running: its PID is active, and its pipe is open.\n\n  * Reaped: the PID has exited, but the pipe is still\n    open and Ninja is waiting for more data out of it.\n\n  * Finished: the PID has exited, and the pipe is\n    closed.\n\n  NOTE: The special case where the Subprocess has no\n  pipe is no longer enabled in the Fuchsia version of\n  Ninja, but corresponds to the upstream behavior\n  for \"console\" processes. This didn\u0027t allow recording\n  their output though.\n\n- When the pipe is closed, the Subprocess is reaped\n  and finished immediately.\n\n- SIGCHLD is used to detect when any Subprocess PID exits\n  and reaps it immediately (before that it would only\n  check for upstream console processes). However, if\n  the pipe is still open, a timer is setup to wait up\n  to 30 seconds for incoming data on the pipe, and\n  the Subprocess is kept in the running_ queue\n  (but with \u0027reaped_ \u003d\u003d true\u0027).\n\n- When data arrives on the pipe of a reaped process,\n  the timer is re-armed to wait for 30 more seconds\n  (just in case).\n\n- Otherwise, if the timer expires, the Subprocess\n  is force-finished.\n\n- A SIGINT / SIGTERM / SIGHUP should also force-finish\n  reaped Subprocess instances immediately.\n\n+ Adjust the process tree to print \"REAPED [PID \u003cpid\u003e]\"\n  instead of \"[PID \u003cpid\u003e]\" when printing the command\n  corresponding to a Reaped Subprocess instance.\n\n+ Add a regression test that verifies that SIGINT\n  stops Ninja immediately when it is waiting for\n  a reaped subprocess.\n\n+ Add a regression test that verifies that SIGTERM\n  stops Ninja immediately when it is waiting for\n  a reaped subprocess, and that the diagnostic\n  message lists its pid with the REAPED tag.\n\nBug: 498320348\nFuchsia-Only: graceful-shutdown\nChange-Id: Ic7e81aca2680fdc603873227be7b7515d8969248\n"
    },
    {
      "commit": "fcff28da5f6f55dd35bd5090b43688e80c594889",
      "tree": "1dd4dc6424e511aa54bf1677dd657033fafd3400",
      "parents": [
        "9cb8f9f49d5e4559fbaaa7237848c354608a0411"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Apr 23 20:06:28 2026 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Apr 23 20:06:28 2026 +0200"
      },
      "message": "GEMINI.md: Minor updates for C++17 and Python formatting.\n\nFuchsia-Only: Developer tools\nChange-Id: I7761df84976b288af55172c80b4aa659d0bb26d7\n"
    },
    {
      "commit": "9cb8f9f49d5e4559fbaaa7237848c354608a0411",
      "tree": "6737a98cd31c58c8a3d04f5e53521c7f69467c45",
      "parents": [
        "f2edf0049927b3578693eeac6e5308447e4b40ee"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Apr 01 12:45:07 2026 +0000"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Apr 23 09:06:29 2026 -0700"
      },
      "message": "Add \u003ccstdint\u003e includes to fix Win32 compilation errors\n\nThese headers seem required when compiling for Windows using\na recent Linux mingw64 toolchain, so fix the problem by including\nthem when needed.\n\nChange-Id: I314c56dacbd731011a6baaa16c6a59756789851e\n"
    },
    {
      "commit": "f2edf0049927b3578693eeac6e5308447e4b40ee",
      "tree": "1641287393d13a356aa89d3c4c60f0569c4cfa45",
      "parents": [
        "7e5d9086c8169b305eee1cb812c82faf89ef72fe"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Apr 23 15:16:38 2026 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Apr 23 15:16:38 2026 +0200"
      },
      "message": "Fix Fuchsia feature test.\n\nA previous CL changed Ninja\u0027s output to display a tree of processes\nwhen interrupted with Ctrl-C for the second time, so adjust the\ncorresponding expected string in the regression test.\n\nIt looks like the regression suite is not run by our CI builders,\nthis will be addressed in a different CL (for the recipe itself).\n\nFuchsia-Only: development test\nChange-Id: Ieda9c66f1d0ded57b235ed3a6d72d5d1f2b08652\n"
    },
    {
      "commit": "7e5d9086c8169b305eee1cb812c82faf89ef72fe",
      "tree": "9a0a6fbf1b69c95039237388291a28e85d906546",
      "parents": [
        "3fdbc391cd1dfa4a5545cae867f8ae6c81cb0a82"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 15 02:26:38 2026 +0000"
      },
      "committer": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 15 05:19:31 2026 +0000"
      },
      "message": "[resultstore] Fix event start timing\n\nStart time was missing starting offset.\n\nOnly caught during integration testing with buildminder.\nNot sure why ResultStore API gRPCs didn\u0027t respond with errors.\n\nBug: 487240814\nChange-Id: I1d9690f6671451c64861dd407980dac2bc373d82\n"
    },
    {
      "commit": "3fdbc391cd1dfa4a5545cae867f8ae6c81cb0a82",
      "tree": "8b781e58535371950ab87d0bcc687da04e0de791",
      "parents": [
        "5c7ebc843088d57afb396d265c0782c0eee63643"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 15 01:45:27 2026 +0000"
      },
      "committer": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 15 01:45:27 2026 +0000"
      },
      "message": "[resultstore] flush for real-time updates\n\nLack of flushing was resulting in major delays to\nResultStore and the buildminder TUI.\nThe overhead of flushing per event update is not a major concern.\n\nBug: 487240814\nChange-Id: I908faba254589a663ff47a2ce63057b91e11d8c4\n"
    },
    {
      "commit": "5c7ebc843088d57afb396d265c0782c0eee63643",
      "tree": "2d7a1241d9b6c8ea004cd79923e59a4fd73e6e23",
      "parents": [
        "e9edef960854c09db097658fb3cdd2ad35de1547"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 08 20:38:09 2026 +0000"
      },
      "committer": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Mon Apr 13 15:41:50 2026 +0000"
      },
      "message": "[subprocess] print process tree on SIGTERM also\n\nPreviously, the process trees would only be displayed\non *second* SIGINT.\nNow a SIGTERM will also display them.\n\nFactored out SubprocessSet::ReportRunningSubprocesses().\n\nChange-Id: I0eecafe99f14f90d6dca52e9aa21f4d821932d5d\n"
    },
    {
      "commit": "e9edef960854c09db097658fb3cdd2ad35de1547",
      "tree": "f2552ec3db3feb6da6f1377dc24143ccdadd009f",
      "parents": [
        "2ffe6b78c670918ee6ec35b8205e309acdc8542b"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 08 06:02:57 2026 +0000"
      },
      "committer": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 08 16:09:26 2026 +0000"
      },
      "message": "[subprocess] Display process tree on interrupt\n\nOn first interrupt, instead of only displaying PIDs,\nnow display a subprocess tree rooted at each ninja-owned\nsubprocess.\nThis gives more insight into what may still be running\nat the time of interrupt.\n\nprocess_tree{.h,-posix.cc,-win32.cc}:\nProcessTree utility captures system-wide process relationships\nthat are used to construct subprocess trees.\nPosix implementation walks /proc to obtain process details.\nThe system-wide snapshot is constructed one-time\nand is the basis for building each subtree.\n\nNote: subprocess-win32.cc was not updated to use ProcessTree\nyet, so this feature is really only available on Posix.\n\nChange-Id: Id60a95990cc5c680616973cc66517372f5972bdd\n"
    },
    {
      "commit": "2ffe6b78c670918ee6ec35b8205e309acdc8542b",
      "tree": "6c97d44a200facc8895f9532da9b024c47345bdf",
      "parents": [
        "37786b5078c0c80814d307ed50c7e114ce1193e9"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Mar 10 12:02:59 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Mar 25 11:23:49 2026 +0100"
      },
      "message": "Capture runner states in BuildResult algebraic data type\n\nThis is a part of the upstream PR that technically doesn\u0027t\nimplement the feature, but makes the rest of the code clearer\nand easier to understand, so get it into the Fuchsia Ninja\nsource tree as well.\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2726\nBug: 495704605\nChange-Id: I9821d0ac9cb8c64471b6a86e4ad5a0955d594f7b\n"
    },
    {
      "commit": "37786b5078c0c80814d307ed50c7e114ce1193e9",
      "tree": "281b11fd751f392cbb37949736a200a4af21ca5b",
      "parents": [
        "b1c5f90c9410aa8a24bc5955705f57a1aba8c8d4"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Mar 09 13:23:30 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Mar 25 11:23:49 2026 +0100"
      },
      "message": "Handle jobserver token availability in runner\n\nThis implements the feature from the upstream PR in a way\nthat is compatible with the Fuchsia Ninja internals, while\nkeeping things as close as possible from upstream.\n\n- jobserver-posix.cc: Add GetJobserverFD() method, the\n  value is then passed to SubprocessSet::SetJobserverFD()\n  to ensure SubprocessSet::DoWork() can detect such\n  events.\n\n- Add CommandRunner::WaitForCommandOrJobserverToken() method\n  and implement it in RealCommandRunner to properly react\n  to SubprocessSet::WorkResult::JobserverTokenAvailable\n  events.\n\n- build.cc: Slight changes to use WaitForCOmmandOrJobserverToken()\n  during the main build loop, and re-loop when a new job token\n  is available.\n\n- jobserver_test.py: Add regression tests for the feature.\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2726\nBug: 495704605\nChange-Id: Idcc9312a3021fc7df189eac05405ac672fcc6d8c\n"
    },
    {
      "commit": "b1c5f90c9410aa8a24bc5955705f57a1aba8c8d4",
      "tree": "1cbf1619eb1e06bea3fd1b70446a3689d09a1cd8",
      "parents": [
        "fecac3df6df0704f0d45528813fd7894764e3524"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Mar 09 07:29:51 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Mar 25 11:23:49 2026 +0100"
      },
      "message": "Add SubprocessSet::WorkResult::JobserverTokenAvailable\n\nThis modifies SubprocessSet::DoWork() to report when the jobserver\nFIFO becomes readable again. This event is only reported if there\nwas no user interruption or any process completion.\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2726\nBug: 495704605\nChange-Id: I291504521f32a2f70c6c1562b70f18a65b03bcb0\n"
    },
    {
      "commit": "fecac3df6df0704f0d45528813fd7894764e3524",
      "tree": "131b64bbb97661f56c62550a40afc59f61d0480d",
      "parents": [
        "bfcf47055c0c0deceb52eff4358ab4a5f29124b3"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Mar 09 07:29:20 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Mar 25 11:23:48 2026 +0100"
      },
      "message": "Add AsyncFdReadyFlags class\n\nA new class to detect that Posix file descriptors become\nreadable or writable, but not perform any read() or write()\noperation on them. Another difference with AsyncHandle is\nthat the file descriptor is not owned by the instance, as\nit is assumed the i/o operations will be performed\nseparately, possibly in blocking mode.\n\nThis will be used to detect that a new job token is\navailable in the jobserver FIFO in Subprocess::DoWork().\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2726\nBug: 495704605\nChange-Id: I30740792a323550ce757bbce53234c2d2d6b72a6\n"
    },
    {
      "commit": "bfcf47055c0c0deceb52eff4358ab4a5f29124b3",
      "tree": "51f0aedd334928ce4deade933a8a19b6be1c221c",
      "parents": [
        "8ffce4dbe12ce518cb21c70c4058039e737be28c"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Mar 09 05:18:41 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Mar 24 18:12:51 2026 +0100"
      },
      "message": "Add SubprocessSet::WorkResult type.\n\nChange the return type of SubprocessSet::DoWork() to an enum\nand adjust call sites appropriately. A future CL will introduce\na new enum value to handle jobserver token availability.\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2726\nBug: 495704605\nChange-Id: I5fbdf68b09991c53bf9b4ff09daa69bda87c2483\n"
    },
    {
      "commit": "8ffce4dbe12ce518cb21c70c4058039e737be28c",
      "tree": "c308dea8a5adecb5fa3c29ec9b5374b2bbede239",
      "parents": [
        "f2e9d73e8e8835155a596de9a5a2494839af2508"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Mar 09 04:54:26 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Mar 09 04:54:26 2026 +0100"
      },
      "message": "Upstream: Build Ninja with C++17\n\nUpstream finally switched to C++17, so do it here too.\nThis will make it easier to merge upstream PRs which rely\non std::optional\u003c\u003e or std::variant\u003c\u003e. And also, yeah, at last!\n\n+ Make configure.py closer to the upstream version, by adding\n  the --warnings-as-errors flag. Note that for MSVC, the /WX\n  flag is already part of the default so this does nothing\n  but this is an upstream bug.\n\n+ Add .ninja_errors to .gitignore, to avoid listing this file\n  when running ./configure.py locally.\n\nChange-Id: Id22b8307d9ad8471b6849557789f26e8c950d7fd\n"
    },
    {
      "commit": "f2e9d73e8e8835155a596de9a5a2494839af2508",
      "tree": "e4db2cf9a3cab0abb546eaab54dcbba8b03e43be",
      "parents": [
        "d9290febee352cb6111fde97c33832b9ace57188"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Mar 03 13:05:51 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Mar 03 13:05:51 2026 +0100"
      },
      "message": "Fix delayed commands implementation\n\nThis CL fixes a number of bugs in the delayed commands\nimplementation and adds a proper regression test (the unit-tests\nare using mock worker scripts, so do not test as needed).\n\n- build.cc: Ensure that a delayed command does not consume any\n  job capacity. This makes -j1 behave exactly as -j4, and\n  makes the scheduling more efficient.\n\n- delayed_commands.cc: Use ./ prefix to invoke the worker\n  script to ensure it is properly launched.\n\n- delayed_worker_fuchsia_bazel.cc: Fix the detection function,\n  oops.\n\n- misc/fuchsia/fuchsia_features_test.py: Add a new regression\n  test that verifies correct behavior, in particular with\n  both -j1 and -j4.\n\n- misc/fuchsia/test_data: new directory with test files used\n  by the new regression test.\n\nBug: 468096724\nFuchsia-Topic: delayed-commands\nChange-Id: Id13ffcbdab6caf973fd189a80fce93e605310547\n"
    },
    {
      "commit": "d9290febee352cb6111fde97c33832b9ace57188",
      "tree": "c89f41372591307b76ff630c6bf7cf15f4ec70ab",
      "parents": [
        "0ea9c98b0ea58934f765faee4114a2b99e9c0dc1"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Feb 27 19:04:07 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Feb 27 19:42:02 2026 +0100"
      },
      "message": "Update delayed commands schema to Ninja depfiles.\n\nAllow each action request to specify an optional path\nfor the Ninja depfile that should be generated by the\nworker tool.\n\n+ Add JsonParser::GetOptionalOrEmptyString() method.\n\nFuchsia-Topic: delayed-tasks\nBug: 468096724\nChange-Id: Ia8962499f350c5d28136d8e4287aa0c88def5153\n"
    },
    {
      "commit": "0ea9c98b0ea58934f765faee4114a2b99e9c0dc1",
      "tree": "f2bce0a5967dcfc2f7bbf554547b5d9145990279",
      "parents": [
        "21d62f0e10aa9be5506f9acde1fe4901a9053648"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Feb 24 01:58:16 2026 +0000"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Feb 26 15:18:14 2026 -0800"
      },
      "message": "[resultstore] let rsproxy mangle resource names\n\nLet ninja emit un-mangled action_id paths so that they\ncan potentially be used directly by a build status console tool.\n\nExpect rsproxy to assume the responsibility for mangling names\nappropriately so that tools like ninja don\u0027t need to.\n\nEdgeData::action_id can now be a const std::string* because it\npoints to a path whose memory outlives the ResultStoreStreamer.\nThis saves string allocations.\n\nFuchsia-Topic: build-event-stream\n\nBug: 487035969\nChange-Id: Ia4db01bfb6a9ffa4708dcc0596f035fa16e15fc4\n"
    },
    {
      "commit": "21d62f0e10aa9be5506f9acde1fe4901a9053648",
      "tree": "ed4c0fce887aae3a96db002742708f69615d5b5f",
      "parents": [
        "69e236ff5a230a9065381ddc8635064a3f30f474"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 17:47:06 2026 +0100"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Feb 25 06:33:50 2026 -0800"
      },
      "message": "Remove asserts from deps_log.cc\n\nInstead, properly reject the first invalid record, truncating\nthe file to not include it anymore (and anything that follows).\n\nNote that the asserts were not compiled in release builds,\nand the offset was incremented *before* processing the faulty\nrecords before this CL. This is probably why deps log truncation\nwas not working properly, as seen in https://fxbug.dev/412639741\n\nBug: 412639741\nBug: 485988597\nChange-Id: Icfdb75cd8a28b2e312775e0bc45d1aaf30813247\n"
    },
    {
      "commit": "69e236ff5a230a9065381ddc8635064a3f30f474",
      "tree": "9639eef7a23219cdaff0160398d6c71605b0e373",
      "parents": [
        "d1675913113f4f8014cbd234b32517067eb70f12"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Mon Feb 23 21:15:23 2026 +0000"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Feb 24 10:27:27 2026 -0800"
      },
      "message": "[resultstore] fix typo\n\ns/configuredTarget/configuredTargets/\nas dictated in ResultStore API documentation.\n\nFuchsia-Topic: build-event-stream\n\nChange-Id: Ibb6994c3a1cf76ac997419b23b47ef98f6030fd4\n"
    },
    {
      "commit": "d1675913113f4f8014cbd234b32517067eb70f12",
      "tree": "a0a7ba52d540dc75a5e3094951278f5b53f3e04b",
      "parents": [
        "ccd84373897665d0a125c5f41aa04080c6192e9b"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 14:30:50 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 18:04:36 2026 +0100"
      },
      "message": "Allow some tools to specify a list of targets using a file.\n\nAdd the --target-file\u003dFILE option to the `inputs`, `multi-inputs`,\n`outputs` and `affected` tools, as these will be used with very long\nlist in future changes to the Fuchsia build, that end up with a\nexec() error due to the command-line length being too long.\n\n+ Add a new topic named `enhanced-tools` to README.fuchsia to\n  document this kind of change. This also covers previous\n  tool changes that added support for flags like `--depfile`\n  (which have been sent upstream, but are currently in review\n  limbo).\n\nFuchsia-Topic: enhanced-tools\nChange-Id: I8bfa99e37d3b06ce17f1827c045ee9cac494f98a\n"
    },
    {
      "commit": "ccd84373897665d0a125c5f41aa04080c6192e9b",
      "tree": "25cb3ddcddc5963f5ea83fb48d335ea99181fe73",
      "parents": [
        "720975be3088ae20f4265e1d810a9d9fdd42b661"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 16:29:31 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 16:43:06 2026 +0100"
      },
      "message": "Add a few text-processing related helpers.\n\nThis prepares a future CL.\n\n- Turn StringPiece equality operators into friend functions\n  to allow `\"foo\" \u003d\u003d strpiece` and `strpiece \u003d\u003d \"foo\"` to\n  both compile, especially in unit-tests.\n\n- Add new text-processing helper classes in text_utils.h.\n  Adding them to a separate file that is not util.h or\n  string_piece_util.h is intentional to make it easier\n  to merge upstream changes into the Fuchsia branch, and\n  clarify what is not from upstream.\n\nFuchsia-Only: Fuchsia-specific features\nChange-Id: I4c7013ef08c0f0fb12ad3beb89d7c065cbbbf9c4\n"
    },
    {
      "commit": "720975be3088ae20f4265e1d810a9d9fdd42b661",
      "tree": "8aa53c7812b40a1853cf3beb9683df0f0806e447",
      "parents": [
        "b5f642dacde9641fa4207632a97c2b0b3d82970a"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 15:31:25 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 16:41:36 2026 +0100"
      },
      "message": "fuchsia_features_test.py: Reformat with \u0027black\u0027\n\nNo other change than reformatting.\n\nFuchsia-Only: Fuchsia-specific tests\nChange-Id: I4e41bd93298bb17c2eaa69aceefd3c6e2fd5b1d4\n"
    },
    {
      "commit": "b5f642dacde9641fa4207632a97c2b0b3d82970a",
      "tree": "48e9e72bc1a3c79757f21eddd0f2974f749841dc",
      "parents": [
        "596c786c90654c3e2e96bf84d357b464e66a2b96"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 15:28:44 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 16:41:36 2026 +0100"
      },
      "message": "fuchsia_features_test.py: Fix type errors\n\nFix type errors reported by `mypy` in the file.\n\nFuchsia-Only: Fuchsia-specific tests\nChange-Id: I0ed4e5a564860566f0d67cf11d66a9f5d57f569b\n"
    },
    {
      "commit": "596c786c90654c3e2e96bf84d357b464e66a2b96",
      "tree": "cfbd1d2d33745c10fe60c3f05a46ea1cae1e9beb",
      "parents": [
        "ecfb262b30a1557c10d0b1c2cc8b7aceac8f2a7e"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 15:21:48 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Feb 24 16:39:40 2026 +0100"
      },
      "message": "Move Fuchsia-specific regression tests.\n\nMove the regression tests that are specific to Fuchsia to\nmisc/fuchsia/.\n\nDoing this makes it easier to merge upstream changes into the\nFuchsia branch, and clarify some of the features implemented\nby the branch as well.\n\nAfter this change, the differences between out misc/output_test.py\nand the one from upstream are minimal (barring a few upstream\ntests that we have not in our branch, since we haven\u0027t merged\nthe corresponding fixes yet).\n\nFuchsia-Only: Fuchsia-specific tests\nChange-Id: I4a0e31435da3a380dedc1728c88158ca1ba89909\n"
    },
    {
      "commit": "ecfb262b30a1557c10d0b1c2cc8b7aceac8f2a7e",
      "tree": "d0aaa08fe23bad23cd0baf7f2710cb89dbb8f434",
      "parents": [
        "db90c65531becb022951a1befea08903a05aaf0a"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Feb 18 02:16:59 2026 +0000"
      },
      "committer": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Feb 19 20:43:15 2026 +0000"
      },
      "message": "[metrics] Extract mnemonic from description\n\nMnemonics like \"CXX\" and \"LINK\" are embedded in the description.\nExtract these and prefer to use these over the less readable\nrule names.  Assume evaluated mnemonics (after variable expansion)\nare ALL_CAPS (numbers allowed).\n\nPerformance considerations:\n* Cache mnemonics as std::string in the Edge object,\n  which outlives the map\u003cStringPiece, int\u003e action_metrics.\n* Bypass updating action metrics and use of mnemonics when\n  no action metrics output is requested.\n\nstring_piece.h:\n* added comparison operator, for use as associative array keys.\n\nFuchsia-Topic: action-metrics\n\nBug: 474111441\nChange-Id: I34b418181aef48fc2a60aa91523566ce4f9d8737\n"
    },
    {
      "commit": "db90c65531becb022951a1befea08903a05aaf0a",
      "tree": "0cd55536a3d6c07f613bd762542383c1585c258f",
      "parents": [
        "2815fa1c3e8efcb0e2e5d777f14c5239ca332720"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Feb 16 12:03:04 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Feb 16 12:04:44 2026 +0100"
      },
      "message": "Upstream: Fix spurious rebuilds for phony targets with validations.\n\nThis comes from an upstream PR and fixes a bug that is pretty\nimportant to use validation targets in the Fuchsia build.\n\nNote that the PR is still under review and may be updated in\nthe Ninja upstream github repository.\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2729\nChange-Id: I868d348c71a8af6632f3851c28a126992eef7ace\n"
    },
    {
      "commit": "2815fa1c3e8efcb0e2e5d777f14c5239ca332720",
      "tree": "548d28a4c8160a24073b39f425308be1d89b8858",
      "parents": [
        "ae95fbc983472ca899b3afee9acb26df80db6446"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Feb 11 15:01:31 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Feb 11 15:03:48 2026 +0100"
      },
      "message": "Ensure table of pending commands is cleared on Ctrl-C\n\nEnsure that as soon as Ctrl-C is received, Ninja clears the\ntable of pending commands from its interactive terminal output\nand stops the corresponding timers.\n\nBefore this CL, the table would continue to be updated every\n100ms even if the listed commands were not still running when\nNinja is waiting for subprocesses to complete. The effect is\nnotable when launching lots of remove actions that take\na lot of cleanup time each.\n\n- Add a Status::BuildInterrupted() method that does nothing\n  by default.\n\n- Add StatusPrinter::BuildInterrupted() which clears\n  the table and removes the update timer altogether.\n\n- Ensure status_-\u003eBuildInterrupted() is called first\n  when the command runner returns ExitInterrupted.\n\nBug: 483627713\nFuchsia-Topic: multi-line-status\nChange-Id: I7a2fff5b7c1e4b57caec4516added5b01277c41c\n"
    },
    {
      "commit": "ae95fbc983472ca899b3afee9acb26df80db6446",
      "tree": "42ead992fb9d114ff952c62b7ff8313a8a3dc6ee",
      "parents": [
        "6b3390293b99119f67f064d91e2c7b5e3b1d196c"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Feb 04 16:40:58 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Feb 04 17:15:17 2026 +0100"
      },
      "message": "Capture console command outputs properly.\n\nThis CL ensures that the output of \u0027console\u0027 commands is properly\nrecorded by Ninja, and written into the `--error_logging_output`\nfile in case of error.\n\nThis requires several non-trivial changes:\n\n- Add new Subprocess::OutputMode::PipeProxy and\n  Subprocess:OutputMode::PseudoTerminalProxy and\n  Subprocess::RunMode::Session values.\n\n- Ensure that if Ninja runs in an interactive terminal,\n  the subprocess is placed in its own session, which\n  allows it to write to a custom pseudo-terminal in\n  raw mode.\n\n  If Ninja does not run in an interactive terminal,\n  the console process is placed in its own process group\n  just like regular ones. The Direct mode is only\n  implemented on Windows now, as pseudo-terminals\n  cannot be implemented reliably on this platform.\n\n- Ensure that Ninja buffers the output of console\n  subprocesses while sending it immediately to stdout\n  to print as soon as possible to the user.\n\nNOTE: The sysroot used by the Fuchis infra recipe is very old\nand does not include the POSIX_SPAWN_SETSID constant required\nto spawn a new process into its own session. The value of that\nconstant is hard-coded in subprocess-posix.cc for now if it\nis not defined, but the recipe should be updated to use\nsomething more recent. E.g. the \u0027focal\u0027 sysroot matches\n\u0027ubuntu20.04\u0027 and has the constant defined.\n\nBug: 481642426\nFuchsia-Tpopic: capture-console-output\nChange-Id: I46cbe119b2fab7a0c5730aa57deecdcfd0d69907\n"
    },
    {
      "commit": "6b3390293b99119f67f064d91e2c7b5e3b1d196c",
      "tree": "786a2b1cd2fccab7bf5c10ffe5434eed1babe56c",
      "parents": [
        "e6c4a1a1991b1b07755e94b3f7204f0c45285345"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Feb 04 12:01:50 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Feb 04 16:50:28 2026 +0100"
      },
      "message": "Add Subprocess::RunMode and Subprocess::OutputMode types.\n\nReplace the single Subprocess:use_console_ boolean flag with\ntwo new members Subprocess::run_mode_ and Subprocess::output_mode_\nwhich distinguish information about how the subprocess is run,\nand how its output is setup and processed.\n\nThis does not change behavior, but prepares for a future CL that\nwill support the new capture-console-output Fuchsia-specific\nfeature.\n\n+ README.fuchsia: Add new topic description\n\nBug: 481642426\nFuchsia-Topic: capture-console-output\nChange-Id: I8cb02ad589cbd1a02fd74a6116796188bcea88de\n"
    },
    {
      "commit": "e6c4a1a1991b1b07755e94b3f7204f0c45285345",
      "tree": "26fbf005a751a891168f7c5e130e344d98e39949",
      "parents": [
        "c25043a9a98dfb1a1166d6dd258a868c3833fac0"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Jan 28 16:06:13 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Feb 02 14:18:00 2026 +0100"
      },
      "message": "Remove PersistentMode::RestartChecker type.\n\nMove the logic implemented by this callable to the query\nhandler, which can now return a proper value to ask the\nclient to restart a new server.\n\nFuchsia-Topic: persistent-mode\nChange-Id: I0e19aefff3e5b30780d75221f62f38fe371b14cc\n"
    },
    {
      "commit": "c25043a9a98dfb1a1166d6dd258a868c3833fac0",
      "tree": "9ec4347cfc6e777066b4794726fc8b1627ff63af",
      "parents": [
        "10e4847172135fd8d8e55a9db47e229ae62b6db6"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Jan 28 15:35:07 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Jan 30 17:43:24 2026 +0100"
      },
      "message": "Introduce PersistentMode::BuildQueryResult\n\ninstead of returning a simple ExitStatus enum value, make\neach query return a small struct that describes more precisely\nfailure conditions and whether the client should restart.\n\nThis is necessary to later change the logic implemented in\nsrc/ninja.cc to allow better error reporting when the manifest\ncannot be loaded, and to implement tools in the server, which\nwill considerably speed up most of them.\n\nFuchsia-Topic: persistent-mode\nChange-Id: I512a1261406496422c0d804a15aaca8588af641d\n"
    },
    {
      "commit": "10e4847172135fd8d8e55a9db47e229ae62b6db6",
      "tree": "4d2651ef11563e621bb60352e87f311437283612",
      "parents": [
        "1966952e3121be579cb7d564e575f70f32340683"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Jan 28 15:32:08 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Jan 30 17:24:54 2026 +0100"
      },
      "message": "Minor persistent_mode.cc cleanups\n\nThis prepares the next CL which changes implementation\ndetails of the persistent mode wire protocol.\n\n- Add RemoteObjectWrite() and RemoteObjectReadAndMake\u003c\u003e()\n  definitions to make it easier to read and write classes\n  that provide ToEncodedString() and FromEncodedString()\n  methods through IPC connections.\n\n- Fix the definitions of logging macros in persistent_mode.cc\n  and persistent_service.cc to work when DEBUG* macros are set.\n\n- Ensure a message is printed every time the server waits for\n  a new client connection, this helps debugging issues.\n\nFuchsia-Topic: persistent-mode\nChange-Id: I4b1b48dc7a95265c8b2dd764e22e3d241a51039f\n"
    },
    {
      "commit": "1966952e3121be579cb7d564e575f70f32340683",
      "tree": "65623b15b506c4d6d0a23346ac67aedb58e9af72",
      "parents": [
        "366a63fd649b86360306121e73b78f4d1cbcf604"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Jan 30 14:35:46 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Jan 30 17:24:54 2026 +0100"
      },
      "message": "ninja.cc: Remove unused dupbuild option\n\nThis option is obsolete and now ignored by upstream, as well as\nthe Fuchsia version, but for some reason we kept parsing it,\nnever referencing its value anywhere.\n\nThis removes it from the Options struct, and make Ninja print\na warning if `-d dupbuild\u003d{err,warn}` is used on the command-line.\n\nThis specific part of ninja.cc now matches upstream.\n\nChange-Id: I343eb997ac5f5bcb8c84e78ef771903bcb42ed9b\n"
    },
    {
      "commit": "366a63fd649b86360306121e73b78f4d1cbcf604",
      "tree": "783cd8db2e7047f3bf07cffb38b73d46e0ac55bb",
      "parents": [
        "a7d773e793cdc0583a84184eb244c56a1d394709"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Jan 30 15:16:26 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Jan 30 17:24:51 2026 +0100"
      },
      "message": "Fix build and remove un-needed header includes.\n\nThis adds \u003ccstdint\u003e includes to async_loop.h and delayed_commands.h\nto fix a build error when using misc/fuchsia/build-ninja.sh with the\nlatest Fuchsia toolchain.\n\n+ Remove a few un-needed header includes reported by the clangd\n  LSP server in my IDE. This is not an exhaustive change.\n\nThis only touches Fuchsia-specific files.\n\nChange-Id: I1ed4aa9560be89f91113c0dc8370e97373aecb82\n"
    },
    {
      "commit": "a7d773e793cdc0583a84184eb244c56a1d394709",
      "tree": "198ea092dadfa8e4e3b400c0d3d76387682d4d40",
      "parents": [
        "2c34a00c6f587f14fea067ea08e0bf87691e66e7"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Sat Jan 10 01:30:54 2026 +0000"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jan 28 11:41:46 2026 -0800"
      },
      "message": "[metrics] emit action metrics JSON output\n\nnew: --action_metrics_output FILE\n\nThis includes initial/final action counts,\nand action breakdown by mnemonic.\n\nRemove the burden from other tools trying to scrape\nthis information from ninja\u0027s stdout.\n\nBug: 474111441\nChange-Id: Idf805c5b9949266da1f2e620bf5fabf99313415c\n"
    },
    {
      "commit": "2c34a00c6f587f14fea067ea08e0bf87691e66e7",
      "tree": "294b92d427bf3fcc5381b5b2ab124f452e4b5a2e",
      "parents": [
        "1c1773e74cf909317d343cb033dc1b98211fd44e"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sun Jan 25 19:48:46 2026 +0100"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jan 27 10:31:15 2026 -0800"
      },
      "message": "Upstream: Support $^ escape sequence for newlines.\n\nThis allows embedding newlines into commands inside the Ninja\nbuild plan. The feature is only enabled when a definition for\n`ninja_required_version` is found with values \u003e\u003d 1.14 though.\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2606\nChange-Id: Ibec953ae03d34fc3c71c66d1e2042c52ed2d4f52\n"
    },
    {
      "commit": "1c1773e74cf909317d343cb033dc1b98211fd44e",
      "tree": "1ea6680171acfe1b44948058580c0b0901874635",
      "parents": [
        "44e033912a984d4af38349205b250c71e0c51b58"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Jan 27 14:21:19 2026 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Jan 27 14:21:19 2026 +0100"
      },
      "message": "Upstream improvement: Reduce `sizeof(Node)` and `sizeof(Edge)`\n\nThis CL contains two upstream improvements from PR#2704\nand PR#2705 that reduce the size in memory of the Ninja\ngraph, without impacting anything else.\n\n---- Original commit message #2704  ----\nReduce the size of `enum ExistenceStatus` from an `int` to `char`\nand then move an `int` to take up the 4 bytes of padding after the\n`bool` members.\n\nThis reduces `sizeof(Node)` from 144 to 136 on 64-bit (MSVC).\n\n---- Original commit message #2705 -----\nReduce the size of `enum VisitMark` from an `int` to `char` and then\nmove this and the `Jobserver::Slot` (a `std::int16_t`) next to the\n`bool` members to fill up padding.\n\nThis reduces `sizeof(Edge)` from 196 to 184 on 64-bit (MSVC).\n---------------------------------\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2704\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2705\nChange-Id: I50917864b09c8803474a3ce0b5533f8f199ce13c\n"
    },
    {
      "commit": "44e033912a984d4af38349205b250c71e0c51b58",
      "tree": "3ee12d9853da6974d50e776193dad7855cd82ee7",
      "parents": [
        "6dc706374d0b46f123f7d58ecb72b948f8b31a06"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Dec 11 18:39:03 2025 +0000"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Dec 12 20:08:35 2025 +0000"
      },
      "message": "Implement delayed commands in Ninja\n\nThis modifies Ninja\u0027s build logic to use a DelayedCommands instance\nto delay the execution of specific commands to build the corresponding\nartifacts with an external worker program instead.\n\n- The Builder class is modified to get a new optional DelayedCommands\n  instance. It also gains a new SetDelayeWorker() method that is used\n  to set a DelayedWorker instance to be used.\n\n- The Builder::Build() method, which contains the main build loop,\n  is modified to use the DelayedCommands instance to detected delayed\n  edges, and later build them with a worker when there are no longer\n  regular started edges.\n\n- src/ninja.cc is modified to create a new FuchsiaBazelDelayedWorker\n  instance and pass it to the Builder before calling Build().\n\n- RealCommandRunner::GetSubprocessSet() is added to ensure the\n  DelayedCommands instance can reuse the same SubprocesSet to\n  launch the worker tool. In particular, this reuses the logic\n  from SubprocessSet::Clear() that handles graceful shutdown\n  with Ctrl-C.\n\nFuchsia-Topic: delayed-commands\nBug: 468096724\nChange-Id: Ic7cfcc7825a3cc9365ad5f9db03cfcafa5f19937\n"
    },
    {
      "commit": "6dc706374d0b46f123f7d58ecb72b948f8b31a06",
      "tree": "656e9bb105f2b2a357dd986e30b6468071065b00",
      "parents": [
        "c27c7100b65af19724b0501e80269368821eaec3"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Dec 11 18:28:03 2025 +0000"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Dec 12 20:08:35 2025 +0000"
      },
      "message": "Add delayed commands support classes.\n\nThis CL introduces several classes that will be used by the\nrest of the Ninja codebase to implement delayed commands,\na feature that allows Ninja to schedule specific edge/actions\nto be built together by an external worker script.\n\n- DelayedWorker: A base class for a worker tool type.\n\n  Derived classes provide logic to detect which edges should\n  be handled by the tool, and how to invoke it.\n\n  The base class provides common logic to encode/decode\n  JSON request and responses between Ninja and the tool\n  and process them appropriately.\n\n- FuchsiaBazelDelayedWorker: A derived class used to call\n  the Fuchsia-specific worker script for Bazel build actions.\n  For now, this just checks for a file in the build directory\n  to avoid introducing new Ninja configuration options and\n  associated plumbing. It is assumed that the build\u0027s\n  regenerator should fill this file (or symlink) with\n  appropriate content.\n\n- DelayedCommands: A class that holds the global state used\n  during the build to implement the feature. For now, this\n  only supports a single worker per instance, which is enough\n  for testing.\n\nThis does not modify the rest of Ninja for ease of review.\n\nA future CL will add a DelayedCommands instance to the\nBuilder class, and then pass it a FuchsiaBazelDelayedWorker\ninstance in src/ninja.cc.\n\nFuchsia-Topic: delayed-commands\nBug: 468096724\nChange-Id: I9dbc7783950dbab70798a2ee05aa772e9ea7928a\n"
    },
    {
      "commit": "c27c7100b65af19724b0501e80269368821eaec3",
      "tree": "5dc3b7f6f83e375dacc83199cde2ce4b8f1e05b5",
      "parents": [
        "c6c5798e9d14b2ea604ec2fc90464f82b82156bd"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit+github@google.com",
        "time": "Thu Nov 20 13:00:35 2025 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Dec 12 20:08:33 2025 +0000"
      },
      "message": "Add minimalist JSON streaming parser.\n\nAdd a new class to process JSON input strings with\na streaming-only API that is a direct and simple to\nuse as possible.\n\nThis will be used by a future CL to process JSON from\nexternal tools.\n\nFuchsia-Topic: delayed-commands\nBug: 468096724\nChange-Id: I8e8eae397d88f72f56e932f8621206c49fba5690\n"
    },
    {
      "commit": "c6c5798e9d14b2ea604ec2fc90464f82b82156bd",
      "tree": "21c34323840ed4a784f412c234b4c92e37bc02d4",
      "parents": [
        "229d0d3ea089f30a956b7748c3f888cfb06327d4"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Dec 12 17:34:27 2025 +0000"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Dec 12 17:34:27 2025 +0000"
      },
      "message": "README.fuchsia: Add new delayed-commands topic\n\nChange-Id: I4484951091b8d9d512ca2ae4bd460062512da033\n"
    },
    {
      "commit": "229d0d3ea089f30a956b7748c3f888cfb06327d4",
      "tree": "d90755cabaa61cc14a78622e5a7b65267b66d20c",
      "parents": [
        "7b553c24f72c1a29094213be9db7561d33b0a5fd"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Dec 11 16:48:55 2025 +0000"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Dec 12 17:31:20 2025 +0000"
      },
      "message": "Rename best_types.h to build_metadata.h\n\nSince this is the only type it defines, and the latter is used\nin more context that BES alone.\n\nChange-Id: Icc2d624156976a3da3459a60a17cfc77ad2b8a59\n"
    },
    {
      "commit": "7b553c24f72c1a29094213be9db7561d33b0a5fd",
      "tree": "3abf09c8f50ca15250f55225475182059b5959b7",
      "parents": [
        "e0f306ce252b6865b205f0003b4324047c3854d9"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Dec 10 00:41:13 2025 +0000"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Dec 12 17:31:20 2025 +0000"
      },
      "message": "Add Edge::GetDescription() helper method\n\nAdd a new helper method to the Edge class to get the edge\u0027s\ndescription if provided, or fallback to the command otherwise.\nThis de-duplicates some existing code, and will be used in\nother CLs.\n\n+ Add PrintCommandOutput() to status_printer.cc, preparing\n  for another future CL.\n\nChange-Id: Ic5dc99187aaa78ca91f5c6f87014a0ea10e1187b\n"
    },
    {
      "commit": "e0f306ce252b6865b205f0003b4324047c3854d9",
      "tree": "ef17de6d544f3b4e1b8f4e7a3839fdf4e46334a5",
      "parents": [
        "4a9abc99c5d0020e347e63a6d91ebfe514c24379"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Dec 10 03:56:12 2025 +0000"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Dec 11 22:15:23 2025 +0000"
      },
      "message": "Add GEMINI.md rules file.\n\nAdd a file describing development rules to be followed by human developers\nand Gemini-based AI agents when working on this project.\n\nNote that in practice, some AI editors will ignore this file for security,\nand will require the user to copy its content into a global file, such\nas ~/.gemini/GEMINI.md, while specifying for which directories they\nshould apply.\n\nChange-Id: I6ce212d51631aaf40d15369bbe32f469b5cce2c5\n"
    },
    {
      "commit": "4a9abc99c5d0020e347e63a6d91ebfe514c24379",
      "tree": "617feee99123db9d854e3f29808b4d98a56258d5",
      "parents": [
        "3f23aef0b470179428023f51284c8bc83243a6a7"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Dec 09 23:45:11 2025 +0000"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Dec 11 12:40:03 2025 -0800"
      },
      "message": "build-ninja.sh: Add tests-controlling options.\n\nAdd a few new options to change the way Ninja unit-tests are run\nto help debugging them during development:\n\n  --gtest_filter\u003dFILTER: Run a specific subset of unit-tests\n     after an incremental build.\n\n  --gdb, --lldb, --gdb\u003dGDB, --lldb\u003dLLDB: Run ninja_tests\n     under a debugger on Linux, can be combined with\n     --gtest_filter.\n\nFuchsia-Only: Development Tools\nChange-Id: Ibdc92c8f036f4167c5c32b47341867002f122824\n"
    },
    {
      "commit": "3f23aef0b470179428023f51284c8bc83243a6a7",
      "tree": "e7b6aa8ee9dae33df944baa9e50d8493e0d61cbc",
      "parents": [
        "67af779597da0498d5dfdba009a1499534c015eb"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Nov 26 23:42:14 2025 +0000"
      },
      "committer": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Dec 02 22:12:25 2025 +0000"
      },
      "message": "[logging] Record dirty inputs --dirty_sources_list\n\nEach build invocation can record the set of dirty inputs\nit observed in the build graph.\nThis file will give insight into files that trigger incremental\nbuilds the most frequently in developer workflows.\n\nBug: 456231643\nChange-Id: Iefb2d21718b618c91defc2f25d55cd551410684d\n"
    },
    {
      "commit": "67af779597da0498d5dfdba009a1499534c015eb",
      "tree": "d8e52f2d3d553df8693455cb37b66744e13e225f",
      "parents": [
        "2550a18c165044a83621388937e858739c57a82d"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Nov 25 21:55:40 2025 +0000"
      },
      "committer": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Nov 25 21:59:29 2025 +0000"
      },
      "message": "[resultstore] Fix output stream lifetime\n\nPreviously, the output stream was being destroyed in the\nResultStoreStreamerInstaller before its final use in\nthe destructor of ResultStoreStreamer.\n\nFuchsia-Topic: build-event-stream\nBug: 369980343\nChange-Id: Ie9b86c6a36430640f061e7ed2d7a0f6969baf4ff\n"
    },
    {
      "commit": "2550a18c165044a83621388937e858739c57a82d",
      "tree": "cd65d58e5be470fe7c43b7943be2339aebbf39eb",
      "parents": [
        "b24791c084d04cb9af203b68145ebbc77d46bc46"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Nov 20 16:18:38 2025 +0000"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Nov 21 01:26:39 2025 -0800"
      },
      "message": "Add --depth\u003dDEPTH option to `-t affected` tool.\n\nThis is useful to limit the depth of the output files, for\nexample to determine which source files include a specific\nheader file listed in depfiles only with something like:\n\n```\nninja -t affected --depfile --depth\u003d1 ../../path/to/header.h\n```\n\nWhich will list the object files of all the sources that include\nthe header. Without the option, the result contains also all their\ntransitive dependents, which is considerably larger.\n\nBug: 462397407\nChange-Id: Ieb40b718df8686b3c336b773dab93e4eddbfa529\n"
    },
    {
      "commit": "b24791c084d04cb9af203b68145ebbc77d46bc46",
      "tree": "872fb319a1d6f4de690e79cab1134e4fcf613f0e",
      "parents": [
        "b4a1b3ea0465e80b140707022b85f00bb368d7e4"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Nov 20 13:57:11 2025 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Nov 20 14:01:38 2025 +0100"
      },
      "message": "FileOrGzipOutputStream: Fix crash in destructor.\n\nIf opening the file failed in Init(), the file_ member will\nbe null, and calling fclose() on it will crash.\n\nBug: 461912110\nChange-Id: I8d0bb9cbff967f8376da520a4756a459f30dcda8\n"
    },
    {
      "commit": "b4a1b3ea0465e80b140707022b85f00bb368d7e4",
      "tree": "5a10d3170ee96b009c1cbf138f2985a113e4b8bb",
      "parents": [
        "dc6f1e9efb0e49975f2342c4e27c44faef330b76"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Nov 19 12:15:36 2025 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Nov 19 13:15:26 2025 +0100"
      },
      "message": "Do not leave zombie processes in case of triple Ctrl-C\n\nImprove the support for user-initiated \"soft-kill\" of\nstuck processes when Ctrl-C is pressed twice.\n\n- On the second Ctrl-C, send SIGTERM to each subprocess\u0027 group\n  to ask it politely to stop. Just in case.\n\n- On the third Ctrl-C, send SIGKILL but do not forget\n  about the subprocess\u0027 PID, which allows reaping it,\n  avoiding creating zombie processes.\n\n- Print the pids of each remaining commands in each\n  phase, which may help debug problems locally.\n\n+ Add a new topic in README.fuchsia about this feature.\n\n+ Add regression test for the feature, yes it\u0027s possible!\n\nFuchsia-Topic: graceful-shutdown\nBug: 452866538\nChange-Id: Ic383af04f9fe9ccbbf8d1b9cfe992aba18398121\n"
    },
    {
      "commit": "dc6f1e9efb0e49975f2342c4e27c44faef330b76",
      "tree": "294705554320ea48a023148796b3cc266eb1864e",
      "parents": [
        "d0d71ffa6b536a1bc7a4b238d89f98ffb9242ecd"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Nov 17 14:54:44 2025 +0100"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Nov 17 09:28:09 2025 -0800"
      },
      "message": "Gracefully handle Ctrl-C when waiting for command completion.\n\nChange the logic when waiting for all processes to complete cleanly,\nfor example after a failed command was detected, or when the user\ninterrupted the build with a first Ctrl-C manually.\n\nIn the case where the wait is too long, because some sub-commands\nare stuck, the user may be tempted to press Ctrl-C a second time.\nIn this case, print a message telling how many commands Ninja is\nwaiting, and warn about leaving zombie processes when pressing\nCtrl-C a third time. This also prints a table of up to 8 commands\nbeing waited for to identify the problem.\n\nIf the user insists, force the exit to let Ninja return immediately\nto the user.\n\nThis behavior works consistently between normal and persistent\nbuild mode. Note that when Ctrl-C is pressed three times, the\npersistent server process will now stay live instead of aborting,\nremoving the \"Could not connect to server: ...\" error that was\nhappening previously.\n\nThis requires changing the Subprocess::Start() and SubprocessSet::Add()\nsignatures to support a new optional \u0027description\u0027 argument, which\nis made default-initialized to minimie changes to unit-test code.\n\nBug: 452866538\nChange-Id: Icf610d0d9f150904b7b0f412a7a4ce33ec50593e\n"
    },
    {
      "commit": "d0d71ffa6b536a1bc7a4b238d89f98ffb9242ecd",
      "tree": "12886012d4e615cf81c7628e1c4cbc682fcfb3c0",
      "parents": [
        "0b3b0d2b0b1d6450829d793cf56b8cc3ac060378"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Nov 17 13:29:47 2025 +0100"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Nov 17 09:28:05 2025 -0800"
      },
      "message": "Do not fallback to a local build when persistent server fails unexpectedly.\n\nFollowing investigations in the associated bug, remove the local\nfallback mode, as it rarely helps, and makes build interruption\nmore painful than desired.\n\nTo replicate this, use the following in a temporary directory then\npress Ctrl-C twice:\n\n```\ncat \u003e build.ninja \u003c\u003cEOF\nrule sleep5\n    command \u003d trap \u0027echo TRAP; sleep 5; echo DONE\u0027; sleep 5\n\nbuild foo: sleep5\nEOF\n\nexport NINJA_PERSISTENT_MODE\u003d1\nninja\n\n``\n\nThe new behavior will print the error message then exit\nimmediately. Before that, Ninja would try to re-run the interrupted\nbuild locally.\n\nBug: 452866538\nChange-Id: Ied558cbd07f5c8a79b357e8b81ec2fd6fa284853\n"
    },
    {
      "commit": "0b3b0d2b0b1d6450829d793cf56b8cc3ac060378",
      "tree": "f5f9626893bc5bd8f35aedecb7addd02ef0b7620",
      "parents": [
        "f0386b9609ae80470c71136cfef0ccdcb3f37e79"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Nov 17 13:17:54 2025 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Nov 17 13:22:08 2025 +0100"
      },
      "message": "Make --chrome_trace messages less verbose.\n\nOnly print the Chrome trace-related messages when --verbose is used.\nThis cleans up the default `fx build` output.\n\nChange-Id: Ia500a805625bdff059d48c604daeb314b5e863cd\n"
    },
    {
      "commit": "f0386b9609ae80470c71136cfef0ccdcb3f37e79",
      "tree": "15edaee1b4d512a978d50c29c23692cc9688ed28",
      "parents": [
        "0364bd0e151ec666eb8583948c1fabd88e14b07d"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 23 17:53:09 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 23 23:26:13 2025 +0200"
      },
      "message": "Add the `affected` tool.\n\nThis re-introduces the tool that was previously introduced\nby [1], which had to be reverted, using a new name to\ndistinguish it from the existing `outputs` tool which\nworks differently.\n\nThis also adds a better description in the tool\u0027s help\nmessage, including an example command to show how it\ncan be used.\n\n[1]: https://fxrev.dev/1400275\n\nBug: 427455042\nChange-Id: Ic11a51aa0d65d16e65cfc2ce9b13291b6c015a4a\n"
    },
    {
      "commit": "0364bd0e151ec666eb8583948c1fabd88e14b07d",
      "tree": "a18bdd74910aba3446e4c2f042c7c15a8091c046",
      "parents": [
        "01e9ebcae73434cf6d2aa73b76d1e1526ae60c37"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 23 17:33:01 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 23 22:39:08 2025 +0200"
      },
      "message": "Add --depfile option to `outputs` tool.\n\nEnsure that the tool\u0027s result is correct when depfile\ndependencies are present in the graph. As usual, the\nresult is only correct if the Ninja build plan didn\u0027t\nchange since the last build.\n\nThe tool\u0027s configuration must use Tool::RUN_AFTER_LOGS\ninstead of Tool::RUN_AFTER_LOAD to ensure the deps log\nis properly loaded before the tool is run.\n\nChange-Id: I45e8941614650eb67b6ff42cb0ff4aacd5a168b8\n"
    },
    {
      "commit": "01e9ebcae73434cf6d2aa73b76d1e1526ae60c37",
      "tree": "2228bf4372361ca1f97a0feeddf1dea68f23a622",
      "parents": [
        "c5418a67b29a7eabffffa526ad18a07c24913dd8"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 23 16:23:19 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 23 22:32:10 2025 +0200"
      },
      "message": "Clarify the purpose of the `outputs` tool with an example.\n\nChange-Id: I8f6c6b8345af06e7410a21d7f95fff9e91e72858\n"
    },
    {
      "commit": "c5418a67b29a7eabffffa526ad18a07c24913dd8",
      "tree": "1405662333b5a5428ffc04f346299fbfa04ebdfb",
      "parents": [
        "7044eaa245bafe107d7536e9bfd5fb8194ec44d7"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 23 16:13:50 2025 +0200"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Oct 23 10:20:52 2025 -0700"
      },
      "message": "Revert \"Fix `outputs` tool implementation.\"\n\nReason for revert: The old `outputs` tool implementation is\nneeded by the Fuchsia build.\n\nAnother CL will re-introduce the change as a new tool named\n\"affected-targets\" or something similar.\n\nThis reverts commit 47377c71f184e19a9a66af2ecb5242f9c4ad9026.\n\nChange-Id: I824a52fc39eafed93d8969571544fb53c7c120ce\n"
    },
    {
      "commit": "7044eaa245bafe107d7536e9bfd5fb8194ec44d7",
      "tree": "290c16e34d37d05b0b198c203d4250185de0115f",
      "parents": [
        "47377c71f184e19a9a66af2ecb5242f9c4ad9026"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 23 14:08:54 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 23 14:20:14 2025 +0200"
      },
      "message": "Try to fix pselect() call on MacOS.\n\nThe Fuchsia Ninja sources no longer use kqueue() on MacOS since [1].\n\nThe Pigweed team is now reporting some random pselect() failures\nhappening when they build their project with the Fuchsia Ninja binary.\nMore specifically, the syscall returns with -1 and errno \u003d\u003d EINVAL.\n\nThe pselect() documentation states that this could happen if the timeout\nvalue is invalid, which cannot happen here due to the way the \"ts\"\npointer is computed, or if nfds is greater that FD_SETSIZE, which\nshould instead generate a Fatal() in Watches::Insert(). So both of these\nconditions do not seem to be the root of the problem.\n\nThis CL changes the call to use null pointers for the read and write\nsets if the number of file descriptors is 0, hoping this will remove\nthe problem. This is consistent with upstream [2].\n\nThis does the same for the Linux-specific ppoll() call.\n\n[1]: https://fxrev.dev/1386741\n[2]: https://github.com/ninja-build/ninja/pull/2550/files#diff-e70adfab80664f71832232d71b3055c78e054dd75fbeec69d019cb0e9dce6b2dR397\n\nBug: 452053710\nChange-Id: Ic8b44d3c2f908b1299a697cbb98153058a6868d7\n"
    },
    {
      "commit": "47377c71f184e19a9a66af2ecb5242f9c4ad9026",
      "tree": "2b47f9ebfd10dca721aedfef85d7ade9cb63997b",
      "parents": [
        "3f4310b3f3bb365a9ef4438cd6c5353b5fe4ad64"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 22 13:51:36 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 22 18:37:32 2025 +0200"
      },
      "message": "Fix `outputs` tool implementation.\n\nThe tool was not working correctly, in particular in the presence\nof depfile-injected dependencies. This CL refactors the\nimplementation considerably and adds two new options to the tool:\n\n`--depfile` is used to include depfile dependencies in the result.\n\n`--ignore-errors` is used to silently ignore targets that are not\nknown to the graph. This is useful in particular when listing input\nfiles from a git diff that are not part of the actual Ninja build\nplan.\n\nBug: 427455042\nChange-Id: I407f5bb49ba701613d8df31bf25729e48a4f1544\n"
    },
    {
      "commit": "3f4310b3f3bb365a9ef4438cd6c5353b5fe4ad64",
      "tree": "f939cd8b0c7f9e91011daf0b1a0cd2ee8d2c04f5",
      "parents": [
        "9cf7b0c04a690e0602c0445096f06bf40f1e2551"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 22 16:39:38 2025 +0200"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Oct 22 09:36:29 2025 -0700"
      },
      "message": "Fix `inputs` and `multi-inputs` tools.\n\nThese tools need the Tool::RUN_AFTER_LOGS flag to ensure\nthat the deps log is loaded before the tool is run. Without\nthat the deps loader will return empty results, and the\n--depfile flag will not work correctly.\n\nThis was not caught because the regression tests didn\u0027t\nset `deps \u003d gcc`, which triggers a different code path\nin Ninja where the depfile is not ingested into the build\nlog but just stays in the output directory. Hence the\nunit-tests have been modified to check both cases.\n\nChange-Id: If57e8a3038a8e7b421d21e41796473db0a4afec0\n"
    },
    {
      "commit": "9cf7b0c04a690e0602c0445096f06bf40f1e2551",
      "tree": "164aad7f57e8bae4f6200361df20177b2de1465e",
      "parents": [
        "4bd7f15519061dba971882735d69c0ecef417f9e"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Jun 02 16:42:29 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 16 15:03:51 2025 +0200"
      },
      "message": "Fix jobserver_pool.cc implementation on Posix.\n\nThis fixes a nasty bug in the loop that is trying to\nfill the pool. In case of EINTR after the write(), the\nloop is restarted but the count was incorrectly\ndecremented, which could result in silently creating\na pool with too few job slots in it.\n\nThis CL fixes it while adding some extra documentation.\n\nNo test is provided because this condition is very hard\nto reproduce.\n\nChange-Id: I902a164a70abbdf871d29e4e4ddf0275d877ecae\n"
    },
    {
      "commit": "4bd7f15519061dba971882735d69c0ecef417f9e",
      "tree": "0bd64af1e3bf5ffd920d080386bfb44724e99ddd",
      "parents": [
        "fa9d8fc9b460a0e8e028a9ef4c33b027f887df18"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 16 11:38:38 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 16 11:46:42 2025 +0200"
      },
      "message": "Reapply \"depfile_parser.in.cc: Add support for filenames with ampersands/quotes\"\n\nThis reverts commit e1bcb95f03bb5e864b425d1868084a70a69ac7ad.\n\nThe original CL [1] had to be reverted because one of the Fuchsia\nbuild rule generated depfile with quoted file paths, which were\ninitially silently ignored, then became valid and broke no-op checks\nafter it was applied.\n\nThe depfile generator has been fixed in [2] though and manual\ninspection shows no other depfile paths with quotes (single or\ndouble) and ampersands in them, so reapplying this upstream\nchange should now be safe.\n\n[1]: https://fxrev.dev/1391182\n[2]: https://fxrev.dev/1394113\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2590\nBug: 452292012\nBug: 447101276\nChange-Id: Ib2ed06cd7def6fa03149fe0b569e1a2e24cb41e7\n"
    },
    {
      "commit": "fa9d8fc9b460a0e8e028a9ef4c33b027f887df18",
      "tree": "52c41273e58eb38d253b0c178c17a133c72e58e7",
      "parents": [
        "e1bcb95f03bb5e864b425d1868084a70a69ac7ad"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 15 13:43:26 2025 +0200"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Oct 15 08:57:21 2025 -0700"
      },
      "message": "Fix build-ninja.sh\n\nThe command to compute PYTHON_TESTS was improperly quoted, resulting\nin an array with a single item (or multiple paths separated by spaces).\nIntroduce command_output_to_array function to deal with this properly\nand use it.\n\nChange-Id: I67aa9321f1de05b89c842d9ee4ac73400e8764ff\n"
    },
    {
      "commit": "e1bcb95f03bb5e864b425d1868084a70a69ac7ad",
      "tree": "866ca220cee80bec2cc1b328d80375b03198de74",
      "parents": [
        "bd56c6aed232bbb425832f54311a48f453cb9c2b"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 15 16:31:52 2025 +0200"
      },
      "committer": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Oct 15 08:55:59 2025 -0700"
      },
      "message": "Revert \"depfile_parser.in.cc: Add support for filenames with ampersands/quotes\"\n\nThis reverts CL [1] as it is suspected for being the root cause for\nFuchsia and Pigweed build breaks.\n\n[1]: https://fuchsia-review.googlesource.com/c/third_party/github.com/ninja-build/ninja/+/1391182\n\nBug: 452292012\nBug: 452053710\nChange-Id: I2bbd1cf7958f143437a25f74cda485c90f1c8fd1\n"
    },
    {
      "commit": "bd56c6aed232bbb425832f54311a48f453cb9c2b",
      "tree": "e79d29864b635a3fc3e640a56adabaf874246bb8",
      "parents": [
        "884308742ac50e4151c5e16470db65c046657c95"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Oct 14 05:59:38 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Tue Oct 14 05:59:38 2025 +0200"
      },
      "message": "Fix ./configure.py script.\n\nA previous CL broke the script, so this fixes it.\n\n+ Remove a compiler warning detected when running `./configure.py --bootstrap`.\n\nChange-Id: Iaf759199f05f5cc237de73851f76bf3f39af5718\n"
    },
    {
      "commit": "884308742ac50e4151c5e16470db65c046657c95",
      "tree": "0ca867b38e38918dcb06d50ebf1e5d8eebc44ec4",
      "parents": [
        "de41a4fbc57af0351536efeeac18afc6f076978d"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sun Oct 12 20:56:17 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:36:11 2025 +0200"
      },
      "message": "depfile_parser.in.cc: Add support for filenames with ampersands/quotes\n\nUpstream also remove the comparison operator for the empty\nDepfileParserOptions struct.\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2590\nBug: 447101276\nChange-Id: Ic15ac3f4582ff19dce6894e814c06bde4f14fe92\n"
    },
    {
      "commit": "de41a4fbc57af0351536efeeac18afc6f076978d",
      "tree": "dac529ed073838ec3acf2d713d0c59d40f55a59f",
      "parents": [
        "2eed718cd6c9d2073eb48d08b04dcd39ad2d5fb6"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sun Oct 12 20:37:29 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:36:04 2025 +0200"
      },
      "message": "Bring misc/output_test.py closer to upstream\n\nBug: 447101276\nChange-Id: I535592105a025b3e7822b1f2eb88ea2dcbdbcadb\n"
    },
    {
      "commit": "2eed718cd6c9d2073eb48d08b04dcd39ad2d5fb6",
      "tree": "efd829e1d6f6ac34fdaa0748042dbffed7eaa621",
      "parents": [
        "237f1571c6c2d3550ea9178a4ea0f09464d6682d"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sun Oct 12 20:24:07 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:35:51 2025 +0200"
      },
      "message": "Update DiskInterface to upstream changes.\n\nMost notably the WriteFile() function now takes an additional\nthird argument. The rest are mostly changes to use override\nwhen defining virtual methods in derived classes.\n\nFuchsia-Only: Closer to upstream\nBug: 447101276\nChange-Id: I62e78ae11c4b8f6cc0128b93cb5737ec317916e4\n"
    },
    {
      "commit": "237f1571c6c2d3550ea9178a4ea0f09464d6682d",
      "tree": "d694cf965c08c923cdf3ce94c5b21ca2880eb379",
      "parents": [
        "1f5fd1e0e0516a0fdf7aaf3cfb526a622ab9fd3b"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sun Oct 12 14:58:52 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:35:37 2025 +0200"
      },
      "message": "Get FunctionCast\u003c\u003e from upstream\n\nFuchsia-Only: Closer to upstream\nBug: 447101276\nChange-Id: I568b7a1f0a230fa67e8308284d62469a55557616\n"
    },
    {
      "commit": "1f5fd1e0e0516a0fdf7aaf3cfb526a622ab9fd3b",
      "tree": "0984cb3576b9ad5a4b8ae1c6e380bdcc68be43b5",
      "parents": [
        "08ef6d708d45d921aaed64914e7932746b4fa1ce"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sun Oct 12 14:40:09 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:35:21 2025 +0200"
      },
      "message": "Get `compb-targets` tool from upstream\n\n+ Add GetWorkingDirectory() to util.h\n\nFuchsia-Only: Closer to upstream\nBug: 447101276\nChange-Id: I6b239dd3a4c7ec8b0a428b294e10fd9665c3b196\n"
    },
    {
      "commit": "08ef6d708d45d921aaed64914e7932746b4fa1ce",
      "tree": "c1599dfab0d40ccff44322e7810049ec7146c28e",
      "parents": [
        "dc127d1f419c316a466fd2e986128b2cdee36fac"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sun Oct 12 14:18:55 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:34:39 2025 +0200"
      },
      "message": "Add platformAwareUnlink()\n\nIt replaced unlink() to fix a VS2022 build issue\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2556/files\nFuchsia-Only: Closer to upstream\nBug: 447101276\nChange-Id: I46005c801db4ae57e532c57ab11f61a235514815\n"
    },
    {
      "commit": "dc127d1f419c316a466fd2e986128b2cdee36fac",
      "tree": "0c67fb2e8a74d8578bb0a497be99aedbbd8e34c2",
      "parents": [
        "26495acc0fb76a905320d43efd14b5e365250846"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sun Oct 12 14:10:29 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:34:29 2025 +0200"
      },
      "message": "Add support for cgroup2 in CPU quote parsing\n\nUpstream-Github-PR: https://github.com/ninja-build/ninja/pull/2591\nFuchsia-Only: Closer to upstream\nBug: 447101276\nChange-Id: I057a43aeb0222973c4ec2d8cc76d067e66197529\n"
    },
    {
      "commit": "26495acc0fb76a905320d43efd14b5e365250846",
      "tree": "4578bc88735672360c11aa212e4cea8f6e169db6",
      "parents": [
        "46eabd307e1ef6a9c4eeb847e50c004155f3e748"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Oct 11 20:58:43 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:34:09 2025 +0200"
      },
      "message": "Import minor upstream changes\n\nMinor modifications that do not impact the Fuchsia build but\nmake our tree closer to upstream\n\nFuchsia-Only: Closer to upstream\nBug: 447101276\nChange-Id: I49b3ba7faecc51b1240bb3e8a453fcd32db4c27c\n"
    },
    {
      "commit": "46eabd307e1ef6a9c4eeb847e50c004155f3e748",
      "tree": "b611ebb0b5c585e936b705351e4129bfcf285932",
      "parents": [
        "797f6e35058dd80ca5e32cbbd024b5c9bbb3532b"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Oct 11 20:52:13 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:34:03 2025 +0200"
      },
      "message": "Change .github directory to match upstream\n\nThis is completely ignored by the Fuchsia LUCI recipe\n\nFuchsia-Only: Getting closer to upstream\nBug: 447101276\nChange-Id: I8172edc40d5f4327ed29a3d2ed0ba0d6e249f9ea\n"
    },
    {
      "commit": "797f6e35058dd80ca5e32cbbd024b5c9bbb3532b",
      "tree": "e3974d4737778c7d1283a279e11e23c63e12d0e4",
      "parents": [
        "6a2668565aabdefd502aa64efa4b56b670b8f8ba"
      ],
      "author": {
        "name": "David \u0027digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sun Oct 12 14:25:06 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 13 17:33:55 2025 +0200"
      },
      "message": "Add \u003ccstdint\u003e include in src/edge_weights.h\n\nThis is required to fix the mingw cross-compilation build\nwhen using `build-ninja.sh --mingw64` on Linux\n\nChange-Id: I97f3bbcfff2f7f2645e50c916cb8a77169eba60f\n"
    },
    {
      "commit": "6a2668565aabdefd502aa64efa4b56b670b8f8ba",
      "tree": "f9f842bc57200ccfc232956e9f2eb2d575de1b5e",
      "parents": [
        "39524ead7bcd20d8cf8b6ff6f30614c7e2e73a0c"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Oct 10 11:01:54 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Oct 10 11:01:54 2025 +0200"
      },
      "message": "build-ninja.sh: Create compile_commands.json symlink.\n\nTell CMake to create a compile_commands.json in the build directory,\nthen update a top-level symlink after the build. Note that this\nfile is already listed in .gitignore.\n\n+ Remove a few shellcheck warnings, which complains about CFLAGS\n  being redefined in sub-shell (and potential losses when using\n  the non-sub-shell value later).\n\nChange-Id: Ib36a0f6c210db3636af05f3be5d623499ff16f2b\n"
    },
    {
      "commit": "39524ead7bcd20d8cf8b6ff6f30614c7e2e73a0c",
      "tree": "972429dadee218786411f441ec746c14a3e40a49",
      "parents": [
        "f7d9603b184b946c0d612d61f06cbc4ae3f6977d"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 09 10:34:52 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Fri Oct 10 09:52:54 2025 +0200"
      },
      "message": "Refactor temporary Status instance management.\n\nIn order to minimize the changes in src/ninja.cc from upstream,\nmove the definition of Status state management classes to\nseparate files.\n\n- status_listener_group.h: Add a new base StatusListenerInstaller\n  that provides common logic to temporarily install a new\n  Status instance within a StatusListenerGroup, and uninstall\n  it automatically on destruction.\n\n- Move *State classes to the corresponding source file\n  implementing the corresponding Status instance, and only\n  expose a simple factory function for them in the corresponding\n  header. I.e.:\n\n    ChromeTracingState -\u003e InstallNewChromeTracingStatus()\n    BuildEventStreamState -\u003e InstallNewBuildEventStreamer()\n    ResultStoreStreamState -\u003e InstallNewResultStoreStreamer()\n    ErrorLoggingState -\u003e InstallNewErrorLoggingStatus()\n\nBug: 447101276\n\nChange-Id: I64c455b765357cd4aa875634def41329e2059850\n"
    },
    {
      "commit": "f7d9603b184b946c0d612d61f06cbc4ae3f6977d",
      "tree": "4385ab1b715eddf7abd3993785176735d2863cd6",
      "parents": [
        "ae27f63bc27873c38cc2ac123259efa96a6f9547"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 09 10:21:50 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 09 10:23:29 2025 +0200"
      },
      "message": "Move FileOrGzipOutputStream definition.\n\nMove the class declaration and definition to output_stream_gzip.{h,cc}\nto minimize the changes to src/ninja.cc compared to upstream. And\nadd unit-tests for the class.\n\nBug: 447101276\nChange-Id: I349e3060ac66f0e9ee34ec8e15f01373a90df2dc\n"
    },
    {
      "commit": "ae27f63bc27873c38cc2ac123259efa96a6f9547",
      "tree": "ea6cf83dc4ead0a084be273c3eaf6f426121e360",
      "parents": [
        "d8efd4e01c5bf4a01dd29369ac4165cffce2a9c8"
      ],
      "author": {
        "name": "Mikhail f. Shiryaev",
        "email": "mr.felixoid@gmail.com",
        "time": "Tue Dec 03 15:51:23 2024 +0100"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 09 10:00:32 2025 +0200"
      },
      "message": "Minor fixes to get closer to upstream.\n\n- Remove unused includes.\n\n- Pass result.status instead of ExitFailure to\n  Status listeners (e.g. BES output).\n\n- Change subprocess_test.cc checks to match upstream\n  (same behavior).\n\nBug: 447101276\nChange-Id: Ic5b965324e66744baea01eca4e1f8cef7c4f9537\n"
    },
    {
      "commit": "d8efd4e01c5bf4a01dd29369ac4165cffce2a9c8",
      "tree": "535c1c97ea074978b34320fbd112c60aa711c772",
      "parents": [
        "aa2f0eb5aff517a0aa88981e54576263307062fe"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 06 19:41:47 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Thu Oct 09 08:31:38 2025 +0200"
      },
      "message": "Always stores the error log in `.ninja_errors.log`\n\nChange the default value of BuildConfig::error_logging_output\nto `.ninja_errors.log` to always write the structured error\nlog at the end of the build.\n\nThe log is always pretty small, in comparison to the build\nlog (and even the deps one), and always having it enabled\nwill simplify changes to the Fuchsia build system and infra\ntools.\n\nThis will help write a new Fuchsia build tool (e.g. `fx last-build-errors`)\nto reprint the errors from the last build. Infra recipes could\nalso be modified to display the errors directly in builder\u0027s\nLUCI pages, instead of having to hunt for them in the\ngenerally huge build log.\n\nBug: 450230569\nFuchsia-Only: developer tools\nChange-Id: I3687fe0275e0a2ad0a1d55e17e3dbf477309513f\n"
    },
    {
      "commit": "aa2f0eb5aff517a0aa88981e54576263307062fe",
      "tree": "0efa2fb28e893884627747ef1cd6d9c6a2d01ebe",
      "parents": [
        "42fe0035de78dc51d771c511bed1abe390b3d47d",
        "e234cf41b8e435a888281eb6aa9d61009f02dac1"
      ],
      "author": {
        "name": "CQ Bot",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Oct 08 13:07:21 2025 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Oct 08 13:07:21 2025 -0700"
      },
      "message": "Merge \"[edge_weights] Add support for configuring edge weights\" into main"
    },
    {
      "commit": "e234cf41b8e435a888281eb6aa9d61009f02dac1",
      "tree": "c5a37ba77f188ead07a155d92724eec1d9968151",
      "parents": [
        "1ab0e2f29818ecfc2b2ded65c463e236bf214972"
      ],
      "author": {
        "name": "Aaron Wood",
        "email": "aaronwood@google.com",
        "time": "Fri Oct 03 12:56:40 2025 -0700"
      },
      "committer": {
        "name": "Aaron Wood",
        "email": "aaronwood@google.com",
        "time": "Wed Oct 08 12:45:45 2025 -0700"
      },
      "message": "[edge_weights] Add support for configuring edge weights\n\nAdd an option to take edge weights from a file, instead of from\nassuming that all edges are equal weight.  This file could be\nhand-generated, or produced by a rule-generator such as GN.\n\nBy providing edge weights, Ninja can schedule long-running\njobs earlier in the build, to reduce overall build times.\n\nFuchsia-Topic: edge-weights\n\nChange-Id: I22000da1d4b00af4bda6a303f0a37f86542c6755\n"
    },
    {
      "commit": "42fe0035de78dc51d771c511bed1abe390b3d47d",
      "tree": "38d0a51438606ec8692a82b7d39a9f8d956987ba",
      "parents": [
        "ac3000bfe90facbe3f80a70ee2fae95b2547205d"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Oct 04 10:24:25 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 08 19:29:24 2025 +0200"
      },
      "message": "SubprocessSet: Handle console processes with SIGCHLD on Posix.\n\nA minor refactor of the SubprocessSet class to use SIGCHLD\nto detect when console processes terminate, instead of relying\non the pipe handle (which was never written to).\n\nThis matches https://github.com/ninja-build/ninja/pull/2550\nwhich introduced the change to avoid issues with console\ncommands that spawn background processes.\n\n+ Minor cleanups in subprocess-win32.cc\n\nBug: 447101276\nFuchsia-Only: Getting closer to upstream\nChange-Id: I57b36caed8167593db95a65e5f7e1cae72ec170b\n"
    },
    {
      "commit": "ac3000bfe90facbe3f80a70ee2fae95b2547205d",
      "tree": "8e0bdbfd8fee2e91a32635821cb888e759e17c77",
      "parents": [
        "32101c08d1b2d28980633217583526443fb179b2"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Oct 04 10:40:13 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 08 19:29:24 2025 +0200"
      },
      "message": "AsyncLoop: Add AsyncSigChild class.\n\nAdd a new async class used to catch SIGCHLD signals being\ndelivered to the process, i.e. when one or more children processes\nhave stopped.\n\nThis is necessary to match upstream\u0027s behavior introduced in\nhttps://github.com/ninja-build/ninja/pull/2550.\n\nThis CL requires changing how the Posix AsyncLoop handles signals\nin ways that can no longer rely on the InterruptCatcher class.\nSee the SignalsCatcher class introduced in async_loop-posix.h.\n\nBug: 447101276\nFuchsia-Only: Getting closer to upstream.\nChange-Id: Ie012844b0d1d5086e0d6684d4cecba0021abc91a\n"
    },
    {
      "commit": "32101c08d1b2d28980633217583526443fb179b2",
      "tree": "5dc51b4626f995b5d441bee391617fd88e892185",
      "parents": [
        "8f682f7695241473d18df933657b2035c80c556c"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 08 08:52:58 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 08 18:24:24 2025 +0200"
      },
      "message": "Fix build-ninja.sh with --allocator\u003drpmalloc\n\nUpdate the rpmalloc source revision being used, since the\ncurrent one\u0027s configure.py script crashes at runtime because\nit used the `pipes` module that has been removed from Python3.\n\nThe newest version uses `shlex` instead. Upstream commit:\nhttps://github.com/mjansson/rpmalloc/commit/89e9a46618f266f8f82668e87fc16f2fef992a73\n\nThere is no notable difference in performance.\n\nFuchsia-Only: Developer tools\nChange-Id: I62c532559dd304931ad0cba7e480d82b616572c1\n"
    },
    {
      "commit": "8f682f7695241473d18df933657b2035c80c556c",
      "tree": "c75d5ee90478112c4e160ddf9cd9429bcc38b2be",
      "parents": [
        "b3a7ef084391f23584811043da3b8c936244ecbf"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 08 18:05:36 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Oct 08 18:05:36 2025 +0200"
      },
      "message": "Remove USE_KQUEUE from the Fuchsia Ninja source tree.\n\nWhile kqueue() / kevent() is a much nicer interface than\nppoll() or pselect(), the latter works on MacOS sufficiently\nwell, and this keeps our source tree closer to upstream.\n\nI just spent far too much time trying to refactor the kqueue()\nbased code to support SIGCHLD properly in async_loop-posix.h\nfor a future CL, and it\u0027s just too much code to maintain and\nrebase for too little benefits over the long term.\n\nMaybe I\u0027ll upload kqueue() support back upstream some day,\nbut for now our life is simpler without it.\n\nBug: 447101276\nFuchsia-Only: not used upstream\nChange-Id: I3e31bfa57416aa5d3196717e97498f2e3ee803fa\n"
    },
    {
      "commit": "b3a7ef084391f23584811043da3b8c936244ecbf",
      "tree": "f767bde10e4f7fbbb7b02d063d0c70304330c681",
      "parents": [
        "bce803b196fa885eddf74d6505eac172bd389dc8"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Oct 04 10:18:13 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 06 15:26:15 2025 +0200"
      },
      "message": "subprocess.h: Fix completed process exit code.\n\nFixes a small bug where ExitFailure was always returned when\na subprocess completed with an error (i.e. non-0 status). This\nensures that the status itself is returned, and on Posix, if\nit was interrupted by a non-interruption signal, 128+status\nis returned instead.\n\nThis matches upstream https://github.com/ninja-build/ninja/pull/2540\nwhich was implemented in our tree (e.g. in src/ninja.cc), except for\nthese bits because our subprocess code was so different.\n\nBug: 447101276\nFuchsia-Only: Getting closer to upstream.\nChange-Id: I4729f3770df382ff33f5231d4e9416a8e87cf303\n"
    },
    {
      "commit": "bce803b196fa885eddf74d6505eac172bd389dc8",
      "tree": "af2665dc74673a78754e3245baca3181416b6693",
      "parents": [
        "44a67f45a1e26bb8c57fdcd0a51f6e9134f163f5"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Oct 04 00:19:03 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 06 11:41:55 2025 +0200"
      },
      "message": "Refactor AsyncLoop and associated classes.\n\nSimplify the implementation of AsyncHandle and AsyncTimer\nand the code used to support them by forcing call sites to\nuse std::unique_ptr\u003c\u003e values for these.\n\nThis removes declarations and support code in async_loop.cc\nthat are no longer necessary.\n\nImplementation classes are trivially renamed from\nAsyncHandle::State to AsyncHandleImpl.\n\nOne notable drawback: since implementation classes are now\nvirtual. For Windows, the `overlapped_` buffer is no longer\nat the start of the instance in memory, thus a simple\n`reinterpret_cast\u003c\u003e` no longer works. See the\n`AsyncHandleImpl::FromOverlappedPtr()` method in\nsubprocess-win32.cc.\n\nBug: 447101276\nChange-Id: I2c1e40cce03ce665d805a1c1a6c0efd2289a4b76\n"
    },
    {
      "commit": "44a67f45a1e26bb8c57fdcd0a51f6e9134f163f5",
      "tree": "44514b8aed09d6a8da703f23770a41a7d69c1616",
      "parents": [
        "538d41528139bc4b32fa5b31c5107c1845b9385a"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Oct 04 11:16:45 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 06 11:41:45 2025 +0200"
      },
      "message": "Remove misc compiler warnings\n\nAs they appear on the Windows Fuchsia builders:\n\n- ipc_service_test.cc: Remove unused functions.\n- json_writer.cc: Remove unused variables.\n- resulstore_streamer.cc: Wrap variables used only\n  in assert() inside #ifndef NDEBUG .. #endif block.\n- util.cc: Fix signed / unsigned comparison warning.\n\nBug: 447101276\nChange-Id: I68a25ba2197cc71e7f41e15060335aa1384c50a8\n"
    },
    {
      "commit": "538d41528139bc4b32fa5b31c5107c1845b9385a",
      "tree": "9c1feabe3a49717e1db5bc00242621fe6bf37763",
      "parents": [
        "fac4238a3d88d778333f7a1117446688e41bb3c6"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Oct 04 10:49:24 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 06 11:41:38 2025 +0200"
      },
      "message": "ninja.cc: Rename --jobserver to --jobserver-pool\n\nTo match upstream, rename the --jobserver flag to --jobserver-pool.\nNote that --jobserver is still supported as a deprecated alias, to\navoid breaking existing builds, but will be removed in the future.\n\nBug: 447101276\nFuchsia-Only: Getting closer to upstream\nChange-Id: Ia7482c8ec608c7d1ad4c5d5702776a24950b586c\n"
    },
    {
      "commit": "fac4238a3d88d778333f7a1117446688e41bb3c6",
      "tree": "0a9745058bd82ef2d4c6c7a107e7dd66e6b03946",
      "parents": [
        "1ab0e2f29818ecfc2b2ded65c463e236bf214972"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Sat Oct 04 00:03:00 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Oct 06 11:41:27 2025 +0200"
      },
      "message": "Move RealCommandRunner to its own source file.\n\nTo better match upstream and make a future rebase easier:\n\n- Move the RealCommandRunner implementation to its own\n  source file under src/real_command_runner.cc.\n\n- Use explicit std:: namespace prefixes in the new file.\n\n- Pass ownership of the Jobserver::Client instance to\n  the Builder in src/ninja.cc to match upstream code.\n\nBug: 447101276\nFuchsia-Only: Getting closer to upstream\nChange-Id: Id9d4fa7a58a14f9bc6b2fc7ea0b655e0a3424794\n"
    },
    {
      "commit": "1ab0e2f29818ecfc2b2ded65c463e236bf214972",
      "tree": "c7bc93f7f3baa3ac22e4180117bbafc77450e285",
      "parents": [
        "0a6b7f336e2c3bc1380fe8d38607fae6247841c0"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Aug 13 12:06:29 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Aug 13 12:10:24 2025 +0200"
      },
      "message": "Improve the --error_logging JSON schema\n\nChange the schema of the --error_logging JSON output in the following\nway:\n\n- Output an object instead of an array.\n\n- Add a \"version\" key describing the schema version. For now\n  only value 1 is supported.\n\n- Add an optional \"build_metadata\" key which replicates the\n  build metadata of the current invocation. This will be useful\n  to associate the Ninja output file with other build outputs\n  (e.g. Bazel error logs).\n\n- Add the \"failures\" key, whose value is a list of failed\n  command entries, using the old schema.\n\nFuchsia-Topic: error-logging\nChange-Id: I113430d52745658b5e71333085935a81d49db077\n"
    },
    {
      "commit": "0a6b7f336e2c3bc1380fe8d38607fae6247841c0",
      "tree": "63b4160407b31689e20c3cfd1bdd890e40065298",
      "parents": [
        "d099b636b45da6e171d2bcd166cc8142c0fe098b"
      ],
      "author": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Wed Jul 23 19:38:10 2025 +0200"
      },
      "committer": {
        "name": "David \u0027Digit\u0027 Turner",
        "email": "digit@google.com",
        "time": "Mon Aug 11 10:41:43 2025 +0200"
      },
      "message": "Add --error_logging_output\u003dFILE option.\n\nAdd a new option to generate a JSON file that contains an array\nof objects describing failed commands and their outputs (when they\ndo not belong to the console pool). See src/status_to_error_log.h\nfor the schema description.\n\n+ Add JsonWriter::Normalize() to simplify tests that compare\n  JSON strings generated by JsonWriter with pretty / indented\n  golden JSON content.\n\nChange-Id: I0d314e26061908bf6157cdd7faaa14183206177a\n"
    },
    {
      "commit": "d099b636b45da6e171d2bcd166cc8142c0fe098b",
      "tree": "02c6e6d3055dccd5afed2542ff316279b4131a46",
      "parents": [
        "d5373a79a9f4903f069f38ee9a52216502ea119d"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Aug 01 23:24:19 2025 +0000"
      },
      "committer": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Aug 07 22:55:04 2025 +0000"
      },
      "message": "[bes] Write build.log as invocation log\n\nWrite ninja\u0027s stdout/stderr output as a special \u0027build.log\u0027\nrecognized by the ResultStore API.\nThis should appear under Build Log and Invocation Artifacts\nin the ResultStore UI.\n\nresultstore_streamer.cc:\nPostpone FinalizeInvocation to destruction time to give\nNinjaMain an opportunity to post final messages to stdout/stderr\nwhich will make it into the invocation \u0027build.log\u0027.\n\nFuchsia-Topic: build-event-stream\nBug: 369980343\nChange-Id: Ie3a20619351395f7bfd718f0a8b34f8c56d800c9\n"
    },
    {
      "commit": "d5373a79a9f4903f069f38ee9a52216502ea119d",
      "tree": "7c87147e1873ebc84b0ac73cead5f6a310e0dc27",
      "parents": [
        "87f13622d9c23308bd358bf234f0d3cc102b92d9"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Aug 05 18:31:50 2025 +0000"
      },
      "committer": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Aug 05 18:35:01 2025 +0000"
      },
      "message": "[status] va_copy between variadic calls\n\nstatus_listener_group.cc:\nva_list args are not usable after a single call,\nso they must be copied between multiple calls.\n\nAdd status_listener_group_test.cc unit tests.\n\nBug: 369980343\nChange-Id: I48dbe8b8c5e8ae5785d324fbb9de600727830c99\n"
    }
  ],
  "next": "87f13622d9c23308bd358bf234f0d3cc102b92d9"
}
