)]}'
{
  "log": [
    {
      "commit": "74af332b81f7b5d631b6b7ffdb870b6340324389",
      "tree": "93031820a23567afd648fd6a60f62f87466c3fa6",
      "parents": [
        "1b05c26753e47787ac2f0612b01b1c0b54263b89"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jul 09 13:35:58 2024 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Jul 09 13:35:58 2024 -0700"
      },
      "message": "Remove test_per_src from build/kati\n\ntest_per_src is being removed, it never worked well and is incompatible\nwith all of the test infrastructure.  Build the kati test binaries\nindividually.\n\nTest: prebuilts/build-tools/build-prebuilts.sh\nChange-Id: I7a51c4a9553897fa2b8273db953d616842b933fc\n"
    },
    {
      "commit": "1b05c26753e47787ac2f0612b01b1c0b54263b89",
      "tree": "d6d9b51824e2f8493dde217f2e18bf2f838802a9",
      "parents": [
        "1cfc60eb63cf6d8c254fcd82a026418eba9ace5c",
        "8b60db29a0be7f727d85f315e45c50b467bd0d35"
      ],
      "author": {
        "name": "mrziwang",
        "email": "mrziwang@google.com",
        "time": "Tue Apr 30 10:28:21 2024 -0700"
      },
      "committer": {
        "name": "mrziwang",
        "email": "mrziwang@google.com",
        "time": "Tue Apr 30 12:18:56 2024 -0700"
      },
      "message": "Merge remote-tracking branch \u0027aosp/upstream\u0027 into kv\n\n* aosp/upstream:\n  Unspecify VarVisibilityFunc param name s\n  Add func KATI_visibility_prefix\n\nChange-Id: I2db3c738d41b38189cf4356631a36411c4f72812\n"
    },
    {
      "commit": "8b60db29a0be7f727d85f315e45c50b467bd0d35",
      "tree": "c004a87a6ffda4fa32750fbbdc25a7678e1757d8",
      "parents": [
        "2c503b6caf952882ea309ed056962769df0e6d3a"
      ],
      "author": {
        "name": "Zi Wang",
        "email": "mrziwang@google.com",
        "time": "Wed Apr 17 15:27:42 2024 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Tue Apr 30 09:58:52 2024 -0700"
      },
      "message": "Add func KATI_visibility_prefix\n\nsyntax: $(KATI_visibility_prefix var, prefix)\n\n1, Add a func KATI_visibility_prefix that takes a variable\nname and a list of strings, set this variable\u0027s visibility\nto these strings. Each string represents the relative path\nfrom the root, and is considered as prefix.\n\ne.g. $(KATI_visibility_prefix VAR, vendor/ device/b baz.mk)\n--\u003e VAR is visible to \"vendor/foo.mk\", \"device/bar.mk\",\n\"device/baz.mk\", \"baz.mk\", but not visible to \"bar.mk\",\n\"vendor.mk\" or \"vendor/baz.mk\".\n\nIf variable visibility is set more than once, and with a\ndifferent list of strings, an error will occur.\n\n2. When a variable is being referenced, if this variable has\nvisibility prefix set, check if the current referencing file\nmatches the visibility prefix. Throw an error if not.\n\n3. In $(KATI_visibility_prefix FOO, prefix)\nIf FOO is not defined, create a variable FOO with empty value.\nThe prefix can also be reference to variable.\nIf so, this function will expand the reference and set the\nvisibility_prefix.\n"
    },
    {
      "commit": "1cfc60eb63cf6d8c254fcd82a026418eba9ace5c",
      "tree": "9d45980144912183309afc3bb4290a2e29dae468",
      "parents": [
        "27de420ef55e982c9ea29a00c33bf7d1243cea4d",
        "2c503b6caf952882ea309ed056962769df0e6d3a"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jan 19 16:10:16 2024 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jan 19 16:10:16 2024 -0800"
      },
      "message": "Merge remote-tracking branch \u0027aosp/upstream\u0027 into update_kati\n\n* aosp/upstream:\n  Remove .KATI_SYMLINK_OUTPUTS\n  Install a specific version of ninja in the dockerfile\n  Enable ninja-validations.sh\n  Fix CI\n\nChange-Id: I4c01f8978cb76c56e23ac89cfdafd969810f5624\n"
    },
    {
      "commit": "2c503b6caf952882ea309ed056962769df0e6d3a",
      "tree": "01410c0e082bdb7714499cc99eacf6b5a4767323",
      "parents": [
        "1ec8253207f5b2aada23988ede917d27195fee38"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jan 19 15:18:41 2024 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Fri Jan 19 15:51:21 2024 -0800"
      },
      "message": "Remove .KATI_SYMLINK_OUTPUTS\n\nThis was added so that bazel could run ninja files,\nbut we abandoned that approach a long time ago.\n"
    },
    {
      "commit": "1ec8253207f5b2aada23988ede917d27195fee38",
      "tree": "c4ab32ba3306cd2e6a3a659b88449ff4f70cd11c",
      "parents": [
        "e37cedd24e76b59887f2153ca56dc6d4e8065d72"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Jan 19 15:48:22 2024 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Fri Jan 19 15:51:21 2024 -0800"
      },
      "message": "Install a specific version of ninja in the dockerfile\n\nIt was different from what is installed in the github action.\n"
    },
    {
      "commit": "e37cedd24e76b59887f2153ca56dc6d4e8065d72",
      "tree": "5a90316ee248b7c28c1c8983c7594da1e993ef22",
      "parents": [
        "fe66697ad8eddaa91feb19ea92cfe6a7226ea9b0"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Oct 04 13:54:43 2023 -0700"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Thu Oct 05 11:38:51 2023 +0200"
      },
      "message": "Enable ninja-validations.sh\n\nUpdate ninja to 1.11.1, which has validation actions,\nand enable ninja-validations.sh\n"
    },
    {
      "commit": "fe66697ad8eddaa91feb19ea92cfe6a7226ea9b0",
      "tree": "a7a1d624caf59bd3f8c75d906174dc3afe65ebaf",
      "parents": [
        "532b343f4be96abf0dec4c6f2a4785d671a985df"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Oct 04 13:52:14 2023 -0700"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Thu Oct 05 11:38:51 2023 +0200"
      },
      "message": "Fix CI\n\nUbuntu-22.04 (which is what ubuntu-latest is at the time\nof writing) now has clang++-14/clang-format-14 instead of\n12. Update those and reformat files. Also, make our github\naction based on ubuntu-22.04 explicetly so that when latest\nchanges we don\u0027t break again. (Although in scenarios like\nthis we would still break)\n\nAlso change a forward declaration to an include to resolve\na build failure.\n"
    },
    {
      "commit": "27de420ef55e982c9ea29a00c33bf7d1243cea4d",
      "tree": "f27c40c50d76a2b7920e3065a38bf5534115e319",
      "parents": [
        "48d40d7519e8d55e658183f8bc39d12c50cc2723",
        "532b343f4be96abf0dec4c6f2a4785d671a985df"
      ],
      "author": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Thu Jun 22 01:42:31 2023 +0000"
      },
      "committer": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Thu Jun 22 01:48:52 2023 +0000"
      },
      "message": "Merge GitHub \u0027master\u0027 branch.\n\n* Already present on aosp/master (with clang-format errors):\n  Add arbitrary metadata \"tag\" tracking.\n  Add KATI_file_no_rerun function\n  Add KATI_foreach_sep function\n\n* Newly arriving from GitHub/master:\n  Delete the golang version of kati\n\n* One additional clang-format fixup in src/eval.cc\n\nChange-Id: Id4bcf87dd629b0384a80a4089bfcd90f94e10975\n"
    },
    {
      "commit": "532b343f4be96abf0dec4c6f2a4785d671a985df",
      "tree": "49a34791a673a507a1b5c5ee0eff4e952b2cf957",
      "parents": [
        "5c48149b4db789ec5f571f01b871e3e4f8163e2b"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri Jun 02 22:50:04 2023 +0000"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Wed Jun 21 12:49:33 2023 -0700"
      },
      "message": "Add arbitrary metadata \"tag\" tracking.\n\nAllows makefiles to set the `.KATI_TAGS` target specific variable to\nannotate arbitrary metadata for the build step for use in profiling.\n\nBug: http://b/259130368\nTest: end-to-end test tracing the time spent running cp for dist\nChange-Id: I930a828cc09add1ce13f7e23142e208c9a7ca5fc\n"
    },
    {
      "commit": "5c48149b4db789ec5f571f01b871e3e4f8163e2b",
      "tree": "62bfe68d03c4a3b38e389be71eecc934aea163c9",
      "parents": [
        "e361127627b94b6eeaf8522941bb1220342a5554"
      ],
      "author": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Wed Jun 07 16:37:01 2023 +0000"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Wed Jun 21 12:30:10 2023 -0700"
      },
      "message": "Add KATI_file_no_rerun function\n\nThe syntax is the same as $(file), but it will only be run once.\n\nSimilar to $(KATI_shell_no_rerun), we want to generate files during\nkati, but not regenerate them on every invocation of kati.\n\nTest: unit tests pass\nChange-Id: I34b7972a0a9f0540da322a995c30fef2efd16145\n"
    },
    {
      "commit": "e361127627b94b6eeaf8522941bb1220342a5554",
      "tree": "c7e7b0b8f89d8b1035091d8fa1c77cc92fd7957b",
      "parents": [
        "a420c70e1a2fac2b5597b6a9a8f522e0448a38ce"
      ],
      "author": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Fri Jun 02 21:34:19 2023 +0000"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Wed Jun 21 12:30:10 2023 -0700"
      },
      "message": "Add KATI_foreach_sep function\n\nsyntax: $(KATI_foreach_sep var,separator,list,text)\n\nRather than using a space to separate items in the expanded result,\n`separator` is used.\n\n\tcomma :\u003d ,\n\tv :\u003d $(KATI_foreach_sep w,$(comma) ,a b c,\"$(w)\")\n\nv will be set to: `\"a\", \"b\", \"c\"`\n\nChange-Id: I426d7b24846dc495b9134319dd452809837fe5f9\n"
    },
    {
      "commit": "48d40d7519e8d55e658183f8bc39d12c50cc2723",
      "tree": "be7c0a41a0d141ec3e3a27856b17bcbe0d5c056d",
      "parents": [
        "006782243b2c2dda84fe63837e30fbf66994fe2e"
      ],
      "author": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Wed Jun 07 16:37:01 2023 +0000"
      },
      "committer": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Fri Jun 16 16:42:56 2023 +0000"
      },
      "message": "Add KATI_file_no_rerun function\n\nThe syntax is the same as $(file), but it will only be run once.\n\nSimilar to $(KATI_shell_no_rerun), we want to generate files during\nkati, but not regenerate them on every invocation of kati.\n\nTest: unit tests pass\nChange-Id: I34b7972a0a9f0540da322a995c30fef2efd16145\n"
    },
    {
      "commit": "006782243b2c2dda84fe63837e30fbf66994fe2e",
      "tree": "6c97303fe716501c25c00d48ea09c415fb5480d1",
      "parents": [
        "35e4da8ff4d86206e06296d8328b8feba971d35e"
      ],
      "author": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Fri Jun 02 21:34:19 2023 +0000"
      },
      "committer": {
        "name": "LaMont Jones",
        "email": "lamontjones@google.com",
        "time": "Fri Jun 16 16:42:56 2023 +0000"
      },
      "message": "Add KATI_foreach_sep function\n\nsyntax: $(KATI_foreach_sep var,separator,list,text)\n\nRather than using a space to separate items in the expanded result,\n`separator` is used.\n\n\tcomma :\u003d ,\n\tv :\u003d $(KATI_foreach_sep w,$(comma) ,a b c,\"$(w)\")\n\nv will be set to: `\"a\", \"b\", \"c\"`\n\nChange-Id: I426d7b24846dc495b9134319dd452809837fe5f9\n"
    },
    {
      "commit": "35e4da8ff4d86206e06296d8328b8feba971d35e",
      "tree": "a709c0e3880d30c93f3e992fc5597ee59f65a2c6",
      "parents": [
        "89a026243359a42eac9e8cab5b3ba9f6a54c3ed4"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri Jun 02 22:50:04 2023 +0000"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jun 15 19:42:30 2023 +0000"
      },
      "message": "Add arbitrary metadata \"tag\" tracking.\n\nAllows makefiles to set the `.KATI_TAGS` target specific variable to\nannotate arbitrary metadata for the build step for use in profiling.\n\nBug: http://b/259130368\nTest: end-to-end test tracing the time spent running cp for dist\nChange-Id: I930a828cc09add1ce13f7e23142e208c9a7ca5fc\n"
    },
    {
      "commit": "a420c70e1a2fac2b5597b6a9a8f522e0448a38ce",
      "tree": "094e6bd1f09d5dd5ab7d4eb6dfb607a81395fe88",
      "parents": [
        "29a3410d629635008e2d5574be280e3c74b4bddc"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Jun 15 11:56:45 2023 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Thu Jun 15 12:32:48 2023 -0700"
      },
      "message": "Delete the golang version of kati\n\nKati started off development in golang, but then\nswitched to C++ after it was discovered that go was\ntoo slow. It\u0027s no longer used.\n"
    },
    {
      "commit": "89a026243359a42eac9e8cab5b3ba9f6a54c3ed4",
      "tree": "bb3ebd2cf181f276d1aeac9483e4f7ea97b5a699",
      "parents": [
        "ee538935fc914663100eb3d181dc40277131c2f6",
        "29a3410d629635008e2d5574be280e3c74b4bddc"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri May 05 16:37:03 2023 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri May 05 16:37:13 2023 -0700"
      },
      "message": "Merge remote-tracking branch \u0027aosp/upstream\u0027 into update_kati_2\n\n* aosp/upstream:\n  Add KATI_shell_no_rerun\n  Add KATI_extra_file_deps function\n  Merge ckati_stamp_dump into the regular ckati binary\n  Remove pointers to IfState\n  Remove ParserState\n\nChange-Id: I63ec0f52bf8a5579084e62981f34b2bd93f8500c\n"
    },
    {
      "commit": "29a3410d629635008e2d5574be280e3c74b4bddc",
      "tree": "01f1df86a5ee54997d842647238d25bcff9a7718",
      "parents": [
        "d72d98c874303afcba9c66364fb84a799609a1c6"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu May 04 16:28:28 2023 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Fri May 05 15:39:17 2023 -0700"
      },
      "message": "Add KATI_shell_no_rerun\n\nWe want to add the ability for kati to injest starlark\ncode to android, but we don\u0027t want starlark to rerun\non every invocation of kati. Instead, add a\n$(KATI_shell_no_rerun) that will run the shell command\nwhen kati regenerates the ninja file, but not when\nchecking the stamp file. Then, the starlark files can\nbe added as dependencies with $(KATI_extra_file_deps).\n"
    },
    {
      "commit": "d72d98c874303afcba9c66364fb84a799609a1c6",
      "tree": "dc73aef456b75911b8313c0a8faddef61fcaf410",
      "parents": [
        "d2aa17a7b9dacc0df2d7ee0427d3637d6cbfd578"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu May 04 15:21:43 2023 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Fri May 05 15:39:17 2023 -0700"
      },
      "message": "Add KATI_extra_file_deps function\n\nCalling this function with a list of files will add those\nfiles to the kati stamp, causing kati to rerun if those files\nare touched.\n\nThis is currently not very useful, because the only ways of\nobserving files will already record kati stamp entries.\n(these being $(file) and $(shell))\n\nHowever, the next commit will add a usecase for it.\n"
    },
    {
      "commit": "d2aa17a7b9dacc0df2d7ee0427d3637d6cbfd578",
      "tree": "500a072bcfc8600a97f1bda7f2e5aacca61b591f",
      "parents": [
        "41f0ac4cb77c21e96c7dbba3174b64b405fb5118"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed May 03 17:43:12 2023 -0700"
      },
      "committer": {
        "name": "Joe Onorato",
        "email": "73136106+onoratoj@users.noreply.github.com",
        "time": "Wed May 03 18:31:57 2023 -0700"
      },
      "message": "Merge ckati_stamp_dump into the regular ckati binary\n\nSo that there\u0027s fewer binaries to worry about updating.\nThere\u0027s only 1 actual usage of ckati_stamp_dump in android,\nso it should be easy to update it when we update ckati in\nandroid.\n"
    },
    {
      "commit": "41f0ac4cb77c21e96c7dbba3174b64b405fb5118",
      "tree": "a16734f4bb5dce4ae1e4af74d04e7f171549fb9f",
      "parents": [
        "30588e18f58f57716205fb3a8ba8d0913bbeca58"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jan 17 11:35:13 2023 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Tue Jan 31 10:31:48 2023 -0800"
      },
      "message": "Remove pointers to IfState\n\nIfState structs are always accessed\nfrom if_stack_, so they don\u0027t need to\nbe pointers.\n"
    },
    {
      "commit": "30588e18f58f57716205fb3a8ba8d0913bbeca58",
      "tree": "d7931cc06c58cd8445ee2c12c2f4f664d744db07",
      "parents": [
        "535ec5d0d6991e647087a8e411d737163a31603a"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Jan 17 11:26:20 2023 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Tue Jan 31 10:31:48 2023 -0800"
      },
      "message": "Remove ParserState\n\nParserState was never compared to anything\nexcept for NOT_AFTER_RULE, so it could be\na boolean instead.\n"
    },
    {
      "commit": "ee538935fc914663100eb3d181dc40277131c2f6",
      "tree": "aa2db39b83ef1d53277c01deb797b762abc36ae0",
      "parents": [
        "ceabd6eede043fcdeb3e460837e513207419de10",
        "535ec5d0d6991e647087a8e411d737163a31603a"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 18 18:24:09 2023 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 18 18:24:09 2023 -0800"
      },
      "message": "Merge remote-tracking branch \u0027aosp/upstream\u0027 into update_kati\n\n* aosp/upstream:\n  Fix crash due to std::string_view change\n  Remove AppendString\n\nChange-Id: Ic53c45ab9e39d378d44fbd8e35637a0be72ad34d\n"
    },
    {
      "commit": "535ec5d0d6991e647087a8e411d737163a31603a",
      "tree": "579c5493692933e5bce7fed0f167148b17c9e9c0",
      "parents": [
        "462b39477dc01a66dca59af85d8b50aeae100bb8"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 18 18:00:13 2023 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Wed Jan 18 18:17:33 2023 -0800"
      },
      "message": "Fix crash due to std::string_view change\n\nstd::string_view can\u0027t accept a null pointer.\n"
    },
    {
      "commit": "462b39477dc01a66dca59af85d8b50aeae100bb8",
      "tree": "6f3da42f1f9a6cec24d7eb5cf98451ee6772b05a",
      "parents": [
        "43f4e4605c54be891e4eddf57a6a2a916fb9b10f"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 11 16:02:18 2023 -0800"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Fri Jan 13 10:28:52 2023 +0000"
      },
      "message": "Remove AppendString\n\nNo longer necessary now that we\u0027re using std::string_view\n"
    },
    {
      "commit": "ceabd6eede043fcdeb3e460837e513207419de10",
      "tree": "4c6eef4c6337ab33fe6274898e60980e9dc9c945",
      "parents": [
        "1be12c8b1307de276ca070a3b3bf8f5d7f12d17d",
        "43f4e4605c54be891e4eddf57a6a2a916fb9b10f"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 11 18:25:52 2023 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Jan 11 18:26:13 2023 -0800"
      },
      "message": "Merge remote-tracking branch \u0027aosp/upstream\u0027 into update_kati\n\n* aosp/upstream:\n  Replace StringPiece with std::string_view\n  Remove usages of using namespace std;\n  Add ninja version of $? test case\n  Run clang-format\n  Update AUTHORS\n  Simplify implementation of $? for ninja\n  Implement $? for ninja\n  Add test case for $?\n  Disable $? in ninja mode\n  Update AUTHORS and CONTRIBUTORS\n  Implement $?\n  Fix tests for ubuntu 22.04\n  Add workflow_dispatch trigger to github action\n  Fix CI\n  Add --variable_assignment_trace_filter option\n  Fix unqualified-std-cast-call compiler warning\n  Correct result of Stem()\n\nChange-Id: I056bfb6fc0193aa51728d52c4d06974a462b1a2d\n"
    },
    {
      "commit": "43f4e4605c54be891e4eddf57a6a2a916fb9b10f",
      "tree": "cecb5e794fdb7be0135c549127d570d1b4ac56c7",
      "parents": [
        "e6590f1aa84734419d787dbdb38dcc070bea7060"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Sat Dec 03 14:51:49 2022 -0800"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Thu Dec 08 10:33:18 2022 +0000"
      },
      "message": "Replace StringPiece with std::string_view\n\nStringPiece was almost an identical copy of std::string_view,\nprobably added before kati was compiled with C++17. Replace\nit with std::string_view now that we\u0027re on C++17.\n\nSome of the differences between StringPiece and std::string_view are:\n\n- myStringPiece.AppendToString(myString) becomes\n  myString.append(myStringView)\n- myStringPiece.as_string() becomes std::string(myStringView)\n- string_view doesn\u0027t have .clear(), replaced with initializing a new\n  string_view\n- myStringPiece.get(0) becomes myStringView.at(0), with added bounds\n  checking because string_view will throw if it\u0027s out of bounds while\n  StringPiece will return 0 instead.\n- StringPiece\u0027s substr() will prevent both the starting and ending\n  indexes of the substring from going past the end of the StringPiece,\n  but string_view will only do that for the ending index, and throw\n  on out of bounds starting indicies.\n- StringPiece could be initialized from a null char*, but string_view\n  will crash when given null.\n\nThe tests caught some of the runtime issues, but more were\ncaught by testing a locally compiled ckati in the android source tree.\n"
    },
    {
      "commit": "e6590f1aa84734419d787dbdb38dcc070bea7060",
      "tree": "37c117d6dc0e693489c347c48ac8eb72425e3853",
      "parents": [
        "6e2447e21b34607154429b81e80eea6f58db4095"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Nov 30 21:33:41 2022 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Wed Nov 30 22:27:12 2022 -0800"
      },
      "message": "Remove usages of using namespace std;\n\nThis is mandated by the google style guide:\nhttps://google.github.io/styleguide/cppguide.html\n"
    },
    {
      "commit": "6e2447e21b34607154429b81e80eea6f58db4095",
      "tree": "b1c6df137c548f3a2488451e6093291db89a82a0",
      "parents": [
        "326d5a4b584db3f5739b801c01729de25aff7557"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Thu Nov 24 20:24:56 2022 +1100"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Mon Nov 28 12:42:27 2022 -0800"
      },
      "message": "Add ninja version of $? test case\n"
    },
    {
      "commit": "326d5a4b584db3f5739b801c01729de25aff7557",
      "tree": "bcc57c4dbaba2b042b0b25c23314cf6fa0daa48b",
      "parents": [
        "3bfdd0f76027366eb026f5dc0db74e85f6545bb4"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Thu Mar 17 19:42:44 2022 +1100"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Mon Nov 28 12:42:27 2022 -0800"
      },
      "message": "Run clang-format\n"
    },
    {
      "commit": "3bfdd0f76027366eb026f5dc0db74e85f6545bb4",
      "tree": "b628026bdb5353d1957ff7082b0b899c10695610",
      "parents": [
        "6a1e3474ab4d78fdee53604413acc9a0ffb96f2a"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Thu Mar 17 19:40:50 2022 +1100"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Mon Nov 28 12:42:27 2022 -0800"
      },
      "message": "Update AUTHORS\n\nI forgot to add my E-mail address along with my name here.\n"
    },
    {
      "commit": "6a1e3474ab4d78fdee53604413acc9a0ffb96f2a",
      "tree": "0d658bc1357271d6e9747d2441e38956ff260b66",
      "parents": [
        "d521068b030be1a6b2df61149a06d5f6bcda399e"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Thu Mar 17 19:37:46 2022 +1100"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Mon Nov 28 12:42:27 2022 -0800"
      },
      "message": "Simplify implementation of $? for ninja\n"
    },
    {
      "commit": "d521068b030be1a6b2df61149a06d5f6bcda399e",
      "tree": "c0e7ee8c27cac5873d2b4fb439f78ae20149b4d0",
      "parents": [
        "a4f36671fe86d5f535a26047f275b5f356c5e6e6"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Thu Mar 10 23:24:53 2022 +1100"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Mon Nov 28 12:42:27 2022 -0800"
      },
      "message": "Implement $? for ninja\n"
    },
    {
      "commit": "a4f36671fe86d5f535a26047f275b5f356c5e6e6",
      "tree": "2f5466180f16898b5e398b3caeec1d810efe9742",
      "parents": [
        "9aaf4c5adba36d65d63666e0a5ddd1e736d72e5c"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Sun Mar 06 20:21:40 2022 +1100"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Mon Nov 28 12:42:27 2022 -0800"
      },
      "message": "Add test case for $?\n"
    },
    {
      "commit": "9aaf4c5adba36d65d63666e0a5ddd1e736d72e5c",
      "tree": "7b65383c205f0a9253064a7dfaca98e795dd5059",
      "parents": [
        "cdbecab2774a3caa4d30b22083659f8f69235bf2"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Sun Mar 06 10:28:55 2022 +1100"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Mon Nov 28 12:42:27 2022 -0800"
      },
      "message": "Disable $? in ninja mode\n"
    },
    {
      "commit": "cdbecab2774a3caa4d30b22083659f8f69235bf2",
      "tree": "3e0cc5ad343499261bae45eca7ea402825704b6a",
      "parents": [
        "172ebf84cace3d848f91ae8532a91ebbb79b0dcc"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Sun Mar 06 10:18:09 2022 +1100"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Mon Nov 28 12:42:27 2022 -0800"
      },
      "message": "Update AUTHORS and CONTRIBUTORS\n"
    },
    {
      "commit": "172ebf84cace3d848f91ae8532a91ebbb79b0dcc",
      "tree": "44553f75356d78b9f22f12e81a67cb7a10672dab",
      "parents": [
        "1c7fee78f28175988570a6f00decb6d6df45828f"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Sat Mar 05 23:37:07 2022 +1100"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Mon Nov 28 12:42:27 2022 -0800"
      },
      "message": "Implement $?\n"
    },
    {
      "commit": "1c7fee78f28175988570a6f00decb6d6df45828f",
      "tree": "3d5a41536caeafcb937e3936a54ae412f29db477",
      "parents": [
        "1ff99f5a0c80f22b9cda08df76c48c22a2c9d46b"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Nov 25 17:10:27 2022 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Sun Nov 27 19:49:35 2022 -0800"
      },
      "message": "Fix tests for ubuntu 22.04\n\nThe version of bash in ubuntu 22.04 says\nerrors occur on line 1 instead of line 0\nwhen using bash -c. Update the tests\nto handle that.\n"
    },
    {
      "commit": "1ff99f5a0c80f22b9cda08df76c48c22a2c9d46b",
      "tree": "276cb4f2adb9ee3edf3742d7129529d6227886b9",
      "parents": [
        "a6adf085a06ef61b0417b140fd24cbc5709b6707",
        "b886653c1c18fa2c220461469e84ebe7334f16e1"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Fri Nov 25 14:14:14 2022 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 25 14:14:14 2022 -0800"
      },
      "message": "Merge pull request #256 from Colecf/workflow_dispatch\n\nAdd workflow_dispatch trigger to github action"
    },
    {
      "commit": "b886653c1c18fa2c220461469e84ebe7334f16e1",
      "tree": "276cb4f2adb9ee3edf3742d7129529d6227886b9",
      "parents": [
        "a6adf085a06ef61b0417b140fd24cbc5709b6707"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Nov 25 13:37:40 2022 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Nov 25 13:37:40 2022 -0800"
      },
      "message": "Add workflow_dispatch trigger to github action\n"
    },
    {
      "commit": "a6adf085a06ef61b0417b140fd24cbc5709b6707",
      "tree": "f142eacde772f9dc025d0c4bbd01de74f45618e1",
      "parents": [
        "a8b2c1d558771c26b78f17199e9bc1abce94cec4",
        "ce47f101600397778b45d6f33543201540f3d48d"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Thu Nov 17 21:51:34 2022 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 17 21:51:34 2022 -0800"
      },
      "message": "Merge pull request #251 from kongy/master\n\nFix unqualified-std-cast-call compiler warning"
    },
    {
      "commit": "ce47f101600397778b45d6f33543201540f3d48d",
      "tree": "f142eacde772f9dc025d0c4bbd01de74f45618e1",
      "parents": [
        "87b8bcbc707549f4a5193fa6dde7ba6a0245a1d3",
        "a8b2c1d558771c26b78f17199e9bc1abce94cec4"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Thu Nov 17 21:40:10 2022 -0800"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Thu Nov 17 21:40:10 2022 -0800"
      },
      "message": "Merge remote-tracking branch \u0027upstream/master\u0027\n"
    },
    {
      "commit": "a8b2c1d558771c26b78f17199e9bc1abce94cec4",
      "tree": "351231d679df57c0ee8f3ce1aa2bbf9862e37e7a",
      "parents": [
        "35adf62f83c590588db6b9a929c60c3c67ffd3b8",
        "c43a8a621bb65cd5fa6549a585167242f9650652"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colecfaust@gmail.com",
        "time": "Thu Nov 17 18:59:42 2022 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 17 18:59:42 2022 -0800"
      },
      "message": "Merge pull request #254 from asmundak/master\n\nAdd --variable_assignment_trace_filter option"
    },
    {
      "commit": "c43a8a621bb65cd5fa6549a585167242f9650652",
      "tree": "351231d679df57c0ee8f3ce1aa2bbf9862e37e7a",
      "parents": [
        "7749f2a01f2e83bb8bc1353b22db9919be28b9ee",
        "35adf62f83c590588db6b9a929c60c3c67ffd3b8"
      ],
      "author": {
        "name": "asmundak",
        "email": "23563312+asmundak@users.noreply.github.com",
        "time": "Thu Nov 17 14:14:23 2022 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 17 14:14:23 2022 -0800"
      },
      "message": "Merge branch \u0027google:master\u0027 into master\n"
    },
    {
      "commit": "35adf62f83c590588db6b9a929c60c3c67ffd3b8",
      "tree": "6c8388c7d41fa1e273d99a5982e5270705fa1962",
      "parents": [
        "09dfa26c4e59b15919aaad6986f9b47c883dc4f1"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Tue Nov 08 20:11:51 2022 -0800"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Wed Nov 09 13:29:42 2022 +0100"
      },
      "message": "Fix CI\n"
    },
    {
      "commit": "7749f2a01f2e83bb8bc1353b22db9919be28b9ee",
      "tree": "7a62ab24c367dfd5026c7de9f48345d87072a7bb",
      "parents": [
        "09dfa26c4e59b15919aaad6986f9b47c883dc4f1"
      ],
      "author": {
        "name": "Sasha Smundak",
        "email": "asmundak@google.com",
        "time": "Mon Oct 31 12:47:09 2022 -0700"
      },
      "committer": {
        "name": "Sasha Smundak",
        "email": "asmundak@google.com",
        "time": "Mon Oct 31 12:47:09 2022 -0700"
      },
      "message": "Add --variable_assignment_trace_filter option\n\nIn addition, write assignment event to the trace file.\n"
    },
    {
      "commit": "1be12c8b1307de276ca070a3b3bf8f5d7f12d17d",
      "tree": "ad4dbc220dbb8c4f605cfc1402816191b9e9f6a4",
      "parents": [
        "a6fd9e68b5a25b8c5726e2f653f5af47ef9087bf"
      ],
      "author": {
        "name": "Sasha Smundak",
        "email": "asmundak@google.com",
        "time": "Thu Oct 27 14:24:43 2022 -0700"
      },
      "committer": {
        "name": "Sasha Smundak",
        "email": "asmundak@google.com",
        "time": "Fri Oct 28 11:40:52 2022 -0700"
      },
      "message": "Add --variable_assignment_trace_filter option\n\nIn addition, write assignment event to the trace file.\n\nTest: build and use it\nChange-Id: I6233c4316a48adfa7c58bb10e5379885e6f37242\n"
    },
    {
      "commit": "87b8bcbc707549f4a5193fa6dde7ba6a0245a1d3",
      "tree": "bd7311b3feae926b2d0895a56fea8dab87ef2c2f",
      "parents": [
        "09dfa26c4e59b15919aaad6986f9b47c883dc4f1"
      ],
      "author": {
        "name": "Yi Kong",
        "email": "yikong@google.com",
        "time": "Mon Aug 22 14:05:32 2022 +0800"
      },
      "committer": {
        "name": "Yi Kong",
        "email": "yikong@google.com",
        "time": "Wed Aug 31 16:27:45 2022 +0800"
      },
      "message": "Fix unqualified-std-cast-call compiler warning\n\nContext: https://reviews.llvm.org/D119670\n\n... also fixed a clang-format error.\n"
    },
    {
      "commit": "09dfa26c4e59b15919aaad6986f9b47c883dc4f1",
      "tree": "34f30f6e2180132f1d9f2aed18a4906071a47382",
      "parents": [
        "ac0166533f93581571fcb84e1f5a43c618f0a96f"
      ],
      "author": {
        "name": "Delilah Hoare",
        "email": "delilah@dhoare.me",
        "time": "Sun Mar 06 19:56:32 2022 +1100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Mar 14 11:42:54 2022 +0100"
      },
      "message": "Correct result of Stem()\n"
    },
    {
      "commit": "a6fd9e68b5a25b8c5726e2f653f5af47ef9087bf",
      "tree": "0be684ec03d7823eaa78ac5d31dd626ab7fe00ab",
      "parents": [
        "8f9c4437513b4a41dec451e1a313fa3a8e9b64d9",
        "ac0166533f93581571fcb84e1f5a43c618f0a96f"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Dec 07 22:08:55 2021 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Dec 07 22:08:55 2021 -0800"
      },
      "message": "Merge remote-tracking branch \u0027aosp/upstream\u0027\n\n* aosp/upstream:\n  Switch from vfork to posix_spawn\n  Fix parallel tests\n  Update Dockerfile to pass tests\n\nChange-Id: I66fc6e2058ef14e048a64341be90470c6c5d00c6\n"
    },
    {
      "commit": "ac0166533f93581571fcb84e1f5a43c618f0a96f",
      "tree": "c69726d17b942621cc8875ce8a987d407c602190",
      "parents": [
        "0632049086037a1c3225c5e006e05339e5f0d2b4",
        "8d20e5a60494b4f1786fbaeac2e16fbe3c4eac9c"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Tue Nov 16 22:53:03 2021 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 16 22:53:03 2021 -0800"
      },
      "message": "Merge pull request #241 from danw/posix_spawn\n\nSwitch from vfork to posix_spawn"
    },
    {
      "commit": "8d20e5a60494b4f1786fbaeac2e16fbe3c4eac9c",
      "tree": "c69726d17b942621cc8875ce8a987d407c602190",
      "parents": [
        "ba53f47e0a741b2d1b722bac11db8e678f001f21"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Nov 15 15:52:50 2021 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Nov 15 22:52:35 2021 -0800"
      },
      "message": "Switch from vfork to posix_spawn\n\nThe macOS 12 SDK has deprecated vfork in preference of posix_spawn or\nfork. Switch to posix_spawn with the flag to continue using vfork on\nLinux.\n"
    },
    {
      "commit": "ba53f47e0a741b2d1b722bac11db8e678f001f21",
      "tree": "9bfe52299e2a4d2a6a5760d43a58e355c69d98e3",
      "parents": [
        "cb69a4e2f286172d29f28bbc397fd940ac05d5b7"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Nov 15 22:47:15 2021 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Nov 15 22:52:35 2021 -0800"
      },
      "message": "Fix parallel tests\n\nStop using /tmp/log, which would be written concurrently from mulitple\ntests, leading to random failures.\n"
    },
    {
      "commit": "cb69a4e2f286172d29f28bbc397fd940ac05d5b7",
      "tree": "04efa3e48705b411d0d0cfcef5edc102f26a3b02",
      "parents": [
        "0632049086037a1c3225c5e006e05339e5f0d2b4"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Nov 15 17:31:44 2021 -0800"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Mon Nov 15 22:51:39 2021 -0800"
      },
      "message": "Update Dockerfile to pass tests\n\nAlso moves the source outside of the root directory, and changes\nENTRYPOINT to CMD to make it easier to enter the container and inspect\nthe test results.\n\nUse -j8 to speed up builds, that should be fairly safe on most modern\nmachines.\n"
    },
    {
      "commit": "8f9c4437513b4a41dec451e1a313fa3a8e9b64d9",
      "tree": "00c806a490d7e59dfd16e9dda274619e08aa1bae",
      "parents": [
        "9a4a3fef9624d9b91139705c1726f39e4ac97c96",
        "0632049086037a1c3225c5e006e05339e5f0d2b4"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Oct 28 10:52:17 2021 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Thu Oct 28 10:52:17 2021 -0700"
      },
      "message": "Merge remote-tracking branch \u0027aosp/upstream\u0027\n\n* aosp/upstream:\n  Fix crash when using --empty_ninja_file\n\nChange-Id: I65c1694cbb332e8a5947fc137ac363a06f60762e\n"
    },
    {
      "commit": "0632049086037a1c3225c5e006e05339e5f0d2b4",
      "tree": "2365474e84f45c8921166cc104fcd312cda4e3e7",
      "parents": [
        "57e1bfcaded27f9badd430a8e66585b613f199e4"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Wed Oct 27 16:01:42 2021 -0700"
      },
      "committer": {
        "name": "Joe Onorato",
        "email": "73136106+onoratoj@users.noreply.github.com",
        "time": "Wed Oct 27 16:40:43 2021 -0700"
      },
      "message": "Fix crash when using --empty_ninja_file\n\nThis bug was introduced in commit bca0a69ffd7045e33bd2e42e795cc0ade6f81c69.\nEmitNode() used to always be called, but after that commit, EmitNode()\nis no longer called when using --empty_ninja_file. EmitNode() has the side\neffect of setting default_target_, which was then needed later on.\n\nHowever it turns out that default_target_ is not actually needed when\nusing --empty_ninja_file, so moving the code that uses it into the check\nthat that flag is not provided fixes the issue.\n"
    },
    {
      "commit": "9a4a3fef9624d9b91139705c1726f39e4ac97c96",
      "tree": "63f332e8e425bc09bf36a10daa61c5828b580424",
      "parents": [
        "01fbbfb4a192c0d80b62c8d859a4320f411d4455",
        "57e1bfcaded27f9badd430a8e66585b613f199e4"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Mon Oct 25 15:45:53 2021 -0700"
      },
      "committer": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Mon Oct 25 15:45:53 2021 -0700"
      },
      "message": "Merge remote-tracking branch \u0027aosp/upstream\u0027 into updatekati2\n\n* aosp/upstream:\n  func: Add support for .SHELLSTATUS\n  Write top-level targets to the Ninja file in the alphabetical order\n  fileutil: improve cache handling of file globs\n  Ninja: use structured bindings for readability\n  NinjaGenerator: constructor: make use of initializer list\n  fileutil: simplify the interface of GetExecutablePath()\n  Ninja: retire \u0027using namespace std\u0027\n  Ninja: clarify how DepNodes are passed and owned\n  Exec: do not heap allocate the Executor\n  CommandEvaluator: reduce needless allocations and clarify interface\n  Ninja: reduce needless heap allocations\n  Parser: drop manual initialization of directive maps\n  symtab: remove unnecessary explicit initialization\n  func: make FuncInfo lookup map a static constant\n  dep: remove manual resource management from g_dep_node_pool\n  dep: fix string::find invocations on single character strings\n  regen_dump: avoid unnecessary copies\n  symtab: JoinSymbols: reserve intermediate vector size\n  ScopedFrame: remove problematic move constructor\n  expr: JoinValues: reserve intermediate vector size\n  Remove threadpool implementation\n  MakefileCacheManager: Avoid global initialization race\n  MakefileCacheManager: avoid heap allocations\n  main: allocate the evaluator on the stack\n\nChange-Id: Ifd471df9802a334cce0185ed597bec0758520f56\n"
    },
    {
      "commit": "57e1bfcaded27f9badd430a8e66585b613f199e4",
      "tree": "fe330017b4508cd38c20eaa62999493bf0521134",
      "parents": [
        "9f48932c90ca93bc1777561cc22d1a2587bc0333"
      ],
      "author": {
        "name": "Cole Faust",
        "email": "colefaust@google.com",
        "time": "Fri Oct 08 13:14:48 2021 -0700"
      },
      "committer": {
        "name": "Joe Onorato",
        "email": "73136106+onoratoj@users.noreply.github.com",
        "time": "Mon Oct 25 15:30:38 2021 -0700"
      },
      "message": "func: Add support for .SHELLSTATUS\n\n.SHELLSTATUS is a variable that\u0027s set\nwith the return status of the last $(shell)\ncommand. GNU Make has this feature, but kati\nhad been missing it.\n"
    },
    {
      "commit": "9f48932c90ca93bc1777561cc22d1a2587bc0333",
      "tree": "c2c9759015d401b688f071a82068fcc56595a620",
      "parents": [
        "371194da71b3e191fea6f2ccceb7b061bd0de310",
        "06f2569b2d16628608c000a76e3d495a5a5528cb"
      ],
      "author": {
        "name": "asmundak",
        "email": "23563312+asmundak@users.noreply.github.com",
        "time": "Wed Oct 20 09:49:16 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 20 09:49:16 2021 -0700"
      },
      "message": "Merge pull request #239 from asmundak/master\n\nWrite top-level targets to the Ninja file in the alphabetical order"
    },
    {
      "commit": "06f2569b2d16628608c000a76e3d495a5a5528cb",
      "tree": "c2c9759015d401b688f071a82068fcc56595a620",
      "parents": [
        "371194da71b3e191fea6f2ccceb7b061bd0de310"
      ],
      "author": {
        "name": "Sasha Smundak",
        "email": "asmundak@google.com",
        "time": "Thu Oct 14 16:40:32 2021 -0700"
      },
      "committer": {
        "name": "Sasha Smundak",
        "email": "asmundak@google.com",
        "time": "Fri Oct 15 14:39:53 2021 -0700"
      },
      "message": "Write top-level targets to the Ninja file in the alphabetical order\n\nFixes issue#238\n"
    },
    {
      "commit": "371194da71b3e191fea6f2ccceb7b061bd0de310",
      "tree": "bba760f4e1389b30e5cb3056cdbc934356e4e87b",
      "parents": [
        "b097553ded5e2f60872c915ac5a1d00981108c22"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Fri Sep 03 17:14:35 2021 +0100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Sep 06 15:09:55 2021 +0200"
      },
      "message": "fileutil: improve cache handling of file globs\n\nAvoid needless allocations by letting the cache vector manage our\nmemory. Further, clarify the interface by passing vectors of glob files\nby immutable const\u0026.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "b097553ded5e2f60872c915ac5a1d00981108c22",
      "tree": "e4ff021a974b8efdf52f9807f1b2e7a022185035",
      "parents": [
        "b10b4f3a683ac4dc9c8c1aa98e56bf624214ed01"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Fri Sep 03 16:54:25 2021 +0100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Sep 06 15:09:55 2021 +0200"
      },
      "message": "Ninja: use structured bindings for readability\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "b10b4f3a683ac4dc9c8c1aa98e56bf624214ed01",
      "tree": "907946f70d60ef40be0025ac9ef7edfdcea67eda",
      "parents": [
        "9b8269085ec62ff294449b4811a32e5fc9015c9a"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Fri Sep 03 02:10:19 2021 +0100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Sep 06 15:09:55 2021 +0200"
      },
      "message": "NinjaGenerator: constructor: make use of initializer list\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "9b8269085ec62ff294449b4811a32e5fc9015c9a",
      "tree": "b3e1f736045d1862ea6aac5cd3a00fc0b1c02523",
      "parents": [
        "63f3968907298d0e25ebd55ad7fd8cbe207dd13f"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Fri Sep 03 02:05:40 2021 +0100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Sep 06 15:09:55 2021 +0200"
      },
      "message": "fileutil: simplify the interface of GetExecutablePath()\n\nRather return a std::string instead of populating a (hopefully\ninitialized) std::string*.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "63f3968907298d0e25ebd55ad7fd8cbe207dd13f",
      "tree": "6b9b87705b84c91f37d6db8c0ed6705c3f09b85c",
      "parents": [
        "6e4bfb8b00be7fd0a440a4cac06c389180971a3d"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Fri Sep 03 01:58:19 2021 +0100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Sep 06 15:09:55 2021 +0200"
      },
      "message": "Ninja: retire \u0027using namespace std\u0027\n\n\"using namespace std;\" is commonly considered bad practice. In order to\nmake the entire code consistent, retire all unqualified std:: use across\nninja.h and ninja.cc.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "6e4bfb8b00be7fd0a440a4cac06c389180971a3d",
      "tree": "0fe9e1a3c649888e85aae7e7b98e648f17fe3ec7",
      "parents": [
        "9c4d6d4d9bbe2e70e5b5c080e72f00b5eb4b094e"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Fri Sep 03 00:57:39 2021 +0100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Sep 06 15:09:55 2021 +0200"
      },
      "message": "Ninja: clarify how DepNodes are passed and owned\n\nRefactor the CommandEvaluator and Executor to prefer const\u0026 DepNode over\nDepNode* as arguments. That makes ownership mutability more obvious.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "9c4d6d4d9bbe2e70e5b5c080e72f00b5eb4b094e",
      "tree": "42de85ad1ba46349ddd250d9eb1ba6b81523116d",
      "parents": [
        "6f8c8f262a01d7169c6bea723f74756d2f7b941c"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Fri Sep 03 00:33:26 2021 +0100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Sep 06 15:09:55 2021 +0200"
      },
      "message": "Exec: do not heap allocate the Executor\n\nStack is just fine.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "6f8c8f262a01d7169c6bea723f74756d2f7b941c",
      "tree": "965a28d46847e42e68cbee95fb16c12481cb706e",
      "parents": [
        "51808c4208b17d3db94bf694ecc12719f35aa21f"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Fri Sep 03 00:26:21 2021 +0100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Sep 06 15:09:55 2021 +0200"
      },
      "message": "CommandEvaluator: reduce needless allocations and clarify interface\n\nWhen command vectors are populated by the caller as vector\u003cCommand*\u003e and\npassed as an input/output parameter via pointer. This interface is\nproblematic as the contract is not well defined. Clarify that by always\nproducing the vector within CommandEvaluator::Eval() and return it by\nvalue. Further, the commands are usually only read and never ownership\nis transferred. Hence let the vector manage the allocations and don\u0027t\nbother about that any longer by passing vector\u003cCommand\u003e instead.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "51808c4208b17d3db94bf694ecc12719f35aa21f",
      "tree": "56e19a4498df6b5d1971cddd8458110826233237",
      "parents": [
        "3d5809423f60594e05d960583da23d8a4390f70d"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Fri Sep 03 00:06:33 2021 +0100"
      },
      "committer": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Sep 06 15:09:55 2021 +0200"
      },
      "message": "Ninja: reduce needless heap allocations\n\nNinjaNodes only ever live in the nodes_ vector and there is therefore no\nneed to heap allocate them individually as the vector can do that for\nus. As a bonus, we do not need to care about the deallocation anymore.\n\nFurther, we can now also treat the vector somewhat const and when\niterating over the nodes we can treat them const\u0026, giving some\nadditional interface clarity.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "3d5809423f60594e05d960583da23d8a4390f70d",
      "tree": "95b9398241f52da9e38de87d382561817c027e3b",
      "parents": [
        "0aca512a197ec7a5f8df10b62905f374afa0796a"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 12 17:13:59 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Wed Jul 14 07:43:42 2021 +0100"
      },
      "message": "Parser: drop manual initialization of directive maps\n\nThe maps are initialized at startup based on static data. Hence, let\u0027s\ndo this at program initialization and remove any manual init/quit code.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "0aca512a197ec7a5f8df10b62905f374afa0796a",
      "tree": "7deefb5446899151e2dc48b87813c6466ce32901",
      "parents": [
        "55df8893eadb35abbad8a9dee99c477d2d22774c"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 12 16:50:05 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Wed Jul 14 07:43:42 2021 +0100"
      },
      "message": "symtab: remove unnecessary explicit initialization\n\nThere is no need to manually heap allocate g_symtab. The static linkage\nguarantees us that this is not used across compilation units. Hence, let\nthe symtab initialize at program start and tear down at program exit.\nDrop any manual init/quit code.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "55df8893eadb35abbad8a9dee99c477d2d22774c",
      "tree": "9142035b3f9d0d1f772d330117cd65739c3e683e",
      "parents": [
        "91e6ab8b0a0d56d906880f39b0d428a660edf189"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 12 16:34:25 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Wed Jul 14 07:43:42 2021 +0100"
      },
      "message": "func: make FuncInfo lookup map a static constant\n\nThe FuncInfo lookup map is initialized on startup based on static data.\nWe can do that at program initialization instead. This makes the maps\nconstant, allows the compiler to optimize and us to remove the explicit\ninit/quit code.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "91e6ab8b0a0d56d906880f39b0d428a660edf189",
      "tree": "4dfd90c9e1111c9913da5ef05ecdb2b8e46bb0da",
      "parents": [
        "f78e6fa37b62376dd9f81402c6e3ca5ad1d5bf0a"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 12 15:58:57 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Wed Jul 14 07:43:42 2021 +0100"
      },
      "message": "dep: remove manual resource management from g_dep_node_pool\n\nMake g_dep_node_pool a vector of DepNode unique_ptr. That way cleanup is\nguaranteed and the heap allocation without overhead. Also, move the\nownership responsibility away from the constructor and rather let the\ncalling site care about the pool. Finally, remove all init/quit code\npaths.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "f78e6fa37b62376dd9f81402c6e3ca5ad1d5bf0a",
      "tree": "f063845b65abe91ebdf1e475da89712df90ccbae",
      "parents": [
        "a009d2ae6ae76874bee7421a7d0f69b016ba9009"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 05 23:34:04 2021 +0100"
      },
      "committer": {
        "name": "Liz Kammer",
        "email": "eakammer@google.com",
        "time": "Thu Jul 08 11:30:11 2021 -0400"
      },
      "message": "dep: fix string::find invocations on single character strings\n\nExpress the single character as such to use the potentially more\nefficient overload of string::find.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "a009d2ae6ae76874bee7421a7d0f69b016ba9009",
      "tree": "e19eb2e51300c79456f164942491d15e55e828c5",
      "parents": [
        "d78d80552db24aa0381380252d67ec38e24faf4f"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 05 23:32:13 2021 +0100"
      },
      "committer": {
        "name": "Liz Kammer",
        "email": "eakammer@google.com",
        "time": "Thu Jul 08 11:30:11 2021 -0400"
      },
      "message": "regen_dump: avoid unnecessary copies\n\nWhen iterating over files and directories, capture them as const\u0026 to\navoid copies.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "d78d80552db24aa0381380252d67ec38e24faf4f",
      "tree": "3c9c6bf131749252f6f67c6a79e061707d32a52e",
      "parents": [
        "5489b9dc4248accdd5cac136511e9aa93a9eed30"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 05 23:29:09 2021 +0100"
      },
      "committer": {
        "name": "Liz Kammer",
        "email": "eakammer@google.com",
        "time": "Thu Jul 08 11:30:11 2021 -0400"
      },
      "message": "symtab: JoinSymbols: reserve intermediate vector size\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "5489b9dc4248accdd5cac136511e9aa93a9eed30",
      "tree": "b57243eb70a0753a6bf7a1d6e1048bd591e5999f",
      "parents": [
        "e8360616137dcc527962af63db8e306b6ed45c78"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 05 23:24:13 2021 +0100"
      },
      "committer": {
        "name": "Liz Kammer",
        "email": "eakammer@google.com",
        "time": "Thu Jul 08 11:30:11 2021 -0400"
      },
      "message": "ScopedFrame: remove problematic move constructor\n\nThe move constructor was implemented as a copy constructor. While\ntechnically still correct, it creates an unusual interface as the\nmoved-from object is still perfectly valid. The way the destructor is\nimplemented, this would have created issues. Luckily, this constructor\nwas so far never used. Hence, remove it and remove the redundant\ndeletions of the copy- and assign-constructurs as they are implicitly\ndeleted if a move constructor is specified.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "e8360616137dcc527962af63db8e306b6ed45c78",
      "tree": "66760242f93191f13761e32b38684d4de15b41cf",
      "parents": [
        "bca0a69ffd7045e33bd2e42e795cc0ade6f81c69"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 05 23:21:37 2021 +0100"
      },
      "committer": {
        "name": "Liz Kammer",
        "email": "eakammer@google.com",
        "time": "Thu Jul 08 11:30:11 2021 -0400"
      },
      "message": "expr: JoinValues: reserve intermediate vector size\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "bca0a69ffd7045e33bd2e42e795cc0ade6f81c69",
      "tree": "6a2fce8fd33e58369defadb112327a06cc0dbfda",
      "parents": [
        "55f1a38a76c4b4e666a33c05d45f5ccde1103f5b"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jul 06 12:30:26 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Thu Jul 08 13:24:53 2021 +0100"
      },
      "message": "Remove threadpool implementation\n\nThe thread pool implementation is currently used for two cases:\n1) parallel generation of the ninja output file content\n2) second check whether regeneration is necessary\n\nNone of those are really on the hot path as rather the whole Eval\nmachinery is dominating the overall runtime.\n\nThere are a couple of issues with the current implementation. The thread\npool always spawns num_jobs threads whenever constructed. Even for the\nuse case 2) where there are two tasks running in the pool, as many\nthreads as cores are on the machine are usually spawned, wasting system\nresources. In particular, use case 2) can be accomplished with running\nthe tasks side by side with std::async.\n\nFor the use case 1), what we effectively do is map-reduce a massive\nstring. Each of the tasks produces a substring of the final output and\nonce they are all generated (in memory), we dump them sorted into the\noutput file. This makes us build up the output in memory (compute and\nmemory) and defer the actual writing (i/o) to a later time.\n\nThe implementation is changed here to entirely skip using a thread pool.\nInstead, we construct a buffered output file stream and pass it around\nwhile we loop over the nodes. That way we can write out the file while\nwe are still producing the output having and can operate on a single\nthread. This also reduces the overall memory foot print.\n\nThose are the measured times from a recent Android aosp/master generator\nrun:\n\nWithout this change:\n\n  (46.543s real, 46.24s user, 7.571s system, 5622MB maxrss)\n  (45.176s real, 46.96s user, 5.268s system, 5622MB maxrss)\n  (45.118s real, 46.94s user, 5.248s system, 5629MB maxrss)\n\nWith this change:\n\n  (45.996s real, 42.05s user, 4.034s system, 4786MB maxrss)\n  (45.727s real, 41.69s user, 4.129s system, 4789MB maxrss)\n  (45.926s real, 42.19s user, 3.835s system, 4787MB maxrss)\n\nAs can be seen, the runtime difference is neglectible, but system\npressure and overall memory consumption significantly improve.\n\nNeedless to say, since all use cases can be implemented alternatively,\nwe can remove the thread pool implementation and it remains less code to\nmaintain and reason about.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "55f1a38a76c4b4e666a33c05d45f5ccde1103f5b",
      "tree": "d1dde1434f1cc6ee1f58c06e946c7c2af5162f76",
      "parents": [
        "b5e36033347ccc87a48b93a8a3f82df29d1d8a38"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 05 16:56:57 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Thu Jul 08 13:23:09 2021 +0100"
      },
      "message": "MakefileCacheManager: Avoid global initialization race\n\nMakefileCacheManager is an object only ever allocated at one place. Yet\nany user of it needs to be called after the allocation and before the\ndeallocation. Simplify this by making the cache manager a local static\nobject initialized on first use. This also avoids the manual new/delete.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "b5e36033347ccc87a48b93a8a3f82df29d1d8a38",
      "tree": "ca5cdac3d054fe3ce08a951b7d57a8adfe300517",
      "parents": [
        "05597cce252eb6ef45f6a3fdf2916bc3f7a7d670"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 05 16:35:12 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Thu Jul 08 13:23:09 2021 +0100"
      },
      "message": "MakefileCacheManager: avoid heap allocations\n\nHeap-allocating the Makefile objects is not necessary as already the map\nnode is heap allocated. Spare those allocations and memory management\naround them.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "05597cce252eb6ef45f6a3fdf2916bc3f7a7d670",
      "tree": "1949162d792a8414eabc3ef5fd1a5e443c7e7906",
      "parents": [
        "798370447a2b416bc0dc44e2daf7c7ee0abb89d7"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Mon Jul 05 15:49:57 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Thu Jul 08 13:23:09 2021 +0100"
      },
      "message": "main: allocate the evaluator on the stack\n\nEvaluator ownership never leaves the scope. Hence, the heap allocation\nis unneccessary. Use the stack instead.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "01fbbfb4a192c0d80b62c8d859a4320f411d4455",
      "tree": "df23299fcfd330f327b93d488640dbeb25719e28",
      "parents": [
        "e4b02173f075d20357d614690c803cb0c9d9b0f5",
        "798370447a2b416bc0dc44e2daf7c7ee0abb89d7"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Jul 01 18:29:18 2021 -0700"
      },
      "committer": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Jul 01 18:29:29 2021 -0700"
      },
      "message": "Merge remote-tracking branch \u0027aosp/upstream\u0027\n\n* aosp/upstream:\n  strutil: SkipUntil: restore function and limit outcome to len\n  strutil: replace SkipUntil by calls to strcspn\n  strutil: deduplicate delimiters\n  strutil: fix delimiters for skipping whitespaces\n  strutil: clarify SkipUntil parameters\n  Bump GNU Make compatibility version\n\nChange-Id: I07c4a4327cc8f7733e6fdb08214f6d1c994f9e1a\n"
    },
    {
      "commit": "798370447a2b416bc0dc44e2daf7c7ee0abb89d7",
      "tree": "cc6741c3d3154332543245578f2488fbb895863a",
      "parents": [
        "731661fdaa6caece5cd63fe26b176db6a532fe8b",
        "3c31b0cabde90ba08d79c2f7aad1c276c0fe3c1b"
      ],
      "author": {
        "name": "Dan Willemsen",
        "email": "dwillemsen@google.com",
        "time": "Thu Jul 01 14:13:45 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 01 14:13:45 2021 -0700"
      },
      "message": "Merge pull request #229 from metti/skipuntil\n\nstrutil: replace SkipUntil by invocations to strcspn"
    },
    {
      "commit": "3c31b0cabde90ba08d79c2f7aad1c276c0fe3c1b",
      "tree": "cc6741c3d3154332543245578f2488fbb895863a",
      "parents": [
        "7efba330bb7de94a6399cce1a83f7f5659e3744e"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Thu Jul 01 15:59:53 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Thu Jul 01 15:59:53 2021 +0100"
      },
      "message": "strutil: SkipUntil: restore function and limit outcome to len\n\nIn case we are dealing with a string that is not terminated after len,\nlimit the result of SkipUntil to either a matching character or the\ngiven length. Whatever is minimal.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "7efba330bb7de94a6399cce1a83f7f5659e3744e",
      "tree": "879a27931caed892697e31284817fde4fb3a332b",
      "parents": [
        "e683259e96a92dee5a918542ee1b307c5c7523c5"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 30 15:57:46 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 30 17:28:14 2021 +0100"
      },
      "message": "strutil: replace SkipUntil by calls to strcspn\n\nWhat SkipUntil does is to return the length of the longest string that\ndoes not match any delimiter characters. That is precisely what strcspn\ndoes (except that SkipUntil was treating \\0 like any other character).\n\nFor the use cases that we have, we can assume that we are not interested\nin anything beyond a null terminator of a string. Hence, replace all\nuses of SkipUntil with equivalent strcspn invocations.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "e683259e96a92dee5a918542ee1b307c5c7523c5",
      "tree": "4bd9f6b0206a3271d7244caab305aed1a3bc4541",
      "parents": [
        "b12032b6d9865361be4741535e2059c9d1af6414"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 30 15:46:47 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 30 17:27:19 2021 +0100"
      },
      "message": "strutil: deduplicate delimiters\n\nSince a8ca5d35306a (\"strutil: replace SSE4 specialization with libc\ncall\"), SkipUntil does take a set of delimiters and not ranges anymore.\nWe can therefore deduplicate the sets. That is what this patch does.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "b12032b6d9865361be4741535e2059c9d1af6414",
      "tree": "549e41ae0f555ad84b46e14eeff263f46a55c722",
      "parents": [
        "419f4d4d453516c6b33f68b04a9157c6b832f0bd"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 30 15:38:32 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 30 17:27:12 2021 +0100"
      },
      "message": "strutil: fix delimiters for skipping whitespaces\n\nCommit a8ca5d35306a (\"strutil: replace SSE4 specialization with libc\ncall\") switched an SSE4 optimization of SkipUntil to using strpbrk. By\nnot matching the full ranges (i.e. not all control characters between\n\\x09 and \\x0d), this lead to wrong results when processing real-world\nMakefiles containing line continuation statements. Fix this by filling\nup the set of delimiters.\n\nReported-by: Dan Willemsen \u003cdwillemsen@google.com\u003e\nFixes: a8ca5d35306a (\"strutil: replace SSE4 specialization with libc call\")\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "419f4d4d453516c6b33f68b04a9157c6b832f0bd",
      "tree": "7ca6fadfec4520549992347ebab1dab9fd010a67",
      "parents": [
        "731661fdaa6caece5cd63fe26b176db6a532fe8b"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 30 15:34:41 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 30 17:27:07 2021 +0100"
      },
      "message": "strutil: clarify SkipUntil parameters\n\nSince a8ca5d35306a (\"strutil: replace SSE4 specialization with libc\ncall\"), SkipUntil does actually take a \u0027list\u0027 of delimiters rather than\na list of ranges. Clarify that by renaming the parameter and all local\ninstances for it.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "731661fdaa6caece5cd63fe26b176db6a532fe8b",
      "tree": "125bbadf1d5929573c8757856c32648b3ea4e2bb",
      "parents": [
        "3e6c016ad04449e1bc8e9dea77550f1a3b3ab6fd",
        "187a78b359e4422ae4d47edbe4b1e2b34c6027a3"
      ],
      "author": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Thu Jun 24 16:17:32 2021 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 24 16:17:32 2021 +0200"
      },
      "message": "Merge pull request #228 from metti/make_version\n\nBump GNU Make compatibility version"
    },
    {
      "commit": "187a78b359e4422ae4d47edbe4b1e2b34c6027a3",
      "tree": "125bbadf1d5929573c8757856c32648b3ea4e2bb",
      "parents": [
        "3e6c016ad04449e1bc8e9dea77550f1a3b3ab6fd"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jun 15 14:36:51 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jun 15 16:37:50 2021 +0100"
      },
      "message": "Bump GNU Make compatibility version\n\nUpdate the GNU Make compatibility version (MAKE_VERSION) to 4.2.1. The\npreviously used version 3.81 had been released 2006 the latest 3.x\nversion is 3.82, released in 2010. With today\u0027s toolchains it is quite a\nbit of work to still get a 3.81 compiled and odds are that Kati users\nare on newer systems anyway (Kati is compiled with C++17).\n\nLastly, as of today we validate ckati against the GNU Make provided in\nUbuntu 20.04 LTS, which is currently 4.2.1. So, the best we can say\nabout compatibility is declaring MAKE_VERSION\u003d4.2.1\n\nIn order to safeguard this, add explicit steps to use a 4.2.1 GNU Make\nfor testing in the github actions and add some documentation to achieve\nthe same result when testing locally.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "e4b02173f075d20357d614690c803cb0c9d9b0f5",
      "tree": "0ea60413261fbfba02f64082dd93c1e20287c691",
      "parents": [
        "0e72fb915dc4e96e2248f31f2e1e425cf49a535c",
        "3e6c016ad04449e1bc8e9dea77550f1a3b3ab6fd"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jun 08 16:33:18 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jun 08 16:33:18 2021 +0100"
      },
      "message": "Merge branch upstream into master\n\n* aosp/upstream:\n  strutil: replace SSE4 specialization with libc call\n  Add diagnostic make file targets\n  EvalIf: Consider any whitespace in variable names an error\n  Expression Parser: Retain single \u0027$\u0027 signs before terminators\n  Update github actions to accommodate recent changes\n  CommandEvaluator: Correct Makefile location for multi statement blocks\n  cleanup: use [[fallthrough]] unconditionally\n  Add support for -C \u003cdirectory\u003e\n  Fix outstanding clang-format issues\n  Fix github action to not use \u0027add-path\u0027 anymore\n  Revert of code change in 97d8f1deb62d (\"[C++] Fail for newlines in expanded rule statement\")\n  tests: ignore the error location that GNUMake emits\n  testcases/tools/findleaves.py: migrate to python3\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\nChange-Id: I9e718fb9ab95bae768dac4c0e16588749e732654\n"
    },
    {
      "commit": "3e6c016ad04449e1bc8e9dea77550f1a3b3ab6fd",
      "tree": "07c55893c896c983964fc14be4124cb1465396bd",
      "parents": [
        "737ff8b179ac109c80a11c42a40c4c157a4c078b",
        "a8ca5d35306a48a81de9939925327de2f948c5eb"
      ],
      "author": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Tue Jun 08 13:34:41 2021 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 08 13:34:41 2021 +0200"
      },
      "message": "Merge pull request #227 from metti/sse4_fixes\n\nstrutil: replace SSE4 specialization with libc call"
    },
    {
      "commit": "0e72fb915dc4e96e2248f31f2e1e425cf49a535c",
      "tree": "8f29d863fc328f1c1e54a3842109409de0367921",
      "parents": [
        "a03c18803d9bd53d9a9cd96cb6e4606b66ed00ac"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jun 08 11:50:41 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jun 08 11:52:36 2021 +0100"
      },
      "message": "build: make strutil_bench a separate host_test\n\nstrutil_bench is a standalone benchmarking executable to be run on the\nhost for testing purposes. Define it as such.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\nChange-Id: Ib4a0fc4cf13b017fde5d7a83e45619a87aafac26\n"
    },
    {
      "commit": "a8ca5d35306a48a81de9939925327de2f948c5eb",
      "tree": "4baaf608a40c275137564eac30e54524f715f172",
      "parents": [
        "e1d6ee2fab91f83f432493671a434881172c366e"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jun 08 08:29:00 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jun 08 11:48:20 2021 +0100"
      },
      "message": "strutil: replace SSE4 specialization with libc call\n\nSkipUntil had been partially specialized to use SSE4.2 instructions if\nselected at compile time. The Makefile.ckati sets the compile flags to\nthe rather incompatible -march\u003dnative to enable the SSE4.2 instruction\nset. The minimum (Intel) architecture required for SSE4.2 is Nehalem, so\n-march\u003dnehalem would do and that would probably make things a bit more\ncompatible when distributing the binary across machines.\n\nIt turns out, the relevant part of SkipUntil can actually be replaced by\na checked `strpbrk` call. Recent libc implementations do specialize\nstrpbrk for SSE4.2 as well. E.g. glibc runtime-selects `__strpbrk_sse42`\nif the host provides the instruction set.\n\nThe ckati benchmark `strutil_bench` is neutral to this change. On my\nmachine the benchmark consistently produces around\n   *kati*: WordScanner: 0.156697\nwith or without the change applied. This is when using the Make based\nbuilding process that also sets -march\u003dnative.\n\nOther build systems and processes might not want to use -march\u003dnative to\nbe able to produce compatible builds. They might also not want to use\nany limiting -march\u003d* at all. That is the case for the Android build\nwhere ckati is built and mainly used. When building in that environment,\nthe strutil_bench consistently runs\n   *kati*: WordScanner: 0.396514\nand when applying this patch\n   *kati*: WordScanner: 0.255683\n\nThe difference between the best Android build and the Make based build\nmust be related to other build settings done in the Android/Soong based\nbuild, such as FORTIFY_SOURCE, stack protector, etc.\n\nAnother side effect of this patch is, that we can run the kati test\nsuite successfully with --fsanitize\u003daddress now. Otherwise the SSE4.2\nspecific implementation would cause an address violation due to an\nout-of-bounds read.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "737ff8b179ac109c80a11c42a40c4c157a4c078b",
      "tree": "d5b7329bc5ac00e9f6add37758fe0b8ec01c2e15",
      "parents": [
        "e1d6ee2fab91f83f432493671a434881172c366e",
        "3d1127fce4613b313bddb9186d5aa6fb3f04e362"
      ],
      "author": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Mon Jun 07 10:25:20 2021 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 07 10:25:20 2021 +0200"
      },
      "message": "Merge pull request #226 from metti/test_fixes\n\nAdd diagnostic make file targets"
    },
    {
      "commit": "3d1127fce4613b313bddb9186d5aa6fb3f04e362",
      "tree": "d5b7329bc5ac00e9f6add37758fe0b8ec01c2e15",
      "parents": [
        "e1d6ee2fab91f83f432493671a434881172c366e"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Thu Jun 03 13:48:48 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Thu Jun 03 13:53:36 2021 +0100"
      },
      "message": "Add diagnostic make file targets\n\nThis helps diagnose issues related to the environment this is developed\nin. For now, just gather information about GNU Make and the current\nshell.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "e1d6ee2fab91f83f432493671a434881172c366e",
      "tree": "e1b81654a833f804de3438e4d6f5b829fc79f665",
      "parents": [
        "1ed7e554a62236abf2db492378233f361865ce92"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 02 23:09:55 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "matthias@maennich.net",
        "time": "Thu Jun 03 00:00:38 2021 +0100"
      },
      "message": "EvalIf: Consider any whitespace in variable names an error\n\nNot only are \u0027 \u0027 and \u0027\\t\u0027 are considered bad in variable names used in\nif statements, actually any whitespace including \u0027\\n\u0027 is considered\nillegal. Fix that by testing for anything matching `isspace`.\n\nThis fixes \u0027testcase/ifdef_ret_in_arg.mk\u0027.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    },
    {
      "commit": "1ed7e554a62236abf2db492378233f361865ce92",
      "tree": "a5dfffd519b2df4ecf09230d790d4019c03d9c7d",
      "parents": [
        "35a9f11de740e620aa24b33b28e30033c7f785eb",
        "56cd497e1093656b5c7c7895732bff83066c2497"
      ],
      "author": {
        "name": "lberki",
        "email": "lberki@users.noreply.github.com",
        "time": "Wed Jun 02 17:47:57 2021 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 02 17:47:57 2021 +0200"
      },
      "message": "Merge pull request #224 from metti/parser\n\nExpression Parser: Retain single \u0027$\u0027 signs before terminators"
    },
    {
      "commit": "56cd497e1093656b5c7c7895732bff83066c2497",
      "tree": "a5dfffd519b2df4ecf09230d790d4019c03d9c7d",
      "parents": [
        "35a9f11de740e620aa24b33b28e30033c7f785eb"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 02 15:52:56 2021 +0100"
      },
      "committer": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Wed Jun 02 16:07:12 2021 +0100"
      },
      "message": "Expression Parser: Retain single \u0027$\u0027 signs before terminators\n\nSingle dollar signs without variable reference are treated as literal\ndollar signs by GNU Make if they are before a terminator, such as a line\nending or a comma in a function argument list. Let Kati do the same.\n\nConsider the following Makefile\n\nfoo :\u003d $(subst a,$,bab)\ntest:\n    echo $(foo)\n\n\u0027foo\u0027 expands to \u0027b$b\u0027 by replacing occurrences of \u0027a\u0027 by the literal\n\u0027$\u0027. The command effective is then `echo b$b`, printing just \u0027b\u0027 unless\n$b evaluates to something.\n\nThere was a test failing due to this missing corner case implementation\nthat is now fixed as well: testcase/subst2.mk\nFurther I added an explicit test case: testcase/simple_subst.mk to\npreserve this corner case.\n\nSigned-off-by: Matthias Maennich \u003cmaennich@google.com\u003e\n"
    }
  ],
  "next": "35a9f11de740e620aa24b33b28e30033c7f785eb"
}
