)]}'
{
  "log": [
    {
      "commit": "75a0997a4be6439f824ef84834dbc9ab76ab34e5",
      "tree": "d2fa73d4b6328e51ba86281588e87213ec45b948",
      "parents": [
        "f768852e1707eb4bc675a9f2d1a6b1e5be178fe9"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Feb 11 15:28:48 2025 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Feb 11 15:38:02 2025 -0800"
      },
      "message": "Add ninja_files tool\n\nIt lists all the loaded ninja files. This is useful for tools that want\nto consume all the ninja files as our ninja file hiearchy gets more\ncomplex.\n\nTest: Manually\nChange-Id: I18dc7b9b7141b19d6055c6cda5223ace74e96807\n"
    },
    {
      "commit": "f768852e1707eb4bc675a9f2d1a6b1e5be178fe9",
      "tree": "9abb2e887645c17c3130b2c5c094913704d54564",
      "parents": [
        "563584c505e8b8860e57cf4443f57419d695c1d2"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 08 09:49:39 2025 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 08 09:49:39 2025 -0800"
      },
      "message": "Use modern for loops in build.cc and graph.cc\n\nSo that the logic is easier to read.\n\nTest: Presubmits\nChange-Id: I808874e29b3c47036a443116725300adbe5d0c1b\n"
    },
    {
      "commit": "563584c505e8b8860e57cf4443f57419d695c1d2",
      "tree": "322f6bbc01da8e66366c0ee50ae6bb6f02086d7b",
      "parents": [
        "a2a74cdee1b5f6344454ad23251720684a4de019"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jan 07 13:02:55 2025 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jan 07 13:11:43 2025 -0800"
      },
      "message": "Add tool to list default nodes in build file\n\nSo that we have a better idea of what is built by default.\n\nBug: 388312357\nTest: manually\nChange-Id: Ic60363c625985fc296c31f23b05333a1ddc8e2dc\n"
    },
    {
      "commit": "a2a74cdee1b5f6344454ad23251720684a4de019",
      "tree": "bf2f4539ef6df5ed257bf5f7280c6baec9d5dbc7",
      "parents": [
        "c05013c606cd590945a538d733848c3d76ef1d67"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jul 09 13:35:11 2024 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jul 09 13:35:11 2024 -0700"
      },
      "message": "Remove test_per_src from external/ninja\n\ntest_per_src is being removed, it never worked well and is incompatible\nwith all of the test infrastructure.  Build the ninja test binaries\nindividually.\n\nTest: prebuilts/build-tools/build-prebuilts.sh\nChange-Id: If21a56a8a4cc8298dcabd7d967fc9409b9a65fd3\n"
    },
    {
      "commit": "c05013c606cd590945a538d733848c3d76ef1d67",
      "tree": "4437731c4796a5f0cefcc3973aa4852c8ac9bd45",
      "parents": [
        "8bdfb2cefbf380d69cde30bed1489c95987552d8"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri May 24 13:35:56 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri May 24 13:35:56 2024 -0700"
      },
      "message": "Add .cache folder to .gitignore\n\nclangd creates this cache folder.\n\nTest: Presubmits\nChange-Id: I84d4a49c5d7782df083987b3bb2844925114c22f\n"
    },
    {
      "commit": "8bdfb2cefbf380d69cde30bed1489c95987552d8",
      "tree": "c384f60286ad0266a5283595e226bd25e2b77d16",
      "parents": [
        "0d6ce3e15c9903b299d317f1d034532355201592"
      ],
      "author": {
        "name": "Yu Liu",
        "email": "yudiliu@google.com",
        "time": "Mon Feb 12 22:51:54 2024 +0000"
      },
      "committer": {
        "name": "Yu Liu",
        "email": "yudiliu@google.com",
        "time": "Tue Mar 05 01:10:06 2024 +0000"
      },
      "message": "Output changed inputs in the edge started events.\n\nBug: 323021988\nTest: run soong builds and verify build.trace\nChange-Id: Ib735c45fabd43867e145cda99c96430cd4c3fe41\n"
    },
    {
      "commit": "0d6ce3e15c9903b299d317f1d034532355201592",
      "tree": "59ef005354979c496fb640bfc1cd750be1b36e9b",
      "parents": [
        "b921f76a07f0defe55e3ac349af1f834cbe84c71"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jan 19 14:44:00 2024 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jan 19 14:56:22 2024 -0800"
      },
      "message": "Remove symlink_output support\n\nThis was added so that bazel could run ninja files, but we abandoned\nthat approach.\n\nBug: 160568334\nTest: OUT_DIR\u003dout ./prebuilts/build-tools/build-prebuilts.sh\nChange-Id: I2c1b4571dedce203527c84387976b13ca6c01111\n"
    },
    {
      "commit": "b921f76a07f0defe55e3ac349af1f834cbe84c71",
      "tree": "06f377e397f761ac85af8bdb64a6eecd709c3471",
      "parents": [
        "4e25c2277f3cc797e1f13084c873a7297b8c2074"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Wed Nov 29 10:00:59 2023 +0900"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Wed Nov 29 01:02:22 2023 +0000"
      },
      "message": "Add comment for fronted.proto\n\nBug: 292304818\nTest: n/a\nChange-Id: Ib29361475589212ddfd9ec94645a42a77e7824e4\n"
    },
    {
      "commit": "4e25c2277f3cc797e1f13084c873a7297b8c2074",
      "tree": "c06526b173e673c4bfc670ffdc8203e15db7b9f1",
      "parents": [
        "36373213c7365ceb8f7e53a6cee3a5e6d68d0723"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Tue Nov 28 09:21:38 2023 +0900"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Tue Nov 28 00:53:16 2023 +0000"
      },
      "message": "explicit casting to int64_t for literal value\n\nBug: 292304818\nTest: build for darwin\nChange-Id: I678e0c73dfa7b8cc83315f157e7602c9913d306e\n"
    },
    {
      "commit": "36373213c7365ceb8f7e53a6cee3a5e6d68d0723",
      "tree": "f68751b2e5fa8f9d0a024d428a88b76d8fb43fbf",
      "parents": [
        "093a41b354aa33de3d2f6bcf6a23ff2a81f93f23"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Mon Nov 27 11:17:48 2023 +0900"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Mon Nov 27 11:17:48 2023 +0900"
      },
      "message": "Add estimated_total_time/critical_path_time in StatusSerializer\n\nTo predict ETA for the build, addied the fields\n\nBug: 292304818\nTest: check if the fields are included in protobuf msg\nChange-Id: Ifb7b1a9e8dbc3788e478d3186356bbf1879edc89\n"
    },
    {
      "commit": "093a41b354aa33de3d2f6bcf6a23ff2a81f93f23",
      "tree": "a5646d202d94aa6f7f2333f5c45a057716081e82",
      "parents": [
        "a8cf756c56884b8f5c1151b888ca0386cefadcb0"
      ],
      "author": {
        "name": "Tomasz Wasilczyk",
        "email": "twasilczyk@google.com",
        "time": "Fri Nov 17 10:11:28 2023 -0800"
      },
      "committer": {
        "name": "Tomasz Wasilczyk",
        "email": "twasilczyk@google.com",
        "time": "Fri Nov 17 10:11:28 2023 -0800"
      },
      "message": "ninja test: pin cpp_std to gnu++17\n\nThis project doesn\u0027t build with gnu++20 and prevents AOSP default to be\nupgraded to a newer standard. Once the build failure is fixed here, this\nchange can be reverted.\n\nBug: 311052584\nTest: treehugger\nChange-Id: I27d615ddff51fe0b563b946bb8c2349a6907c637\n"
    },
    {
      "commit": "a8cf756c56884b8f5c1151b888ca0386cefadcb0",
      "tree": "d285bb48b7e2f2d64e45820c3ae130739ffe4e4e",
      "parents": [
        "efbceece33817facf746ddc378f33ae4cc602788"
      ],
      "author": {
        "name": "Alexandru Croitor",
        "email": "alexandru.croitor@qt.io",
        "time": "Mon Jul 31 16:22:06 2023 +0200"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Oct 27 10:13:10 2023 -0700"
      },
      "message": "UPSTREAM: Fix browse to work with Python 3.11+\n\nPython sources should not contain null bytes, so don\u0027t pass the final\nstring null terminator character to the python interpreter.\n\nTest: builds\nBug: 307946202\n(cherry picked from commit 67834978a6abdfb790dac165b8b1f1c93648e624)\nChange-Id: I9b205ae8137955c1841b1b56297e86a79ac550a1\n"
    },
    {
      "commit": "efbceece33817facf746ddc378f33ae4cc602788",
      "tree": "48dbf8398c8f356d6f7467253cd84d9dad1d7226",
      "parents": [
        "45d6a94d6de54494150299ff0e7137196f3f0b47"
      ],
      "author": {
        "name": "Peter Collingbourne",
        "email": "pcc@google.com",
        "time": "Fri Jul 28 21:02:14 2023 -0700"
      },
      "committer": {
        "name": "Peter Collingbourne",
        "email": "pcc@google.com",
        "time": "Fri Jul 28 21:03:00 2023 -0700"
      },
      "message": "Fix build.\n\nThis fork of Ninja fails to build because it uses a number of C++17\nfeatures. Fix it by changing the -std\u003d flag.\n\nChange-Id: Ib94be50a51aff6b0a8f7b1490052cbe3e4fe0b57\n"
    },
    {
      "commit": "45d6a94d6de54494150299ff0e7137196f3f0b47",
      "tree": "b07393ef133d54784d133b9cb81308fd682c7c0e",
      "parents": [
        "9fdf0a6156cd9d3d5824bd8f422d395abdd6f2fc"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jun 15 19:43:55 2023 +0000"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jun 15 22:04:18 2023 +0000"
      },
      "message": "Add tags field to build.\n\nThe tags field is a string with an implementation defined format. This\nallows build systems to include arbitrary metadata in the proto for\nbetter metrics.\n\nBug: http://b/259130368\nTest: used to trace dist cp time\nChange-Id: I9f6fcae0d8e4f7152ea82d3038807f622ca92801\n"
    },
    {
      "commit": "9fdf0a6156cd9d3d5824bd8f422d395abdd6f2fc",
      "tree": "e5b31248f02716deeebd924216f0cb99e124f8a8",
      "parents": [
        "5aa136b129a5357234d20efd5eded60a1ddd3b79",
        "309aff722de411015ce33ff7395a7d522456ac3c"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue May 23 20:25:36 2023 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue May 23 20:25:36 2023 +0000"
      },
      "message": "Merge \"Python 3 fxies.\""
    },
    {
      "commit": "5aa136b129a5357234d20efd5eded60a1ddd3b79",
      "tree": "287fe7c426fe1387fbdbef0d6a27975581d53c9c",
      "parents": [
        "3bed7b3ce5e93bfa2933f8ff987d599ba517d182",
        "49916af0a51e9eff9d2d45b8565837ba875e8baf"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "android-test-infra-autosubmit@system.gserviceaccount.com",
        "time": "Mon May 22 21:33:14 2023 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon May 22 21:33:14 2023 +0000"
      },
      "message": "Merge \"Add usesninjalogasweightlist option\""
    },
    {
      "commit": "49916af0a51e9eff9d2d45b8565837ba875e8baf",
      "tree": "6e9e55044b0c98333affe91f5972543f98282be6",
      "parents": [
        "2f4ecd1728f9620adeea31d498abea7c8e66b3bf"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Sat May 20 00:32:32 2023 +0900"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Mon May 22 13:23:08 2023 +0900"
      },
      "message": "Add usesninjalogasweightlist option\n\nIf weight list is large(more than 100,000 lines), reading the whole list\nspends a few seconds(1-3s). It is ignorable in full build, but it might\nbe considerable in small build or m nothing scenario.\n\nIf weight list comes from ninja log, we can just directly read ninja log\ndata instead of writing weight list from ninja log outside, and read the\nweight list. It doesn\u0027t spend additional time because ninja log is\nloaded by default.\n\nBug: 271527305\nTest: build with new option\nChange-Id: I1b4880ce993e5faaa03749b30f62a1236f63fe86\n"
    },
    {
      "commit": "3bed7b3ce5e93bfa2933f8ff987d599ba517d182",
      "tree": "21d674699e516c40e511cbae3bcb4892da3c8a81",
      "parents": [
        "2f4ecd1728f9620adeea31d498abea7c8e66b3bf"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Thu May 18 21:20:08 2023 +0900"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Mon May 22 11:40:24 2023 +0900"
      },
      "message": "Skip if the next node isn\u0027t dirty\n\nIn priority calculation, a clean node doesn\u0027t need to be visited.\n\nBug: 271527305\nTest: ninja build\nChange-Id: Id6c238c717554040cacef8db3a8ed6eedb98994b\n"
    },
    {
      "commit": "309aff722de411015ce33ff7395a7d522456ac3c",
      "tree": "089e68849f22a6fa4a11395b61c1fba43f9b9fda",
      "parents": [
        "2f4ecd1728f9620adeea31d498abea7c8e66b3bf"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri May 19 21:16:49 2023 +0000"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri May 19 21:16:49 2023 +0000"
      },
      "message": "Python 3 fxies.\n\nBug: None\nTest: ./configure.py\nChange-Id: I43a4a37dfcca746fe15100fb5ba897fb1f2b9999\n"
    },
    {
      "commit": "2f4ecd1728f9620adeea31d498abea7c8e66b3bf",
      "tree": "a4380b5daec544eb5e655022f7d27f552ddd8633",
      "parents": [
        "4566a1ad1f3393f284e9bf35fa2bb7c0e415f1ba"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Thu Mar 16 12:57:02 2023 +0900"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Thu Mar 16 14:29:37 2023 +0900"
      },
      "message": "Clean up WeightDataSource\n\n1. accept rvalue reference for move\n2. uses optional.or_value instead of if block\n\nBug: 271527305\nTest: m ninja\nChange-Id: I29f32a3fdeb866370f076e37e063c5057890e134\n"
    },
    {
      "commit": "4566a1ad1f3393f284e9bf35fa2bb7c0e415f1ba",
      "tree": "80ea8b1dd5875de38df42b6743daabe873cdc8f2",
      "parents": [
        "a6b76d1e577f3bf3d3956d1b135d130e8083af69",
        "5d2e4cc33ce16912d3e28fbd916253023c7f49ed"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Wed Mar 15 22:55:17 2023 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Mar 15 22:55:17 2023 +0000"
      },
      "message": "Merge \"Declare a new type for WeightDataSource\""
    },
    {
      "commit": "5d2e4cc33ce16912d3e28fbd916253023c7f49ed",
      "tree": "381e51955e0ffd0227244fdbeebd90d58b5a2ba4",
      "parents": [
        "85feab1d7308ac61770ffde92d21aa935bda2d09"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Wed Mar 15 21:21:22 2023 +0900"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Wed Mar 15 21:25:53 2023 +0900"
      },
      "message": "Declare a new type for WeightDataSource\n\nMaintaining both vector\u003cHashStr\u003e and unordered_map\u003cHashStrView, V\u003e for\nlifecycle could be fragile.\n\nBug: 271527305\nTest: NINJA_PRIORITY_FROM_BUILD_LOG\u003dtrue m\nChange-Id: Ic80c2b153b191fc2abd7ad2f0cb27a0f2d51cfa8\n"
    },
    {
      "commit": "a6b76d1e577f3bf3d3956d1b135d130e8083af69",
      "tree": "298d8d25ea9b419b6bb40f00274cf56aa82cbafc",
      "parents": [
        "cdd5c80b94f89be8282b8bd43760239516c1c5ac",
        "85feab1d7308ac61770ffde92d21aa935bda2d09"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Wed Mar 15 10:03:19 2023 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Mar 15 10:03:19 2023 +0000"
      },
      "message": "Merge \"Add usesweightlist option\""
    },
    {
      "commit": "85feab1d7308ac61770ffde92d21aa935bda2d09",
      "tree": "72921723594ba548495c64af483adbc2be2b9bc7",
      "parents": [
        "367e81abfaac84d9a821a5c412d3709bb4f28d8a"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Fri Mar 10 07:37:44 2023 +0900"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Wed Mar 15 18:10:59 2023 +0900"
      },
      "message": "Add usesweightlist option\n\nif usesweightlist\u003d\u003cfile path\u003e, ninja prioritizes some\nworks by calculating critical path from weight list.\n\na priority list is a csv file, it looks like\n\u003coutput file path\u003e,\u003cweight\u003e\n\u003coutput file path\u003e,\u003cweight\u003e\n\nIn PS#12, divide weight and priorty.\nIn PS#7, remove usesbuildlogtoprioritize, and add usesprioritylist.\n\nBug: 271527305\nTest: NINJA_PRIORITY_FROM_BUILD_LOG\u003dtrue m\n  and then check if it uses priority.\n\nChange-Id: I463dc2a8a38e977d84f37f2d975582560b8c22fd\n"
    },
    {
      "commit": "cdd5c80b94f89be8282b8bd43760239516c1c5ac",
      "tree": "b2d76addefb2564b3dc53e5ba989dd6001e3925a",
      "parents": [
        "367e81abfaac84d9a821a5c412d3709bb4f28d8a"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Mon Feb 27 13:33:16 2023 -0800"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Mon Feb 27 13:33:16 2023 -0800"
      },
      "message": "Bugfix for http://aosp/2319430 in subninjas\n\nhttp://aosp/2319309 \"Prework for --experimentalEnvvar\" added the\ncmdEnviron_ member to every Scope. But the simple path only\ninitialized it to NULL. While `subninja chdir` was correct,\nthe more generic `subninja` (not a chdir) would get a NULL\ncmdEnviron_ leading to it omitting any `envvar` statements.\n\nThis fixes the case where:\n\n1. build.ninja with a \"subninja chdir foo\" *and* \"envvar\"\n2. foo/build.ninja with a \"subninja bar/build.ninja\"\n3. foo/bar/build.ninja builds something that depends on \"envvar\"\n\nChange-Id: Ie260ea5c728bcd07b5251c322084e52382819f0a\n"
    },
    {
      "commit": "367e81abfaac84d9a821a5c412d3709bb4f28d8a",
      "tree": "b7867588c9bfedbdcd4f3687659e294633596292",
      "parents": [
        "b897bf6b054bde97e163d1c22bf5c3e23c50f29e"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Wed Jan 11 13:21:57 2023 -0800"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Thu Jan 12 21:36:23 2023 -0800"
      },
      "message": "Bugfix for http://aosp/2319430 to parse env var\n\nlexer_.ReadIdent() reads a single identifier, and cannot read the entire\nenvironment value assignment - it stops at whitespace.\n\nAlso, it fails when attempting to unassign an environment variable.\n\nThis change also updates unit tests to test for these cases.\n\nChange-Id: I9e4757f0323c9e095fbb7bac73954d6ca517f6d8\n"
    },
    {
      "commit": "b897bf6b054bde97e163d1c22bf5c3e23c50f29e",
      "tree": "c5887d606e4d033bec1d7d2dcfa5b5685d376455",
      "parents": [
        "70e62ae53f1999a250beda05386c8a496cb15410"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Tue Dec 13 11:02:59 2022 -0800"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Tue Dec 13 12:23:58 2022 -0800"
      },
      "message": "Auto-merge duplicate pools between subninja chdir\u0027s\n\nNote: Pools cannot have the same name, except in the very rare case that\na subninja chdir invokes an entirely separate build which then has a\npool with the same name.\n\nEven then, the pools are silently merged across subninja chdirs, unless\nthe depth value does not match. The special predefined \u0027console\u0027 pool\nwill always have a depth of 1, so references to it get merged by the\nsame logic.\n\nPools are *not* supposed to break the build due to these subtle nuances\nof when they are merged and when they are not. Pools are supposed to be\na useful decorator that optimizes the build for some rare rules that\nneed to have *less* parallelism. Sometimes the different trees being\nbuilt cannot avoid having duplicate pool names because the sources are\nmaintained by different parties. The goal then is to *not* break the\nbuild, by either silently merging pools as much as possible, and\notherwise allowing pools with the same name to silently coexist.\n\nEach pool must have a unique tuple\n( Scope* Pool::parent_, HashedStr name_ )\n\nChange-Id: Id220ed9baa41af3ddb902e8e20bd03f6acbb4441\n"
    },
    {
      "commit": "70e62ae53f1999a250beda05386c8a496cb15410",
      "tree": "b6f80f77131f6f06de5246a074c0d51b1fb577f8",
      "parents": [
        "378951b8ded9d3e3df52fa1eeb1209bf9ae6652d"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Mon Nov 28 18:34:14 2022 -0800"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Wed Nov 30 11:17:47 2022 -0800"
      },
      "message": "Add --experimentalEnvvar support\n\nThis CL completes the work started in http://aosp/2319309 by adding the\nnew assignment grammar that sets env variables inside a subninja chdir:\n\n```\nsubninja b/build.ninja\n  env OUT \u003d build\n  chdir \u003d b\n```\n\nThe modified environment gets used when edges from inside the subninja chdir\nare executed.\n\nNote that setting environment variables within a ninja file is still\nconsidered somewhat buggy and may be removed suddenly in the future because\nninja makes no guarantees about any *other* environment variables, nor are\nbuilds hermetically sealed against such changes in the environment. A ninja\nfile using this kind of assignment from this CL is doing it to add some\nkind of environment variable guaranttes, and ninja does not support that\nat this time. An easy way to improve the build is to \"bake\" environment\nvariable assignments into a wrapper script. Then ninja would execute the\nwrapper script (instead of directly calling the underlying command).\n\nHermetic build environments are becoming a de facto best practice as\nthey make caching and build troubleshooting simpler.\n\nWarning: a further pitfall awaits for Windows builds, since posix builds\nhave an implicit /bin/sh prepended to all commands. Windows builds will\nget the modified environment vars from this CL but since there is no\ncommand shell to expand them, the called program must itself know how to\nhandle environment variable expansion, or the Windows build must use a\ndifferent ninja rule - such as a wrapper script like mentioned above.\n\nChange-Id: I6a3de2cbfa361f6b6723851fd87b04db0058a8a6\n"
    },
    {
      "commit": "378951b8ded9d3e3df52fa1eeb1209bf9ae6652d",
      "tree": "bdb05de4fe16e8516fa08fb19e9665df51eba824",
      "parents": [
        "4b5a2177cb2f246e6cf5fa1316ff4323ece37408"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Sat Nov 26 19:17:26 2022 -0800"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Wed Nov 30 09:52:40 2022 -0800"
      },
      "message": "Prework for --experimentalEnvvar\n\nThis CL adds the --experimentalEnvvar flag in Options and passes it to\nManifestParserOptions, which passes it to ChunkParser where subninja chdir\nparsing happens. This sets the stage for a future CL to parse environment\nvariable assignments.\n\nAlso add to struct Include a std::unordered_map to contain those environment\nvariable assignments, and add support to struct Edge for commands that\nhave a cmdEnviron. This sets the stage for a future CL to compute an\nenvironment that differs from the startup environment variables when\nninja was started.\n\nThis is all the practical refactoring to make the meat of the\n--experimentalEnvvar code simple, while not making any change to ninja\nbehavior; the flag --experimentalEnvvar does nothing.\n\nChange-Id: I7654fbcb3389fc4a6384ac395ae0f8740b9e39ec\n"
    },
    {
      "commit": "4b5a2177cb2f246e6cf5fa1316ff4323ece37408",
      "tree": "03e0a2898e4275b6fcd15d71cf6d19af8445700f",
      "parents": [
        "246659993ca5e43621f11711d7935223b6d1f295"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Wed Sep 21 16:18:07 2022 -0700"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Wed Sep 21 16:18:07 2022 -0700"
      },
      "message": "Subninja chdir: \u0027phony\u0027 default rule\n\nThis fixes the following error in a subninja chdir:\n\nninja: error: b/build.ninja:8: unknown build rule \u0027phony\u0027\nbuild all: phony b2.txt\n           ^ near here\n\nThe bug is caused by the builtin rules (just one rule in this case)\nbeing added to the root scope in the State() constructor. Since\nsubninja chdir\u0027s have a weird scope for their root scope -- one that\nboth points to its parent and also acts like it has no parent --\nthe scope gets the builtin rules added just like a root scope.\n\nThe subninja chdir scope points to its parent to be able to translate\nrelative paths to absolute paths.\n\nThe subninja chdir scope blocks traversal to its parent when looking\nup variables and rules.\n\nThis commit fixes the one problem with blocking traversal to its parent:\nthe default rules (just one rule, the rule for \"phony\") are not visible\nin a chdir.\n\nChange-Id: I42b6011a3ed87924f5c8738c7d049d7d2b311e4f\n"
    },
    {
      "commit": "246659993ca5e43621f11711d7935223b6d1f295",
      "tree": "bb743da64d559a781ff8bb839ee67ccebd09e6b5",
      "parents": [
        "1e5938f5528ffe4ba70e3eb304e191540e88bb3e"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Wed Jun 08 19:16:39 2022 -0700"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Wed Jun 08 19:16:39 2022 -0700"
      },
      "message": "Subninja chdir: clean up logspam\n\nWarnings would be spammed if a subninja (not a chdir) was used:\nninja: warning: Node \"%s\" not in a child of target %p \"\"\n\nThis fixes ResolveChdir() by first walking the target up the\ntree to the next chdir or root node. This prevents the child\nbeing searched for from flying past the target and hitting\nthe root node unexpectedly.\n\nChange-Id: I1136d8432a2172e432023c48626270f21da51049\n"
    },
    {
      "commit": "1e5938f5528ffe4ba70e3eb304e191540e88bb3e",
      "tree": "1546e0a78d78b654bb39a1f2e700a0c205aa722c",
      "parents": [
        "8861e220575c4e66db5d313d5fc7a5dc2ab85719"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Thu Apr 14 16:02:11 2022 -0700"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Thu May 26 12:54:51 2022 -0700"
      },
      "message": "Implement subninja chdir building\n\nThis CL implements the rest of subninja chdir:\n\n1. Edge now supports subninja chdir. All Edge instances are tracked\n   in the singleton State, uniquely identified by their GlobalPath()\n   (see Scope::GlobalPath())\n\n2. Node support as well. Node::globalPath() replaces\n   Node::path_hashed(). Node::path() is renamed to Node::rpath()\n   while this CL is in-progress; but before submitting, it\n   should be renamed back to Node::path(). (Same for Node::path_)\n   It\u0027s just convenient to have the compiler flag any use of\n   the old path() and path_ for review.\n\n3. Variables do not change. Within the same Scope, variables are\n   evaluated just like they always were. No variable is allowed\n   to leak across a parent -\u003e child subninja chdir.\n\n4. depfiles and rspfiles\u0027 contents should not change. If a\n   depfile or rspfile is read or written from within a subninja\n   chdir, the paths in it should be transparently converted to\n   the Scope::GlobalPath().\n\n5. Edge::EvaluateCommand() will generate commands in a chdir.\n\n6. WIN32 build special cases.\n\nChange-Id: I1bb4ae947353354533c3755df43698f00a3f2cf0\n"
    },
    {
      "commit": "8861e220575c4e66db5d313d5fc7a5dc2ab85719",
      "tree": "cd19a92a2288852f85630496469141713114dac4",
      "parents": [
        "30041e4cd15ce5f55a7b2809e771c61a92b985d1"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Mon Apr 11 18:11:59 2022 -0700"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Sat May 21 12:44:15 2022 -0700"
      },
      "message": "Subninja chdir: parse and load declarations\n\nThis builds on the previous CL to implement the parsing of\na subninja chdir, then loading the .ninja file in the\nchdir. Note the order of the steps:\n\n1. The subninja chdir is fully parsed in the parent\n2. The subninja file is loaded into memory\n3. The chdir() is performed\n4. LoadManifestTree() is called\n5. The current dir is restored like it was\n\nThis CL does not implement all the changes to be able to set\nparent edges pointing at the subninja.\n\nChange-Id: I7d75f72b252b8f60a6d2d7cec763a879e2c705be\n"
    },
    {
      "commit": "30041e4cd15ce5f55a7b2809e771c61a92b985d1",
      "tree": "29a992ca91f0568604657087120ce846f29df337",
      "parents": [
        "f5a64fd445303624881dc16eddbd104e1d08a592",
        "b3dd6ea54b471469d46ad13d9ef0ee1de4bb7b7d"
      ],
      "author": {
        "name": "Christopher Parsons",
        "email": "cparsons@google.com",
        "time": "Tue May 17 15:08:55 2022 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue May 17 15:08:55 2022 +0000"
      },
      "message": "Merge \"Set output mtime of phony edges to latest inputs\""
    },
    {
      "commit": "f5a64fd445303624881dc16eddbd104e1d08a592",
      "tree": "ef020fbc16d25176f1d09226371f358e91d63a61",
      "parents": [
        "e2408a6ab1aeb6d46c31410cd2f180c67a6e7cd2"
      ],
      "author": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Wed May 04 03:55:04 2022 +0000"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Tue May 17 13:53:15 2022 +0000"
      },
      "message": "Add \u0027excluded path\u0027 option for path and inputs\n\nninja tool path and inputs are useful to track and reduce deps from\ncertain target. But, it\u0027s hard to forecast inputs and path before\ncutting the dep actually. So, I added -e option to suppose some pathes\nare excluded.\n\nTest: ninja -t path(or inputs) with -e option\nBug: 230693986\nChange-Id: If29dd5947a44e834b90eaae8a9fd51ce9edd3981\n"
    },
    {
      "commit": "b3dd6ea54b471469d46ad13d9ef0ee1de4bb7b7d",
      "tree": "a68bee0f478641d9bf339357f595f5c0fab92298",
      "parents": [
        "e2408a6ab1aeb6d46c31410cd2f180c67a6e7cd2"
      ],
      "author": {
        "name": "Chris Parsons",
        "email": "cparsons@google.com",
        "time": "Tue May 17 02:03:00 2022 +0000"
      },
      "committer": {
        "name": "Chris Parsons",
        "email": "cparsons@google.com",
        "time": "Tue May 17 02:03:00 2022 +0000"
      },
      "message": "Set output mtime of phony edges to latest inputs\n\nThis is a partial cherrypick of https://github.com/ninja-build/ninja/pull/1964/\nwhich fixes a build correctness bug for phony edges. Previously, actions\nwith implicit dependencies on phony targets would not rerun if the\ninputs to these phony targets were changed.\n\nTest: Manually verified bug fix with repro case described in b/232030877#comment27\nTest: New unit test\nChange-Id: I1d58abb9c46e9a31f0cb3b44bf45e87f8f301209\n"
    },
    {
      "commit": "e2408a6ab1aeb6d46c31410cd2f180c67a6e7cd2",
      "tree": "a59ec39f68f75e3886ff20b9911b13f5c2e29b9c",
      "parents": [
        "ed250d061bd8d7682c9f434c58dd3cebeb90f4ec"
      ],
      "author": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Mon Apr 11 17:05:44 2022 -0700"
      },
      "committer": {
        "name": "David Hubbard",
        "email": "dsp@google.com",
        "time": "Thu Apr 21 14:17:15 2022 -0700"
      },
      "message": "Add CHDIR token to lexer\n\nThis CL changes the grammar defined in lexer.in.cc and propagates\nthe changes through all the affected files:\n\n* src/depfile_parse.cc\n* src/lexer.cc\n* src/lexer.h\n* src/lexer.in.cc (of course)\n\nThis adds a \u0027chdir\u0027 token which can be used after a \u0027subninja\u0027:\n\n\u003csubninja\u003e path\n\u003cindent\u003e  \u003cchdir\u003e \u003cequals\u003e path\n\nHowever, this CL does not make the changes to the parser to\nsupport the \u0027chdir\u0027 token. That is left for a future CL.\n\nNote that https://github.com/ninja-build/ninja/pull/1578 is the\norigin of this sequence of CLs. The github pull request does not\nadd a CHDIR token to the lexer, and uses a string compare with\n\"chdir\". This CL corrects that and uses the lexer in the proper\nway.\n\nChange-Id: Iaac81cbcc387da44f7ace1298a0f7e388f414908\n"
    },
    {
      "commit": "ed250d061bd8d7682c9f434c58dd3cebeb90f4ec",
      "tree": "c2fc183f402d6a12ca0dabcf3b88260025b4a67d",
      "parents": [
        "826625d95f30b001cef64959e624e5d7076ed507"
      ],
      "author": {
        "name": "Sasha Smundak",
        "email": "asmundak@google.com",
        "time": "Fri Nov 19 11:04:48 2021 -0800"
      },
      "committer": {
        "name": "Sasha Smundak",
        "email": "asmundak@google.com",
        "time": "Mon Nov 22 09:58:48 2021 -0800"
      },
      "message": "Add --quiet option that suppresses status updates.\n\nCherrypick a567ebb6ef75bfda9204900e4fcbcd7ee2785f61 from upstream\n\nTest: no build progress messages (Soong changes required)\nChange-Id: Iddcd0caf4d7ae0c88b6171d51f7786a2e87a6b4a\n"
    },
    {
      "commit": "826625d95f30b001cef64959e624e5d7076ed507",
      "tree": "bfb4c65af9635ed2256fe88ce99f042c7de2c077",
      "parents": [
        "5717c6e5808b6eb129aacec0e9b54060cb7c6b47"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Aug 18 13:55:29 2021 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Aug 24 16:32:33 2021 -0700"
      },
      "message": "Build ninja statically when using musl\n\nThe aosp-llvm-toolchain build uses LD_LIBRARY_PATH to affect the\nprocesses run inside ninja, but that affects ninja too.  There\u0027s\nno way to use a different LD_LIBRARY_PATH for ninja and its\nsubprocesses, so just make ninja static instead.\n\nBug: 190084016\nTest: aosp-build-tools linux_musl build\nChange-Id: Ifd6d871ccb973f97eab76cd9ada58df1af175d9f\n"
    },
    {
      "commit": "5717c6e5808b6eb129aacec0e9b54060cb7c6b47",
      "tree": "de82d3f1f762d49adc1fa5faca50d4e2df59cd3a",
      "parents": [
        "3f92b2c8e697faed2083b609b7389e19d240b140"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Jul 21 18:09:15 2021 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Aug 11 16:48:35 2021 -0700"
      },
      "message": "Fix printf of rlim_t for musl\n\nrlim_t is an unsigned long long on musl, add a cast to work on any\ndefinition.\n\nBug: 190084016\nTest: m out/soong/host/linux-x86/bin/ninja with musl\nChange-Id: I6f74fd1bfece4cd7a39bf5edbad78e73c1716d52\n"
    },
    {
      "commit": "3f92b2c8e697faed2083b609b7389e19d240b140",
      "tree": "ee209b795f562b3b401bb40e98ea82d9b081f062",
      "parents": [
        "3a102e1097901ca8283ee2b81dd88a8d290610a9"
      ],
      "author": {
        "name": "makepost",
        "email": "makepost@firemail.cc",
        "time": "Mon Dec 24 03:13:16 2018 +0200"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Aug 11 16:48:33 2021 -0700"
      },
      "message": "Use st_mtim if st_mtime is macro, fix #1510\n\nIn POSIX.1-2008, sys_stat has a st_mtim member and a st_mtime backward\ncompatibility macro. Should help avoid hardcoding platform detection.\n\nBug: 190084016\nTest: m out/soong/host/linux-x86/bin/ninja with musl\n(cherry picked from commit 567815df38a2ff54ad7478a90bd75c91e434236a)\nChange-Id: If073a90b26d7dd4f3149ed76acc0da817bf07775\n"
    },
    {
      "commit": "3a102e1097901ca8283ee2b81dd88a8d290610a9",
      "tree": "c2c0d3f02989da6eac4e133210625066c2fe21fe",
      "parents": [
        "1c25dd0eb54e8e5b3daff3154aa2c121a40754e6"
      ],
      "author": {
        "name": "Spandan Das",
        "email": "spandandas@google.com",
        "time": "Fri Jul 16 19:57:10 2021 +0000"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Jul 27 00:43:33 2021 -0700"
      },
      "message": "Create a debug tool to print all dependency chains between two nodes\n\naosp/825820 prints a single dependency chain between two nodes using a\nBFS based approach. The current CL will print all dependency chains.\n\nThis has been implemented using a DFS based approach.\n1. DFS makes it easy to send a \"path prefix\"\n2. I have not memoized this algorithm yet. I ran it for a couple of\nexamples against redin\u0027s ninja file and found it to benchmark OK (more\ndetails in Test section)\n3. Since this is DFS, it is sensitive to the depth of the search. For my\nhardware, a search exceeding a depth\u003e50,000 would cause a segmentation fault\n\nBug: 193147539\nTest: ./ninja ninja_test \u0026\u0026 ./ninja_test\n\nBenchmark:\npath\ntime ./ninja -C ~/code/aosp -f out/combined-aosp_redfin.ninja -t path\nall bionic/apex/com.android.runtime.pk8\ntakes ~26s and returns 1 path\n\npaths\ntime ./ninja -C ~/code/aosp -f out/combined-aosp_redfin.ninja -t paths\nall bionic/apex/com.android.runtime.pk8\ntakes ~28s and returns 48 paths\n\nChange-Id: Ia5ea029dd0f9c410a1151310d205792b93ed702c\n"
    },
    {
      "commit": "1c25dd0eb54e8e5b3daff3154aa2c121a40754e6",
      "tree": "222aa70b6e0169040ad70ef5d0ca764ca4a464f6",
      "parents": [
        "dbec7ad4540f87733394953f89b89d3557dbf3cb"
      ],
      "author": {
        "name": "Michael Hirsch, Ph.D",
        "email": "scivision@users.noreply.github.com",
        "time": "Wed Feb 19 05:55:41 2020 -0500"
      },
      "committer": {
        "name": "Jeongik Cha",
        "email": "jeongik@google.com",
        "time": "Tue May 11 16:28:37 2021 +0900"
      },
      "message": "browse.py: use html.escape for python3\n\nfixes #1741\nfixes #1736\n\nCherry-picked from\nhttps://github.com/ninja-build/ninja/commit/4d744de3eed19af8c8c1094637a044747c297934\n\nTest: ninja ... -t browse with python3\nBug: 187784045\nChange-Id: Ic6bd8b6eb08f68058712acf325be88ebb69831c7\n"
    },
    {
      "commit": "dbec7ad4540f87733394953f89b89d3557dbf3cb",
      "tree": "d6c0dcfdbeea2f35cfeee3846d200bff392cf478",
      "parents": [
        "64665f0233bcdbbb9c9dc5b0f441a7c1fa11137c"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Apr 08 17:56:57 2021 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Apr 08 18:06:29 2021 -0700"
      },
      "message": "Switch jemalloc to jemalloc5\n\nTest: OUT_DIR\u003dout prebuilts/build-tools/build-prebuilts.sh\nChange-Id: I0eb19ec95caa14b14cc417f77595d345bf0df19b\n"
    },
    {
      "commit": "64665f0233bcdbbb9c9dc5b0f441a7c1fa11137c",
      "tree": "935e60c6698e64eed7992570e8340a116dbef282",
      "parents": [
        "a42ef0b5df875dad2707937ef77464ccbe1ea069",
        "d4937ad8940180c83736288ed890928605d8812f"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Oct 14 18:33:54 2020 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Oct 14 18:33:54 2020 +0000"
      },
      "message": "Merge changes Ie0345988,I4ceb53e3\n\n* changes:\n  Add more stats to EdgeFinished proto message\n  Fix syntax error in frontend/native.py\n"
    },
    {
      "commit": "d4937ad8940180c83736288ed890928605d8812f",
      "tree": "d977f7a810dedae931b6236e157fb43ef31d89d7",
      "parents": [
        "357070c4c5a2f6cc0d9988fb799c9e5df349fdbe"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Oct 14 10:52:30 2020 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Oct 14 11:03:59 2020 -0700"
      },
      "message": "Add more stats to EdgeFinished proto message\n\nAdd everything collected in rusage that is supported by Linux\nand looks useful.\n\nBug: 170701554\nTest: ninja_test\nChange-Id: Ie0345988579f0635aac07eb45bd6b69192975b89\n"
    },
    {
      "commit": "357070c4c5a2f6cc0d9988fb799c9e5df349fdbe",
      "tree": "505ef0132ee0d15ed1f39dcfbc67cee5a65e0adf",
      "parents": [
        "ffd6a3e01d9cf37cc48c966af361eabacedf500b"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Oct 14 10:50:14 2020 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Oct 14 10:50:14 2020 -0700"
      },
      "message": "Fix syntax error in frontend/native.py\n\nTest: ./ninja -d stats --frontend\u003dfrontend/native.py\nChange-Id: I4ceb53e365aea16f8c09fafa633be14c9ecfcf01\n"
    },
    {
      "commit": "a42ef0b5df875dad2707937ef77464ccbe1ea069",
      "tree": "09274bc7e7c256a7b3015d93b366fdfc83d61c22",
      "parents": [
        "4b3e54d29302e0accfab963fc1af21b2d44771d1"
      ],
      "author": {
        "name": "Joe Onorato",
        "email": "joeo@google.com",
        "time": "Thu Oct 08 16:16:03 2020 -0700"
      },
      "committer": {
        "name": "Joe Onorato",
        "email": "joeo@google.com",
        "time": "Thu Oct 08 16:26:22 2020 -0700"
      },
      "message": "Add OWNERS file for external/ninja that references build/soong/OWNERS\n\nTest: treehugger\nBug: 170407947\nChange-Id: I3f380fc19bb6a99561b7c7139275525fcd4b4531\n"
    },
    {
      "commit": "4b3e54d29302e0accfab963fc1af21b2d44771d1",
      "tree": "7000047a495858d78c78951094e12495cfd719a5",
      "parents": [
        "ffd6a3e01d9cf37cc48c966af361eabacedf500b"
      ],
      "author": {
        "name": "Jingwen Chen",
        "email": "jingwen@google.com",
        "time": "Mon Sep 21 13:46:37 2020 +0000"
      },
      "committer": {
        "name": "Jingwen Chen",
        "email": "jingwen@google.com",
        "time": "Thu Oct 01 08:44:07 2020 +0000"
      },
      "message": "Add support for new \u0027symlink_outputs\u0027 reserved variable to AOSP Ninja statements.\n\nThis variable contains a space-separated list of paths representing\ndeclared symlink outputs that an edge creates.\n\nIf `-o usessymlinkoutputs\u003dyes`, Ninja will check that symlink outputs\nare in this list, and file outputs are not in this list. Otherwise, it\nprints a warning. Defaults to `usesymlinkoutputs\u003dno`, which does not\naffect existing Ninja files (unless symlink_outputs is already being\nused, which isn\u0027t the case in AOSP).\n\n`-w undeclaredsymlinkoutputs\u003derr` turns that warning into error.\n\nThis is not necessary today because AOSP Ninja (not upstream Ninja)runs\n`lstat` on all outputs, which would return the correct metadata\nregardless if the output is a symlink or a file. However, tooling\nintegration with Ninja files require symlink outputs to be marked as\nsuch, and aggregating them in the symlink_outputs variable is probably\nthe least invasive approach.\n\nTest: (in build-tools) OUT_DIR\u003dout build/soong/soong_ui.bash --make-mode --skip-make ninja ninja_test \u0026\u0026 out/soong/host/linux-x86/nativetest64/ninja_test/ninja_test\nTest: (in AOSP) m NINJA_ARGS\u003d\"-o usessymlinkoutputs\u003dyes\"\nTest: (in AOSP) m NINJA_ARGS\u003d\"-o usessymlinkoutputs\u003dyes -w undeclaredsymlinkoutputs\u003derr\"\n\nBug: 160568334\n\nChange-Id: Iae69ccb6014cace9ab6e61e0b6aca00f6d6ac8c6\n"
    },
    {
      "commit": "ffd6a3e01d9cf37cc48c966af361eabacedf500b",
      "tree": "4d8613d280161c1471713f1fd1b78f3f8111668e",
      "parents": [
        "e41652c988d198c2a386c98970ab6acedf738598"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Aug 13 17:24:41 2020 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Aug 13 17:24:41 2020 -0700"
      },
      "message": "Improve depfilemulti warning\n\nInstead of going straight to stderr without any context, instead put the\nwarning into the output of the action that triggered it, so that it can\nbe properly attributed when using the protobuf status serializer:\n\n[ 50% 358/708] //external/crosvm/msg_socket/msg_on_socket_derive:libmsg_on_socket_derive rustc msg_on_socket_derive.rs\nninja: warning: depfile has multiple output paths (on separate lines); continuing anyway [-w depfilemulti\u003dwarn]\n\nIn the case where we\u0027re loading the depfile at startup (when not using\nthe deps database), continue using the Warning() to stderr, but at least\nprefix the message with which depfile caused the warning.\n\nTest: mmma external/crosvm\nChange-Id: I4cf6a9af71596e2d0745408da25ca5e100f50561\n"
    },
    {
      "commit": "e41652c988d198c2a386c98970ab6acedf738598",
      "tree": "1596ffaf6b16fd2e858a05bfa1a2bcecbd71020f",
      "parents": [
        "71bdf56a58b603b8888723734277c78c828f6266",
        "2e64645749ff91eff2f999f03f55da360ae5913d"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Jul 08 17:59:20 2020 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Jul 08 23:06:28 2020 -0700"
      },
      "message": "Merge upstream commit \u00272e646457\u0027 into master\n\n* commit \u00272e646457\u0027:\n  Document example dyndep use cases\n  Document `dyndep` binding behavior and the dyndep file format\n  query: load dyndep files for queried edges\n  graph: load dyndep files\n  clean: remove outputs specified by dyndep files\n  clean: remove unnecessary Cleaner constructor variant\n  Teach builder to load dyndep files when they are ready\n  Teach RecomputeDirty to load dyndep files that are ready\n  Teach DependencyScan to load a dyndep file\n  Add a \"dyndep\" reserved binding to the manifest format\n  Add a parser for a new \"dyndep\" file format\n  Explicitly avoid repeat deps loading\n  Make a Builder optionally available to Plan\n  Factor out output edge ready check from Plan::NodeFinished\n  Factor out edge marking logic from Plan::AddSubTarget\n  Teach FakeCommandRunner to support multiple active commands\n  Allow EdgeFinished and NodeFinished to fail with errors\n  Assert precondition in BuildStatus::BuildEdgeStarted\n  Factor out a base class of ManifestParser\n  ManifestParser: Fix typo {expectd \u003d\u003e expected}\n\nThis brings in the upstream dyndep feature into our ninja fork. The\nmajority of the conflicts were from our parallel manifest parser, as\nthat changed the Lexer and all of the BindingEnv classes, which required\nsome rewrites. Upstream shares a base parsing class between the\nManifestParser and DyndepParser, that doesn\u0027t make sense with our new\nparser, so DyndepParser is the only user of the Parser base class.\n\nColin\u0027s validation nodes change also interacts with dyndeps, I pulled in\nthe new code from his github pull request.\n\nTest: builtin ninja tests\nTest: treehugger with updated prebuilt\nChange-Id: I90b059d0c28a353d50e74efc9097cc39d88a5583\n"
    },
    {
      "commit": "71bdf56a58b603b8888723734277c78c828f6266",
      "tree": "48dbc616dbb645da754587458797039b9ad44858",
      "parents": [
        "f94f19e6eca76079dba1c3fe272885f97dfcf5b7",
        "71b96489325e5e2629464687c60f20d9905ab51c"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Jul 07 22:42:55 2020 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Jul 07 22:45:22 2020 -0700"
      },
      "message": "Merge upstream commit \u002771b96489\u0027 into master\n\n* commit \u002771b96489325e5e2629464687c60f20d9905ab51c\u0027:\n  Remove trailing whitespace from all files\n  make inline.sh more portable\n  Feature/add term env dumb to win32 (#1550)\n  Update link to premake\n  Take CPU set limitations into account when calculating processor count\n  Docs: Make builds reproducible by generating the same IDs from the same inputs\n  Fix Fuchsia typo\n  mark this 1.9.0.git\n  ninja_syntax.py: remove unused has_path argument\n  Remove outdated part about Chrome download, fix #1338\n  Remove dead Chromium link, fix #1263\n  Change gyp to gn\n\nI don\u0027t expect anything here to cause problems, it was only a trivial\nconflict. This stops right before the upstream dyndeps patch.\n\nTest: treehugger\nChange-Id: Ib968993b8a98e75f0ff3e32be7ac325ac3fc14ad\n"
    },
    {
      "commit": "f94f19e6eca76079dba1c3fe272885f97dfcf5b7",
      "tree": "c6eb53be55f3c9e87b98508e1d30da15459d65c8",
      "parents": [
        "add90eee261445c62c3dabfdaf1bdd425310dd49",
        "0a2e2cae7038ce519b0524c07d7135c3e520c9cd"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Jul 07 19:51:46 2020 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Jul 07 22:36:46 2020 -0700"
      },
      "message": "Merge upstream commit \u00270a2e2cae\u0027 into master\n\n* commit \u00270a2e2cae7038ce519b0524c07d7135c3e520c9cd\u0027:\n  Restore depfile toleration of multiple output paths on distinct lines\n  Fix depfile parser handling of multiple rules\n  Fix depfile parser test case line continuation\n  Re-arrange depfile parser token processing logic\n  Re-generate depfile parser with re2cc 1.0.1\n\ndepfile_parser.cc conflicts were handled by regenerating with re2c\n\nThe other conflicts were all fairly simple argument/option ordering.\n\nTest: compare .ninja_deps of a full android build before and after this\n      change, they\u0027re equivalent\nChange-Id: I74b7fc56e035c9dbab4c987b6af17329c596a898\n"
    },
    {
      "commit": "add90eee261445c62c3dabfdaf1bdd425310dd49",
      "tree": "0a72a7b58ac28175a5a151bdc3e06294bed7ae1e",
      "parents": [
        "0160e910ee3efcb8f2dccc965300eb8172cccdd1"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jun 09 18:41:27 2020 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Jun 19 23:09:16 2020 -0700"
      },
      "message": "Add validation nodes to ninja\n\nA common problem in the Android build is inserting rules that perform\nsome sort of error checking that doesn\u0027t produce any artifacts needed\nby the build, for example static analysis tools.  There are a few\npatterns currently used, both of which have downsides.\n\nThe first is to have a rule that depends on all of the static analysis\nresults.  This ensures they run, but requires running static analysis\nover everything, and not just the active parts of the build graph.\n\nThe second is to insert the static analysis rule into the build graph\nbetween the artifact producing rule and anything that depends on it,\noften copying the artifact as the output of the static analysis rule.\nThis increases the critical path of the build, often reducing\nparallelism.  In the case of copying the artifact, it also wastes\ndisk space.\n\nThis patch adds \"validation nodes\" to edges in Ninja.  A build\nstatement can specify validation nodes using \"|@\" in the edge\ninputs.  The validation nodes are not used as an input to the edge\n(the edge can run before the validation node is ready), but are\nadded to the initial nodes of the build graph whenever the edge\nis part of the build graph.  The edge that outputs the validation\nnode can depend on the output of the edge that is being validated.\n\nTest: ninja_test\nChange-Id: Ife27086c50c1b257a26509373199664680b2b247\n"
    },
    {
      "commit": "0160e910ee3efcb8f2dccc965300eb8172cccdd1",
      "tree": "0707f3a71a73eb04775ee50a0291ec3ec665c20b",
      "parents": [
        "e5a9d70b45ebecf68a8aec37edf5857b4d635c4e"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon May 18 13:56:43 2020 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon May 18 13:56:43 2020 -0700"
      },
      "message": "Add a new \"debug\" status message, use for stats\n\nThis will allow the android build to always set \"-d stats\", and redirect\nthe output to a verbose log file for later analysis.\n\nTest: NINJA_ARGS\u003d\"-d stats\" m nothing  (without changes to soong_ui -- prints to stdout)\nTest: m nothing   (with changes to soong_ui, see in verbose.log.gz)\nChange-Id: Idc6a9964970f8bc457b4c72cb177998d67149e4a\n"
    },
    {
      "commit": "e5a9d70b45ebecf68a8aec37edf5857b4d635c4e",
      "tree": "347e6045c0cbaa8b5dbc9142e8735b9ef3f187c9",
      "parents": [
        "20255e08887f8f5987663644cd237030615d2e09",
        "75cacd53dfddd986a040b9e631feacac2b276b89"
      ],
      "author": {
        "name": "Daniel Norman",
        "email": "danielnorman@google.com",
        "time": "Tue Jan 28 23:25:58 2020 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Jan 28 23:25:58 2020 +0000"
      },
      "message": "Merge \"Add a debug tool to show all (recursive) inputs to a given target.\""
    },
    {
      "commit": "75cacd53dfddd986a040b9e631feacac2b276b89",
      "tree": "a8787d39781038fc67b80a8369895dc8a60522d0",
      "parents": [
        "62c124ccbcc60b8c23fb07ed2f6ddced080324cf"
      ],
      "author": {
        "name": "Daniel Norman",
        "email": "danielnorman@google.com",
        "time": "Mon Nov 11 05:17:37 2019 +0000"
      },
      "committer": {
        "name": "Daniel Norman",
        "email": "danielnorman@google.com",
        "time": "Tue Jan 28 13:23:13 2020 -0800"
      },
      "message": "Add a debug tool to show all (recursive) inputs to a given target.\n\nBug: 141745084\nBug: 146437081\nTest: ./ninja -t inputs -i -d ninja\nChange-Id: Ifcfcdd473397be46784ad0c770d17d1ccaaaeaef\n"
    },
    {
      "commit": "20255e08887f8f5987663644cd237030615d2e09",
      "tree": "d36aa658fa2b2ccd038d01fe3d763d98995b1a9c",
      "parents": [
        "886f1674e9b793add8bcd18f4c05ea0b9984ea63"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Fri Jan 10 18:05:16 2020 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Jan 13 22:36:31 2020 -0800"
      },
      "message": "Remove outputs before executing rule\n\nUnless it\u0027s a restat rule, we expect the rule to recreate the outputs\nanyways, and this can help catch commands that don\u0027t.\n\nIt seems to be more reliable than the oldoutputs warning (which I\u0027m\nhitting occasionally in some unexpected places), and partially fulfills\nthe same goals. It\u0027s not a full replacement, since outputs with\ntimestamps less than their inputs will cause rebuilds.\n\nMove the usesphonyoutputs\u003d{yes,no} and the new preremoveoutputs\u003d{yes,no}\ninto a new `-o` command line option set, rather than having them in the\n`-w` warnings list. I considered moving them to a manifest variable, but\nthere\u0027s not a lot of precedence for that, and soong_ui needs to\ncoordinate with ckati and potentially control them based on board-level\nBUILD_BROKEN_* values.\n\nTest: run ninja_tests (via build_prebuilts.sh)\nTest: run full android build with this option enabled\nChange-Id: I5b2cb26117f6f852f6568b28dda27175d79b851b\n"
    },
    {
      "commit": "886f1674e9b793add8bcd18f4c05ea0b9984ea63",
      "tree": "53334670ce81ea28a324ca488c8a651eee73af60",
      "parents": [
        "3cb0851989749a6ff630d4a7c978b44281feb41e"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Jan 13 21:50:59 2020 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Jan 13 22:24:05 2020 -0800"
      },
      "message": "Simplify tests\n\nWe don\u0027t need to create new builder objects, the config is a reference,\nso when we update it, the builder will see the new values.\n\nTest: run ninja_tests (via build_prebuilts.sh)\nChange-Id: I8d3e4ff530014eb034ae774fbadcea3d5359181c\n"
    },
    {
      "commit": "3cb0851989749a6ff630d4a7c978b44281feb41e",
      "tree": "59d12222df2a60ac093088f790619dac71f4e849",
      "parents": [
        "62c124ccbcc60b8c23fb07ed2f6ddced080324cf"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Jan 13 19:04:14 2020 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Jan 13 22:20:00 2020 -0800"
      },
      "message": "Add better warning output for stale output files\n\nI\u0027m running into this warning in some unexpected cases, so provide some\nextra information when it hits.\n\nTest: ninja_tests (run by build_prebuilts.sh)\nChange-Id: I294cf0d38dad3324d7fc697bff94356f07f3df13\n"
    },
    {
      "commit": "62c124ccbcc60b8c23fb07ed2f6ddced080324cf",
      "tree": "4941bfefe36ded9dedd0cbd9168a81d1cda8ffa4",
      "parents": [
        "0338a25747a2f3470c02773a7001e5d425c95552"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Jan 08 21:22:12 2020 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Jan 08 21:22:12 2020 -0800"
      },
      "message": "Restore missing dep from depfile support\n\nThe restriction about not having phony rules that were dirty because of\na missing input was causing incremental build breaks because phony edges\nare automatically created for each file listed in a depfile.\n\nRestore the original behavior for these edges, while keeping the error\nfor phony rules defined in the ninja file.\n\nTest: run ninja_tests (through build-prebuilts.sh)\nChange-Id: Id41b7ecd329844a97db4d3cb9c585f26ac2774bd\n"
    },
    {
      "commit": "0338a25747a2f3470c02773a7001e5d425c95552",
      "tree": "500b9c4282fa9fce0e4b458e171aa0166581f030",
      "parents": [
        "e678f7baa015015408ecedbab7174525244f53e4"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed May 08 09:20:16 2019 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Jan 08 15:55:31 2020 -0800"
      },
      "message": "Ensure that edge outputs are \u003e\u003d their newest input\n\nOtherwise they\u0027ll be dirty again during the next build. So they either\nneed to update their timestamps, or be marked with restat so that they\nwon\u0027t be considered dirty again.\n\nTest: ninja_tests (run by build-prebuilts.sh)\nChange-Id: Ie004cca58735f6576e1e2ea7a126dca6992e6eaf\n"
    },
    {
      "commit": "e678f7baa015015408ecedbab7174525244f53e4",
      "tree": "cca67c70b0e49e8ab9cfc920b79708f6154be234",
      "parents": [
        "2ddc376cc3c5531db80899ce757861fac7a531b9"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Sat May 04 17:55:19 2019 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Jan 08 15:55:31 2020 -0800"
      },
      "message": "Add option to require commands to create all outputs\n\nIf an output file wasn\u0027t created, then running the same build again\nwithout changes would mark the edge as dirty and re-run the command.\nThis is an easy way to make incremental builds much longer than they\nshould be.\n\nCommands that don\u0027t actually write outputs should be using `phony_output`\n\nThe default `-w missingoutfile\u003dwarn` will just print a warning when an\noutput isn\u0027t created. `-w missingoutfile\u003derr` will fail the command when\nan output isn\u0027t created.\n\nTest: ninja_tests  (run by build-prebuilts.sh)\nChange-Id: I1f4b1ee06f406b01b9263dcda7c6412eef4431ad\n"
    },
    {
      "commit": "2ddc376cc3c5531db80899ce757861fac7a531b9",
      "tree": "31819eae80b45be50bb88c7b74b1700ea530ffed",
      "parents": [
        "98d29d1997d682d68525df68c7e78b25fee828fc"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Sat May 04 17:32:27 2019 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed Jan 08 15:55:28 2020 -0800"
      },
      "message": "Add the \"Phony Output\" concept\n\nThese are like Make\u0027s .PHONY rules in that they can have a command, but\nare always considered dirty, and will re-run on every build.\n\nAdds `-w usesphonyoutputs\u003dyes` to control whether the output directory\ncheck happens at all, as before this is used, Make .PHONY rules can be\nreal rules that can trigger the output directory check. This will also\nbe useful to control the next warnings about outputs existing and being\ntoo old.\n\nAlso replicate the checks from Kati where non-phony outputs nodes cannot\ndepend on phony output nodes (otherwise they\u0027d always rebuild).\n\nTest: ninja_tests (run by build-prebuilts.sh)\nChange-Id: Iea561f775434e1b062aedfbf7014bcdbaa66a5db\n"
    },
    {
      "commit": "98d29d1997d682d68525df68c7e78b25fee828fc",
      "tree": "690da0a1c8a6ae9eb27b7f35e2fac1bc6db12e2f",
      "parents": [
        "48d41552c70e0fc62db3c2ee0400a344b41a6575"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Fri Jan 03 15:24:00 2020 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Fri Jan 03 15:24:18 2020 -0800"
      },
      "message": "Ensure that outputs are files, not directories\n\nWe\u0027ve been making this assumption implicitly, and while it is possible\nto get the behaviors correct with dependencies, it\u0027s quite difficult.\nWe\u0027d rather all outputs be files instead. So make it a warning by\ndefault, letting us turn it into an error with \"-w outputdir\u003derr\"\n\nUntil the previous change, it was an internal ninja error if an Edge\nthat created an output directory failed, as we\u0027d try to remove the\ndirectory as if it was a file. The previous change skipped the\nRemoveFile if it was detected to be a directory.\n\nIt\u0027s uncommon to use directories as build nodes, as it is significantly\nproblematic with how ninja works today -- if you output a directory of\nheaders, then compile using that directory, the depfile will refer to\nindividual headers and ninja won\u0027t connect them in the build graph. If\nthere\u0027s already an input or implicit dependency that may be okay.\n\nOutputting a directory would also require careful work to ensure that\nthe timestamp of that directory is valid, and only the correct files\nexist -- if you\u0027re always doing `rm -rf` and recreating them that works.\nBut it doesn\u0027t protect if some other action (or the user) goes and\nmodified one or more of the files in the directory (or subdirs).\n\nIn Android, we often use dependencies on directories in the source tree,\nto detect when files have been added or removed from a directory so that\nwe can re-run globs and similar. So those have not been restricted.\n\nTest: run ninja_test (build-tools build does this)\nChange-Id: Idc51a8bd4b28fae7f425e71217e6def53d139e35\n"
    },
    {
      "commit": "48d41552c70e0fc62db3c2ee0400a344b41a6575",
      "tree": "ad3dd6e61f40c4dc312f5bb35bff7b2385e79172",
      "parents": [
        "9373f63dc1999da3b3a78c63a6b60aa678b441e0"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed May 01 21:32:00 2019 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Fri Jan 03 15:24:18 2020 -0800"
      },
      "message": "Switch to lstat for all nodes with input edges\n\nIn an Android build, we have a directory that represents the device\u0027s\nfilesystem, with many ninja edges that populate that directory with the\ncorrect contents. Some of those files are actually symlinks:\n\n  .../system/bin/ls -\u003e toybox\n  .../system/vendor -\u003e /vendor\n\nThese currently cannot be represented in the build graph due to the use\nof stat(), which will attempt to follow those symlinks. In the toybox\ncase, that may actually work as long as `ls` and `toybox` are created by\nthe same edge, but that\u0027s not guaranteed to happen. And for the absolute\nlinks, they\u0027ll often be considered missing, or will have stat results\nfrom completely unrelated files.\n\nSo we currently don\u0027t represent these files in the build graph, making\nthem side effects of some other file that is actually in the build\ngraph. That becomes very error prone when the symlink is removed, but\nthat other file isn\u0027t, etc. It\u0027s sometimes difficult to find an\nappropriate file to attach a side effect to.\n\nWhat\u0027s important is that we never intend to actually walk the symlink we\ngenerate, they\u0027re just used as any other file would be by tools like zip\n/ image creation tools / etc. So it\u0027s safe to always use lstat for\ngenerated files -- aka nodes with input edges.\n\nThis doesn\u0027t change the behavior for source files -- we\u0027re still going\nto use Stat, which is appropriate in many cases, since most tools would\njust read from the path, getting the final destination file.\n\nThere are potential, but rare for Android, issues:\n\n * If we had set up the build outputs as symlinks, then actually written\n   to the destination file, expecting that to be used by dependent\n   rules. This shouldn\u0027t be the case in the Android build -- none of the\n   standard build steps do this, and it should be unusual otherwise too.\n\n * During one build we create a symlink, then in another build use it\n   without the defining rule. With `mm` gone, this should be quite\n   unusual (in cases where a full build succeeds). There\u0027s a small\n   chance it could happen in the ASAN builds, which runs the build\n   twice.\n\nTest: built-in tests\nChange-Id: I84fb74fc502b45f978ebe03d4b5331d734b52dcc\n"
    },
    {
      "commit": "9373f63dc1999da3b3a78c63a6b60aa678b441e0",
      "tree": "ea9443f3f4126bf5e7e6f143b71dc1545934bd3d",
      "parents": [
        "059335d867310d6e8bf9fa44de69755575e763d2"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Jan 02 10:20:12 2020 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Jan 02 16:38:45 2020 -0800"
      },
      "message": "Add symlink tests\n\nTrack how symlinks work in the build graph with \"stat\" today. These will\nbe updated in the next change that switches to lstat.\n\nTest: run ninja_tests (the build-tools build does this)\nChange-Id: Ic1674bef202c198b6c707fc8a36edc2d89c27ee7\n"
    },
    {
      "commit": "059335d867310d6e8bf9fa44de69755575e763d2",
      "tree": "7a8b8a410b320ad21b48bc0910906e4916073c4c",
      "parents": [
        "8c231cd10d8ad8d5437190717dfc5d5968e139d4"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon May 13 18:37:00 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue May 14 13:35:47 2019 -0700"
      },
      "message": "Refactor deps log loading, fix 2 bugs\n\nThere were two bugs in DepsLog::Load\u0027s main parsing pass:\n\n * Previously, with an invalid log file, the main pass could initialize\n   dep_index[output_id] with the index of a record after the point where\n   the log is truncated, e.g.:\n\n    - Chunk 1: path record for node #0\n    - Chunk 1: invalid record\n    - Chunk 2: path record for node #1\n    - Chunk 2: deps record outputting node #0, needs node #1\n\n   The result of the parse could depend on chunk boundaries (e.g. how many\n   threads the machine has), and the parser could crash if the later deps\n   record has source IDs that were also truncated.\n\n   Fix the problem by moving dep_index initialization to a later pass. The\n   validation and truncation work is factored out into a ValidateDepsLog\n   function.\n\n * Fix node ID validation of deps record inputs. The existing code to do\n   this had no effect:\n\n        if (output_id \u003c 0 || output_id \u003e\u003d next_node_id) break;\n        for (size_t i \u003d 4; i \u003c size; ++i) {\n          int input_id \u003d log.table[index + i];\n          if (input_id \u003c 0 || input_id \u003e\u003d next_node_id) break;\n\n   The outer break exited the for-each-record loop early, signaling that\n   parsing had failed. The nested break exited the for-each-input loop,\n   which merely prevented validation of later node IDs. Replace the break\n   statements with \"return false\" in IsValidRecord.\n\nThese two changes regressed \".ninja_deps load\" run-time by about 10ms\non a 580MB .ninja_deps file. (e.g. about 140ms -\u003e 150ms). I suspect the\ncompiler may have been optimizing out the source ID checking.\n\nTest: ninja_test\nChange-Id: I13c3a314cfa7d2bf15c724962a9ec35f55176779\n"
    },
    {
      "commit": "8c231cd10d8ad8d5437190717dfc5d5968e139d4",
      "tree": "14325d5793431cb7929c54002bf0e91ea797335f",
      "parents": [
        "4bca41954126457f319b86661f1fdb3ba3206ab7"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon May 13 19:49:27 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue May 14 13:35:47 2019 -0700"
      },
      "message": "Factor out ParseRecord to handle dep record format\n\nAdd a function, ParseRecord, that parses a deps log record into an\nintermediate data structure, InputRecord. This function consolidates\nthe deps record format handling in one place -- previously, the various\nstages of DepsLog::Load each handled parts of the record format.\n\nTest: ninja_test\nChange-Id: Iaf5878b2d5a62c778526e049f1db07ba6a15d886\n"
    },
    {
      "commit": "4bca41954126457f319b86661f1fdb3ba3206ab7",
      "tree": "3cdcf4800c989d84acaaf9aece992369462d35c2",
      "parents": [
        "46b766e4577359f2fd6ffa81e14e1dba405300d5"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon May 13 19:56:33 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue May 14 13:35:14 2019 -0700"
      },
      "message": "Refactor deps log splitting, add tests\n\nFactor out a MustBeDepsRecord function from SplitDepsLog, and add tests\nfor MustBeDepsRecord.\n\nAllow a split candidate to appear as the first 1-3 words of a chunk (and\nin principle, the start of a file). If we can\u0027t look backwards to rule out\nan mtime (because we\u0027re too close to the start of the file), then we know\nwe can\u0027t be looking at an mtime.\n\nA deps record won\u0027t actually appear at the start of a file, because the\npath records it references will come first. An invalid file could start\nwith a deps record, though, so adjust the\n\"assert(chunk_start \u003c candidate)\" check to allow and discard an empty\nword span.\n\nTest: ninja_test\nTest: replace SplitByThreads(log.size) with\n  SplitByChunkSize\u003csize_t\u003e(log.size, 1) and rerun ninja_test\nTest: Short-circuit SplitDepsLog with \"return {{ 0, log.size }}\" and\n  rerun ninja_test\nChange-Id: Ibab39b6f429152274e911daaa52fd0e96990cd29\n"
    },
    {
      "commit": "46b766e4577359f2fd6ffa81e14e1dba405300d5",
      "tree": "c9e6154326cccccfb3db664e9b691ee0befd3e78",
      "parents": [
        "09f86d98995373b97d746d1c489cf097f84fe1ea"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue May 07 18:19:18 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon May 13 21:24:59 2019 -0700"
      },
      "message": "Split DepsLogInput -\u003e DepsLogInputFile+DepsLogData\n\nI\u0027m planning to use the DepsLogData class to make up test data.\n\nDepsLogData is only 2 words now, so pass it by value instead of by\nreference.\n\nTest: ninja_test\nChange-Id: I277855137cce0fcdf60fccef9c3061cc01056728\n"
    },
    {
      "commit": "09f86d98995373b97d746d1c489cf097f84fe1ea",
      "tree": "699f5c8473bfae8ed5ced8d3540a98fad886c6fa",
      "parents": [
        "ee41accb399c458226bc2902ecbe529aabbfcc17"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue May 07 21:31:53 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon May 13 20:26:56 2019 -0700"
      },
      "message": "Replace the +1 dep_index bias with ssize_t\n\nThis seems less likely to cause confusion.\n\nI measured the run-time of initializing dep_index with both ordinary\nstores and relaxed stores. On a 580MB deps log, the ordinary stores\n(seq_cst) took about 4ms, while relaxed stores took 0.5ms.\n\nTest: ninja_test\nChange-Id: Id1a2cc026220e33b25c87dba4b5f612850e42bd0\n"
    },
    {
      "commit": "ee41accb399c458226bc2902ecbe529aabbfcc17",
      "tree": "97da0ffb7512aa35d8b3b28e7d41229aee804548",
      "parents": [
        "4f8e35afdca5caee718e38687af5497cbc4a48b5",
        "5a78423193c48cae4800eb1ec44b62d14ae03920"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Apr 29 20:20:27 2019 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Wed May 01 20:04:36 2019 -0700"
      },
      "message": "Merge commit \u00275a78423193c48cae4800eb1ec44b62d14ae03920\u0027 into master\n\nThis is a merge of upstream master up until this dep file parsing\nchange, which will need more verification given our depfiles:\n  https://github.com/ninja-build/ninja/pull/1039\n\nThe biggest change in this merge is probably the use of 64-bit\ntimestamps.\n\n* commit \u00275a78423193c48cae4800eb1ec44b62d14ae03920\u0027: (80 commits)\n  Add OSX build on travis (#1502)\n  Fit --help output into 80 columns and move verbose up, fix #1500\n  Improve error message when Python wasn\u0027t found for the browse tool\n  Explain why there\u0027s no browse tool, fix #1478\n  HACKING: use `Python` for the project\n  HACKING: fix some whitespace nits\n  Fix rendering of code block, fix #955\n  Make -j 0 run unlimited parallel builds, fix #1309\n  Enable ANSI escape sequences on Windows 10 terminals\n  Add --verbose as an alternative spelling for -v, fix #1310\n  Add unit test for #1491\n  Allow disabling of escape code stripping, fix #1475\n  subprocess-win32: add hint on ERROR_INVALID_PARAMETER\n  Win32Fatal: support a \"hint\" for the error\n  manual: mention the \"invalid parameter\" case\n  util: don\u0027t add ellipses width when deciding if they\u0027re necessary\n  Verify GetFullPathName return value\n  Make output_test.py independent of the environment\n  Fix older VS compatibility issues and PDB files generation issue. (#1435)\n  Fix parsing some special chars in depfiles\n  ...\n\nChange-Id: I315385cecc748ff351614792a9921ec87e5f4cf3\n"
    },
    {
      "commit": "2e64645749ff91eff2f999f03f55da360ae5913d",
      "tree": "3b792807b3d1aaa2402fe95548920305803cfed6",
      "parents": [
        "71b96489325e5e2629464687c60f20d9905ab51c",
        "1d55d05afd5949a5caa6b41ffa5539f4cbb5a575"
      ],
      "author": {
        "name": "Jan Niklas Hasse",
        "email": "jhasse@bixense.com",
        "time": "Sat Apr 20 13:28:13 2019 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 20 13:28:13 2019 +0200"
      },
      "message": "Merge pull request #1521 from bradking/dyndep\n\ndyndep: dynamically discovered dependencies for Fortran and C++20 modules"
    },
    {
      "commit": "1d55d05afd5949a5caa6b41ffa5539f4cbb5a575",
      "tree": "3b792807b3d1aaa2402fe95548920305803cfed6",
      "parents": [
        "014a5414c4c2301d5572e7cb805416997f35d539"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Wed Dec 02 16:39:29 2015 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Document example dyndep use cases\n\nShow a simple example of Fortran module dependencies (this use case\nmotivated the entire dyndep feature).  Also show an example of tarball\nextraction, a case that few other buildsystems can handle cleanly.\n"
    },
    {
      "commit": "014a5414c4c2301d5572e7cb805416997f35d539",
      "tree": "ac69349757fd9d7c17eadb52e233b7512dd6b51b",
      "parents": [
        "e1a58793ef080d4dcd2b404718a8d24307958591"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Wed Dec 02 14:28:40 2015 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Document `dyndep` binding behavior and the dyndep file format\n"
    },
    {
      "commit": "e1a58793ef080d4dcd2b404718a8d24307958591",
      "tree": "c8394b1588157116a7cd76dec122e4cc4d75cb9b",
      "parents": [
        "a32e047b4f0e083eb8f9d9cdca9238bb4b006e4a"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Tue Feb 12 13:12:35 2019 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "query: load dyndep files for queried edges\n"
    },
    {
      "commit": "a32e047b4f0e083eb8f9d9cdca9238bb4b006e4a",
      "tree": "c1c8daa5a5a5c085fefb2bc65c2376e1c652e0aa",
      "parents": [
        "a3cbb4d4ddbd3661720603cc26b25cad6177b4c8"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Tue Feb 12 13:11:36 2019 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "graph: load dyndep files\n\nTeach the `-t graph` tool to load dyndep files because they are part of\nthe build graph.  Issue a warning when the dyndep file cannot be loaded\ncleanly.  This will help users visualize the complete build graph.\n"
    },
    {
      "commit": "a3cbb4d4ddbd3661720603cc26b25cad6177b4c8",
      "tree": "77c2fbdb481653ae300342b025d2af9438f3e9a9",
      "parents": [
        "c21f3f2a1d8cb0aea45804ffc788947c4096281b"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Tue Feb 12 09:16:50 2019 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "clean: remove outputs specified by dyndep files\n\nSome outputs may not be known in the main build manifest and are instead\ndiscovered through a dyndep binding.  Load dyndep files that are\navailable during cleaning so that we can clean these outputs too.\n"
    },
    {
      "commit": "c21f3f2a1d8cb0aea45804ffc788947c4096281b",
      "tree": "f2f2c3a4860477c29b589112bb73dd724b7d6889",
      "parents": [
        "2375707bdfc83c79c94cac93a957de71c294737c"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Tue Feb 12 11:00:04 2019 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "clean: remove unnecessary Cleaner constructor variant\n\n`Cleaner` provides two constructors that are the same except that one\nconstructs a \"real\" disk interface internally and the other takes a\ncaller-provided disk interface.  A real disk interface is already\navailable at the only call site for the former constructor.  Use it\ndirectly and drop the unnecessary constructor variant.\n"
    },
    {
      "commit": "2375707bdfc83c79c94cac93a957de71c294737c",
      "tree": "9ccac1cec095db3401a6d467d8a2bbea0f43edba",
      "parents": [
        "0f0fb3275d0c908d9a4401c97cd5ef9d407987d4"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Wed Dec 02 09:52:18 2015 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Teach builder to load dyndep files when they are ready\n\nAfter finishing an edge that produces a dyndep file, load the file and\nupdate the build graph structure.  Recompute the dirty state of all its\ndependents and of newly reachable portions of the graph.  Add edges to\nthe build plan that are discovered to be wanted.  Finally, schedule\nedges that are wanted and now ready to build.\n"
    },
    {
      "commit": "0f0fb3275d0c908d9a4401c97cd5ef9d407987d4",
      "tree": "fe6e4d9fe0083f2108fb011dbc91f2da45ae2bf8",
      "parents": [
        "e5c22c0a4b93895334a10d412124ffff69c3fd25"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Nov 05 10:03:57 2015 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Teach RecomputeDirty to load dyndep files that are ready\n\nThe full readiness of a node that has a dyndep binding cannot be known\nuntil after the dyndep file is loaded.  If a dyndep file is ready while\nconstructing the build plan it can be loaded immediately so full\ninformation can be used to decide whether anything needs to be built.\nIf a dyndep file is not ready while constructing the build plan then the\nedges naming it cannot be ready either because the dyndep file is one of\ntheir inputs.  In this case we defer loading the dyndep file until the\nbuild plan is being executed.\n"
    },
    {
      "commit": "e5c22c0a4b93895334a10d412124ffff69c3fd25",
      "tree": "f04be9f0e0d0e2fcfd5101e9dd9a2dfe3cc1141b",
      "parents": [
        "a4970769519b09fec5ff6ffe73a5fa2bf9f252e4"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Wed Nov 04 16:17:33 2015 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Teach DependencyScan to load a dyndep file\n\nAdd a LoadDyndeps method to load a dyndep file and update\nthe edges that name it in their dyndep binding.\n"
    },
    {
      "commit": "a4970769519b09fec5ff6ffe73a5fa2bf9f252e4",
      "tree": "15f2b8629bde476cd385a4c9ef800c0ee3528f30",
      "parents": [
        "c4b0c21ba9c60c2af99ea8d1961cbc1e4f217810"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Oct 01 15:24:58 2015 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Add a \"dyndep\" reserved binding to the manifest format\n\nAllow rules or build statements to specify one of the build statement\ninputs in a \"dyndep\" binding.  This will later be used to load\ndependency information from the specified file.\n"
    },
    {
      "commit": "c4b0c21ba9c60c2af99ea8d1961cbc1e4f217810",
      "tree": "ed8a6a591734881a0f68dc4ff570d9e9da11184f",
      "parents": [
        "325602ca41c76753470b991c7a47b76b15e4241b"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Oct 01 15:19:28 2015 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Add a parser for a new \"dyndep\" file format\n\nDefine a file format suitable for specifying dynamically-discovered\ndependency information for build edges.  Design a format inspired by the\nbuild manifest format and using the same lexer.  Start with a required\nformat version specification followed by \"build\" statements that add\nimplicit inputs and outputs to existing edges.\n"
    },
    {
      "commit": "325602ca41c76753470b991c7a47b76b15e4241b",
      "tree": "3a0fe810e629519ca8ba32510c515827e08eb852",
      "parents": [
        "b08f3fb86909bf5b890e33936cf8fd44e1cbff47"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Mon Nov 30 13:56:04 2015 -0500"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Explicitly avoid repeat deps loading\n\nTrack for each Edge whether depfile information has been loaded using an\nexplicit flag.  This will allow RecomputeDirty to be repeated for an\nedge without loading deps again.\n"
    },
    {
      "commit": "b08f3fb86909bf5b890e33936cf8fd44e1cbff47",
      "tree": "eda7529eece89180f27cbc1421dfc72dbada12c1",
      "parents": [
        "083a9e2e7af813571444e33fad5f0f373bce7e3f"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Fri Jun 19 11:47:21 2015 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Make a Builder optionally available to Plan\n\nIn order to later support dynamic updates to the build plan while\nbuilding, the Plan will need access to its Builder.  Since this access\nwill be needed only for specific features we can avoid updating all Plan\nconstructions in the test suite by making this access optional.\n"
    },
    {
      "commit": "083a9e2e7af813571444e33fad5f0f373bce7e3f",
      "tree": "9f22771d45526d579e6307a5e914414ee90b7194",
      "parents": [
        "64acb1a22b1001df96a4dfb7f36c16d7f56df392"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Fri Aug 07 11:24:57 2015 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Factor out output edge ready check from Plan::NodeFinished\n\nMove the logic to a new Plan::EdgeMaybeReady method so it can be re-used\nelsewhere.\n"
    },
    {
      "commit": "64acb1a22b1001df96a4dfb7f36c16d7f56df392",
      "tree": "0716b7870e2e271822fdd84504e04ac99a8ad9e0",
      "parents": [
        "70d356218beff99ddaa048ff357f2d2692a32b7a"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Aug 06 13:30:09 2015 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Factor out edge marking logic from Plan::AddSubTarget\n\nMove the logic to mark edges as wanted over to a Plan::EdgeWanted method\nso it can be re-used elsewhere later.\n"
    },
    {
      "commit": "70d356218beff99ddaa048ff357f2d2692a32b7a",
      "tree": "86dcaa714127c8b61e59241518648ee7a9bf9c7d",
      "parents": [
        "e50299c5004e1890d5335f4d51e8e576fa6836d5"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Tue Jun 20 11:51:13 2017 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Teach FakeCommandRunner to support multiple active commands\n\nReplace our single active edge pointer with a vector and add a\nparameter that tests can set to limit the number of concurrent\nedges.  Set the default to 1 to preserve the current behavior.\nSpecific tests will be able to override it later to simulate\nconcurrent builds.\n"
    },
    {
      "commit": "e50299c5004e1890d5335f4d51e8e576fa6836d5",
      "tree": "bf2e3ba2be1b0b885c37c1796f1d90662ef414e8",
      "parents": [
        "54520575cd11250ecf5d115b74fce5b8acd3e1aa"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Jun 18 13:41:35 2015 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Allow EdgeFinished and NodeFinished to fail with errors\n\nAdd an \u0027err\u0027 string argument and return a boolean for success.  Update\ncall sites to pass an \u0027err\u0027 string argument and check the return value.\nThis will be useful later for adding logic to these methods that may\nfail.\n"
    },
    {
      "commit": "54520575cd11250ecf5d115b74fce5b8acd3e1aa",
      "tree": "3fd3ac0b4975df42450814fbd8809fc064cfb85a",
      "parents": [
        "d71880839246046cf0b1b662abf91687ea91f9b9"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Tue Jun 20 16:01:15 2017 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Assert precondition in BuildStatus::BuildEdgeStarted\n\nThis method should be called only with edges that have not\nalready been started.\n"
    },
    {
      "commit": "d71880839246046cf0b1b662abf91687ea91f9b9",
      "tree": "5b88a492a01b92dd6aae8062918e56a2355ab4c5",
      "parents": [
        "215a190a57efddcd114658f8b24d57f58c217d88"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Jul 02 13:12:44 2015 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "Factor out a base class of ManifestParser\n\nCreate a Parser base class that holds parser functionality not specific\nto the build manifest file format.  This will allow it to be re-used for\nother parsers later.\n"
    },
    {
      "commit": "215a190a57efddcd114658f8b24d57f58c217d88",
      "tree": "387400e9d023e0b7a3d17ebe4bd755cc2e3faf1d",
      "parents": [
        "71b96489325e5e2629464687c60f20d9905ab51c"
      ],
      "author": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:06:37 2019 -0400"
      },
      "committer": {
        "name": "Brad King",
        "email": "brad.king@kitware.com",
        "time": "Thu Apr 18 08:21:44 2019 -0400"
      },
      "message": "ManifestParser: Fix typo {expectd \u003d\u003e expected}\n"
    },
    {
      "commit": "71b96489325e5e2629464687c60f20d9905ab51c",
      "tree": "8ab2373f170b346ebd018c8e70ff43699b29f716",
      "parents": [
        "b344c799788426b3b26eabcbef5728955e8e2703"
      ],
      "author": {
        "name": "Jan Niklas Hasse",
        "email": "jhasse@bixense.com",
        "time": "Wed Apr 17 18:04:28 2019 +0200"
      },
      "committer": {
        "name": "Jan Niklas Hasse",
        "email": "jhasse@bixense.com",
        "time": "Wed Apr 17 18:04:54 2019 +0200"
      },
      "message": "Remove trailing whitespace from all files\n"
    },
    {
      "commit": "b344c799788426b3b26eabcbef5728955e8e2703",
      "tree": "2c8fa7044e3e913dd6fcfa390df7a0a1157978d8",
      "parents": [
        "a8bc2e15d5dce3f343850ea3a8fd4f36a42e0ed3",
        "9de96be2cb177d386ef881ede8d0ca2b575ad31f"
      ],
      "author": {
        "name": "Jan Niklas Hasse",
        "email": "jhasse@bixense.com",
        "time": "Wed Apr 17 12:38:33 2019 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 17 12:38:33 2019 +0200"
      },
      "message": "Merge pull request #1559 from goshhhy/master\n\nmake inline.sh more portable"
    },
    {
      "commit": "9de96be2cb177d386ef881ede8d0ca2b575ad31f",
      "tree": "2c8fa7044e3e913dd6fcfa390df7a0a1157978d8",
      "parents": [
        "a8bc2e15d5dce3f343850ea3a8fd4f36a42e0ed3"
      ],
      "author": {
        "name": "goshhhy",
        "email": "37872995+goshhhy@users.noreply.github.com",
        "time": "Tue Apr 16 15:15:37 2019 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 16 15:15:37 2019 -0700"
      },
      "message": "make inline.sh more portable"
    },
    {
      "commit": "a8bc2e15d5dce3f343850ea3a8fd4f36a42e0ed3",
      "tree": "f484ec4a8bc1380d9fe67a295eb9f745e1d090e4",
      "parents": [
        "55279e640d40020307fc39feed1bfef7815421d9"
      ],
      "author": {
        "name": "jhuels",
        "email": "40254454+jhuels@users.noreply.github.com",
        "time": "Tue Apr 16 14:07:03 2019 -0700"
      },
      "committer": {
        "name": "Jan Niklas Hasse",
        "email": "jhasse@bixense.com",
        "time": "Tue Apr 16 23:07:03 2019 +0200"
      },
      "message": "Feature/add term env dumb to win32 (#1550)\n\nAdd reading of TERM variable for win32 dumb terminals"
    },
    {
      "commit": "55279e640d40020307fc39feed1bfef7815421d9",
      "tree": "87b01036da8c719cc1ccac49d14791250d762263",
      "parents": [
        "1bcc689324bdee090eed035353724abc3fa7c909",
        "02ec31abb7ffb70d5b66b8acbcf8ba7b2d5bbeef"
      ],
      "author": {
        "name": "Jan Niklas Hasse",
        "email": "jhasse@bixense.com",
        "time": "Wed Apr 10 20:40:11 2019 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 10 20:40:11 2019 +0200"
      },
      "message": "Merge pull request #1553 from ddrone/patch-1\n\nUpdate link to premake"
    },
    {
      "commit": "02ec31abb7ffb70d5b66b8acbcf8ba7b2d5bbeef",
      "tree": "87b01036da8c719cc1ccac49d14791250d762263",
      "parents": [
        "1bcc689324bdee090eed035353724abc3fa7c909"
      ],
      "author": {
        "name": "ddrone",
        "email": "ddrone@users.noreply.github.com",
        "time": "Wed Apr 10 19:12:17 2019 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 10 19:12:17 2019 +0100"
      },
      "message": "Update link to premake"
    }
  ],
  "next": "4f8e35afdca5caee718e38687af5497cbc4a48b5"
}
