)]}'
{
  "log": [
    {
      "commit": "cecebbbaccd36dc2e9f6e80c8e91e57d979963a5",
      "tree": "e866ec8f6bd1eafcc47a7f26d5b957ad787dcfdc",
      "parents": [
        "a6bc86aae72e406c1e90ff25eb3f95b654d9a723"
      ],
      "author": {
        "name": "Bernie Innocenti",
        "email": "codewiz@google.com",
        "time": "Thu Feb 06 03:49:33 2020 +0900"
      },
      "committer": {
        "name": "Bernie Innocenti",
        "email": "codewiz@google.com",
        "time": "Thu Feb 06 17:04:27 2020 +0000"
      },
      "message": "Convert system/core to Result::ok()\n\nNo functionality changes, this is a mechanical cleanup.\n\nTest: m\nTest: cd system/core \u0026\u0026 atest\nChange-Id: Ifdaa3ce1947ed578f656d5a446978726eb416c36\n"
    },
    {
      "commit": "1efc4849d7436d258460789a3ae83178bfef1abd",
      "tree": "c41e069e4a67e220ec133f3894a9f5b08ed410b9",
      "parents": [
        "e91c76b2104792d839b2bd3036e7e265427dcdc1"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Nov 14 09:19:07 2019 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Nov 14 09:19:07 2019 -0800"
      },
      "message": "init: make CheckPropertyTriggers() more efficient\n\nPreviously CheckPropertyTriggers() tried to do the entire property\ntriggers check with one loop.  However, that would require calling\nGetProperty() on all properties for all triggers just in case the\nproperty that is being set is used by a given trigger.\n\nThis change first checks that the property being set exists in each\ntrigger and that its value is set such that the trigger would be\ntriggered, only then does it check that other property triggers are\nset to the right value.\n\nBug: 143922756\nTest: boot\nTest: substantially fewer GetProperty() calls from\n      CheckPropertyTriggers()\n\nChange-Id: I0228cf47328b31963eaf3fc689fb60f711532df4\n"
    },
    {
      "commit": "6fd8d3bb1b9e29da5d4840bdb94fdf262fad1f3a",
      "tree": "10e74cd5e40f6d3c1430301b0703c292275a4aed",
      "parents": [
        "4b8e6b673f904c197743aad8f773d43cc6b69883"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 12 09:26:20 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 12 09:31:42 2019 -0700"
      },
      "message": "init: Allow matching empty property values\n\nWhen we have a property match along with an event trigger, we\ncurrently don\u0027t allow matching empty property values, in other words,\nproperties that are unset.  For example, the below trigger would never\nbe run:\n\non zygote-start \u0026\u0026 property:persist.sys.fuse\u003d\"\"\n\nThat doesn\u0027t make sense though, it should be possible to match an\nempty property value, so this change allows that trigger to match when\npersist.sys.fuse is either empty or not set.\n\nThis continues to not match a \u0027*\u0027 to an empty property, so\n\non zygote-start \u0026\u0026 property:persist.sys.fuse\u003d*\n\nwill not run if persist.sys.fuse is empty or unset.\n\nTest: the above triggers run appropriately\nChange-Id: Ia57de7b96ad352590d0c82ff4ae95060b7361976\n"
    },
    {
      "commit": "e269a721dc47a3c6ac9f57e22dfd4556efbc5605",
      "tree": "ec9ccf16fd876d5de02b09956309aa78b881230c",
      "parents": [
        "e5fa9b80ac761dbaf7fbb389204b6b95a6938c86",
        "d17c37952de1df556726ed1ebb9fe8e3ee3b3bf7"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 06 15:19:48 2019 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Aug 06 15:19:48 2019 +0000"
      },
      "message": "Merge \"init: ignore ENOENT from fewer builtins\""
    },
    {
      "commit": "4772f1da47bfdad8e0b3e3cdbf1bdc6bda0443b1",
      "tree": "3f40d0bee7fa7394dc09ed9d73f2cd1d9f3d6932",
      "parents": [
        "c5cf85db23ac8c8a0206e911d73ef1c42ad66ed6"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jul 30 09:34:41 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Aug 01 10:54:47 2019 -0700"
      },
      "message": "init: check the arguments of builtins during the build\n\nHost init verifier already checks that the names and number of\narguments for builtins are correct, but it can check more.  This\nchange ensures that property expansions are well formed, and that\narguments that can be parsed on the host are correct.  For example it\nchecks that UIDs and GIDs exist, that numerical values can be parsed,\nand that rlimit strings are correct.\n\nTest: build\n\nChange-Id: Ied8882498a88a9f8324db6b8d1020aeeccc8177b\n"
    },
    {
      "commit": "c5cf85db23ac8c8a0206e911d73ef1c42ad66ed6",
      "tree": "5e940c776939c3d175bf50cbbd1ea92d5840d39a",
      "parents": [
        "244d9b8fb968b9f0289ac69d723a4f760d1c1b91"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jul 31 13:59:15 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Aug 01 10:34:58 2019 -0700"
      },
      "message": "init: don\u0027t log in expand_props directly\n\nIt\u0027s better to pass the error message to the caller to determine how\nbest to print the error.\n\nTest: build\nChange-Id: Id8857c459df2f26c031650166609608d20e4d051\n"
    },
    {
      "commit": "d17c37952de1df556726ed1ebb9fe8e3ee3b3bf7",
      "tree": "b035fefa6e6350ccf666f2b0829a8bc7124cad31",
      "parents": [
        "244d9b8fb968b9f0289ac69d723a4f760d1c1b91"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jul 30 10:51:59 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jul 30 12:44:35 2019 -0700"
      },
      "message": "init: ignore ENOENT from fewer builtins\n\nPreviously we were ignoring ENOENT from all builtins as\nrootdir/init.rc has many legacy commands that we need to keep for\nbackwards compatibility, but are otherwise no longer relevant.\n\nHowever, this wasn\u0027t catching actual issues, for example chown failing\ndue to not finding the user or group name.  This change therefore\nreduces the scope of ignoring ENOENT to the only the extraneous errors\nin builtins.\n\nTest: boot CF and walleye without seeing errors from init.rc\nTest: see errors from invalid users/groups in chown\nChange-Id: Ia8e14fa2591e083cb1736c313a3e55515bc5d15e\n"
    },
    {
      "commit": "d52a5b3c10ad341e38f61466e81b7a963e6eb92e",
      "tree": "4a39211c457d181b091a854d8faeedb1be7170c5",
      "parents": [
        "b3fc1b7441b8cc4d11384cf8867682308daffb15"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jul 22 16:05:36 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jul 23 14:39:38 2019 -0700"
      },
      "message": "init: simplify keyword_map\n\nI\u0027ve heard that keyword_map is too complex, in particular the tuple\nand the pair in BuiltinFunctionMap, so this change removes a lot of\nthat complexity and, more importantly, better documents how all of\nthis works.\n\nTest: boot, init unit tests\n\nChange-Id: I74e5f9de7f2ec524cb6127bb9da2956b5f307f56\n"
    },
    {
      "commit": "7c1d87e490886ba80f741f89cc6cd82a55eec247",
      "tree": "74785eedb9e8164bc5c4dfdf8ed985e99ad8576c",
      "parents": [
        "d543c8ca11d79f487a5c0e496faa57c961acf18c"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jul 10 11:18:24 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jul 10 12:59:02 2019 -0700"
      },
      "message": "init: fix clang-tidy performance issues\n\nTest: boot, init unit tests\nChange-Id: Iccf34d2fedfa543dd9f29e010cbb6d8fe9cf5983\n"
    },
    {
      "commit": "bbcbc2ffb339b2388e0cc282bb698fe436100b42",
      "tree": "3b1ab414d943a4a9b50dd29c581807fa2092ed06",
      "parents": [
        "caa95d551d7f3b86d609b09bb4ab98e2435f6bc8"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jun 10 11:08:01 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jun 10 12:39:18 2019 -0700"
      },
      "message": "init: replace Result\u003cSuccess\u003e with Result\u003cvoid\u003e\n\nNow that Result\u003cT\u003e is actually expected\u003cT, ...\u003e, and the expected\nproposal states expected\u003cvoid, ...\u003e as the way to indicate an expected\nobject that returns either successfully with no object or an error,\nlet\u0027s move init\u0027s Result\u003cSuccess\u003e to the preferred Result\u003cvoid\u003e.\n\nBug: 132145659\nTest: boot, init unit tests\nChange-Id: Ib2f98396d8e6e274f95a496fcdfd8341f77585ee\n"
    },
    {
      "commit": "8fd64c8af11e29a270bff6688f52589afb2b0466",
      "tree": "51cb7ec12139129ec9795603d5e962f2e64a2e90",
      "parents": [
        "f74ff74475494e25ab27a507ff55bfefb78ff905"
      ],
      "author": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Fri May 31 03:43:34 2019 +0900"
      },
      "committer": {
        "name": "Jiyong Park",
        "email": "jiyong@google.com",
        "time": "Thu Jun 06 08:58:55 2019 +0900"
      },
      "message": "Move result.h from init to libbase\n\nThe Result, Error, ErrnoError are quite generic. Moving them from init\nto libbase so that they can be used from other places.\n\nBug: 132145659\nTest: libbase_test\nChange-Id: Id774a587f74380fadd7a0fc88c0aa892c3d9a489\n"
    },
    {
      "commit": "9949ec5f5672a839937ed08dfc338494418cdb03",
      "tree": "e77c38fe273c25da47e3317f1afc92f1ecce97fb",
      "parents": [
        "691e0e154ad3d666bcd3fb6d21c563700a31ff2f"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu May 16 16:54:49 2019 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed May 22 15:23:01 2019 -0700"
      },
      "message": "init: replace Result\u003c\u003e with expected\u003c\u003e\n\nAndroid-base has an implementation of the future std::expected\u003c\u003e.\nThis provides the same baseline functionality as Result\u003c\u003e, so use it\ninstead of our own version.\n\nBug: 132145659\nTest: boot, init unit tests\nChange-Id: I11e61bcb5719b262a6420483ed51a762826a9e23\n"
    },
    {
      "commit": "018a438ff05a2082df0ce339fd6ea364ad760577",
      "tree": "4f48e9f0367f299a85ebbced90adefbcd15fd84f",
      "parents": [
        "4bc53d20afce1e1201f8effa2404d97aa3c67b50"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Oct 17 11:11:23 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Oct 17 11:30:53 2018 -0700"
      },
      "message": "init: use rvalues references for callees of ParseLineSection()\n\nParseLineSection() provides \u0027args\u0027 as an rvalue reference, so its\ncallers can and should use it as such.  This saves some copying\noverhead and cleans up the code a bit.\n\nTest: boot\nChange-Id: Ib906318583dc81de9ea585f5f09fdff35403be1b\n"
    },
    {
      "commit": "dc803126283444431c0d06f0386eddada0fe6b77",
      "tree": "1ea923034a483bc3b935d7a6a1eeb85712eea244",
      "parents": [
        "54be246a1f916a9be409b59ceaebf7a564170d2c"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu May 24 18:00:39 2018 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu May 24 18:04:31 2018 -0700"
      },
      "message": "libbase: add host properties support.\n\nMove init and libprocessgroup away from their existing hacks.\n\nBug: N/A\nTest: ran tests\nChange-Id: Ifabdd38e0cc4ab2582f1ea59d32159d386f48eb6\n"
    },
    {
      "commit": "de6bd50d4238d19ec401127bcf2321dc679d908d",
      "tree": "f181f4acfa59f642c5927fc706060b192a2638e6",
      "parents": [
        "304dacae8acd6c3469a7c5ff05357478ad2ff074"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Feb 13 16:50:08 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Feb 28 10:45:45 2018 -0800"
      },
      "message": "init: add host side parser for init\n\nCreate a host side parser for init such that init rc files can be\nverified for syntax correctness before being used on the device.\n\nBug: 36970783\nTest: run the parser on init files on host\n\nChange-Id: I7e8772e278ebaff727057308596ebacf28b6fdda\n"
    },
    {
      "commit": "9cbf57048cf0057f499bf1911e4ac3eba795becb",
      "tree": "d35ece56762c71f178792237b1441f0592042233",
      "parents": [
        "7fd3bc27eccdcb11de4886bdda05cd26a8d8af5c"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Feb 13 16:24:51 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Feb 14 16:37:17 2018 -0800"
      },
      "message": "Move all Action parsing into ActionParser\n\nBug: 36970783\nTest: Build\nChange-Id: Iea2d97fb45c3e88bc83fb72d6fa67049be42cfa9\n"
    },
    {
      "commit": "7fd3bc27eccdcb11de4886bdda05cd26a8d8af5c",
      "tree": "4235be71596d436217a6e4f3abff105472cf91ad",
      "parents": [
        "0f6417f232e92aad0d712ab1b131c0829869cddd"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Feb 13 15:36:14 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Feb 14 16:37:09 2018 -0800"
      },
      "message": "Move ActionManager to its own file\n\nBug: 36970783\nTest: build\nChange-Id: I08fa39052236b462249f79de1d02bf02bdbf4c84\n"
    },
    {
      "commit": "0f6417f232e92aad0d712ab1b131c0829869cddd",
      "tree": "1443f21b57b95cc361fe7d903091dc8eee83478b",
      "parents": [
        "cd2fa1f43215b829bd4359bf7725daa220b08dbf"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Feb 13 15:25:29 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Feb 13 15:26:14 2018 -0800"
      },
      "message": "Move ActionParser to its own file\n\nBug: 36970783\nTest: build\nChange-Id: Idd5b923e4789760bb9ef67c10982b2642bc6a31a\n"
    },
    {
      "commit": "eeb21885545f25606498feee0ad3f1f9b29e44e8",
      "tree": "da581722ce59de92841e19f94e68b4c60a6ec6a7",
      "parents": [
        "4719ecd28c1ee1ca1cf25a6bc789d005a8f62e60"
      ],
      "author": {
        "name": "Jaekyun Seok",
        "email": "jaekyun@google.com",
        "time": "Tue Jan 16 12:51:19 2018 +0900"
      },
      "committer": {
        "name": "Jaekyun Seok",
        "email": "jaekyun@google.com",
        "time": "Thu Jan 18 04:38:01 2018 +0900"
      },
      "message": "Apply the whitelist of actionable system properties\n\nThis whitelist will be applied only when\nro.actionable_compatible_property.enabled is true.\n\nBug: 38146102\nTest: tested on walleye with ro.actionable_compatible_property.enabled\u003dtrue\nChange-Id: Ifd7211396b53e50a06d79e7c67224e2b38ef7c9d\n"
    },
    {
      "commit": "c49719fc5d2cf3817f6997ce40fc2dac7d411efa",
      "tree": "20976b810ebb16b32d2bf125bed2df5750a1f763",
      "parents": [
        "eac86b0ea90f19f9a4116e9a1ca401f0959ceb03"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Jan 10 11:04:34 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jan 12 10:35:26 2018 -0800"
      },
      "message": "init: always expand args in subcontext\n\nCurrently init expands properties in arguments only when those\ncommands are run in a subcontext.  This creates a hole where\nproperties that should not be accessible from a given subcontext of\ninit can be accessed when running a command in the main init\nexecutable (for example `start`).\n\nThis change creates a callback in subcontext init that simply expands\nand returns arguments back to the main init process, to ensure that\nonly those properties that a subcontext can access get expanded.\n\nBug: 62875318\nTest: boot bullhead, new unit tests\nChange-Id: I2850009e70da877c08e4cc83350c727b0ea98796\n"
    },
    {
      "commit": "579e682628805dd9c3f8c96765c0beb3f56f1494",
      "tree": "d9f77eb889f512a8a98ce9fb6826b4810bb2dc11",
      "parents": [
        "e1d9e7c343ac4577450b96d4de19da6f099eb154"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Dec 20 09:41:00 2017 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Dec 20 09:42:22 2017 -0800"
      },
      "message": "Add std::string StartsWith*/EndsWith* overloads.\n\nWe should have done this from the beginning. Thanks to Windows, we\u0027re not\ngoing to be able to switch libbase over to std::string_view any time soon.\n\nBug: N/A\nTest: ran tests\nChange-Id: Iff2f56986e39de53f3ac484415378af17dacf26b\n"
    },
    {
      "commit": "7d0a5c3656ee56eb81e442b58063d500b4f506e0",
      "tree": "1b066819020691798e8f57bc3b64c58e11f21f2f",
      "parents": [
        "b480d441ac092fc855711180023e6292e705e589"
      ],
      "author": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Fri Nov 10 14:20:47 2017 -0800"
      },
      "committer": {
        "name": "Steven Moreland",
        "email": "smoreland@google.com",
        "time": "Wed Nov 15 10:39:29 2017 -0800"
      },
      "message": "EndSection returns Result\u003cSuccess\u003e\n\nAllow it to fail. When there is an error for a section ending,\nprint the error pointing to the line where the section starts.\n\nBug: 69050941\nTest: boot, init_tests\nChange-Id: I1d8ed25f4b74cc9ac24d38b8075751c7d606aea8\n"
    },
    {
      "commit": "cb0f9bbc855097e0c8248643015b837255fd569a",
      "tree": "cc42fe9dc7a6011c2b9e9ee0fd26f9f2454e1746",
      "parents": [
        "9c568d0fc0e290529180e3fc0452f0ac489e5053"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 12 15:58:47 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Sep 29 13:06:26 2017 -0700"
      },
      "message": "init: run vendor commands in a separate SELinux context\n\nOne of the major aspects of treble is the compartmentalization of system\nand vendor components, however init leaves a huge gap here, as vendor\ninit scripts run in the same context as system init scripts and thus can\naccess and modify the same properties, files, etc as the system can.\n\nThis change is meant to close that gap.  It forks a separate \u0027subcontext\u0027\ninit that runs in a different SELinux context with permissions that match\nwhat vendors should have access to.  Commands get sent over a socket to\nthis \u0027subcontext\u0027 init that then runs them in this SELinux context and\nreturns the result.\n\nNote that not all commands run in the subcontext; some commands such as\nthose dealing with services only make sense in the context of the main\ninit process.\n\nBug: 62875318\nTest: init unit tests, boot bullhead, boot sailfish\n\nChange-Id: Idf4a4ebf98842d27b8627f901f961ab9eb412aee\n"
    },
    {
      "commit": "68f2a4614518468f1320ad3e62a6db554e509fb1",
      "tree": "379a26958c3c70d672bae20d0a099c9a82ed98a3",
      "parents": [
        "76af7e6a0c4ce7759e6cc5994b5496ddb09035ee"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 22 16:15:26 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 23 11:05:37 2017 -0700"
      },
      "message": "init: enable error reporting of builtin functions\n\nEnable error reporting when builtin functions fail.  These errors are\nnow reported with full context including the source file and line\nnumber, e.g.\n\ninit: Command \u0027write /sys/module/subsystem_restart/parameters/enable_debug ${persist.sys.ssr.enable_debug}\u0027 action\u003dearly-boot (/init.bullhead.rc:84) took 0ms and failed: cannot expand \u0027${persist.sys.ssr.enable_debug}\u0027\n\nThere are two small caveats:\n1) There are nearly 200 reports of builtins failure due to \"No such\n   file or directory\".  Many of these are due to legacy paths included\n   in rootdir/init.rc.  Until they are cleaned up, reporting of these\n   failures is disabled.\n2) Similarly, symlink is often used to create backwards compatible\n   symlinks.  By their very nature, these calls are expected to fail\n   on newer systems that do already use the new path.  Due to this,\n   failures of symlink due to EEXIST are not reported.\n\nBug: 38038887\nTest: boot bullhead, only see true errors reported from builtins.\nChange-Id: I316c13e3adc992cacc6d79ffee987adc8738fca0\n"
    },
    {
      "commit": "130e3d7204d2b2d3d2ba956c3243fbc0fb1cabe4",
      "tree": "1aeef41d7c988db4d02026af31a3290e9288245f",
      "parents": [
        "6de21f11125941ea1b94fdeec754bacea3916fd5"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 22 16:07:15 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 23 11:04:32 2017 -0700"
      },
      "message": "init: pass errors from one Result\u003cT\u003e to another better\n\nResult\u003cT\u003e currently has two problems,\n1) A failing Result\u003cT\u003e cannot be easily constructed from a Result\u003cU\u003e\u0027s\nerror.\n2) errno is lost when passing .error() through multiple Result\u003cT\u003e\u0027s\n\nThis change fixes both problems having Result\u003cT\u003e::error() return a\nResultError class that contains the std::string error message and int\nerrno.\n\nIt additionally has ostream operators to continue to allow printing\nthe error string directly to an ostream and also to pass the errno\nthrough to another Result\u003cT\u003e class via Error() creation.\n\nLastly, it provides a new constructor for Result\u003cT\u003e for ResultError,\nsuch that a Result\u003cT\u003e can be constructed from Result\u003cU\u003e::error().\n\nTest: boot bullhead, init unit tests\nChange-Id: Id9614b727cdabd2f5498b0da0e598e9aff7d9ae0\n"
    },
    {
      "commit": "89bcc85edfff4a2b2378f638ab90b2f7e19a8472",
      "tree": "0f233aaf5488cbf61b5b408c418d598c4aff7931",
      "parents": [
        "557946e57c375b05deb5ba07b739f27abc70697e"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 02 17:01:36 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 14 14:07:49 2017 -0700"
      },
      "message": "init: use Result\u003cT\u003e for the parsing functions\n\nTest: boot bullhead\nMerged-In: I7f00c5f0f54dd4fe05df73e1d6a89b56d788e113\nChange-Id: I7f00c5f0f54dd4fe05df73e1d6a89b56d788e113\n"
    },
    {
      "commit": "557946e57c375b05deb5ba07b739f27abc70697e",
      "tree": "a073dadfaa7529739187ae7264abc21b881c8b97",
      "parents": [
        "11a3aeeae3dc887b889d4086d4d26d95c324c08d"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 01 13:50:23 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 14 14:07:39 2017 -0700"
      },
      "message": "init: use Result\u003cT\u003e for builtin functions\n\nWe currently throw out the return values from builtin functions and\noccasionally log errors with no supporting context.  This change uses\nthe newly introduced Result\u003cT\u003e class to communicate a successful result\nor an error back to callers in order to print an error with clear\ncontext when a builtin fails.\n\nExample:\n\ninit: Command \u0027write /sys/class/leds/vibrator/trigger transient\u0027 action\u003dinit (/init.rc:245) took 0ms and failed: Unable to write to file \u0027/sys/class/leds/vibrator/trigger\u0027: open() failed: No such file or directory\n\nTest: boot bullhead\nMerged-In: Idc18f331d2d646629c6093c1e0f2996cf9b42aec\nChange-Id: Idc18f331d2d646629c6093c1e0f2996cf9b42aec\n"
    },
    {
      "commit": "ede0d538501dfc78c741fb3b0645406636d1d1fd",
      "tree": "8b00e4bc64471d59a20d762345683721b0214e62",
      "parents": [
        "c31963b5c255d57e162f4666f80b438ac74413ac"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 06 14:20:11 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Jul 10 09:28:24 2017 -0700"
      },
      "message": "Move Timer from init to libbase\n\nTest: boot bullhead\nTest: new libbase unit tests\n\nChange-Id: Ic398a1daa1fe92c10ea7bc1e6ac3f781cee9a5b5\n"
    },
    {
      "commit": "eeab491efd8f456324f88e444f228b1016712e45",
      "tree": "ac3a5db1273c871d2d96aabbc44187b275e87c56",
      "parents": [
        "6333cd093809cbfb70309eff4710a1152c67ec86"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Tue Jun 27 22:08:45 2017 -0700"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Jul 05 14:49:57 2017 -0700"
      },
      "message": "init: Support custom shutdown actions\n\nWe have been seeing panics and errors during shutdown sequence in\nsome vendor\u0027s platform, and it is required to disable error handling\nduring shutdown.\n\nThis CL separates the shutdown request to execute another \"shutdown\"\ntrigger at the beginning of shutdown stage. And vendor can use this\ntrigger to add custom commands needed for shutting down gracefully.\n\nBug: 38203024\nBug: 62084631\nTest: device reboot/shutdown\nChange-Id: I3fac4ed59f06667d86e477ee55ed391cf113717f\n"
    },
    {
      "commit": "81f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33",
      "tree": "994dda570ae23534eb95913a17747e2f90f4ad7b",
      "parents": [
        "84c2eebbdd889fdb7208069c48ba06a2b5a71bf4"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jun 22 12:53:17 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jun 23 13:21:20 2017 -0700"
      },
      "message": "init: create android::init:: namespace\n\nWith some small fixups along the way\n\nTest: Boot bullhead\nTest: init unit tests\nChange-Id: I7beaa473cfa9397f845f810557d1631b4a462d6a\n"
    },
    {
      "commit": "1c3a53f03ca3c2c647f83cd8b8ae7e18c5c7bc69",
      "tree": "9fc09a4a34648a35479a68a717c18edb28e51e26",
      "parents": [
        "07a57f0f283938c5e558d79c62d4c2d4c24d3d03"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jun 22 16:50:31 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jun 22 17:24:22 2017 -0700"
      },
      "message": "init: cleanup some string usage\n\n1) property_set() takes const std::string\u0026 for both of its arguments,\n   so stop using .c_str() with its parameters\n2) Simplify a few places where StringPrintf() is used to concatenate strings\n3) Use std::to_string() instead of StringPrintf() where it\u0027s better suited\n\nTest: Boot bullhead\nTest: init unit tests\nChange-Id: I68ebda0e469f6230c8f9ad3c8d5f9444e0c4fdfd\n"
    },
    {
      "commit": "d9ebf061176757b874a64c3a8ed00d5cfc82f2c1",
      "tree": "44e3b7b54e09de0315f0e8bfff48bf105e501d74",
      "parents": [
        "960ed3ce1bf5bc93a449625a8ace1e4e1c044d02",
        "26ed9cb7062c852749b18cd4b5873d07a3389d00"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Apr 25 21:44:18 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Apr 25 21:44:19 2017 +0000"
      },
      "message": "Merge \"init: rename \u0027Trigger\u0027 to \u0027Event\u0027 and convert to std::variant\""
    },
    {
      "commit": "fe062055cb11fcb1a6178b046173fc0361ad5b96",
      "tree": "ea784f3dd62a9a30b51a84878c636e57cb1ee18c",
      "parents": [
        "35c5bcc89ce713aca02852dc10247a648187ea28"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Apr 24 16:59:05 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Apr 25 11:24:24 2017 -0700"
      },
      "message": "ueventd: replace ueventd_parser.cpp with init_parser.cpp\n\nPreviously init_parser.cpp was made generic and capable of parsing any\nnumber of differently named \u0027sections\u0027 or prefixed lines.  We now use\nthese capabilities to do the parsing for ueventd.\n\nBug: 36250207\nBug: 33785894\n\nTest: boot bullhead and ensure the right /dev nodes exist\n      with the right permissions set\nTest: verify no boot time difference\nChange-Id: I698ca962d414f8135af32f6c9cd778841b2b8b53\n"
    },
    {
      "commit": "26ed9cb7062c852749b18cd4b5873d07a3389d00",
      "tree": "8e3d8b51654781200cce37994ed19d3273592ebd",
      "parents": [
        "d0013343e930e0052d4dd4736edd29d84eadc770"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Apr 17 13:25:29 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Apr 25 17:14:23 2017 +0000"
      },
      "message": "init: rename \u0027Trigger\u0027 to \u0027Event\u0027 and convert to std::variant\n\nThe term \u0027trigger\u0027 should be used in \u0027Action\u0027 to indicate what causes\nthe \u0027Action\u0027 to be executed.\n\nThe term \u0027event\u0027 should be used in ActionManager\u0027s queue to indicate\na state change that is checked against the \u0027triggers\u0027 of an \u0027Action\u0027 to\nsee if it should execute.\n\nConvert the previous Trigger class to std::variant, as the latter is\nbetter suited for this use.\n\nChange-Id: I2558367c8318b536aa69fcec93793f1c12857ef5\n"
    },
    {
      "commit": "30a6f276fd8850b0a78689d7bff3cb06a18cb286",
      "tree": "6d07dc78662207e7300c42c9362dc7b198d98194",
      "parents": [
        "a0bf415cad6dddcc1cdb154a95c795b5a8ecb7aa"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Apr 19 15:31:58 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Apr 21 18:26:40 2017 -0700"
      },
      "message": "init: clean up the SectionParser interface and Parser class\n\nRemove the dependency on Action and Service from what should be a\ngeneric Parser class.\n\nMake ActionParser, ImportParser, and ServiceParser take a pointer to\ntheir associated classes instead of accessing them through a\nsingleton.\n\nMisc fixes to SectionParser Interface:\n1) Make SectionParser::ParseLineSection() non-const as it always should\nhave been.\n2) Use Rvalue references where appropriate\n3) Remove extra std::string\u0026 filename in SectionParser::EndFile()\n4) Only have SectionParser::ParseSection() as pure virtual\n\nDocument SectionParser.\n\nMake ImportParser report the filename and line number of failed imports.\n\nMake ServiceParser report the filename and line number of duplicated services.\n\nTest: Boot bullhead\n\nChange-Id: I86568a5b375fb4f27f4cb235ed1e37635f01d630\n"
    },
    {
      "commit": "012c573e267b8dd70de14237cb470bd7301ee8ea",
      "tree": "06b9798202eb69bf71557304928b9e9f100cad4f",
      "parents": [
        "06039e58d804287fcd8f8edb99983865429026ea"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Apr 18 13:21:54 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Apr 19 11:26:29 2017 -0700"
      },
      "message": "init: Stop combining actions\n\nIn the past, I had thought it didn\u0027t make sense to have multiple\nAction classes with identical triggers within ActionManager::actions_,\nand opted to instead combine these into a single action.  In theory,\nit should reduce memory overhead as only one copy of the triggers\nneeds to be stored.\n\nIn practice, this ends up not being a good idea.\n\nMost importantly, given a file with the below three sections in this\nsame order:\n\non boot\n  setprop a b\n\non boot \u0026\u0026 property:true\u003dtrue\n  setprop c d\n\non boot\n  setprop e f\n\nAssuming that property \u0027true\u0027 \u003d\u003d \u0027true\u0027, when the `boot` event\nhappens, the order of the setprop commands will actually be:\n\nsetprop a b\nsetprop e f\nsetprop c d\n\ninstead of the more intuitive order of:\n\nsetprop a b\nsetprop c d\nsetprop e f\n\nThis is a mistake and this CL fixes it.  It also documents this order.\n\nSecondly, with a given \u0027Action\u0027 now spanning multiple files, in order\nto keep track of which file a command is run from, the \u0027Command\u0027\nitself needs to store this.  Ironically to the original intention,\nthis increases total ram usage.  This change now only stores the file\nname in each \u0027Action\u0027 instead of each \u0027Command\u0027.  All in all this is a\nnegligible trade off of ram usage.\n\nThirdly, this requires a bunch of extra code and assumptions that\ndon\u0027t help anything else.  In particular it forces to keep property triggers\nsorted for easy comparison, which I\u0027m using an std::map for currently,\nbut that is not the best data structure to contain them.\n\nLastly, I added the filename and line number to the \u0027processing\naction\u0027 LOG(INFO) message.\n\nTest: Boot bullhead, observe above changes\nTest: Boot sailfish, observe no change in boot time\nChange-Id: I3fbcac4ee677351314e33012c758145be82346e9\n"
    },
    {
      "commit": "3f5eaae526413a29de899270714469c76dc91ec8",
      "tree": "c7de454140682dad1661449b29badf31f001e345",
      "parents": [
        "b15882faab26af76f0bca30c2ce4ef4890eb4502"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Apr 06 16:30:22 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Apr 06 18:06:34 2017 -0700"
      },
      "message": "init: more header cleanup\n\nRemove includes of \"log.h\" that really want \u003candroid-base/logging.h\u003e\nFix header include order\nRemove headers included in .cpp files that their associated .h already includes\nRemove some unused headers\n\nTest: boot bullhead\nChange-Id: I2b415adfe86a5c8bbe4fb1ebc53c7b0ee2253824\n"
    },
    {
      "commit": "ccf23537eeacfa47e5f18dd3b75089886d177c1b",
      "tree": "cadcde5aa295377ca4613fde651a20e2e8bb7a26",
      "parents": [
        "ec16825cb8130420dbdd0ca7086f5f1c7ad469a8"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Mar 28 16:40:41 2017 -0700"
      },
      "committer": {
        "name": "Keun-young Park",
        "email": "keunyoung@google.com",
        "time": "Wed Mar 29 10:07:54 2017 -0700"
      },
      "message": "init: replace property_get with its android::base equivalent\n\nSlowly try to decouple property_service.cpp from the rest of init.\n\nTest: Boot bullhead\nChange-Id: I267ae0b057bca0bf657b97cb8bfbb18199282729\n"
    },
    {
      "commit": "d8a7257b14086a9070aa521b41118570ee4f4aaa",
      "tree": "ffc59394943a5a65fcb2939925270b661496ab50",
      "parents": [
        "2bc00140be22f08964102068a736358fe8dde5da"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Mar 13 12:24:49 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Mar 13 12:24:49 2017 -0700"
      },
      "message": "init: fix DumpState() logging\n\nFix two formatting issues in Action::DumpState(),\n\nOld:\non ro.crypto.state\u003dencrypted ro.crypto.type\u003dfile zygote-start\nNew:\non ro.crypto.state\u003dencrypted \u0026\u0026 ro.crypto.type\u003dfile \u0026\u0026 zygote-start\n\nOld:\non boot\n  %sifup lo\n  %shostname localhost\n  %sdomainname localdomain\n  %swrite /proc/sys/vm/overcommit_memory 1\nNew:\non boot\n  ifup lo\n  hostname localhost\n  domainname localdomain\n  write /proc/sys/vm/overcommit_memory 1\n\nAlso, now that we\u0027re importing many small rc files, it no longer makes\nsense to call Parser::DumpState() after each import.  Therefore, move\nthe conditional to call Parser::DumpState() to after /init.rc and its\nimports are parsed and after the late imports are parsed.\n\nTest: Boot bullhead with DumpState() enabled and check the output\nChange-Id: I0b81305b8938aa1a7133d7dd2055f34f47609cf9\n"
    },
    {
      "commit": "2bc00140be22f08964102068a736358fe8dde5da",
      "tree": "cf0c1d9307b0078c837e9d4d1998d7475a5df407",
      "parents": [
        "76850afa52ded23a03f4ac225edb7fd0f035975c"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Mar 13 11:58:58 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Mar 13 11:58:58 2017 -0700"
      },
      "message": "init: enable C++17\n\nTest: Boot bullhead\nChange-Id: I40961ff765461e8aef211d27158ffb7c4be76493\n"
    },
    {
      "commit": "331cf2fb7c16b5b25064f8d2f00284105a9b413f",
      "tree": "a8ac7d695885bed4a3fb60cdcdd1af9f4460a18c",
      "parents": [
        "48dfc220cbb1f1315a565edb18c8e03923b14aa3"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Nov 29 19:20:58 2016 +0000"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sat Dec 03 10:54:26 2016 -0800"
      },
      "message": "Replace the \"coldboot\" timeout with a property.\n\nAlso rename init\u0027s existing boot-time related properties so they\u0027re\nall \"ro.*\" properties.\n\nExample result:\n\n  # Three properties showing when init started...\n  [ro.boottime.init]: [5294587604]\n  # ...how long it waited for ueventd...\n  [ro.boottime.init.cold_boot_wait]: [646956470]\n  # ...and how long SELinux initialization took...\n  [ro.boottime.init.selinux]: [45742921]\n\n  # Plus one property for each service, showing when it first started.\n  [ro.boottime.InputEventFind]: [10278767840]\n  [ro.boottime.adbd]: [8359267180]\n  [ro.boottime.atfwd]: [10338554773]\n  [ro.boottime.audioserver]: [10298157478]\n  [ro.boottime.bootanim]: [9323670089]\n  [ro.boottime.cameraserver]: [10299402321]\n  [ro.boottime.cnd]: [10335931856]\n  [ro.boottime.debuggerd]: [7001352774]\n  [ro.boottime.debuggerd64]: [7002261785]\n  [ro.boottime.drm]: [10301082113]\n  [ro.boottime.fingerprintd]: [10331443314]\n  [ro.boottime.flash-nanohub-fw]: [6995265534]\n  [ro.boottime.gatekeeperd]: [10340355242]\n  [ro.boottime.healthd]: [7856893380]\n  [ro.boottime.hwservicemanager]: [7856051088]\n  [ro.boottime.imscmservice]: [10290530758]\n  [ro.boottime.imsdatadaemon]: [10358136702]\n  [ro.boottime.imsqmidaemon]: [10289084872]\n  [ro.boottime.installd]: [10303296020]\n  [ro.boottime.irsc_util]: [10279807632]\n  [ro.boottime.keystore]: [10305034093]\n  [ro.boottime.lmkd]: [7863506714]\n  [ro.boottime.loc_launcher]: [10324525241]\n  [ro.boottime.logd]: [6526221633]\n  [ro.boottime.logd-reinit]: [7850662702]\n  [ro.boottime.mcfg-sh]: [10337268315]\n  [ro.boottime.media]: [10312152687]\n  [ro.boottime.mediacodec]: [10306852530]\n  [ro.boottime.mediadrm]: [10308707999]\n  [ro.boottime.mediaextractor]: [10310681177]\n  [ro.boottime.msm_irqbalance]: [7862451974]\n  [ro.boottime.netd]: [10313523104]\n  [ro.boottime.netmgrd]: [10285009351]\n  [ro.boottime.oem_qmi_server]: [10293329092]\n  [ro.boottime.per_mgr]: [7857915776]\n  [ro.boottime.per_proxy]: [8335121605]\n  [ro.boottime.perfd]: [10283443101]\n  [ro.boottime.qcamerasvr]: [10329644772]\n  [ro.boottime.qmuxd]: [10282346643]\n  [ro.boottime.qseecomd]: [6855708593]\n  [ro.boottime.qti]: [10286196851]\n  [ro.boottime.ril-daemon]: [10314933677]\n  [ro.boottime.rmt_storage]: [7859105047]\n  [ro.boottime.servicemanager]: [7864555881]\n  [ro.boottime.ss_ramdump]: [8337634938]\n  [ro.boottime.ssr_setup]: [8336268324]\n  [ro.boottime.surfaceflinger]: [7866921402]\n  [ro.boottime.thermal-engine]: [10281249924]\n  [ro.boottime.time_daemon]: [10322006542]\n  [ro.boottime.ueventd]: [5618663938]\n  [ro.boottime.vold]: [7003493920]\n  [ro.boottime.wificond]: [10316641073]\n  [ro.boottime.wpa_supplicant]: [18959816881]\n  [ro.boottime.zygote]: [10295295029]\n  [ro.boottime.zygote_secondary]: [10296637269]\n\nBug: http://b/31800756\nTest: boots\nChange-Id: I094cce0c1bab9406d950ca94212689dc2e15dba5\n"
    },
    {
      "commit": "93df4e18a255262595acb862ab870e9fed721fb8",
      "tree": "d6358f49fc8da2802f1ae93812df199efefb979e",
      "parents": [
        "d67a4abc647d5ed7235ff7ee1695b31340e63a1c"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Nov 16 19:19:49 2016 -0800"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Nov 16 22:24:43 2016 -0800"
      },
      "message": "init: move empty string check to InitTriggers\n\nTest: mma\nBug: 32838381\nChange-Id: I69203734ef7d3640da75f3e3cbe9254bf468d916\n"
    },
    {
      "commit": "d67a4abc647d5ed7235ff7ee1695b31340e63a1c",
      "tree": "e51e4b59dc3524c13a99236c12f3ed70cc45e1b3",
      "parents": [
        "8b1d526a72c1e6705b03f4b3267ee02fe84ce765"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Nov 16 12:08:30 2016 -0800"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Nov 16 15:46:19 2016 -0800"
      },
      "message": "init: fix undefined behavior in ExecuteCommand\n\nExecuteCommand may change command_ vector which leads undefined behavior\nThis bug is found when adding logs in ExecuteCommand printing our Command class fields\n\nBug: 32838381\nTest: on emulator\nChange-Id: I96468bd2192ca80013871a3a6ac4132149363fff\n"
    },
    {
      "commit": "8b1d526a72c1e6705b03f4b3267ee02fe84ce765",
      "tree": "e1b67d9bcc147a18da8136b9c85a6fa8eff4c335",
      "parents": [
        "0673412bb962a2c92830e903acf442506d092ebc"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Tue Nov 15 23:58:55 2016 -0800"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Tue Nov 15 23:58:55 2016 -0800"
      },
      "message": "Revert \"Revert \"init: warn slow action\"\"\n\nThis reverts commit 1802d11cc766f04e75e93c7f98dcf52fb2e64149.\n\nTest: grep init log\nBug: 32712851\n"
    },
    {
      "commit": "9b1d5e15ef4bc51cb79ec6504cbd8cd62d7a30bc",
      "tree": "093b45629595a949c8b56673ebe566b58047c785",
      "parents": [
        "431c4895689814f791dfcce4fe716d64dab55e98",
        "69b9b36c114680c87251ab0f140fd5d6b61e1fa9"
      ],
      "author": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Nov 15 17:23:56 2016 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Nov 15 17:23:56 2016 +0000"
      },
      "message": "Merge \"init: fix BuildTriggersString for empty string\""
    },
    {
      "commit": "69b9b36c114680c87251ab0f140fd5d6b61e1fa9",
      "tree": "5b8a5c1832d2d6a767298aaa54ac7baf4f261164",
      "parents": [
        "557359863c0d1fcda9a85e3b7fb275cb12a3eb70"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Mon Nov 14 20:05:21 2016 -0800"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Mon Nov 14 20:20:48 2016 -0800"
      },
      "message": "init: fix BuildTriggersString for empty string\n\nbehavior is undefined if pop_back() on empty std::string\n\nTest: grep init log\nBug: 32712851\nBug: 32838381\nChange-Id: I5bfac2fb275036abd0158b78df14019d2e82716d\n"
    },
    {
      "commit": "1802d11cc766f04e75e93c7f98dcf52fb2e64149",
      "tree": "53fa12f29de5a07f486bd1e219e49ba1d70fd601",
      "parents": [
        "b1a309ac1f08df9864ba2c364225a6bb172fd003"
      ],
      "author": {
        "name": "Nick Desaulniers",
        "email": "ndesaulniers@google.com",
        "time": "Tue Nov 15 00:53:00 2016 +0000"
      },
      "committer": {
        "name": "Nick Desaulniers",
        "email": "ndesaulniers@google.com",
        "time": "Tue Nov 15 00:53:00 2016 +0000"
      },
      "message": "Revert \"init: warn slow action\"\n\nThis reverts commit b1a309ac1f08df9864ba2c364225a6bb172fd003.\n\nBug: 32712851\nBug: 32838381\nChange-Id: Ib4c47de5ea5b0bad765a43cbff9f73d9978729d4\n"
    },
    {
      "commit": "b1a309ac1f08df9864ba2c364225a6bb172fd003",
      "tree": "08461465b9b26bfff8cf8ae6e62c352d20fa2b39",
      "parents": [
        "2422d55d2b57e999324d6ea6a344e2bc25af1978"
      ],
      "author": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Nov 09 15:17:38 2016 -0800"
      },
      "committer": {
        "name": "Wei Wang",
        "email": "wvw@google.com",
        "time": "Wed Nov 09 15:19:11 2016 -0800"
      },
      "message": "init: warn slow action\n\nSlow action that takes longer than 50ms will be warned to user\n\nTest: grep init log\nBug: 32712851\nChange-Id: I3a6a881a8dee1807270343b511a47c76dd230392\n"
    },
    {
      "commit": "7bc87a5a780361928bd1aeed9d2f22233fe05407",
      "tree": "e51894a0ac4a46c26931c24dc5df63cd4ac39bd3",
      "parents": [
        "5b7e3b9a2a703642de18dcb4869c58ac93be3205"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Aug 04 16:09:39 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Aug 04 16:09:39 2016 -0700"
      },
      "message": "Move init\u0027s kernel logging into libbase.\n\nThis will let other stuff (such as adbd and recovery) use it too.\n\nBug: http://b/28467098\nChange-Id: Idab51f438ed3edd6fe65a56c4b396eaff5f3833e\n"
    },
    {
      "commit": "35f5d04620a3221b9f57194ab0239c7c7ba5a726",
      "tree": "eaebe09b53c2aa953f33cb511ccffaf748412099",
      "parents": [
        "00a4ee0f46d36aff90fa120619f4dc6f4a837930"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jul 26 09:32:33 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jul 26 09:32:33 2016 -0700"
      },
      "message": "Fix early init logging.\n\nRemove the /dev/__kmsg__ workarounds (which can then be removed\nfrom sepolicy), and fix confusion in the translation between\nandroid-base logging and kernel logging priorities (in particular,\nwhere \u0027notice\u0027 comes in the hierarchy).\n\nBug: http://b/30317429\nChange-Id: I6eaf9919904b6b55bc402c20bf1a4ae269014bc7\nTest: adb shell dmesg | grep init\n"
    },
    {
      "commit": "f86b5a6b90619e02d1d034ef7b0adc3b439f4abb",
      "tree": "1348657947a4a875d740dc1df134ae9150ef53d6",
      "parents": [
        "90db709a2fbccefcee82e54289cd517cd8cb99b5"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Jun 24 15:12:21 2016 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jun 27 08:11:31 2016 -0700"
      },
      "message": "Move init to libbase logging.\n\nChange-Id: Ibfbefeff587a69e948978a037c555fd12a5ade6a\n"
    },
    {
      "commit": "1c563d96f000876d77b2d33fbfb03c241bc503e1",
      "tree": "2b4938eda86ade588cc77bbee202075d3f659bb4",
      "parents": [
        "3abd03232efd53bb3a73d1e76f6f72754457e18d"
      ],
      "author": {
        "name": "Chih-Hung Hsieh",
        "email": "chh@google.com",
        "time": "Fri Apr 29 15:44:04 2016 -0700"
      },
      "committer": {
        "name": "Chih-Hung Hsieh",
        "email": "chh@google.com",
        "time": "Fri Apr 29 15:44:04 2016 -0700"
      },
      "message": "Fix google-explicit-constructor warnings.\n\nBug: 28341362\nChange-Id: I4504e98a8db31e0edcbe63c23f9af43eb13e9d86\n"
    },
    {
      "commit": "4f71319df011d796a60a43fc1bc68e16fbf7d321",
      "tree": "5e9b64a97edcda3dbb1d40c617bdd9b179deb259",
      "parents": [
        "1efab7acc5d5b69dced70b6d04070d36f7c9632d"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Dec 04 22:00:26 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Dec 04 22:00:26 2015 -0800"
      },
      "message": "Track rename of base/ to android-base/.\n\nChange-Id: Idf9444fece4aa89c93e15640de59a91f6e758ccf\n"
    },
    {
      "commit": "b7349902a945903f9e36a569051f5131beb0bc24",
      "tree": "8553bcebe434b7d6fe178fbb2c2ef2433773c8f2",
      "parents": [
        "e13fd9aa231b117b03be6b84b7fb0debe6cb620d"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed Aug 26 11:43:36 2015 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Sep 01 12:26:02 2015 -0700"
      },
      "message": "init: Use classes for parsing and clean up memory allocations\n\nCreate a Parser class that uses multiple SectionParser interfaces to\nhandle parsing the different sections of an init rc.\n\nCreate an ActionParser and ServiceParser that implement SectionParser\nand parse the sections corresponding to Action and Service\nclasses.\n\nRemove the legacy keyword structure and replace it with std::map\u0027s\nthat map keyword -\u003e (minimum args, maximum args, function pointer) for\nCommands and Service Options.\n\nCreate an ImportParser that implements SectionParser and handles the\nimport \u0027section\u0027.\n\nClean up the unsafe memory handling of the Action class by using\nstd::unique_ptr.\n\nChange-Id: Ic5ea5510cb956dbc3f78745a35096ca7d6da7085\n"
    },
    {
      "commit": "cb716f976b078dff72aa3a61f9435d45e4beb9f5",
      "tree": "360466a1c1251a77cf48e0c08d23fc55fdc9de09",
      "parents": [
        "20391b1de5aaa49657d625fe18a36d4484c6ac31"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Aug 11 12:34:22 2015 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 21 10:14:43 2015 -0700"
      },
      "message": "init: Queue Triggers instead of Actions\n\nWhen init queues a trigger, it actually enqueues all of the Actions\nthat match with that given trigger.  This works currently because\nall init scripts are loaded and therefore all Actions are available\nbefore init starts queueing any triggers.\n\nTo support loading init scripts after init has started queueing\ntriggers, this change enqueues Trigger objects instead of their\nmatching Actions.  Each Trigger object then matches its associated\nActions during its execution.\n\nAdditionally, this makes a few cosmetic clean ups related to triggers.\n\nBug: 23186545\nChange-Id: I5d177458e6df1c4b32b1072cf77e87ef952c87e4\n"
    },
    {
      "commit": "96f67316a22bc9236aed70b198e91a5406389e5b",
      "tree": "f168868b586356de56460b67ddfb10ab00e13e6d",
      "parents": [
        "cf4dba5ab315493531fff5a4867698a3659b0526"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 30 13:52:55 2015 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Jul 31 16:02:12 2015 -0700"
      },
      "message": "init: use std::vector\u003cstd::string\u003e for argument passing\n\nChange-Id: Ie7a64e65de3a20d0c7f7d8efc0f7c1ba121d07fe\n"
    },
    {
      "commit": "fa0c21c94ccb98bfa5cf3cc7a6b220be4a5fa378",
      "tree": "db32b026384bc809486ef7bba9bf74131a8d9be5",
      "parents": [
        "fac3bf35af412292e1a955510095c4234dc0fd53"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 23 17:53:11 2015 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 30 13:37:23 2015 -0700"
      },
      "message": "init: Create classes for Action and Command\n\nThis creates the concept of \u0027event_trigger\u0027 vs \u0027property_trigger\u0027\n\nPreviously these were merged into one, such that \u0027on property:a\u003db \u0026\u0026\nproperty:b\u003dc\u0027 is triggered when properties a\u003db and b\u003dc as expected,\nhowever combinations such as \u0027on early-boot \u0026\u0026 boot\u0027 would trigger\nduring both early-boot and boot.  Similarly, \u0027on early-boot \u0026\u0026\nproperty:a\u003db\u0027 would trigger on both early-boot and again when property\na equals b.\n\nThe event trigger distinction ensures that the first example fails to\nparse and the second example only triggers on early-boot if\nproperty a equals b.\n\nThis coalesces Actions with the same triggers into a single Action object\n\nChange-Id: I8f661d96e8a2d40236f252301bfe10979d663ea6\n"
    }
  ]
}
