)]}'
{
  "log": [
    {
      "commit": "85f2bc930ae57abdf27c6ffea6d90091e3f22ae3",
      "tree": "92d872c01e0022977ffd2837f141bb09202d5d29",
      "parents": [
        "7ef143fc84b80b9e3e040b129e0fe9d8b05fc15c"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Apr 10 10:15:30 2020 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Apr 10 10:15:30 2020 -0700"
      },
      "message": "Cleanup some trivial TODOs.\n\n1) There\u0027s no reason or way to support boot_clock for waiting for\n   property changes, since the underlying futex_wait uses\n   CLOCK_MONOTONIC.  We probably wouldn\u0027t want boot_clock even if it\n   did, since it doesn\u0027t make sense to consider the time a device was\n   suspending in the timeout for waiting for a property to change.\n2) The init tokenizer has been essentially unchanged for a decade,\n   there\u0027s no motivation to \u0027fix\u0027 it to not require a trailing\n   newline.\n3) The ueventd TODO regarding moving vendor specific ueventd.rc\n   entries out of rootdir has been fixed.\n\nTest: n/a\nChange-Id: I3b68e3d2f25cbd539f9f8ff526669b8af04d833d\n"
    },
    {
      "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": "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": "0166fd606d232fc50c7b9eb66f749b8b053f2818",
      "tree": "5accfe8062d7fd49841cbbaaad992788e2a7bdc8",
      "parents": [
        "52db49b68fb6562300bc1fc4e08a1380e9b8d6d0"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Oct 26 12:33:52 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Oct 26 12:33:52 2018 -0700"
      },
      "message": "init: fix error messages when an invalid section header is found\n\nIf a section header such as \u0027on\u0027 or \u0027service\u0027 has an error with it,\nthe rest of the commands / options are currently reported as errors\nsince there is no valid parser object to parse them.  For example,\n\nservice !@#$%%^\u0026*() /system/bin/false\n    user root\n    group blah\n    blah blah\n\nGenerates:\n\ninit: /system/etc/init/bad.rc: 2: invalid service name \u0027!@#$%%^\u0026*()\u0027\ninit: /system/etc/init/bad.rc: 3: Invalid section keyword found\ninit: /system/etc/init/bad.rc: 4: Invalid section keyword found\ninit: /system/etc/init/bad.rc: 5: Invalid section keyword found\n\nThis change suppresses the extraneous \u0027Invalid section keyword found\u0027\nmessages.\n\nTest: faulty error messages are suppressed.\nChange-Id: Ieeb2d5b8b7eea33e191a88ce5a0d41701686943f\n"
    },
    {
      "commit": "d72432de930b329dd0cf14b62a67618e11e8e7cb",
      "tree": "0e20bf57476557c11535662726a280ddc1392eca",
      "parents": [
        "28a3160c077446719fe9c95e0a0730689e8e44ad"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jun 19 15:18:40 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jun 19 15:18:40 2018 -0700"
      },
      "message": "Don\u0027t check permissions bits on init scripts for host_init_verifier\n\nAlso get rid of the copy in parser.  There\u0027s no incentive to switch to\na tokenizer that doesn\u0027t modify the input, nor is there a reason to\nwaste cycles making a copy of every init script as its processed.\n\nBug: 36970783\nTest: boot\nChange-Id: I8aca9c9d6f1961e1ab35dee50691a6791fc6ec66\n"
    },
    {
      "commit": "d5d626c9f7eff613cbac2a9bfed68103f79dd4c5",
      "tree": "dc3ffcca19afafdadf50e2f767ce3fdae60a7b53",
      "parents": [
        "ae74e42d2557b93a3da9ef75c51ef1f6aab3cc0a"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jun 12 10:57:35 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Jun 12 10:59:12 2018 -0700"
      },
      "message": "ueventd: fix extraneous \u0027Invalid section\u0027 error\n\nWhen adding a new error case for host_init_parser, I didn\u0027t handle the\nindividual line callbacks used for ueventd correctly.  This change\nfixes that.\n\nTest: bullhead boots without extraneous ueventd warnings\nChange-Id: I56cad854b0defd936a7fbcab73fe2f2963c0e2e4\n"
    },
    {
      "commit": "194b5d1da9ec8957bbf0987e263e50132776b5e1",
      "tree": "e736f6bc12b0dfd4a4f7b31c9e861a61f9796684",
      "parents": [
        "fe86a1473fdb85d6c21bd4e1c9990b4c97d875ff"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed May 09 17:38:30 2018 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Wed May 30 15:43:32 2018 -0700"
      },
      "message": "init: handle properties and imports for host init verifier\n\nAllow specifying properties on the command line when running host init\nverifier.  This is needed particularly for importing files that have a\nproperty expansion in their path.\n\nHandle the import statement on host, basing paths off of the out\ndirectory of Android builds.\n\nBug: 36970783\nTest: verify that bullhead imports the correct files and checks them\nChange-Id: I4fe263016b3764a372708b559bc0c739b1b7e5e3\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": "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": "b592dd8afff487e5ba73bbd782cfa7501a65e88e",
      "tree": "22dde0feaeec6d370a71fe8d324d4b59f5c6f6b0",
      "parents": [
        "7fa62c58d603dc1bc56d73a22bbf7f9a0dd3059e"
      ],
      "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 10:27:33 2017 -0700"
      },
      "message": "init: use Result\u003cT\u003e for the parsing functions\n\nTest: boot bullhead\nChange-Id: I7f00c5f0f54dd4fe05df73e1d6a89b56d788e113\n"
    },
    {
      "commit": "62ca663475ff5284503cb82cae3e92e93d56bbea",
      "tree": "5ed92b5aa90980de7dc10254f5c4bc4064506578",
      "parents": [
        "b6b9629f02175f6fe8b0a19645c21b117ffe673b"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Aug 03 12:54:07 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Aug 14 10:26:57 2017 -0700"
      },
      "message": "init: introduce Result\u003cT\u003e for return values and error handling\n\ninit tries to propagate error information up to build context before\nlogging errors.  This is a good thing, however too often init has the\noverly verbose paradigm for error handling, below:\n\nbool CalculateResult(const T\u0026 input, U* output, std::string* err)\n\nbool CalculateAndUseResult(const T\u0026 input, std::string* err) {\n  U output;\n  std::string calculate_result_err;\n  if (!CalculateResult(input, \u0026output, \u0026calculate_result_err)) {\n    *err \u003d \"CalculateResult \" + input + \" failed: \" +\n      calculate_result_err;\n      return false;\n  }\n  UseResult(output);\n  return true;\n}\n\nEven more common are functions that return only true/false but also\nrequire passing a std::string* err in order to see the error message.\n\nThis change introduces a Result\u003cT\u003e that is use to either hold a\nsuccessful return value of type T or to hold an error message as a\nstd::string.  If the functional only returns success or a failure with\nan error message, Result\u003cSuccess\u003e may be used.  The classes Error and\nErrnoError are used to indicate a failed Result\u003cT\u003e.\n\nA successful Result\u003cT\u003e is constructed implicitly from any type that\ncan be implicitly converted to T or from the constructor arguments for\nT.  This allows you to return a type T directly from a function that\nreturns Result\u003cT\u003e.\n\nError and ErrnoError are used to construct a Result\u003cT\u003e has\nfailed. Each of these classes take an ostream as an input and are\nimplicitly cast to a Result\u003cT\u003e containing that failure.  ErrnoError()\nadditionally appends \": \" + strerror(errno) to the end of  the failure\nstring to aid in interacting with C APIs.\n\nThe end result is that the above code snippet is turned into the much\nclearer example below:\n\nResult\u003cU\u003e CalculateResult(const T\u0026 input);\n\nResult\u003cSuccess\u003e CalculateAndUseResult(const T\u0026 input) {\n  auto output \u003d CalculateResult(input);\n  if (!output) {\n    return Error() \u003c\u003c \"CalculateResult \" \u003c\u003c input \u003c\u003c \" failed: \"\n                   \u003c\u003c output.error();\n  }\n  UseResult(*output);\n  return Success();\n}\n\nThis change also makes this conversion for some of the util.cpp\nfunctions that used the old paradigm.\n\nTest: boot bullhead, init unit tests\nChange-Id: I1e7d3a8820a79362245041251057fbeed2f7979b\n"
    },
    {
      "commit": "67dee626e0185096bbaf73042f1a891ce436f714",
      "tree": "7d8dac0fe94f641494ea33e97ca00e0fb444795b",
      "parents": [
        "29b94116855b96e24beeb993396b251a1f85127a"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 27 12:54:48 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Jul 27 13:23:32 2017 -0700"
      },
      "message": "init: remove Parser singleton and related cleanup\n\n* Remove the Parser singleton (Hooray!)\n* Rename parser.* to tokenizer.* as this is actually a tokenizer\n* Rename init_parser.* to parser.* as this is a generic parser\n* Move contents of init_parser_test.cpp to service_test.cpp as this\n  actually is a test of the parsing in MakeExecOneshotService() and\n  nothing related to (init_)parser.cpp\n\nTest: boot bullhead\nTest: bool sailfish\nTest: init unit tests\nChange-Id: I4fe39e6483f58ebd3ce5ee715a45dbba0acf5d91\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": "ad6741c6f82febee62bbfc439d03654c2cb3ba3e",
      "tree": "c39a1d0ac4f41f4add55a3fcc7e7a1a9040a3a76",
      "parents": [
        "fe062055cb11fcb1a6178b046173fc0361ad5b96"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Mon Apr 24 16:47:18 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Tue Apr 25 11:24:33 2017 -0700"
      },
      "message": "init: remove unused parts of parser.cpp\n\nNow that ueventd is using init\u0027s parser, we no longer need anything\nother than the tokenizer from parser.cpp.\n\nTest: Boot bullhead\nChange-Id: I1f70f2c4479af576174bd74dd919d81817500216\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": "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": "e7aa2b2c8378b458345477d1f6d9904490263bb6",
      "tree": "125b6116858579422945357b40930b5738a94eab",
      "parents": [
        "d1ec9c450d8dc9d24b5f0254111449ecfcbeaea6"
      ],
      "author": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Wed Mar 02 14:02:55 2016 -0800"
      },
      "committer": {
        "name": "George Burgess IV",
        "email": "gbiv@google.com",
        "time": "Mon Mar 07 18:40:40 2016 -0800"
      },
      "message": "Cleanup uses of sprintf so we can deprecate it.\n\nAlso cleans up two instances of open() with useless mode params, and\nchanges a few uses of snprintf to use sizeof(buffer) instead of\nhardcoded buffer sizes.\n\nChange-Id: If11591003d910c995e72ad8f75afd072c255a3c5\n"
    },
    {
      "commit": "c0e919c92062360a69b771722677d041c9998403",
      "tree": "8d082ff796a482fd305a00640a5c83dd0a258d12",
      "parents": [
        "27d28d3baff860d1fd936a5fcf2d920577c52575"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Feb 04 14:46:36 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Feb 04 17:16:11 2015 -0800"
      },
      "message": "Stop using #if for conditional compilation.\n\nUse regular \u0027if\u0027 to prevent bitrot.\n\nAlso remove remaining typedefs.\n\nChange-Id: I2e6ca928e2db29b88b643cf990ff05cfb0be94a6\n"
    },
    {
      "commit": "f3cf438714aa1284d8a58e2f3b108ba93f6d3abb",
      "tree": "3a1b726c6805315c280d745e8b742ec9542d58e9",
      "parents": [
        "5204b1580e0d0f38272c7da166eee9b88c14dc50"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Feb 03 17:12:07 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Feb 04 08:59:10 2015 -0800"
      },
      "message": "Build init as C++.\n\nThis is just the minimal change to keep it building.\n\nChange-Id: I245c5b8413a1db114576c81462eb5737f5ffcef2\n"
    },
    {
      "commit": "0b41512a2ea3d5fbb2b82841557a96417398c398",
      "tree": "381db0232c00e524127d236191a5d13c1df2e4a7",
      "parents": [
        "a73774e62e09c8e27039d3f8a5f1f842a0df740a"
      ],
      "author": {
        "name": "Badhri Jagan Sridharan",
        "email": "badhri@google.com",
        "time": "Fri Oct 10 23:19:06 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Feb 02 16:21:05 2015 -0800"
      },
      "message": "init: Add support \"\u0026\u0026\" operator in property triggers\n\n\"\u0026\u0026\" operator can now be used to test the validity\nof two of more properties.\n\nFor example:\n\non property:test.a\u003d1 \u0026\u0026 property:test.b\u003d1\n    setprop test.c 1\n\nThe above stub sets the test.c to 1 only when\nboth test.a\u003d1 and test.b\u003d1\n\n(cherry-pick of 162f7d797c67019a7a3f08c3b0f0ffc91d548ddc.)\n\nChange-Id: I72c19f7aa92231372a416193618ee6c7fd368141\nSigned-off-by: Badhri Jagan Sridharan \u003cbadhri@google.com\u003e\n"
    },
    {
      "commit": "da04c52ab1036048520fca265cf02b61dca789e0",
      "tree": "93ffef38f15b4f38845cff1446d749a2ca9faa65",
      "parents": [
        "8f91282ebe1963b9d27f8779ad1342302b293bd2"
      ],
      "author": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Thu Sep 01 17:09:44 2011 -0700"
      },
      "committer": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Fri Sep 02 12:11:18 2011 -0700"
      },
      "message": "init/cutils: move list utility code to cutils from init\n\nChange-Id: I357ceee813700297d8343159f22a07659e768d41\nSigned-off-by: Dima Zavin \u003cdima@android.com\u003e\n"
    },
    {
      "commit": "1be6968d9d51f43fdb00535708a6fed0be6bfbca",
      "tree": "823625732a159531ffd54c600cdcdf7d8c2207e5",
      "parents": [
        "be1def8d43d75e280cdd75d432ddcadeaff580b1"
      ],
      "author": {
        "name": "Bruce Beare",
        "email": "bruce.j.beare@intel.com",
        "time": "Sun Dec 26 09:55:10 2010 -0800"
      },
      "committer": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Fri Jan 07 11:19:04 2011 -0800"
      },
      "message": "init: Fix parser line numbering\n\nChange-Id: I1ac481a2cef749b26c73bc9e6a212e6ace7a0ae2\n"
    },
    {
      "commit": "6310a8261c922533a692fb3e74ece2da98d4bafa",
      "tree": "32a27ed5e629bdc77f2a9d92644b010bf0bef5c8",
      "parents": [
        "3294bbbad9494eb4ca534624b96e39f8ed15aaf2"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Apr 20 14:29:05 2010 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Apr 21 19:43:40 2010 -0700"
      },
      "message": "init: Split parser into generic parser and init parser\n\nChange-Id: I451ebc4ff12f2ac660eb533fa10ad561fa25c9dd\n"
    },
    {
      "commit": "cd0f173e2790ee068fd2a20bcfc6c20468e97e51",
      "tree": "c3f86859ecbb9018a74acde83125c891675f1fcd",
      "parents": [
        "ed8a7d84428ec945c48b6b53dc5a3a18fabaf683"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Apr 19 17:10:24 2010 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Apr 21 19:43:35 2010 -0700"
      },
      "message": "init: Add wait command and mount wait flag\n\nChange-Id: I6b4c10f8f246095a7fb7342388ec4f6ff97d5733\n"
    },
    {
      "commit": "ed8a7d84428ec945c48b6b53dc5a3a18fabaf683",
      "tree": "9cb7e354a86e2109b5a9b1418986333daec9a5b3",
      "parents": [
        "12541c61311e0488e9873df754f8328cd12f99b4"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Apr 19 17:05:34 2010 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Wed Apr 21 19:43:35 2010 -0700"
      },
      "message": "init: Move list and log handling to list.h and log.h\n\nChange-Id: I298f575c590d0f28b7ad78747f3ebdbba56b7a27\n"
    },
    {
      "commit": "ebc6ff105a114ff5b5465e64fa0f3889730da19d",
      "tree": "67bab7f7c867863aa7bf63c60becc662b8663bcb",
      "parents": [
        "bc39871bf95f6c61034eaf89a6933a02da1b348a"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Apr 13 19:52:01 2010 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Fri Apr 16 19:02:32 2010 -0700"
      },
      "message": "init: Handle commands in event queue loop\n\nChange-Id: I679059dae43143f3c8f16b68de5694539b699e50\n"
    },
    {
      "commit": "3899e9fc01cf608f19f716749c54cc5c4d17e766",
      "tree": "5256f744a9732e7776e8f1fa85322ad0403839a0",
      "parents": [
        "9c5366ba55b1553b2d66f48e3d14fbd274a2944d"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Apr 13 20:35:46 2010 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Apr 13 22:52:10 2010 -0700"
      },
      "message": "init: Move prototypes for util.c into util.h\n\nChange-Id: I46a91849ce5297eb2597dd6134412f817564ec24\n"
    },
    {
      "commit": "ca7648ddfb46347c60014a849b0150a74df4e1d2",
      "tree": "b048e6b32dd37eebe21cb2cb8591015912779b06",
      "parents": [
        "0dd7ca6e87abb689700c5e3a816a949b03b1154b"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Apr 13 19:29:51 2010 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Tue Apr 13 22:51:12 2010 -0700"
      },
      "message": "init: Move parser prototypes to parser.h\n\nChange-Id: I31db51eb8e8a33a0bd06b41206bc9f9147d16d41\n"
    },
    {
      "commit": "4e221f0077373b37ca70e862eface2987557295b",
      "tree": "d2d78cdc9a5680e012a75a689d3221cbaf10ac89",
      "parents": [
        "1bfb4803ea64d7072f183cabd4cb704147dbf749"
      ],
      "author": {
        "name": "San Mehat",
        "email": "san@google.com",
        "time": "Thu Feb 25 14:19:50 2010 -0800"
      },
      "committer": {
        "name": "San Mehat",
        "email": "san@google.com",
        "time": "Fri Feb 26 10:05:20 2010 -0800"
      },
      "message": "init: Add support for specifying a services i/o priority\n\nSigned-off-by: San Mehat \u003csan@google.com\u003e\n"
    },
    {
      "commit": "8c92ba1921fc8dc3fc7cc39ef854e9ee70fafc67",
      "tree": "db381770ca1f3244b0aedfd5633b0f6efcf2fab5",
      "parents": [
        "bdb9831ce9195c15ab6f2c01d809fb7946dd2f34",
        "e86a2c7ceb767bce5c9a6706d7f36289d3e5de49"
      ],
      "author": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Tue Sep 01 08:28:21 2009 -0700"
      },
      "committer": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Tue Sep 01 08:28:21 2009 -0700"
      },
      "message": "merge from open-source master\n"
    },
    {
      "commit": "e7cb137f32fbc7caf97b80fac152b4bd3ac242cd",
      "tree": "b6c89e2290d1f8cac6dc1d593d2089c2e22e35e4",
      "parents": [
        "9f28bde9eb37e7d00df5c2a7c51d88dcd57cef7b"
      ],
      "author": {
        "name": "Jay Freeman (saurik)",
        "email": "saurik@saurik.com",
        "time": "Mon Nov 17 06:41:10 2008 +0000"
      },
      "committer": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Thu Aug 27 07:43:28 2009 -0700"
      },
      "message": "added chdir/chroot commands to init for mount switching/pivoting\n"
    },
    {
      "commit": "7c44fe5925b6dd51166f73d30de0a2f22d66373e",
      "tree": "6f9e8e3fc3ee500e4e1122ed395e77d19206c017",
      "parents": [
        "a3e8a6ad56d60d2ad6c580004f86920d73acc62c"
      ],
      "author": {
        "name": "San Mehat",
        "email": "san@google.com",
        "time": "Wed Aug 26 16:39:25 2009 -0700"
      },
      "committer": {
        "name": "San Mehat",
        "email": "san@google.com",
        "time": "Wed Aug 26 16:39:59 2009 -0700"
      },
      "message": "init: builtins: Add \u0027copy\u0027 command to init.rc parser\n\nSigned-off-by: San Mehat \u003csan@google.com\u003e\n"
    },
    {
      "commit": "f24e252903ca0f71c7fbfb135cf17e83e0c2ea90",
      "tree": "65d2499db0682ad75bbd21a365bfcfc00756d3a3",
      "parents": [
        "1b154930b2c2634dce9c04d5d5cec7acb229ccb0"
      ],
      "author": {
        "name": "San Mehat",
        "email": "san@google.com",
        "time": "Tue May 19 13:30:46 2009 -0700"
      },
      "committer": {
        "name": "San Mehat",
        "email": "san@google.com",
        "time": "Tue May 19 13:33:07 2009 -0700"
      },
      "message": "init: Add the ability to start services with dynamic arguments.\n\n    To add arguments dynamically to a service, start the service like so:\n\n    setprop ctl.start service_to_run:arg1 arg2 arg3...\n\n    To start a service with *no* dynamic arguments, start the service normally:\n\n    setprop ctl.start service_to_run\n\n    Dynamic arguments are only supported on \u0027oneshot\u0027 services\n\nSigned-off-by: San Mehat \u003csan@google.com\u003e\n"
    },
    {
      "commit": "b3779558dcfbe99f0b9c1ef796e3728edad25672",
      "tree": "a9b56e1a49c55040bdfcc986dcadf47330327b5b",
      "parents": [
        "3d40729054803fae1c4d4bb5ac7554665a132b26"
      ],
      "author": {
        "name": "Mike Lockwood",
        "email": "lockwood@android.com",
        "time": "Fri May 08 14:27:42 2009 -0400"
      },
      "committer": {
        "name": "Mike Lockwood",
        "email": "lockwood@android.com",
        "time": "Fri May 08 14:27:42 2009 -0400"
      },
      "message": "init: Fix some broken code that did not cause problems until switching to gcc 4.4\n\nSigned-off-by: Mike Lockwood \u003clockwood@android.com\u003e\n"
    },
    {
      "commit": "dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0",
      "tree": "2ba8d1a0846d69b18f623515e8d9b5d9fe38b590",
      "parents": [
        "e54eebbf1a908d65ee8cf80bab62821c05666d70"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:32:55 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:32:55 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "e54eebbf1a908d65ee8cf80bab62821c05666d70",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [
        "a1e1c1b106423de09bc918502e7a51d4ffe5a4ae"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:29:04 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:29:04 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "5ae090ed949cea9d1e7ab1552b455a229f8f9757",
      "tree": "555f686d531f29f4907d80655e7b0a7e69f2a180",
      "parents": [
        "35237d135807af84bf9b0e5b8d7f8633e58db6f5"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:51:25 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:51:25 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@125939\n"
    },
    {
      "commit": "35237d135807af84bf9b0e5b8d7f8633e58db6f5",
      "tree": "d8bcf3ada2182d248604728285dd80abb466f22a",
      "parents": [
        "4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:08:08 2008 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:08:08 2008 -0800"
      },
      "message": "Code drop from //branches/cupcake/...@124589\n"
    },
    {
      "commit": "4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53",
      "tree": "54fd1b2695a591d2306d41264df67c53077b752c",
      "parents": [],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "message": "Initial Contribution\n"
    }
  ]
}
