)]}'
{
  "log": [
    {
      "commit": "8edb00c990e563e6f91b278a212f2edf877cf763",
      "tree": "dcd6c0fb2ce82fcb5b43ed47dc74879cfe71b647",
      "parents": [
        "9dbc027b5f540bcf23c968398f8a70e92abd56cd"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jun 11 17:21:44 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Jun 12 09:40:37 2009 -0700"
      },
      "message": "edify extensions for OTA package installation, part 2\n\nAdds more edify functions for OTAs:\n\n  is_mounted getprop apply_patch apply_patch_check apply_patch_space\n  write_raw_image write_firmware_image package_extract_file\n\nThis allows us to install radios, hboots, boot images, and install\nincremental OTA packages.\n\nFixes a couple of dumb bugs in edify itself:\n\n  - we were doubling the size of the function table each time it was\n    *not* full, rather than each time it was full\n\n  - \"no such function\" errors weren\u0027t visible to the parser, so they\n    didn\u0027t prevent execution of the script.\n"
    },
    {
      "commit": "9dbc027b5f540bcf23c968398f8a70e92abd56cd",
      "tree": "daa1d97ee8a585480267f963048d25289c752176",
      "parents": [
        "9931f7f3c1288171319e9ff7d053ebaad07db720"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jun 11 17:32:55 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jun 11 17:32:55 2009 -0700"
      },
      "message": "fix sim build in donut, too\n"
    },
    {
      "commit": "9931f7f3c1288171319e9ff7d053ebaad07db720",
      "tree": "42ae5b40309f6ea3410c5ad496f81368675274f7",
      "parents": [
        "9b9c2114bd7d02200ce43cb9ec513473079dfad9"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Jun 10 14:11:53 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jun 11 16:25:29 2009 -0700"
      },
      "message": "edify extensions for OTA package installation, part 1\n\nAdds the following edify functions:\n\n  mount unmount format show_progress delete delete_recursive\n  package_extract symlink set_perm set_perm_recursive\n\nThis set is enough to extract and install the system part of a (full)\nOTA package.\n\nAdds the updater binary that extracts an edify script from the OTA\npackage and then executes it.  Minor changes to the edify core (adds a\nsleep() builtin for debugging, adds \".\" to the set of characters that\ncan appear in an unquoted string).\n"
    },
    {
      "commit": "9b9c2114bd7d02200ce43cb9ec513473079dfad9",
      "tree": "862fc4cae41e95727a2df0db36c65faaba3de900",
      "parents": [
        "b2ee9201be583b17ddbf0eaa69a37545f992b565",
        "37bee62aefb5ac10716054edf482fd37078f1427"
      ],
      "author": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Jun 10 08:10:29 2009 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Jun 10 08:10:29 2009 -0700"
      },
      "message": "Merge change 3514 into donut\n\n* changes:\n  core of edify, an eventual replacement for amend\n"
    },
    {
      "commit": "37bee62aefb5ac10716054edf482fd37078f1427",
      "tree": "793d29d81698fc25eda435ae577b22bc2f70362d",
      "parents": [
        "f28c916e73ee9f643c67c70d059c70381d774cb0"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Mon Jun 08 17:35:39 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Jun 09 17:37:19 2009 -0700"
      },
      "message": "core of edify, an eventual replacement for amend\n\nEdify is a simple scripting language for OTA installation, to be used\nwhen we move to OTAs being installed via binaries shipped with the\npackage.\n"
    },
    {
      "commit": "b2ee9201be583b17ddbf0eaa69a37545f992b565",
      "tree": "5444f4287f19e9775b8a53fb0074b83d69248ebe",
      "parents": [
        "f28c916e73ee9f643c67c70d059c70381d774cb0"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jun 04 10:24:53 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jun 04 16:45:32 2009 -0700"
      },
      "message": "allow OTA package to provide binary instead of script\n\nAllow installation of OTA packages which do not contain an\nupdate-script, but instead contain an update-binary.\n"
    },
    {
      "commit": "f28c916e73ee9f643c67c70d059c70381d774cb0",
      "tree": "775fcffe9df8b9242d20fe4f46491b21e33f8a64",
      "parents": [
        "07e1dca7068284c4f3013550335029eb72b39b82"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Jun 02 15:30:11 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Jun 02 15:41:00 2009 -0700"
      },
      "message": "remove unused permissions scheme from amend\n\nAmend (aka the recovery command language) had a half-implemented\nscheme of limiting which commands OTA packages were allowed to\nexecute.  It\u0027s not clear what this was ever supposed to be good for.\nRemove it.\n"
    },
    {
      "commit": "07e1dca7068284c4f3013550335029eb72b39b82",
      "tree": "52685fc37135c50e0abf2518c8028f1f2d081919",
      "parents": [
        "1c4ceae38f3fd7eb1e451d430acb5d99f257b0f9"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu May 28 19:02:45 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu May 28 19:02:45 2009 -0700"
      },
      "message": "don\u0027t say \"install complete\" when it really isn\u0027t\n\nChange the recovery UI so that when there is a hboot or radio update\npending (which the user most do a home+back reboot to actually\ninstall), the UI tells them so, instead of saying \"Install from sdcard\ncomplete.\"\n"
    },
    {
      "commit": "1c4ceae38f3fd7eb1e451d430acb5d99f257b0f9",
      "tree": "5dbf0392571a64b4afbe0ba73655c889f650eb75",
      "parents": [
        "683c4628039a8cb6dad1a086fae23a7d71438414"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri May 08 09:43:28 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri May 08 09:43:28 2009 -0700"
      },
      "message": "undo temporary alignment hack\n\nRemove the memory alignment that mysteriously made OTA installs work,\nin anticipation of a kernel that fixes the actual problem.  Handle\nEINTR properly.\n"
    },
    {
      "commit": "683c4628039a8cb6dad1a086fae23a7d71438414",
      "tree": "aacd5abd9b128d786f651b2dfb2a5eb5400c5e43",
      "parents": [
        "596271fa71d79e3eec03c7cf6ac76cb026dd8578"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue May 05 17:50:21 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed May 06 08:40:28 2009 -0700"
      },
      "message": "align data passed to write() on 32k boundaries\n\nIn donut, OTA installation often encounters the write() system call\ndoing short writes -- which is legal but unexpected -- or failing with\nENOSPC when plenty of space is available.  Passing aligned memory\nbuffers to write() appears to prevent (or at least reduce the\nfrequency) of these problems.  b/1833052 has been filed to look at the\nunderlying problem, but this change aligns buffers we use with write()\nso we can OTA for now (or see if this problem still occurs).\n"
    },
    {
      "commit": "596271fa71d79e3eec03c7cf6ac76cb026dd8578",
      "tree": "3a78f4d9d0b3694d4a75b7dd3d086b0249de8b5e",
      "parents": [
        "f554ceb0500f75c425b37c74a0d65d138c0fbdd0"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Apr 29 16:52:04 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Apr 29 17:35:34 2009 -0700"
      },
      "message": "handle short writes when unzipping files\n\nminzip fails if write() doesn\u0027t write all the data in one call.\nApparently this was good enough before, but it causes OTAs to fail all\nthe time now (maybe due to the recently-submitted kernel)?  Change\ncode to attempt continuing after short writes.\n"
    },
    {
      "commit": "f554ceb0500f75c425b37c74a0d65d138c0fbdd0",
      "tree": "cd124eff0fc6d5141d1d206fb508aa42a82ac1b9",
      "parents": [
        "d1b19b9c98ac97db5c933d72dac5dca054a28353",
        "d105f8f84f25db7861775e07a808855334207d95"
      ],
      "author": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Wed Apr 22 17:56:50 2009 -0700"
      },
      "committer": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Wed Apr 22 17:56:50 2009 -0700"
      },
      "message": "merge cupcake into donut\n"
    },
    {
      "commit": "d1b19b9c98ac97db5c933d72dac5dca054a28353",
      "tree": "cd124eff0fc6d5141d1d206fb508aa42a82ac1b9",
      "parents": [
        "49283858fb6565a5da0c5987e614f60254e61804"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "",
        "time": "Wed Apr 01 15:48:46 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Apr 01 15:48:46 2009 -0700"
      },
      "message": "AI 144130: Don\u0027t build OTA package keys into the recovery binary; read\n  them from an external file in the recovery image.  Use the\n  test-keys for all builds.\n\nAutomated import of CL 144130\n"
    },
    {
      "commit": "49283858fb6565a5da0c5987e614f60254e61804",
      "tree": "36661a63319014a2b364535b25f17859212b3b7a",
      "parents": [
        "1066d2c31990e3c2eacedbe0a70013da774fcf3e"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "",
        "time": "Wed Apr 01 14:39:15 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Apr 01 14:39:15 2009 -0700"
      },
      "message": "AI 144082: Remove the unused \"unpacking\" recovery icon.\n\nAutomated import of CL 144082\n"
    },
    {
      "commit": "1066d2c31990e3c2eacedbe0a70013da774fcf3e",
      "tree": "5b63ade43f6796b000f6e64c9e6cf6c41a01c993",
      "parents": [
        "58bde316e22e392885de71d2391f2bc7f438ff1f"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "",
        "time": "Wed Apr 01 13:57:40 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Apr 01 13:57:40 2009 -0700"
      },
      "message": "AI 144070: Add an option to wipe cache (only) to the recovery menu.\n\nAutomated import of CL 144070\n"
    },
    {
      "commit": "58bde316e22e392885de71d2391f2bc7f438ff1f",
      "tree": "d4d6fd74729dc423328ece239b60c0ae7bf9abaa",
      "parents": [
        "bc012de46e99fc936e6c06d19416b8414835c7b6"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "",
        "time": "Fri Mar 27 13:25:30 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Mar 27 13:25:30 2009 -0700"
      },
      "message": "AI 143128: Use PNG instead of BMP for recovery image icons.  This saves\n  about 60k from the recovery and system images.\n\nAutomated import of CL 143128\n"
    },
    {
      "commit": "bc012de46e99fc936e6c06d19416b8414835c7b6",
      "tree": "a857e6ff407fb5e2a2d75c597ab7f1d50d5c567f",
      "parents": [
        "cf5b17055b1276c187537cf5a054cf6ebe753113"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "",
        "time": "Tue Mar 24 21:30:32 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 24 21:30:32 2009 -0700"
      },
      "message": "Automated import from //branches/donutburger/...@142141,142141\n"
    },
    {
      "commit": "d105f8f84f25db7861775e07a808855334207d95",
      "tree": "a857e6ff407fb5e2a2d75c597ab7f1d50d5c567f",
      "parents": [
        "73e8e9ba08f288b7cc9ea62be9782dc1398a2d41"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "",
        "time": "Tue Mar 24 19:03:53 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 24 19:03:53 2009 -0700"
      },
      "message": "Automated import from //branches/cupcake/...@142138,142138\n"
    },
    {
      "commit": "cf5b17055b1276c187537cf5a054cf6ebe753113",
      "tree": "2d8a5b9d800dac4bfb1edc2552889cd16df1be08",
      "parents": [
        "c24a8e688a6312764254beac2b2520bb0c5e998d"
      ],
      "author": {
        "name": "Dianne Hackborn",
        "email": "",
        "time": "Tue Mar 24 18:36:43 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 24 18:36:43 2009 -0700"
      },
      "message": "Automated import from //branches/donutburger/...@140818,140818\n"
    },
    {
      "commit": "73e8e9ba08f288b7cc9ea62be9782dc1398a2d41",
      "tree": "2d8a5b9d800dac4bfb1edc2552889cd16df1be08",
      "parents": [
        "c24a8e688a6312764254beac2b2520bb0c5e998d"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Mar 19 23:08:36 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Mar 19 23:08:36 2009 -0700"
      },
      "message": "auto import from //branches/cupcake_rel/...@141571\n"
    },
    {
      "commit": "c24a8e688a6312764254beac2b2520bb0c5e998d",
      "tree": "7df23711566b358047301d8413ee399105546e8b",
      "parents": [
        "ffb48f64fec674c6dd923eb8b1eb3f743e05a8ba"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:28:42 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:28:42 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "ffb48f64fec674c6dd923eb8b1eb3f743e05a8ba",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [
        "d4ae69739ebb67374d62229829df07bf2de85103"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:14 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:14 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "d4ae69739ebb67374d62229829df07bf2de85103",
      "tree": "726d3efa74bb9e772b171db8831ca99c912f1940",
      "parents": [
        "15bb56d89aff63b233edca99f41d8943ffde6b1c"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 14:03:51 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 14:03:51 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@132589\n"
    },
    {
      "commit": "15bb56d89aff63b233edca99f41d8943ffde6b1c",
      "tree": "7df23711566b358047301d8413ee399105546e8b",
      "parents": [
        "8b7334b3c2f891f516722851575fec43bd28b4cf"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Mon Mar 02 22:54:15 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Mon Mar 02 22:54:15 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@137055\n"
    },
    {
      "commit": "8b7334b3c2f891f516722851575fec43bd28b4cf",
      "tree": "726d3efa74bb9e772b171db8831ca99c912f1940",
      "parents": [
        "928d471ef2bfa359e16426cd993ba6f9b07ee16e"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:43:56 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:43:56 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@130745\n"
    },
    {
      "commit": "928d471ef2bfa359e16426cd993ba6f9b07ee16e",
      "tree": "3c72897eeeb0e4f737136e13366bf100cbe63d7a",
      "parents": [
        "ff3d93821e22588ce607c17252334ca2d9ca54a4"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:50:54 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:50:54 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@125939\n"
    },
    {
      "commit": "ff3d93821e22588ce607c17252334ca2d9ca54a4",
      "tree": "e806acbb6f71dbdafc09df3bc0d8a0a4ae1b7905",
      "parents": [
        "23580ca27a0a8109312fdd36cc363ad1f4719889"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:03:49 2008 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:03:49 2008 -0800"
      },
      "message": "Code drop from //branches/cupcake/...@124589\n"
    },
    {
      "commit": "23580ca27a0a8109312fdd36cc363ad1f4719889",
      "tree": "0bb90eaa72f8df110162499f756b5cbfb7d49235",
      "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"
    }
  ]
}
