)]}'
{
  "log": [
    {
      "commit": "ff3f75f682a1f2511df6d2b86e8f6d68a2de4980",
      "tree": "1e99600bd4df12554b32b3a7137ac55c7b93bce8",
      "parents": [
        "931000f17dcb85e415a52597acd6a0c31649f968"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Feb 07 15:35:21 2025 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Feb 07 15:35:21 2025 -0800"
      },
      "message": "Fix n2 for rustc_hash update\n\nUpdated in android in aosp/3478945\n\nTest: cargo build \u0026\u0026 OUT_DIR\u003dout ./prebuilts/build-tools/build-prebuilts.sh --skip-go --skip-asan\nChange-Id: Ifc8ba004aad05c9b95c2a22393a99e60d0421e0d\n"
    },
    {
      "commit": "931000f17dcb85e415a52597acd6a0c31649f968",
      "tree": "df2af449e902178394edfaecb54f8cfed93026c1",
      "parents": [
        "397b3fdf5bef2cc5537eb539b168865a7fc73599"
      ],
      "author": {
        "name": "Chris Wailes",
        "email": "chriswailes@google.com",
        "time": "Mon Feb 03 12:01:53 2025 -0800"
      },
      "committer": {
        "name": "Chris Wailes",
        "email": "chriswailes@google.com",
        "time": "Mon Feb 03 12:11:20 2025 -0800"
      },
      "message": "Update code for Rust 1.83.0\n\nManual application of https://github.com/evmar/n2/commit/b7ee97e5f78781ab4c568f284c1218c3de6d3af2\n\nerror: creating a shared reference to mutable static is discouraged\n  --\u003e external/n2/src/signal.rs:14:9\n   |\n14 |         INTERRUPTED.store(true, std::sync::atomic::Ordering::Relaxed);\n   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ shared reference to mutable static\n   |\n   \u003d note: for more information, see \u003chttps://doc.rust-lang.org/nightly/edition-guide/rust-2024/static-mut-references.html\u003e\n   \u003d note: shared references to mutable statics are dangerous; it\u0027s undefined behavior if the static is mutated or if a mutable reference is created for it while the shared reference lives\n   \u003d note: `-D static-mut-refs` implied by `-D warnings`\n   \u003d help: to override `-D warnings` add `#[allow(static_mut_refs)]`\n\nerror: creating a shared reference to mutable static is discouraged\n  --\u003e external/n2/src/signal.rs:31:14\n   |\n31 |     unsafe { INTERRUPTED.load(std::sync::atomic::Ordering::Relaxed) }\n   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ shared reference to mutable static\n   |\n   \u003d note: for more information, see \u003chttps://doc.rust-lang.org/nightly/edition-guide/rust-2024/static-mut-references.html\u003e\n   \u003d note: shared references to mutable statics are dangerous; it\u0027s undefined behavior if the static is mutated or if a mutable reference is created for it while the shared reference lives\n\nTest: OUT_DIR\u003dout/ ./prebuilts/build-tools/build-prebuilts.sh\nBug: 384401387\nChange-Id: I13aa32214c4d5e2411a56d9f99123b0c746b1075\n"
    },
    {
      "commit": "397b3fdf5bef2cc5537eb539b168865a7fc73599",
      "tree": "cfb55900be234c6e9bce3e93efa356e82031e877",
      "parents": [
        "f6508e15700d3d2e87f3732693956392d3f320bd"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Aug 09 00:08:05 2024 +0000"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Aug 08 17:10:08 2024 -0700"
      },
      "message": "Revert \"Periodically recompact the n2_db\"\n\nRevert submission 3205132\n\nReason for revert: This has a bug: when switching between the bootstrap and real builds, n2 thinks that the entries belonging to the other type of build are unneeded and deletes them from the database when recompacting, causing constant reruns.\n\nReverted changes: /q/submissionid:3205132\n\nChange-Id: I3ff933eb1ba94c55c39941867d4f2a5ee9e78fc4\n"
    },
    {
      "commit": "f6508e15700d3d2e87f3732693956392d3f320bd",
      "tree": "a561b6f300425aa59a81af96d65a03a8374a9745",
      "parents": [
        "68d496504760dbd78dcbfefc839a6c41d1d89266"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Aug 06 16:05:01 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Aug 06 16:05:01 2024 -0700"
      },
      "message": "Readd setflags\n\nThis was mistakenly removed due to a warning about it being unused,\nbut it\u0027s actually used on mac os. Readd it with\n`#[cfg(target_os \u003d \"macos\")]` to avoid the warning on linux.\n\nBug: 318434287\nTest: Presubmits\nChange-Id: Idbf102cf5e1b749b74454d7dad026c7f114812da\n"
    },
    {
      "commit": "68d496504760dbd78dcbfefc839a6c41d1d89266",
      "tree": "db67ddc8e719534b6779f90e5cd79fe92b287335",
      "parents": [
        "00e3efdf7a0228246300b382bf00d5e7ed32c713"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Aug 06 14:23:06 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Aug 06 14:23:06 2024 -0700"
      },
      "message": "Use os-agnostic file size method\n\n.st_size() works on linux only, use .len() instead so it also works\non mac.\n\nBug: 318434287\nTest: cargo test\nChange-Id: I92f3eac83d13c3e6f3ae3a9aca5a75055dbb37de\n"
    },
    {
      "commit": "00e3efdf7a0228246300b382bf00d5e7ed32c713",
      "tree": "55981fbe194a3c1e8077991769097677349706c9",
      "parents": [
        "dc69be4422baeca36661c0a1d2b2323387563e3b"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Aug 02 12:31:35 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Aug 06 11:26:55 2024 -0700"
      },
      "message": "Enable lints: \"android\"\n\nThe soong rust rules by default don\u0027t run any lints in things in\nexternal/. They also only have a few possible lint sets to enable, and\nthe \"android\" one promotes all warnings as errors, and enables warnings\non public methods without documentation, so a lot of documentation\nhad to be added to enable it.\n\nBug: 318434287\nTest: Presubmits\nChange-Id: I1afcec39aa4808b51d68a3398845efaee779368f\n"
    },
    {
      "commit": "dc69be4422baeca36661c0a1d2b2323387563e3b",
      "tree": "b788f82f839c912936ac31fa893d20b9dd6491d5",
      "parents": [
        "bbcf93c31d053b5d40735bb279e9fd1c53882411",
        "ba59cd501c73b082ed2502cc0bcd7378ae54e00b"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Aug 06 18:17:58 2024 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Aug 06 18:17:58 2024 +0000"
      },
      "message": "Merge changes I18cc12ba,I7a760a6b,Iabfcb39f into main\n\n* changes:\n  Periodically recompact the n2_db\n  Add tests for phony_output\n  Improve phony behavior\n"
    },
    {
      "commit": "ba59cd501c73b082ed2502cc0bcd7378ae54e00b",
      "tree": "1031f46aeac03c984d6f89454fd9255d9a9e56fc",
      "parents": [
        "1a1841746196045d312922939b4fe65cbbb1a9cc"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Aug 01 14:36:32 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Aug 06 10:34:44 2024 -0700"
      },
      "message": "Periodically recompact the n2_db\n\nOtherwise is grows in size forever.\n\nBug: 346806628\nTest: cargo test\nChange-Id: I18cc12ba47b13fda5ac1a792deb36e255d19f829\n"
    },
    {
      "commit": "1a1841746196045d312922939b4fe65cbbb1a9cc",
      "tree": "9079be918eed183e836da159557cf7eab76c3c2e",
      "parents": [
        "be4977159ec78a9bc2237b09de3a7b7307a4cbaa"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jul 31 18:39:22 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Aug 06 10:34:32 2024 -0700"
      },
      "message": "Add tests for phony_output\n\nAlso add a missing check that a regular build can\u0027t depend on a\nphony_output build.\n\nBug: 346808410\nTest: cargo test\nChange-Id: I7a760a6bf826edcfaccb01315b50e608d96bf7a2\n"
    },
    {
      "commit": "be4977159ec78a9bc2237b09de3a7b7307a4cbaa",
      "tree": "fd308579f5a56bc1d513510aaff82dbb19c8a355",
      "parents": [
        "2d855709bf91111a71cef5768f14bb9979952f39"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jun 26 15:46:28 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Aug 06 10:34:14 2024 -0700"
      },
      "message": "Improve phony behavior\n\nNow phonies in n2 act more like ninja: real rules can depend on phonies,\nwhich acts like an alias to the phony\u0027s dependencies.\n\nBug: 346808410\nTest: cargo test\nChange-Id: Iabfcb39f10daf704ad284ecc137345a96d646dba\n"
    },
    {
      "commit": "bbcf93c31d053b5d40735bb279e9fd1c53882411",
      "tree": "e98fe08c9baf8157319f47aba3f99133a24c0446",
      "parents": [
        "2d855709bf91111a71cef5768f14bb9979952f39"
      ],
      "author": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Fri Aug 02 14:49:01 2024 -0700"
      },
      "committer": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Mon Aug 05 14:30:26 2024 -0700"
      },
      "message": "Properly handle escapes in depfile parsing\n\nMatch ninja\u0027s depfile parsing more closely.  When reading paths, from\nthe depfile, handle `$$` and `\\` escapes.\n - \"\\\" escapes certain characters.\n - \"$$\" becomes \"$\".\n\nBug: 354052615\nTest: Manual\nChange-Id: Ib6ed18f7808ec53f51c1aaabe64f8905c90201e1\n"
    },
    {
      "commit": "2d855709bf91111a71cef5768f14bb9979952f39",
      "tree": "a0fe72a5455e92da5cafcd51d7f7081e29d24a72",
      "parents": [
        "2297777653263bd5e52f432c63c2b1870461c7c0"
      ],
      "author": {
        "name": "Haamed Gheibi",
        "email": "haamed@google.com",
        "time": "Fri Jul 12 21:58:35 2024 -0700"
      },
      "committer": {
        "name": "Haamed Gheibi",
        "email": "haamed@google.com",
        "time": "Fri Jul 12 21:58:35 2024 -0700"
      },
      "message": "Add phony_output feature to build specs.\n\nBug: 346808410\nBug: 352764259\nChange-Id: I8fc7cb0dcc29ac34fb5d8f5a6bfd6df57e08f652\n"
    },
    {
      "commit": "2297777653263bd5e52f432c63c2b1870461c7c0",
      "tree": "39056055f08c15c70670cb178678209392b5d4dc",
      "parents": [
        "87aa87c90ef4b7e9d0e53d8a2cde05053cbe7e39"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Jun 20 14:22:27 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Jun 20 14:22:27 2024 -0700"
      },
      "message": "Remove debugging code\n\nThe issue was fixed.\n\nBug: 318434287\nTest: Presubmits\nChange-Id: I248d17b54aadc7d166ffca40d882ab5779aca816\n"
    },
    {
      "commit": "87aa87c90ef4b7e9d0e53d8a2cde05053cbe7e39",
      "tree": "87ae5e2cb0af16ecc6c39f9adfc27ce43cc85e15",
      "parents": [
        "c7545409e8db3671a68f282991df2ab8327423a2",
        "22b951c379980e7b07505c9e10433c690c8a34e5"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "android-test-infra-autosubmit@system.gserviceaccount.com",
        "time": "Wed Jun 19 01:25:10 2024 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Jun 19 01:25:10 2024 +0000"
      },
      "message": "Merge \"Wait for all threads to finish before exiting\" into main"
    },
    {
      "commit": "22b951c379980e7b07505c9e10433c690c8a34e5",
      "tree": "8872065ec8f6ce409505466f5896fc3aab2e2df8",
      "parents": [
        "9b4e4d86f28310c7ac64e5fc062568a1d7b9123b"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jun 18 17:04:35 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jun 18 17:04:35 2024 -0700"
      },
      "message": "Wait for all threads to finish before exiting\n\nThis is important so that we know when the build is really done,\nand I think it might fix the flake where n2 doesn\u0027t exit properly on\nCI.\n\nBug: 346806217\nTest: cargo test\nChange-Id: I766e2e2e5459f289f02b451ac95512f3d3b36cea\n"
    },
    {
      "commit": "c7545409e8db3671a68f282991df2ab8327423a2",
      "tree": "57a3825532dca0461765a1773daa0c267bd18999",
      "parents": [
        "9b4e4d86f28310c7ac64e5fc062568a1d7b9123b"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jun 18 12:20:09 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jun 18 12:20:09 2024 -0700"
      },
      "message": "Enable core dumps in the n2 process itself\n\nCore dumps don\u0027t appear to be getting generated when using\nulimit -c unlimited in the build script. Try enabling it in the n2\nprocess itself in case there\u0027s some oddity with what processes it\u0027s\nenabled for.\n\nBug: 318434287\nTest: Presubmits\nChange-Id: I407bd32c6688609b2400770bdaf7138853ad2cb4\n"
    },
    {
      "commit": "9b4e4d86f28310c7ac64e5fc062568a1d7b9123b",
      "tree": "c8b0868334869bebd08e5be1e0b966e27b60b5ba",
      "parents": [
        "a231075a372cdc7acaeb377fa78bb9134e4973b9"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jun 14 12:58:23 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jun 14 15:30:12 2024 -0700"
      },
      "message": "Kill hung n2 with SIGSEGV and collect its core dump\n\nSo that we can debug it afterwards.\n\nBug: 318434287\nTest: Manually\nChange-Id: I64fbbdfdba5ea085c1051ea03805abbb85651e2d\n"
    },
    {
      "commit": "a231075a372cdc7acaeb377fa78bb9134e4973b9",
      "tree": "a36427359edd239acffb6a9ddc5946abe68ccade",
      "parents": [
        "a6d3338e5e81a3f440f67e82e849fbe5fa8fbdab"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Jun 13 15:46:37 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Jun 13 15:46:37 2024 -0700"
      },
      "message": "Log the start and end of the n2 command in build_fails_when_validation_fails\n\nJust to confirm that the n2 command is not exiting.\n\nBug: 318434287\nTest: build/soong/soong_ui.bash --make-mode --soong-only --skip-config n2 out/soong/host/linux-x86/nativetest64/n2_e2e_tests/n2_e2e_tests \u0026\u0026 N2_PATH\u003dout/soong/host/linux-x86/bin/n2 out/soong/host/linux-x86/nativetest64/n2_e2e_tests/n2_e2e_tests --nocapture --test-threads 1\nChange-Id: I33f2898e26122066fd3909922e07a795f7086ecf\n"
    },
    {
      "commit": "a6d3338e5e81a3f440f67e82e849fbe5fa8fbdab",
      "tree": "e0f7a9f1d93ac3bb4ba155396ef84d7426b23512",
      "parents": [
        "8411de130a28e0f832b9e4814721c0a539b4529f"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jun 12 10:02:48 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jun 12 10:02:48 2024 -0700"
      },
      "message": "Replace std::process::exit with ExitCode\n\nstd::process::exit\u0027s documentation warns about it having a unclean\nshutdown. Particuarly it says destructors on other threads won\u0027t be\nrun, which I think could cause n2\u0027s detached threads to not be cleaned\nup, and cause n2 to hang forever. It recommends using ExitCode instead\nfor better cleanup, switch to that to see if it fixes the ci flake.\n\nBug: 318434287\nTest: cargo test\nChange-Id: I9de83643d05e0f331b4b7d853e997810d148768f\n"
    },
    {
      "commit": "8411de130a28e0f832b9e4814721c0a539b4529f",
      "tree": "26f1ca96b6e0f7b3b202c0120b387940b765b3a3",
      "parents": [
        "0be4524105303ef1be048459b1ebb9f02f8a3628"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jun 11 16:42:23 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jun 11 16:42:23 2024 -0700"
      },
      "message": "Add more logging\n\nIn an attempt to find the bug where n2 flakily hangs forever.\n\nBug: 318434287\nTest: cargo test\nChange-Id: I664e30e76862e798b369d3594283df06f8f6ea57\n"
    },
    {
      "commit": "0be4524105303ef1be048459b1ebb9f02f8a3628",
      "tree": "5ee281c8bffc1ddfb9928778d81db993d624494f",
      "parents": [
        "9edd3976ad9433caff47076945dc36b8ea9e578f"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jun 11 12:13:18 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jun 11 13:41:46 2024 -0700"
      },
      "message": "Add logging and enable logging in failing test\n\nbuild_fails_when_validation_fails is flakey on CI, add logging to\nattempt to debug issue.\n\nBug: 318434287\nTest: cargo test\nChange-Id: I93bb100cec05224d95d60f572cfa2baaec011464\n"
    },
    {
      "commit": "9edd3976ad9433caff47076945dc36b8ea9e578f",
      "tree": "530deacbf3276559552bf498c503d9273f9f6f77",
      "parents": [
        "fa0d805aaf457c90939cae88777690f2680cdf49"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Mon Jun 10 11:28:28 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Mon Jun 10 11:28:28 2024 -0700"
      },
      "message": "Use jemalloc on linux only\n\nThis is consistent with ninja, it appears we don\u0027t have a working\njemalloc build for mac.\n\nBug: 318434287\nBug: 346330468\nBug: 346329947\nTest: presubmits\nChange-Id: I49dab1a35320eaa7c36fce69f371f244b7425a6e\n"
    },
    {
      "commit": "fa0d805aaf457c90939cae88777690f2680cdf49",
      "tree": "48a17ce685ad311b2f67dccb6afa2514e24a09b5",
      "parents": [
        "8b94724c07052c00a66ba542c753f7898f82e466",
        "a276e3ea530a1d5c35db481c400058f888ed3709"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jun 07 19:00:11 2024 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Jun 07 19:00:11 2024 +0000"
      },
      "message": "Merge \"Assert output files exist\" into main"
    },
    {
      "commit": "8b94724c07052c00a66ba542c753f7898f82e466",
      "tree": "fff7612f5dbbe63e9df8aa2531c997596315a7b3",
      "parents": [
        "d6965ab02a137098cfdf894efb720a45a0a91058",
        "77878140070176e373ebf70ade657178ecc9ee38"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jun 07 18:53:40 2024 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Jun 07 18:53:40 2024 +0000"
      },
      "message": "Merge \"Add multithreaded reading of the n2 db\" into main"
    },
    {
      "commit": "d6965ab02a137098cfdf894efb720a45a0a91058",
      "tree": "6f040a82b103c4a0ca001e3ada0297714971cf28",
      "parents": [
        "d82c50fd2fad1c30b8051a62720e6df0f7395768",
        "5a6642ca0568f37db0cc6416cb122586f1cd9af2"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jun 07 18:30:27 2024 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Jun 07 18:30:27 2024 +0000"
      },
      "message": "Merge \"Enable jemalloc\" into main"
    },
    {
      "commit": "a276e3ea530a1d5c35db481c400058f888ed3709",
      "tree": "defad981b4c0452a85b5596e9c1718eceed94c00",
      "parents": [
        "5a6642ca0568f37db0cc6416cb122586f1cd9af2"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Jun 06 17:47:57 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Jun 06 17:53:40 2024 -0700"
      },
      "message": "Assert output files exist\n\nThis recreates ninja\u0027s equivalent of \u0027-w missingoutfile\u003derr\u0027.\nI didn\u0027t bother to make the flag though because android always sets\nit.\n\nThis causes some failures in the android build when building .PHONY\ntargets from kati, because we don\u0027t support phony_output yet. The\nmain build still works though. (though there\u0027s more stuff related\nto phonies that I still need to look into)\n\nBug: 318434287\nTest: cargo test\nChange-Id: I26d9e4ec35b4a48c7aa7c85626f733734ae79429\n"
    },
    {
      "commit": "d82c50fd2fad1c30b8051a62720e6df0f7395768",
      "tree": "03e83e6adfc84557ae6a407377967142062d5490",
      "parents": [
        "fa63b620369eda5ef405c51c79a573709a8c4495"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jun 05 17:47:56 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jun 05 17:47:56 2024 -0700"
      },
      "message": "Lookup bindings from the build before the rule\n\nI think this is an unintuitive lookup order, but it appears to be\nwhat android\u0027s ninja uses:\nhttps://android.googlesource.com/platform/external/ninja/+/8bdfb2cefbf380d69cde30bed1489c95987552d8/src/graph.cc#568\n\nThis doesn\u0027t seem to affect the actual build at all, but previously,\nn2 was displaying different action descriptions than what ninja was.\nThis is somewhat surprising, but I guess it\u0027s relatively rare to have\nthe same binding on both the build and the rule, and it was mostly\nlocalized to descriptions in our case.\n\nBug: 318434287\nTest: Building android with n2, see proper descriptions\nChange-Id: I0fd6d4d51352a5e086abd013fa3506702ee0ebca\n"
    },
    {
      "commit": "5a6642ca0568f37db0cc6416cb122586f1cd9af2",
      "tree": "54613344896a5d281eec3a1d3a32bbac62bfb86c",
      "parents": [
        "fa63b620369eda5ef405c51c79a573709a8c4495"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Mon May 13 16:50:56 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jun 05 16:21:23 2024 -0700"
      },
      "message": "Enable jemalloc\n\nThe jemallocator and jemalloc-sys crates were renamed upstream to\nhave the tikv- prefix, but they\u0027re otherwise the same crates.\n\nBug: 318434287\nTest: Presubmits\nChange-Id: If97cda70963c752084efbfbfdbc54a21d0c0bcac\n"
    },
    {
      "commit": "77878140070176e373ebf70ade657178ecc9ee38",
      "tree": "f16ab5aca4f3faff82c1f3a9fc800df825ecde00",
      "parents": [
        "fa63b620369eda5ef405c51c79a573709a8c4495"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Mon Jun 03 11:24:53 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jun 05 12:05:43 2024 -0700"
      },
      "message": "Add multithreaded reading of the n2 db\n\nThis takes the reading from ~1.1 seconds down to ~0.6 seconds on\nAOSP main, without jemalloc. (jemalloc should improve it further)\n\nThe implementation I went with is a little different than the\nimplementation in the android ninja fork: in n2, we divide the database\ninto fixed-size chunks. When writing a record, if there\u0027s not enough\nspace left in the chunk, the remainder of the chunk will be padded with\nzeros. In android\u0027s ninja, there are no fixed size chunks, but logic\nthat attempts to find the boundaries of records via a series of\nheuristics that are not guaranteed to be correct.\n\nTest: cargo test\nBug: 318434287\nChange-Id: Ic3091dc29f48288715302215567cef681d284594\n"
    },
    {
      "commit": "fa63b620369eda5ef405c51c79a573709a8c4495",
      "tree": "9a0386c966130181953aa6f9ddb34e45b1108692",
      "parents": [
        "f0f1120284b7fd9428b570e3dbfa5aa3f4ec3b2a"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue May 28 18:20:44 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue May 28 18:20:44 2024 -0700"
      },
      "message": "Add targets tool\n\nThis tool is used by android\u0027s checkbuild builds.\n\nBug: 318434287\nTest: cargo test\nChange-Id: I066560b80c609ca45c99c0a93cbefde671b69f86\n"
    },
    {
      "commit": "f0f1120284b7fd9428b570e3dbfa5aa3f4ec3b2a",
      "tree": "299657fc7f8eb8841953c9c4fee6f20b460a9edd",
      "parents": [
        "a668ceca6e52016a124c336f0373a04d56a9eed5",
        "7a2677a355c45e8529cb15b0ca7ba268bb4e8499"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "android-test-infra-autosubmit@system.gserviceaccount.com",
        "time": "Tue May 28 19:00:58 2024 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue May 28 19:00:58 2024 +0000"
      },
      "message": "Merge \"Make tracing thread-safe\" into main"
    },
    {
      "commit": "7a2677a355c45e8529cb15b0ca7ba268bb4e8499",
      "tree": "5f4b45d1d1b9c92837521557caea38763c7e43ce",
      "parents": [
        "fa380f57e373d61f3633ad579d87ba4c742c362e"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed May 22 16:51:50 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed May 22 16:51:50 2024 -0700"
      },
      "message": "Make tracing thread-safe\n\nPreviously, a mutable global variable was used to control the trace\nfile. This was fine when n2 was largely singlethreaded, but now that\nthe parsing is mulithreaded it produces invalid json files.\n\nInstead of writing to a file immediately, just keep the trace events\nin a global ConcurrentLinkedList until the end of the program. This\nisn\u0027t very good from a memory perspective, we may consider guarding\nthe file behind a lock instead. But since tracing is only for developer\ndebuging, this should be fine. Soong will also create it\u0027s own trace\nfor the actions, we only really need the n2 trace for parse time\nanalysis.\n\nBug: 318434287\nTest: m nothing, check trace file\nChange-Id: I3105a56d0eb24c3bf166f4139483a7ae58893f4c\n"
    },
    {
      "commit": "a668ceca6e52016a124c336f0373a04d56a9eed5",
      "tree": "587336e499fae2c018c53b4438f6c72bac77588f",
      "parents": [
        "fa380f57e373d61f3633ad579d87ba4c742c362e"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed May 22 14:54:59 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed May 22 14:54:59 2024 -0700"
      },
      "message": "Flush frontend file after every message\n\nIf the buffer wasn\u0027t filled, the proto wouldn\u0027t be written out\nto the frontend file till the next message. The \"Analyzing Android.bp\nfiles and writing build actions...\" message is an action that takes\na long time, and is the only action running at that point, so it will\nnot be pushed out of the buffer by another message until it\u0027s finished\nrunning.\n\nBug: 318434287\nTest: m nothing\nChange-Id: Ib3b9b4603c3cbc3f01d4ec9dfc807dbfe80beadc\n"
    },
    {
      "commit": "fa380f57e373d61f3633ad579d87ba4c742c362e",
      "tree": "52792e40969148867882261d48d027124b71cd7f",
      "parents": [
        "1213947699f1469bc29315955ba3c10d3a60c8b4",
        "f0554a52d0614b154f633773dcb43a04c3677bd2"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue May 21 18:15:25 2024 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue May 21 18:15:25 2024 +0000"
      },
      "message": "Merge changes I3ced97c9,I68a8649e,I5e7c195e,I79432cda,I2dd9e5da into main\n\n* changes:\n  lstat generated files\n  Shell-escape $in and $out\n  Disallow missing depfiles\n  Implement --frontend-file\n  Add multithreaded parsing\n"
    },
    {
      "commit": "1213947699f1469bc29315955ba3c10d3a60c8b4",
      "tree": "d4094e39abcb84e1e86afd25fbaad2fb1069402e",
      "parents": [
        "ea9d45feebc5954989fcb1273fa5bfb095de4eaa"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed May 15 11:38:31 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed May 15 11:38:31 2024 -0700"
      },
      "message": "Increase the sleep before/after running commands\n\nAdding this sleep did seem to drastically reduce the flakiness, but\nwe recently got another flake. Increase the length of the sleep to\nhopefully hammer out the last bit of flakeyness.\n\nTest: Cargo test\nChange-Id: I3b0ef31efc92357f90e49d04876f17397fa507e5\n"
    },
    {
      "commit": "f0554a52d0614b154f633773dcb43a04c3677bd2",
      "tree": "e04904afa03196f827044df1b77b146f1ba50f0f",
      "parents": [
        "8536b9d4805ceef2fd62e90bf2753c52f9f06e85"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Mon May 13 15:25:40 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Mon May 13 15:25:40 2024 -0700"
      },
      "message": "lstat generated files\n\nThis is to match a patch that we added to the android fork of ninja,\nwhere generated files are lstat\u0027d instead of stat\u0027d. Without this,\nn2 always reruns rules that generate dangling symlinks, because it\nthinks those files don\u0027t exist.\n\nBug: 318434287\nTest: Manually\nChange-Id: I3ced97c9195adb3b8d94e3103940f197097c278c\n"
    },
    {
      "commit": "8536b9d4805ceef2fd62e90bf2753c52f9f06e85",
      "tree": "65c10c0312bb3ec8ef2d3a32aab18a8d3b0f2ee4",
      "parents": [
        "06e302ebee1e86cbe72317ee2999938fb23798b1"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue May 07 16:43:58 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri May 10 15:00:49 2024 -0700"
      },
      "message": "Shell-escape $in and $out\n\nExcape in cases where they need to be read by n2 directly.\nE.g. `rspfile \u003d $in` is not escaped because n2 will just open the file\ndirectly, but `rspfile_content \u003d $in` will be escaped because rspfiles\nare often treated as command line arguments.\n\nBug: 318434287\nTest: cargo test\nChange-Id: I68a8649eabbf3b0ca459e0cac28160a834eebd62\n"
    },
    {
      "commit": "06e302ebee1e86cbe72317ee2999938fb23798b1",
      "tree": "28bf6ebf4beece7aa81f56cc79d4228680c24dbc",
      "parents": [
        "c28d8df575ed64b095dea6b5bf418f7c15a69f25"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue May 07 14:55:11 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri May 10 15:00:39 2024 -0700"
      },
      "message": "Disallow missing depfiles\n\nWe always run ninja with -w missingdepfile\u003derr. N2 doesn\u0027t have that\nflag, but we can just make it always enforce that dep files exist.\n\nBug: 318434287\nTest: cargo test\nChange-Id: I5e7c195efca6779db631e65017f14a10d3f48d15\n"
    },
    {
      "commit": "c28d8df575ed64b095dea6b5bf418f7c15a69f25",
      "tree": "9da57e6de1a6404cfb95296c4fcb8961c669e79d",
      "parents": [
        "db1b20166946afe6fe335377fdeb920f9d727928"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue May 07 14:36:27 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri May 10 15:00:22 2024 -0700"
      },
      "message": "Implement --frontend-file\n\nThis is what soong uses to take control of ninja\u0027s output. Ninja will\njust be quiet but write protobuf-encoded status messages to a file that\nsoong_ui reads.\n\nNot all fields of the protobuf are implemented in this cl, but it\u0027s\nenough to display a functional UI in an android build. Missing things\ninclude:\n  - A bunch of fields related to how much time/memory an action took\n  - A critical path time estimate used in displaying an ETA, but that\n    requires the infrastructure about the time of prior builds used\n    to schedule slower actions with higher priority in regular ninja\n  - The inputs that changed that caused an action to rerun, used in\n    some telemetry\n\nBug: 318434287\nTest: cargo test\nChange-Id: I79432cdab965ff5fc7e0d5b42c645488b2e9093b\n"
    },
    {
      "commit": "ea9d45feebc5954989fcb1273fa5bfb095de4eaa",
      "tree": "b2bdb466a120d6fe21a3549a20199b3657b95c42",
      "parents": [
        "2c5699b5c386164710a960d48fc9bd28c2b293ab"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue May 07 13:27:30 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue May 07 13:27:30 2024 -0700"
      },
      "message": "Loosen bound on mtime diff in stat_mtime_resolution\n\nThis check seems to flake sometimes, make it more lenient.\n\nBug: 318434287\nTest: cargo test\nChange-Id: I21c46360ae60c9f1a1e0ba488f5f674bc4691615\n"
    },
    {
      "commit": "db1b20166946afe6fe335377fdeb920f9d727928",
      "tree": "77bb29f2bfeb88d29e68638a8ed531725e7c6bb3",
      "parents": [
        "2c5699b5c386164710a960d48fc9bd28c2b293ab"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Jan 18 20:58:54 2024 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu May 02 16:14:47 2024 -0700"
      },
      "message": "Add multithreaded parsing\n\nThis PR ports over most of the enhancements that are in Android\u0027s fork\nof ninja to n2. N2 goes from taking ~16 seconds to parse the AOSP ninja\nfiles, to ~1 second. (at least on my work computer where\navailable_parallelism returns 128) It still seems to be about ~0.1\nseconds slower than the android fork of ninja, but it\u0027s at least in the\nrange where it\u0027s a little difficult to measure.\n\nA general list of the changes in this PR:\n\n - Add support for subninja, with scoped variables.\n - mmap input files instead of reading them into memory.\n - Remove the FileIds and the Vec of files, replacing them with Arc.\n   Having to maintain a separate vec mapping FileIds to files is too\n   expensive.\n - Use the DashMap crate to map from filename to File object, so that\n   id_from_canonical can be called in parallel.\n - Use rayon for multithreading.\n - Split input files into chunks and parse the chunks in parallel\n - Parse subninjas in parallel. Subninja support was implemented because\n   regular includes cannot be processed in parallel.\n - Revamp the evaluation of variable assignments. Now, every statement\n   in the ninja file gets a \"scope position\". When evaluating global\n   variables, they are evaluated relative to a certain scope position,\n   so you can evaluate the variable at a particular point in the file,\n   even if it is reassigned later.\n - Introduce \"clumps\" of parse results, as returning all the parsed\n   statements in a flat vector causes too many large vector\n   concatenations.\n - Box Build objects, as they are quite large, and Vecs of unboxed\n   builds are too large and slow to concatenate.\n - Don\u0027t evaluate all the build bindings at load time. Only evaluate the\n   input/output files, and defer evaluation of other bindings until the\n   build is actually run.\n - Evalstrings are now just regular strings instead of Vecs of strings.\n   This means when they\u0027re evaluated they\u0027re re-parsed. Doing it this\n   way saves of the Vec allocations, and in the case of owned\n   evalstrings, does one big string allocation instead of a bunch of\n   little ones. There are a lot more owned evalstrings now due to\n   deferred evaluation of build bindings, so it makes a bit of a\n   difference.\n\nOne thing that the android fork has that I didn\u0027t include was\nprecomputed hashes. The android fork has a HashedString and\nHashedStrView type that it uses to ensure hashes aren\u0027t recalculated.\nThis is somewhat difficult to do in rust, you have to either make\nconcessions about being able to look up map values by their borrowed\nrepresentation, use the raw entry map apis on nightly rust, or use\nhashbrown\u0027s RawTable. And even when I was experimenting with RawTable it\ndidn\u0027t seem to provide a noticeable speedup.\n\nSome of these optimizations are memory optimizations. This turned out to\nbe necessary because apparently the exit_group syscall that quits the\nprocess spends time cleaning up memory. The exit_group syscall was\ntaking over a second to run before some of these optimizations.\n\nBug: 318434287\nTest: OUT_DIR\u003dout prebuilts/build-tools/build-prebuilts.sh\nChange-Id: I2dd9e5dae37c2904ecf01db2cd771857e5f7aae8\n"
    },
    {
      "commit": "2c5699b5c386164710a960d48fc9bd28c2b293ab",
      "tree": "88dacaeb2298937bc0b5642d541ce8a96c943f87",
      "parents": [
        "7f8389b619a5a1e14ee6a8d95ec4e6bf479f04fd"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu May 02 12:09:35 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu May 02 12:09:35 2024 -0700"
      },
      "message": "Attempt to fix test flakes\n\nSleep before/after running n2, because it seems like occasionally\nn2 is not seeing updating timestamps. Maybe the tests run too quickly\nand the timestamps are the same?\n\nBug: 338259955\nTest: Presubmits\nChange-Id: Ib695815317499c95514ccf0653c55ed19e2fbb96\n"
    },
    {
      "commit": "7f8389b619a5a1e14ee6a8d95ec4e6bf479f04fd",
      "tree": "d3236dbcf57f35643470ba8cc39d3f4c19f8db6c",
      "parents": [
        "975e23097d141aedbf8da4da6b4bcb60c19d9f67"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed May 01 13:35:36 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed May 01 13:35:36 2024 -0700"
      },
      "message": "Disable dep_on_current_directory test\n\nThis test is flakey, disable it until we can do a proper fix.\n\nBug: 338259955\nTest: Presubmits\nChange-Id: I8218fb08524f17c2332738e353da2a744e08f762\n"
    },
    {
      "commit": "975e23097d141aedbf8da4da6b4bcb60c19d9f67",
      "tree": "3f463815d531fc31bea74072a7d6aa489b3adcda",
      "parents": [
        "5e6f103c616029220267ff7523aad38344a88411"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Apr 30 15:09:16 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Apr 30 17:58:45 2024 -0700"
      },
      "message": "Add build rules for n2 tests\n\nBug: 318434287\nTest: OUT_DIR\u003dout prebuilts/build-tools/build-prebuilts.sh\nChange-Id: I8cad9c5951d71b719e5a87907a5099be4b73468b\n"
    },
    {
      "commit": "5e6f103c616029220267ff7523aad38344a88411",
      "tree": "0b9a4453a315d92909fa1fb2812ddc3566efc11d",
      "parents": [
        "f184abd6d45c08d7dae97d7c64d7b8c05365ed5d",
        "110d191d73e8b42aec329a358d332cd6862cbc78"
      ],
      "author": {
        "name": "Inna Palant",
        "email": "ipalant@google.com",
        "time": "Thu Mar 28 05:41:27 2024 +0000"
      },
      "committer": {
        "name": "Inna Palant",
        "email": "ipalant@google.com",
        "time": "Thu Mar 28 05:41:27 2024 +0000"
      },
      "message": "Merge remote-tracking branch \u0027origin/upstream\u0027\nImport b/328273370\n"
    },
    {
      "commit": "110d191d73e8b42aec329a358d332cd6862cbc78",
      "tree": "0b9a4453a315d92909fa1fb2812ddc3566efc11d",
      "parents": [
        "8881a661ae63e1124eb47b45f08d9fa1225a5f00"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Mar 21 14:12:44 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Mar 21 14:26:48 2024 -0700"
      },
      "message": "Import n2 to android\n\nTest: m n2\nThird-Party Import of: https://github.com/evmar/n2\nRequest Document: go/android3p\nFor CL Reviewers: go/android3p#reviewing-a-cl\nFor Build Team: go/ab-third-party-imports\nBug: http://b/328273370\nOriginal import of the code can be found at: https://googleplex-android.googlesource.com/platform/external/n2/+/refs/heads/third-party-review.\nSecurity Questionnaire: http://b/328273370#comment1\n\nChange-Id: Iab199b146d606cb1e8212f5c38d8612a5845b6bf\n"
    },
    {
      "commit": "f184abd6d45c08d7dae97d7c64d7b8c05365ed5d",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [],
      "author": {
        "name": "rassb@google.com",
        "email": "rassb@google.com",
        "time": "Wed Mar 13 08:59:46 2024 -0700"
      },
      "committer": {
        "name": "rassb@google.com",
        "email": "rassb@google.com",
        "time": "Wed Mar 13 08:59:46 2024 -0700"
      },
      "message": "Initial empty repository\n"
    },
    {
      "commit": "8881a661ae63e1124eb47b45f08d9fa1225a5f00",
      "tree": "0d9a6e659f8bf87bfc1d8e7f1135e46e5bd5e175",
      "parents": [
        "668d9ab5cdbd493a8af356078066423487ac81e2"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 10 18:11:29 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Mar 05 11:03:56 2024 -0800"
      },
      "message": "Parse depfiles with multiple targets\n\nThis is needed for android. It just treats all the deps of all targets\nin the depfile as deps for the Build.\n\nIn task.rs there is a TODO to verify that the targets refer to the\noutputs of the Build, but adding that verification breaks the android\nbuild. In android\u0027s case, there are some depfiles that contain\n`foo.o: path/to/some/dep.asm` where it should instead be\n`path/to/foo.o: path/to/some/dep.asm`.\n"
    },
    {
      "commit": "668d9ab5cdbd493a8af356078066423487ac81e2",
      "tree": "87479e0396101ba6de2a8a4eda49089574322257",
      "parents": [
        "66b02a579a0a857dbac5688e24cdb2f64f311b01"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Sun Jan 21 21:26:15 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 25 00:30:16 2024 -0800"
      },
      "message": "Switch some HashMaps to FxHashMaps\n\nFxHashMap has a faster hashing algorithm,\nat the expense of not being resistent to DOS\nattacks.\n"
    },
    {
      "commit": "66b02a579a0a857dbac5688e24cdb2f64f311b01",
      "tree": "07867bd7afb68c339eca81825314f5b71b84b328",
      "parents": [
        "a0e37e96a75f373bd85de0ffda324a8a64f4f6cb"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Sun Jan 21 21:23:51 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 25 00:30:16 2024 -0800"
      },
      "message": "Only hash strings once in id_from_canonical\n\nUse HashMap.entry() instead of a lookup + insert.\n"
    },
    {
      "commit": "a0e37e96a75f373bd85de0ffda324a8a64f4f6cb",
      "tree": "0a1a9d218ef8312629b4e00298eb06cdbcee629d",
      "parents": [
        "c90437e5024789e90b221589dff73f2997f91532"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Sun Jan 21 21:22:15 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 25 00:30:16 2024 -0800"
      },
      "message": "Precalcuate length of evaluated strings\n\nSo that we can do one memory allocation for them.\n"
    },
    {
      "commit": "c90437e5024789e90b221589dff73f2997f91532",
      "tree": "7de6eb601b3f36781a0a5b52bc1d91cd48734606",
      "parents": [
        "38899de2f32a5c8bb156f5180c6ba3156552124f"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Sun Jan 21 21:19:30 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 25 00:30:16 2024 -0800"
      },
      "message": "Pass owned paths to id_from_canonical\n\nid_from_canonical ideally takes owned strings\ninstead of references to avoid a copy.\n"
    },
    {
      "commit": "38899de2f32a5c8bb156f5180c6ba3156552124f",
      "tree": "9f47e38f1388ad4c14f0acaf576ec89e46cd0c16",
      "parents": [
        "909ac6087a2d74903c1d6c3772c7e3823d4b259a"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Fri Jan 19 00:11:47 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Fri Jan 19 00:15:20 2024 -0800"
      },
      "message": "avoid clown shoes allocation of input files\n\nScanner expects its input to be nul terminated, which I implemented as\n  buf \u003d std::fs::read(file)\n  buf.push(0)\n\nHowever, std::fs::read carefully sizes its buffer to be exactly the file\u0027s size,\nwhich means the push() must grow the buffer.  This means for e.g. a 40mb input\nfile, we\u0027d read it into a 40mb buffer, then grow the buffer, copying it into an\n80mb buffer, just to add one byte!\n\nFix this by using a buffer of the appropriate size.\n\nI attempted to measure the perf impact here and it wasn\u0027t measureable.\nPossibly this buffer growth really is that fast?  It seems it will at least\nhave memory impact at least.\n"
    },
    {
      "commit": "909ac6087a2d74903c1d6c3772c7e3823d4b259a",
      "tree": "a18d60a8d9fd3d8376408693f480f1a9ed0ac25e",
      "parents": [
        "56afe80b86a0931b970d206fd886f37bc24204c3"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Dec 27 23:50:53 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 18 11:03:50 2024 -0800"
      },
      "message": "Evaluate build paths in the context of the build\u0027s bindings\n\nThis fixes an incompatibility with ninja.\n\nI\u0027ve also moved a bunch of variable evaluations out of the\nparser and into the loader, in preparation for parsing the\nbuild file in multiple threads, and then only doing the\nevaluations after all the chunks of the file have been\nparsed.\n\nFixes #91 and #39.\n"
    },
    {
      "commit": "56afe80b86a0931b970d206fd886f37bc24204c3",
      "tree": "1bab114fa4bb7c8995d0544c9bce325efd2a3a6f",
      "parents": [
        "fbc90544c73006e94218df33ce7dcf24e6a3f03f"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Sat Dec 30 18:33:42 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 18 11:03:50 2024 -0800"
      },
      "message": "Add benchmark test for the loader\n\nI\u0027m making some changes that affect the performance\nof the parser and the loader, and would like to\nbenchmark them together.\n\nUnfortunately this required making a bunch of things\npublic (#[cfg(test)] doesn\u0027t seem to apply for\nbenchmarks), which isn\u0027t great.\n"
    },
    {
      "commit": "fbc90544c73006e94218df33ce7dcf24e6a3f03f",
      "tree": "2e2414a41ef20e37232a6e67f30a062b9ca41777",
      "parents": [
        "78650f638cbaf1fb85a9be7e61f99e9c888f53fa"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 03 13:32:01 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 18 11:03:50 2024 -0800"
      },
      "message": "Enforce only valid rule variables are used\n\nRegular ninja also has this validation.\n"
    },
    {
      "commit": "78650f638cbaf1fb85a9be7e61f99e9c888f53fa",
      "tree": "ffd74a47d409ef323186565ba32085663e007810",
      "parents": [
        "cc45ae4a5d193522e40c05a219aaf464df8b0f6a"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Jan 10 08:18:16 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Jan 10 08:24:18 2024 -0800"
      },
      "message": "drop git lfs\n\nIt\u0027s a needless burden for people who don\u0027t care about this snapshot.\nI switched to Google Drive for now, shruggie.\n\nFixes #105.\n"
    },
    {
      "commit": "cc45ae4a5d193522e40c05a219aaf464df8b0f6a",
      "tree": "246d76beedfe3cad6da1582f290d4b0b664c387c",
      "parents": [
        "43cfa7fa15b6b5c24cdad9908b04800020fd8c83"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Mon Jan 08 14:26:33 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 15:59:58 2024 -0800"
      },
      "message": "Wait for out instead of regular_input\n\nThe test is supposed to ensure that out builds before validation_input.\n"
    },
    {
      "commit": "43cfa7fa15b6b5c24cdad9908b04800020fd8c83",
      "tree": "eef0ef49045ffe10b3b30d72692080270e06c42f",
      "parents": [
        "438506aa01ce44d608db7a19ec08512ecd5c42eb"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 13:24:14 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 13:26:15 2024 -0800"
      },
      "message": "improve test for validation execution order\n\nThe test wanted to verify that in a file containing\n  build foo: ... |@ bar\nit\u0027s possible for foo to finish before bar does.\n\nThis changes to the test to make the bar step wait (at runtime) for the\nfoo step to finish, enforcing that that ordering is possible.\n\nFixes #102.\n"
    },
    {
      "commit": "438506aa01ce44d608db7a19ec08512ecd5c42eb",
      "tree": "2bfdec3dea0abeba7c839cab38da8a8eb3d5ee23",
      "parents": [
        "5f01dd43680b3992ba96b0059ab17c32d271b4b3"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 12:42:15 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 13:06:16 2024 -0800"
      },
      "message": "stat outputs of phony rules\n\nCMake has files that are outputs of a phony rule but still used as inputs.\n  build ...: ... some_file\n  build some_file: phony ...\n\nBefore this change, n2 would just mark all phony outputs as missing, which\nbreaks the above.  This change instead makes phony a little closer to how\nnon-phony rules work which fixes #40 and which I hope is a benefit in general.\n\nFixes #40.\n"
    },
    {
      "commit": "5f01dd43680b3992ba96b0059ab17c32d271b4b3",
      "tree": "8708dad2e7a8c45be4d88e30a703504b88592b3c",
      "parents": [
        "9f8d939d0d653de65b860c9382840ca2db350f8e"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 11:22:09 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 11:22:09 2024 -0800"
      },
      "message": "mention empty depfiles in design notes\n"
    },
    {
      "commit": "9f8d939d0d653de65b860c9382840ca2db350f8e",
      "tree": "554c88859f04efefcc07ae73000c2e85bcb78993",
      "parents": [
        "738e5641f169d96ac634c9437373a9ce4f1f6c61"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 11:14:42 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 11:14:42 2024 -0800"
      },
      "message": "update README to show current output\n"
    },
    {
      "commit": "738e5641f169d96ac634c9437373a9ce4f1f6c61",
      "tree": "9b71e6f1de5a41425d41461be7e351e87d3b163e",
      "parents": [
        "81ebd8649dd2fd7de8fa8dd06c13ee5b62efb912"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 10:57:35 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 11:08:47 2024 -0800"
      },
      "message": "allow windows drive letters in depfiles\n\nSee bug report context in #98.\n\nFrom a patch from Tobias Hieta \u003ctobias.hieta@ubisoft.com\u003e.\n"
    },
    {
      "commit": "81ebd8649dd2fd7de8fa8dd06c13ee5b62efb912",
      "tree": "4b5901e80da68a3d552bbe96db2cf9bc6d930bdd",
      "parents": [
        "d43e8ca9e3e540d31c588158bc51309187cb6a7f"
      ],
      "author": {
        "name": "Tobias Hieta",
        "email": "tobias.hieta@ubisoft.com",
        "time": "Fri Jan 05 12:42:56 2024 +0100"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 10:44:06 2024 -0800"
      },
      "message": "Treat missing depfile as a empty list of dependencies.\n\nCMake can sometimes write depfile directives to build.ninja\neven when no depfile is generated. This was handled by \"ninja\"\nby just ignoring the missing file and going on with the build,\nsee the code here:\n\nhttps://github.com/ninja-build/ninja/blob/master/src/build.cc#L894\n\nThis fixes #80\n"
    },
    {
      "commit": "d43e8ca9e3e540d31c588158bc51309187cb6a7f",
      "tree": "5c65eb321d80283d9c021138dd9fa38bcff8eb6b",
      "parents": [
        "86774347351d519deefae46ef7c6ac2f8b11a510"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sun Jan 07 15:36:52 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Jan 08 09:38:05 2024 -0800"
      },
      "message": "another pass at documenting variable scope\n"
    },
    {
      "commit": "86774347351d519deefae46ef7c6ac2f8b11a510",
      "tree": "2184b8dcb2b6e2c3405090f0b740e66537dadebf",
      "parents": [
        "c26761ec410c351a38499023b7cafd3adb9b9a54"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 04 13:18:58 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 04 13:18:58 2024 -0800"
      },
      "message": "design notes on variable scope\n"
    },
    {
      "commit": "c26761ec410c351a38499023b7cafd3adb9b9a54",
      "tree": "d93bb4b8d4e2b11b1131e836d49f1d61ae94c82a",
      "parents": [
        "b6f2188dcfaa137ba875097b4948742d3be6557f"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 04 11:37:05 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Jan 04 11:37:05 2024 -0800"
      },
      "message": "snapshots of llvm build artifacts\n"
    },
    {
      "commit": "b6f2188dcfaa137ba875097b4948742d3be6557f",
      "tree": "9cfe2c926be52fb09a19bae4b187cd662568a975",
      "parents": [
        "d5cec949902ea8e3d91ea78654c39b7a7071aae0"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jan 02 18:11:26 2024 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Jan 03 08:50:34 2024 -0800"
      },
      "message": "Canonicalize paths to \u0027.\u0027 instead of an empty string\n\nIt\u0027s possible to have a ninja dep on \u0027.\u0027, meaning the directory that\nninja was run from. Previously, canon_path_fast would canonicalize\nthis to an empty string, which would cause stats and other opterations\nto fail.\n\nThis was found when running the android codebase with n2.\n"
    },
    {
      "commit": "d5cec949902ea8e3d91ea78654c39b7a7071aae0",
      "tree": "7e44128622052ea1b863fe05b6923b6785058eca",
      "parents": [
        "2ef3a151ab3318f4fc8cc6539628085c24a812ca"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 04:35:02 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 04:35:02 2023 -0800"
      },
      "message": "attempt to deflake write_to_input test\n"
    },
    {
      "commit": "2ef3a151ab3318f4fc8cc6539628085c24a812ca",
      "tree": "b872a283b96c84b1d071b57c8577faf9476fa743",
      "parents": [
        "0f89aa87a7ff0d9fd37fa84745948bf0ba657edd"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 04:18:25 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 04:18:25 2023 -0800"
      },
      "message": "ci: show backtraces on test failure\n"
    },
    {
      "commit": "0f89aa87a7ff0d9fd37fa84745948bf0ba657edd",
      "tree": "f94d0f84418124cd6d2c17be9576c6c62c1ec238",
      "parents": [
        "57e6e1274f7f1c48e9457299e0a87464401bcf3d"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 03:19:40 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 03:21:54 2023 -0800"
      },
      "message": "support external build.ninja files under `cargo bench`\n\nAdd docs for how to use it too.\n"
    },
    {
      "commit": "57e6e1274f7f1c48e9457299e0a87464401bcf3d",
      "tree": "b47466e21821d932c496a92eb7d4076e48adb62d",
      "parents": [
        "04bc07898ee99ed9f7dc9e48e2a9295dfd6d2811"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 02:47:49 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 02:47:49 2023 -0800"
      },
      "message": "disable bench for lib/bin, because it lives under benches/\n\nThis is in the Criterion FAQ.\n"
    },
    {
      "commit": "04bc07898ee99ed9f7dc9e48e2a9295dfd6d2811",
      "tree": "63d5bd25d1cf9d1a91a3bae54b5715c61c87954a",
      "parents": [
        "178bf19798a0e0454f53b5c3b4c3dc1a4dd97798"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 02:31:22 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Dec 30 02:31:22 2023 -0800"
      },
      "message": "restore criterion benchmarking\n"
    },
    {
      "commit": "178bf19798a0e0454f53b5c3b4c3dc1a4dd97798",
      "tree": "ea729fd30c014777a2109cf74aad801148805ae8",
      "parents": [
        "54eeb86a2a0ab5b622837ea1447dfdea892d8f26"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Dec 26 16:46:04 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Dec 26 16:46:04 2023 -0800"
      },
      "message": "move around nul-termination of input files\n"
    },
    {
      "commit": "54eeb86a2a0ab5b622837ea1447dfdea892d8f26",
      "tree": "d23409983b512abd425ef6f9532718adc2e907b8",
      "parents": [
        "08667f8300825b18962ea7113f9b0a7a0d0cd10c"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Dec 26 15:52:53 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Dec 26 15:55:46 2023 -0800"
      },
      "message": "use a growing Vec\u003cu8\u003e for buffering record writes\n\nI had been too clever here with a statically-sized buffer, when really I ought\nto profile first and optimize second.\n\nI think it\u0027s still correct (without profiling) to avoid calling the underlying\nwrite() syscall too many times, so buffering at least a record at a time still\nmakes sense.\n\nFixes #92.\n"
    },
    {
      "commit": "08667f8300825b18962ea7113f9b0a7a0d0cd10c",
      "tree": "8715627484b3bd3a3025bf940d9ea23abc59edfc",
      "parents": [
        "60e9a6ea8b9cbb217a420cc850e4ba051cdc755e"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Dec 21 15:44:15 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Dec 21 15:44:15 2023 -0800"
      },
      "message": "win: ensure thread attributes live long enough\n\nThe pointers passed in a PROC_THREAD_ATTRIBUTE_LIST must\noutlive the struct, so add some lifetime hackery.\n"
    },
    {
      "commit": "60e9a6ea8b9cbb217a420cc850e4ba051cdc755e",
      "tree": "bc92e334fcdf07c2c8bfe75418e351d8e0e43881",
      "parents": [
        "c1fcd4a39620fe68e26f17fb35df66f9807a0984"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Dec 21 15:24:19 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Dec 21 15:24:19 2023 -0800"
      },
      "message": "fix a test failing on windows\n"
    },
    {
      "commit": "c1fcd4a39620fe68e26f17fb35df66f9807a0984",
      "tree": "9d42335e7ada8a4489565a13dead3329836d8ed5",
      "parents": [
        "8aaa403e3f1325fed7d8018aa66a2f2dfa555f77"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Dec 20 14:54:40 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Thu Dec 21 11:07:34 2023 -0800"
      },
      "message": "Add validation inputs\n\nThese were added to regular ninja in:\nhttps://github.com/ninja-build/ninja/commit/04c410b15b70fb321928ffba19d697db15cb0121\n\nAndroid uses them, so they\u0027re needed to port android to n2. (which is\nsomething I\u0027m exploring but not committing to)\n"
    },
    {
      "commit": "8aaa403e3f1325fed7d8018aa66a2f2dfa555f77",
      "tree": "a40c9cb412852df7cff4cab7e34b2249d533fffb",
      "parents": [
        "4bae87a58cd8d22efa2b610d3ac4cb7578cd3d3b"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Dec 20 10:11:54 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Dec 20 10:11:54 2023 -0800"
      },
      "message": "obey builddir for placing .n2_db\n"
    },
    {
      "commit": "4bae87a58cd8d22efa2b610d3ac4cb7578cd3d3b",
      "tree": "28d06cfeeded5f07ed0683b7b985742b64b75938",
      "parents": [
        "593a81a0a4b3f51a957d5557e0a0aa6b08fa0402"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Nov 28 15:39:59 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Nov 28 15:43:18 2023 -0800"
      },
      "message": "allow $\\n in most contexts when parsing\n\nThe Ninja rules here aren\u0027t super clear, like I think this might be legal\n\n  build $\n    foo$\n    :$\n    bar\n    baz$\n    \u003d$\n    blah\n\nand at least that kind of thing appears to be possible output of ninja_syntax.py.\n\nFixes #89.\n"
    },
    {
      "commit": "593a81a0a4b3f51a957d5557e0a0aa6b08fa0402",
      "tree": "19406e4346961ae530197bdbf1066daad9b96cbf",
      "parents": [
        "dc8e3c917c99d49721cbf89cbbe4eaa257ce4021"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sun Nov 05 09:51:59 2023 -0800"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sun Nov 05 09:51:59 2023 -0800"
      },
      "message": "drop log to fix test\n"
    },
    {
      "commit": "dc8e3c917c99d49721cbf89cbbe4eaa257ce4021",
      "tree": "643ed2fa823dcbe95d33bf9c97df08c7e024e0e9",
      "parents": [
        "90041c1f010d27464e3b18e38440ed9855ea62ef"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Nov 04 17:44:24 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Sat Nov 04 17:46:33 2023 -0700"
      },
      "message": "build all files if none specified\n\nI\u0027m ambivalent about this behavior, but it\u0027s come up twice so I think\npeople depend on it.\n\nFixes #88 and #53.\n"
    },
    {
      "commit": "90041c1f010d27464e3b18e38440ed9855ea62ef",
      "tree": "0349965a39186c116e96b270f26f49988fd9b38d",
      "parents": [
        "b1102a68f87cb2a43b086708de45f7760e722ac3"
      ],
      "author": {
        "name": "Damien Elmes",
        "email": "gpg@ankiweb.net",
        "time": "Thu Oct 05 16:40:05 2023 +1000"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Oct 10 10:45:53 2023 -0700"
      },
      "message": "Run clippy --fix\n"
    },
    {
      "commit": "b1102a68f87cb2a43b086708de45f7760e722ac3",
      "tree": "ba317ece4a8f476f98958682b8b5c9fe74f62eea",
      "parents": [
        "fd9ee6c9e8be3f723d8f0e88fcf3e064188437c6"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Oct 10 10:44:10 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Oct 10 10:44:10 2023 -0700"
      },
      "message": "add a test for utf8 truncation\n\n(Followup to #86)\n"
    },
    {
      "commit": "fd9ee6c9e8be3f723d8f0e88fcf3e064188437c6",
      "tree": "cafd5e8f8e0a2894697fed662c3ce338798fbd9c",
      "parents": [
        "117dfc642a5c724b629dc0d4ab768278803d4395"
      ],
      "author": {
        "name": "Damien Elmes",
        "email": "gpg@ankiweb.net",
        "time": "Thu Oct 05 13:12:12 2023 +1000"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Oct 10 10:39:16 2023 -0700"
      },
      "message": "Fix a panic when truncating inside a unicode char\n\nthread \u0027\u003cunnamed\u003e\u0027 panicked at \u0027byte index 78 is not a char boundary; it is inside \u0027━\u0027 (bytes 77..80) of `     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 48.9/48.9 KB 3.6 MB/s eta 0:00:00`\u0027, src/progress.rs:330:22\n"
    },
    {
      "commit": "117dfc642a5c724b629dc0d4ab768278803d4395",
      "tree": "757a275e99e0a3decb2296e052adef1a57a81972",
      "parents": [
        "7d1b9c403bece4d16e0ae430b1c208287c87c20e"
      ],
      "author": {
        "name": "Nico Weber",
        "email": "thakis@chromium.org",
        "time": "Thu Oct 05 19:20:33 2023 -0400"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Fri Oct 06 11:23:59 2023 -0700"
      },
      "message": "Improve error printing in process_posix.rs\n\n* The posix_spawn_* family of functions returns !\u003d 0 on error,\n  and the return is an error code that can be passed to strerror().\n  So check for `!\u003d 0`, not `\u003c 0`. (Error codes that can be passed\n  to strerror() are in practice \u003e 0!) Rename `check_posix` to\n  `check_posix_spawn` too, to make it clear it\u0027s only for checking\n  return codes from functions in the posix_spawn_* family.\n\n* The normal C runtime functions return a code \u003c 0 on error, and\n  put the error code in errno. Add a check_ret_errno function and\n  call that instead of check_posix for non-spawn functions.\n"
    },
    {
      "commit": "7d1b9c403bece4d16e0ae430b1c208287c87c20e",
      "tree": "f80b7af6d534c7ac2d47ee800bbbc88bc3d29b6c",
      "parents": [
        "d97762e0f9f5bf79bb8e3c37ad3f68f47b76f28a"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Sep 25 13:42:51 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Sep 25 13:46:54 2023 -0700"
      },
      "message": "ensure state for all outputs of phony builds\n\nIf a build is missing its inputs or its outputs, we normally stop examining\ndisk state upon discovering the first missing file because we know we\u0027ll need\nto execute it regardless.\n\nBut we don\u0027t execute phony builds, so they were skipping some logic that was\nbreaking an invariant: any step downstream of an output relies on that step\ngathering the disk state (mtime) for that output.\n\nFor phony steps we expect outputs to be missing, and (due to working\naround a Ninja bug) we also don\u0027t care about missing inputs(!).  Without\nspecial casing, the \"stop on first missing\" file meant we wouldn\u0027t have\nstate for their outputs.\n\nFrom a patch from liushuyu011@gmail.com, from #84.\n"
    },
    {
      "commit": "d97762e0f9f5bf79bb8e3c37ad3f68f47b76f28a",
      "tree": "6fd662ba3d4b0f30b53c8b53d4944ca370c6d158",
      "parents": [
        "3a39030a50203b363f4f32eeb8727d9f8d061965"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Sep 25 13:21:58 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Mon Sep 25 13:21:58 2023 -0700"
      },
      "message": "include location in more error messages\n"
    },
    {
      "commit": "3a39030a50203b363f4f32eeb8727d9f8d061965",
      "tree": "dafff46f14208538a03b865125430476f8e73145",
      "parents": [
        "00dcdbeb609ec3acda30aaa712dfcc22df008460"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Aug 30 12:43:08 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Aug 30 12:43:08 2023 -0700"
      },
      "message": "rule expansion can refer to build vars that refer to top-level vars\n\nFixes #83.\n"
    },
    {
      "commit": "00dcdbeb609ec3acda30aaa712dfcc22df008460",
      "tree": "61982e9a53fa40aac2d8f259108e9c60e78faa4b",
      "parents": [
        "3b9daf3516d0d8a05b4c0f07dbf30afcd90a92a7"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Aug 30 00:08:54 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Aug 30 00:08:54 2023 -0700"
      },
      "message": "add currently-failing test case for issue #83\n"
    },
    {
      "commit": "3b9daf3516d0d8a05b4c0f07dbf30afcd90a92a7",
      "tree": "768db67f04be1f5a9e0433f0f44a6d3597bdcbb1",
      "parents": [
        "12652a1d4f9ffad0d2efd1045b9ba19ef615e055"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Aug 30 00:06:17 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Wed Aug 30 00:06:17 2023 -0700"
      },
      "message": "untangle some of \"lazy\" variable handling\n\nParser always returns lists of \u0026str-\u003evar, and it\u0027s up to the consumer\nof the parse to copy if it wants longer lifetimes.\n"
    },
    {
      "commit": "12652a1d4f9ffad0d2efd1045b9ba19ef615e055",
      "tree": "9a8efb50bd91f334dba5632c502e2b857796286e",
      "parents": [
        "6edf153154e893c80e181bb58bb6bc6a4be86a6f"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 22:46:56 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 22:57:55 2023 -0700"
      },
      "message": "avoid fd leaks in pipe() call\n\nWe want to open all our fds using CLOEXEC so they\u0027re not inherited by\nchild processes.  All Rust builtin APIs do this already, but we used\nlibc::pipe() for our pipe.\n\nTo fix this, we use pipe2() on non-Mac (which allows passing the flag)\nand Mac-specific POSIX_SPAWN_CLOEXEC_DEFAULT otherwise.\n\nFixes leak found in #68.\n"
    },
    {
      "commit": "6edf153154e893c80e181bb58bb6bc6a4be86a6f",
      "tree": "733266bc0e2c9f95f11595e0d8976f61b61c3d55",
      "parents": [
        "4ba54d1019634256d0303803eb217215283d2bfd"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 10:20:30 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 10:20:30 2023 -0700"
      },
      "message": "clearer task termination logic\n"
    },
    {
      "commit": "4ba54d1019634256d0303803eb217215283d2bfd",
      "tree": "f500f8043adbc713b9dea73653021d76691db8b4",
      "parents": [
        "f4690abb23d25316a169234e941f586ebb87fbf9"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 10:10:20 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 10:10:20 2023 -0700"
      },
      "message": "close pipe before waitpid\n\nPossibly could help with #68?\n"
    },
    {
      "commit": "f4690abb23d25316a169234e941f586ebb87fbf9",
      "tree": "92a6ff3b9fd9c6b16a838569d30b2748afc720f6",
      "parents": [
        "8017d1f0390a7e514928d46943271d4a3f5e9b44"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 10:02:00 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 10:02:00 2023 -0700"
      },
      "message": "build fix on linux\n"
    },
    {
      "commit": "8017d1f0390a7e514928d46943271d4a3f5e9b44",
      "tree": "34e2503327cfc2812005894bac9ea6a0feece217",
      "parents": [
        "fc0f93b586b2baa558c969efdf17f7d2d385a6b5"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 10:01:00 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 10:01:00 2023 -0700"
      },
      "message": "better types in posix_spawn\n"
    },
    {
      "commit": "fc0f93b586b2baa558c969efdf17f7d2d385a6b5",
      "tree": "7409eddad82a2f3a09b6ad2cc1766477ec334636",
      "parents": [
        "c1e3b58a0a6906be39f86ee64d71bbc0229f394a"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 09:37:35 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 09:37:35 2023 -0700"
      },
      "message": "open /dev/null over stdin in subprocesses\n\nNinja does this.  Not sure if it helps with #68.\n"
    },
    {
      "commit": "c1e3b58a0a6906be39f86ee64d71bbc0229f394a",
      "tree": "2793dc7d0dd4f6e4f43bb07bddf14d835414dfed",
      "parents": [
        "39505375adc491a1600ba7dc0e21efea3dd2c726"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 09:36:48 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 09:36:48 2023 -0700"
      },
      "message": "minor type cleanups in posix_spawn\n"
    },
    {
      "commit": "39505375adc491a1600ba7dc0e21efea3dd2c726",
      "tree": "6bd5666ec0f26948e41ca0f93ac5d380546075c6",
      "parents": [
        "0d9753a6a85536c4c817a1d5ac8d0d67492776d1"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 09:24:13 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 09:24:13 2023 -0700"
      },
      "message": "clearer log comment\n"
    },
    {
      "commit": "0d9753a6a85536c4c817a1d5ac8d0d67492776d1",
      "tree": "7a2157778fd363612740e0e35e259f8dbc6effc7",
      "parents": [
        "84c14c0b1d70b02ee7d7e3a66f79029e07e4a73d"
      ],
      "author": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 09:22:17 2023 -0700"
      },
      "committer": {
        "name": "Evan Martin",
        "email": "evan.martin@gmail.com",
        "time": "Tue Aug 29 09:22:30 2023 -0700"
      },
      "message": "fix comments\n"
    }
  ],
  "next": "84c14c0b1d70b02ee7d7e3a66f79029e07e4a73d"
}
