)]}'
{
  "log": [
    {
      "commit": "26dbad2b984e69f6c938ac3e82267d0ded0df8fd",
      "tree": "b1b87916a442415c19e3cd148d8fd64d1f42b3ef",
      "parents": [
        "eaeb55f745c86487b4ad57da008d501fa1ebc37d"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jan 28 12:09:05 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jan 28 12:09:05 2015 -0800"
      },
      "message": "Add missing includes.\n\nChange-Id: I0737456e0221ebe9cc854d65c95a7d37d0869d56\n"
    },
    {
      "commit": "075ad800c539503d0515e5e0b4af160eccedead9",
      "tree": "0fa4e4f99556393317ae486eb66aeb3cbad220df",
      "parents": [
        "e8d7dd4ed1a372cb9bf67a1f7ff55aaa3e152053"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@google.com",
        "time": "Thu Jun 26 15:35:51 2014 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@google.com",
        "time": "Wed Jul 02 12:16:36 2014 -0700"
      },
      "message": "sideload without holding the whole package in RAM\n\nImplement a new method of sideloading over ADB that does not require\nthe entire package to be held in RAM (useful for low-RAM devices and\ndevices using block OTA where we\u0027d rather have more RAM available for\nbinary patching).\n\nWe communicate with the host using a new adb service called\n\"sideload-host\", which makes the host act as a server, sending us\ndifferent parts of the package file on request.\n\nWe create a FUSE filesystem that creates a virtual file\n\"/sideload/package.zip\" that is backed by the ADB connection -- users\nsee a normal file, but when they read from the file we\u0027re actually\nfetching the data from the adb host.  This file is then passed to the\nverification and installation systems like any other.\n\nTo prevent a malicious adb host implementation from serving different\ndata to the verification and installation phases of sideloading, the\nFUSE filesystem verifies that the contents of the file don\u0027t change\nbetween reads -- every time we fetch a block from the host we compare\nits hash to the previous hash for that block (if it was read before)\nand cause the read to fail if it changes.\n\nOne necessary change is that the minadbd started by recovery in\nsideload mode no longer drops its root privileges (they\u0027re needed to\nmount the FUSE filesystem).  We rely on SELinux enforcement to\nrestrict the set of things that can be accessed.\n\nChange-Id: Ida7dbd3b04c1d4e27a2779d88c1da0c7c81fb114\n"
    },
    {
      "commit": "c704e06ce596bd0a6de66b10b108aee95535468a",
      "tree": "3005b89333b7500aaa78e0867e377eac2f0280ab",
      "parents": [
        "ffb557d351776bed40818fa77afaa743d9e34a34"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri May 23 08:40:35 2014 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri May 23 08:52:31 2014 -0700"
      },
      "message": "disable async reboot during package installation\n\nThe default recovery UI will reboot the device when the power key is\npressed 7 times in a row, regardless of what recovery is doing.\nDisable this feature during package installation, to minimize the\nchance of corrupting the device due to a mid-install reboot.  (Debug\npackages can explicitly request that the feature be reenabled.)\n\nChange-Id: I20f3ec240ecd344615d452005ff26d8dd7775acf\n"
    },
    {
      "commit": "99916f0496cfe37891d40f21a9a0e387620a8a60",
      "tree": "6b457a65cfdf482fec027386fcd7d197586c67b2",
      "parents": [
        "0708239c003a1537c9cbf98dea5a490955d667aa"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Mon Jan 13 14:16:58 2014 -0800"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jan 16 13:29:28 2014 -0800"
      },
      "message": "do verification and extraction on memory, not files\n\nChanges minzip and recovery\u0027s file signature verification to work on\nmemory regions, rather than files.\n\nFor packages which are regular files, install.cpp now mmap()s them\ninto memory and then passes the mapped memory to the verifier and to\nthe minzip library.\n\nSupport for files which are raw block maps (which will be used when we\nhave packages written to encrypted data partitions) is present but\nlargely untested so far.\n\nBug: 12188746\nChange-Id: I12cc3e809834745a489dd9d4ceb558cbccdc3f71\n"
    },
    {
      "commit": "027429a34fd229d7546640bd5b629156da8dd0fd",
      "tree": "898231a189fb42ae3b64299120e903e443d7d694",
      "parents": [
        "9690e2b370f3f303ef75e1fd5c7fdbea8787d46a"
      ],
      "author": {
        "name": "Alistair Strachan",
        "email": "alistair.strachan@imgtec.com",
        "time": "Wed Jul 17 10:41:49 2013 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Mon Nov 18 09:52:46 2013 -0800"
      },
      "message": "Restore default umask after forking for update-binary.\n\nA system/core change made in Mar 26 2012 6ebf12f \"init: Change umask\nof forked processes to 077\" changed the default umask of services\nforked from init.\n\nBecause recovery is forked from init, it has a umask of 077. Therefore\nwhen update-binary is forked from recovery, it too has a umask of 077.\n\nThis umask is overly restrictive and can cause problems for scripts\nrelying on minzip to extract binaries directly into the target\nfilesystem. Any directories updated by minzip will have their\npermissions reset to r-x------ and created files will have similarly\nrestrictive permissions.\n\nAs it seems unlikely this security measure was intended to have this\nside effect on legacy sideloads that do not have chmods to repair\nthe damage done by minzip, this change reverts the umask to 022 in\nthe fork made for update-binary.\n\nChange-Id: Ib1a3fc83aa4ecc7480b5d0c00f3c7d0d040d4887\n"
    },
    {
      "commit": "239ac6abac4524be93fce710360c0512c6cc2ab3",
      "tree": "55428f9ad654b63d4002ca94902440648c955b96",
      "parents": [
        "c0441d171914e59941ec4f815ae0aabf56d6504f"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@google.com",
        "time": "Tue Aug 20 16:03:25 2013 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@google.com",
        "time": "Wed Aug 21 13:44:35 2013 -0700"
      },
      "message": "recovery: install packages in a known mount environment\n\nWhen installing a package, we should have /tmp and /cache mounted and\nnothing else.  Ensure this is true by explicitly mounting them and\nunmounting everything else as the first step of every install.\n\nAlso fix an error in the progress bar that crops up when you do\nmultiple package installs in one instance of recovery.\n\nChange-Id: I4837ed707cb419ddd3d9f6188b6355ba1bcfe2b2\n"
    },
    {
      "commit": "fafc85b4ad7a5679c6b562bed64460732e05fd1e",
      "tree": "830eb6f87a91e587eac04fa306206d70260ff6c2",
      "parents": [
        "602c4ebd393845f3388aea6ecb0c620580a7f332"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Jul 09 12:29:45 2013 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Jul 09 12:50:24 2013 -0700"
      },
      "message": "recovery: move log output to stdout\n\nRecovery currently has a random mix of messages printed to stdout and\nmessages printed to stderr, which can make logs hard to read.  Move\neverything to stdout.\n\nChange-Id: Ie33bd4a9e1272e731302569cdec918e0534c48a6\n"
    },
    {
      "commit": "bac7fba02763ae5e78e8e4ba0bea727330ad953e",
      "tree": "6056acf572fb45b4ff1ef2874b1d6373776a56c7",
      "parents": [
        "84a6c0d298f0606f7c27857b17115cbd362ad637"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Apr 10 11:32:17 2013 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Apr 10 11:32:17 2013 -0700"
      },
      "message": "verifier: update to support certificates using SHA-256\n\nChange-Id: Ifd5a29d459acf101311fa1c220f728c3d0ac2e4e\n"
    },
    {
      "commit": "6c249f7ae890694f061bfde7a3ab52bf367be110",
      "tree": "15652db30bd69d6ee35210f48e65943767958003",
      "parents": [
        "bf80f49edcec6b22ad7b1219e6ed6eda1e930c8c"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Nov 02 15:04:05 2012 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Nov 02 15:09:57 2012 -0700"
      },
      "message": "move key loading to verifier code\n\nAdd an option to verifier_test to load keys from a file, the way the\nrecovery does.\n\nChange-Id: Icba0e391164f2c1a9fefeab4b0bcb878e91d17b4\n"
    },
    {
      "commit": "02ec6b88ed4e6cf40cc257572b07c7277b7b6341",
      "tree": "2aa6f95cb875d258f62a5342ec2bb1ad0093e3bd",
      "parents": [
        "a3ccba6d314cb29b02d1dbda9a71427b11da936d"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@google.com",
        "time": "Wed Aug 22 17:26:40 2012 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@google.com",
        "time": "Wed Aug 22 17:26:40 2012 -0700"
      },
      "message": "add simple text to recovery UI\n\n- recovery takes a --locale argument, which will be passed by the main\n  system\n\n- the locale is saved in cache, in case the --locale argument is\n  missing (eg, when recovery is started from fastboot)\n\n- we include images that have prerendered text for many locales\n\n- we split the background states into four (installing update,\n  erasing, no command, error) so that appropriate text can be shown.\n\nChange-Id: I731b8108e83d5ccc09a4aacfc1dbf7e86b397aaf\n"
    },
    {
      "commit": "17495277b1a6328f5cae68523ad00be1f1107950",
      "tree": "1f24ec32e8d3cb586c2514180eeff4a539f5d8df",
      "parents": [
        "aade2e590e17b0f47dbf554f7df5824ba4096212"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Jul 25 13:10:58 2012 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Jul 25 13:10:58 2012 -0700"
      },
      "message": "support version 2 (2048-bit e\u003d65537) keys in recovery\n\nChange-Id: I9849c69777d513bb12926c8c622d1c12d2da568a\n"
    },
    {
      "commit": "e5d5ac76cc8e5d11867aeff6a1d068215c1c3a7c",
      "tree": "c88149f2f9c48966f66533e7bbf0b66ae407a314",
      "parents": [
        "48704798ea79a4cf0a4024ffcd18fc11ca03a43c"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Apr 12 11:01:22 2012 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Apr 12 11:01:22 2012 -0700"
      },
      "message": "minor recovery changes\n\n- add the --just_exit option to make recovery exit normally without doing anything\n- make it possible to build updater extensions in C++\n- add the clear_display command so that the updater binary can request\n  recovery switch to the NONE background UI\n\nThese are all used to support the notion of using OTA as a factory\nreflash mechanism.\n\nChange-Id: Ib00d1cbf540feff38f52a61a2cf198915b48488c\n"
    },
    {
      "commit": "7440630caa77869e7d264dfb9da47db2182524a2",
      "tree": "395aa8bc2d1d0412a52d42a3bb2d75a54f96685c",
      "parents": [
        "10e418d3c89ec404fbf959c1ef77a720a42a66ed"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Oct 28 15:13:10 2011 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Oct 28 15:13:10 2011 -0700"
      },
      "message": "refactor ui functions into a class\n\nMove all the functions in ui.c to be members of a ScreenRecoveryUI\nclass, which is a subclass of an abstract RecoveryUI class.  Recovery\nthen creates a global singleton instance of this class and then invoke\nthe methods to drive the UI.  We use this to allow substitution of a\ndifferent RecoveryUI implementation for devices with radically\ndifferent form factors (eg, that don\u0027t have a screen).\n\nChange-Id: I7fd8b2949d0db5a3f47c52978bca183966c86f33\n"
    },
    {
      "commit": "10e418d3c89ec404fbf959c1ef77a720a42a66ed",
      "tree": "0c429bcc8f4a1935f3be97d87ebdc2f4434ee887",
      "parents": [
        "d0181b8fcdac761afec252151a8bfda116916e96"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Oct 28 10:33:05 2011 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Oct 28 10:33:05 2011 -0700"
      },
      "message": "turn recovery into a C++ binary\n\nChange-Id: I68a67a4c8edec9a74463b3d4766005ce27b51316\n"
    },
    {
      "commit": "d0181b8fcdac761afec252151a8bfda116916e96",
      "tree": "c878f12af3461775fe971b1a935783d08c6e9d62",
      "parents": [
        "441031dadc4f5e8c1487468229781702bc08fb14"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Oct 19 10:51:12 2011 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Oct 19 11:26:18 2011 -0700"
      },
      "message": "allow recovery packages to wipe cache\n\nupdater now has a function \"wipe_cache();\" which causes recovery to\nwipe the cache partition after the successful installation of the\npackage.  Move log copying around a bit so logs and the last_install\nflag file are copied to cache after it\u0027s wiped.\n\nBug: 5314244\nChange-Id: Id35a9eb6dcd626c8f3a3a0076074f462ed3d44bd\n"
    },
    {
      "commit": "469243e53689b6f312d20813444dc00d83528758",
      "tree": "e59d3978874c4637efdd7fb86201b1c360f4e56d",
      "parents": [
        "3ed8e187212b06767e0ca5860cdbd79c11c9390e"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Apr 12 09:28:10 2011 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Apr 12 09:28:10 2011 -0700"
      },
      "message": "save a last_install file with the result of the last package install attempt\n\nWhen installing a package, create /cache/recovery/last_install, which\ncontains the filename of the package and a 1 or 0 for success or\nfailure.\n\nAlso, don\u0027t mount ext4 and vfat filesystems as read-only (on devices\nwhere /cache is ext4, we need it to be read-write).\n\nChange-Id: I0cf2a1921bbd65e06343aa74e2006577fac77c2c\n"
    },
    {
      "commit": "cc8cd3f3cac07f6927ead277ef390c000ae798d9",
      "tree": "eb69079a188920538b1d955d0da5d594d934723f",
      "parents": [
        "0f1ad110f8655d941afefcc57d371ea98c02a7a7"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Mon Sep 20 12:16:13 2010 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Sep 21 14:13:45 2010 -0700"
      },
      "message": "remove the notion of \"root path\"; support mixed flash types\n\nRemove the wacky notion of \"roots\" and \"root paths\" (those things that\nlook like \"FOO:some/path\" instead of just \"/foo/some/path\").  Let each\ndevice specify its own table of available partitions and how to mount\nthem (needed for devices that use both MTD/yaffs2 and EMMC/ext4\npartitions).\n\n(Cherrypicked from gingerbread w/slight edits.)\n\nChange-Id: I2479ce76b13e73f1d12035c89386c3a82b3edf51\n"
    },
    {
      "commit": "d7d4208976125d114d0b8e44438e2417d5275098",
      "tree": "1f5915af5ad0420295138e6d55dc95c094127d15",
      "parents": [
        "792b00712bb1411d3b0583bcea95b43b3107fb95"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Sep 17 13:02:48 2010 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Sep 17 13:02:48 2010 -0700"
      },
      "message": "remove unneeded partition roots\n\nRecovery itself no longer needs to access all these partitions;\nmanipulation of them is done by the updater binary.  This is a small\nfirst step towards removing roots entirely.\n\nChange-Id: I3fbcada32079a37db4cc097861dfa91e0a08da30\n"
    },
    {
      "commit": "56c5105bd7096704eaed35329b2c8c84cc282867",
      "tree": "41ec0075fa7181d1103bacdbce2fa1c9454eb136",
      "parents": [
        "8674a726ff05a4a6c09c6934778c251635f130a8"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jul 01 09:18:44 2010 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Sep 15 11:10:02 2010 -0700"
      },
      "message": "support for ext4/EMMC filesystems in updater binary\n\nMake the mount and format functions take extra parameters describing\nthe filesystem type and add support for mounting and formatting ext4\nfilesystems on EMMC.\n\nChange recovery to consistently use stdout for status messages instead\nof mixing stdout and stderr.\n"
    },
    {
      "commit": "8e5e4dada713609c9b2c45ea9cf4572bb89ef761",
      "tree": "b1dd9d0f6408811e71dade4f1ccbc52f18114a5e",
      "parents": [
        "d12560aa2134d3af21a1220cd4873553f9c51743"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Sep 14 18:06:55 2010 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Sep 14 21:26:38 2010 -0700"
      },
      "message": "close update package before installing; allow remount\n\nClose the update package before invoking the binary, to allow the\ninstaller to unmount /cache if it wants to.  Add a function to allow\nremounting of a mount as read-only.\n\nChange-Id: Idfcc96c3da66083295177f729263560be58034e4\n"
    },
    {
      "commit": "21b97ed5693d039e8b9dea57a160d3307f412682",
      "tree": "7257b5526e7f4ae33c2dea69ad86c4688e13bdda",
      "parents": [
        "dd6a0412b5d4623f63e46120c648342824029c18"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 24 16:11:17 2010 -0700"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Thu Jun 24 16:11:17 2010 -0700"
      },
      "message": "Add __attribute__((format(printf, a, b))) to printf like functions.\n\nFix potential string format bug.\n\nChange-Id: Ie05aac53b2c45a48bd68e340b76ccb21edfd28b7\n"
    },
    {
      "commit": "e08991e02a7d678f2574e85289a34b2a9a537c82",
      "tree": "ca53b4adbf66388805a47f93c440412be552761c",
      "parents": [
        "93dbe07ff6c06e8df2c804cbac63601fbb1de041"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Feb 02 13:09:52 2010 -0800"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Feb 03 09:20:07 2010 -0800"
      },
      "message": "bump updater API version to 3; deprecate firmware update command\n\nRemove support for the HTC-specific \"firmware\" update command and the\ncorresponding edify function write_firmware_update().  This\nfunctionality is now done by an edify extension library that lives in\nvendor/htc.\n\nChange-Id: I80858951ff10ed8dfff98aefb796bef009e05efb\n"
    },
    {
      "commit": "aa062531aa3e740b6cf7d3690fd5310e7fdf03f2",
      "tree": "6d189c02c973650a0ad4dbb33e0d5b3504d68c60",
      "parents": [
        "687bc12ccfbda26ad134b27d09d1d70a2b8705a6"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jan 28 16:47:20 2010 -0800"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Thu Jan 28 16:51:00 2010 -0800"
      },
      "message": "fix parsing of dumpkeys output\n\n%i can\u0027t be used to read unsigned ints (though it happens to work with\nbionic).  Change to %x and %u as appropriate.\n\nChange-Id: I8ea9ca16a939501757cf70fc5953abee26c8231c\nhttp://b/2402231 - Parser for /res/keys interprets n0inv as a signed int\n"
    },
    {
      "commit": "60151a295ccf726238dc47456d80b427db6d6a38",
      "tree": "42fdf22f18dc4097c2f86cbd691fe6b1c8bd3820",
      "parents": [
        "0cf0e33b5fdb6eb871b64f5325ccd54339f62f01"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Aug 12 18:30:03 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Aug 14 17:26:33 2009 -0700"
      },
      "message": "verify whole-file signature instead of jarsigner signatures\n\nIn recovery, verify a signature that covers the entire zip file,\ninstead of using the jarsigner format to verify individual files.\n\nBug: 1328985\n"
    },
    {
      "commit": "64893ccc09b25ac31bc6a17f5c7f43c7fa789576",
      "tree": "a56912e18b608b123f1c4454293d2b2aa36fa96a",
      "parents": [
        "bec02d57fb85cc7dd0196a54b0e9530e306623ac"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Jul 14 16:31:56 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Tue Jul 14 16:58:42 2009 -0700"
      },
      "message": "remove amend\n\nYank all the code to install OTA packages out of the recovery binary\nitself.  Now packages are installed by a binary included in the\npackage (run as a child of recovery), so we can make improvements in\nthe installation process without waiting for a new release to use\nthem.\n"
    },
    {
      "commit": "fbf3c10e45c20f8fe6bd1ac49ffe220035b9c454",
      "tree": "458bbaf030872557aeea42b057383f246c5f6f75",
      "parents": [
        "47cace98369f60df2351a65801c8065bb7f9dbf0"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Jun 24 09:36:20 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Jun 24 09:36:20 2009 -0700"
      },
      "message": "improve updater progress bar\n\nLet recovery accept set_progress commands to control progress over the\n\u0027current segment\u0027 of the bar.  Add a set_progress() builtin to the\nupdater binary.\n"
    },
    {
      "commit": "fb2e3af3f915c0e3f2b4b027ef26777267ad46dc",
      "tree": "45e7354eacc638f4176a095844258d1f313aba7b",
      "parents": [
        "e3da02e7bcfd85c543419e7590a3c86f64d8cc8a"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Jun 17 17:29:40 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Wed Jun 17 18:12:16 2009 -0700"
      },
      "message": "let the \"firmware\" command take the file straight from the package\n\nTo do a firmware-install-on-reboot, the update binary tells recovery\nwhat file to install before rebooting.  Let this file be specified as\n\"PACKAGE:\u003cfoo\u003e\" to indicate taking the file out of the OTA package,\navoiding an extra copy to /tmp.  Bump the API version number to\nreflect this change.\n"
    },
    {
      "commit": "d9c9d10d9da76f067d3955bea71f7bb39e859fa5",
      "tree": "1e49a3a616c3147f871e79b1b15e2b2a63379cc1",
      "parents": [
        "8edb00c990e563e6f91b278a212f2edf877cf763"
      ],
      "author": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Jun 12 12:24:39 2009 -0700"
      },
      "committer": {
        "name": "Doug Zongker",
        "email": "dougz@android.com",
        "time": "Fri Jun 12 14:05:03 2009 -0700"
      },
      "message": "fixes to edify and updater script\n\nA few more changes to edify:\n\n  - fix write_raw_image(); my last change neglected to close the write\n    context, so the written image was corrupt.\n\n  - each expression tracks the span of the source code from which it\n    was compiled, so that assert()\u0027s error message can include the\n    source of the expression that failed.\n\n  - the \u0027cookie\u0027 argument to each Function is replaced with a State\n    object, which contains the cookie, the source script (for use with\n    the above spans), and the current error message (replacing the\n    global variables that were used for this purpose).\n\n  - in the recovery image, a new command \"ui_print\" can be sent back\n    through the command pipe to cause text to appear on the screen.\n    Add a new ui_print() function to print things from scripts.\n    Rename existing \"print\" function to \"stdout\".\n"
    },
    {
      "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": "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": "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": "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": "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": "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": "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"
    }
  ]
}
