)]}'
{
  "log": [
    {
      "commit": "1ec9ceb6eea5e6c5657ddcad5fc32bcaa52c9620",
      "tree": "bae4feefca88d4e4d0d40aa1637a91825720cdc9",
      "parents": [
        "7257e03981c1330a785a910a846a454724eebdaf"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Wed Feb 10 15:03:50 2016 -0800"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Wed Feb 10 15:03:50 2016 -0800"
      },
      "message": "adb: mkdirs fixes\n\nFix pathological case where the directory to be created can\u0027t be created\nbecause there is already a file there. This was previously returning\nsuccess because the wrong var was passed to directory_exists().\n\nFix test to exercise this situation. Also clarify tests.\n\nChange-Id: I0dc0f14084e0eda4e1498874d4ab2a6445d322ac\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "a17d272002eab3355be435dbe2c1722162556fe9",
      "tree": "c78ea82996f0ea56f95e07ade9e696ed65c276fc",
      "parents": [
        "128452bdd7eac825796023d8c44a41d4fd8053e2"
      ],
      "author": {
        "name": "David Pursell",
        "email": "dpursell@google.com",
        "time": "Thu Jan 21 08:40:59 2016 -0800"
      },
      "committer": {
        "name": "David Pursell",
        "email": "dpursell@google.com",
        "time": "Thu Jan 21 20:03:33 2016 -0800"
      },
      "message": "base: add network address parsing function from adb.\n\nThis CL moves the network address parsing function from adb to libbase\nso that it can be used by fastboot as well as adb.\n\nlibbase seemed like the right choice because:\n  1. It already has some parsing functions (parseint)\n  2. The net address parsing function uses the libbase string\n     functions so we have a libbase dependency anyway.\n\nThe parsing function has been modified slightly to make the canonical\naddress optional, and debug logging on success has been removed.\n\nFor adb the only functional difference is that parsing a network\naddress will no longer print the result to the debug log, which seemed\nunnecessary.\n\nBug: http://b/26236380\nChange-Id: Ife6df02937225fc66de87884d3572d79c092c522\n"
    },
    {
      "commit": "232d25d01ea1a5cf28d8bd2ee3bdf0e3f09321fb",
      "tree": "76f238a9a8a309dbca1c9d50a6abb836f5a1253d",
      "parents": [
        "b15bf57db5aeaa97f9754c9a5053540e65df71e3",
        "1eef478833d0eef5380c37994dceef0ae3c4c784"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Dec 10 21:30:19 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Dec 10 21:30:19 2015 +0000"
      },
      "message": "Merge \"adb: shell: add -n flag to not read from stdin.\""
    },
    {
      "commit": "1eef478833d0eef5380c37994dceef0ae3c4c784",
      "tree": "6775770fff996f57215070b4cf8dbe18094b364a",
      "parents": [
        "4919c176fe05d9fc9f3f8f57065dd650f0fa12b6"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Nov 20 15:37:31 2015 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Dec 10 12:52:06 2015 -0800"
      },
      "message": "adb: shell: add -n flag to not read from stdin.\n\nShell scripts of the following form do not work properly with adb:\n    echo \"foo\\nbar\\nbaz\" | {\n        read FOO\n        while [ \"$FOO\" !\u003d \"\" ]; do\n            adb shell echo $FOO\n            read FOO\n        done\n    }\nThe first run of adb shell will consume all of the contents of stdin,\ncausing the loop to immediately end. ssh solves this by providing a -n\nflag that causes it to not read from stdin. This commit adds the same.\n\nBug: http://b/25817224\nChange-Id: Id74ca62ef520bcf03678b50f4bf203916fd81038\n"
    },
    {
      "commit": "f55ead962f2257312af08fe730ef9d3f3d988e76",
      "tree": "75488c67fc418f771691c0aa9caa88346126ed75",
      "parents": [
        "b13dd00d883d02dfef1a403caa63501ddca50a09"
      ],
      "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": "28bc2cb5524c98a2a9585ff4656636cc1461b492",
      "tree": "288969465d7d552881900e6c025aaf774464cd4f",
      "parents": [
        "7c3f48a86d2a4f89e39c94f54e56a8c8b92621e3"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Sat Nov 07 18:51:54 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Nov 09 10:22:13 2015 -0800"
      },
      "message": "adb/base: minor compiler portability improvements\n\nI\u0027ve been using these changes to compile with Visual Studio.\n\n- GetFileBasename(): __FILE__ uses \\ with Visual Studio.\n\n- adb_trace.cpp: Apparently VS needs an ampersand before the function name.\n\n- \"expr1 ? : expr2\" is a GCC extension.\n\n- \u003calgorithm\u003e contains std::min().\n\n- seekdir can\u0027t always be #define\u0027d because some headers have members\n  named seekdir.\n\n- adb_utils.cpp: Not really a compiler issue, just a random fix:\n  0x7F/DEL is not printable.\n\nChange-Id: I0dfb634f1ba4ccbc0d1b9f71b00e838fbebb3b41\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "1d3983b53c4a3d6d00c2331873dd62bc7f6e8022",
      "tree": "9c8480b3c4d5bab8ed36cc9ce82673828c11e718",
      "parents": [
        "12a0e1261edde837dd65dda91b724ad270f8dba4",
        "fe1a61275bb5025e85feda6bd1a210ca247fd13a"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Nov 05 01:45:22 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Nov 05 01:45:22 2015 +0000"
      },
      "message": "Merge changes I70c94c4b,Ifd8769ed\n\n* changes:\n  adb: make mkdirs/secure_mkdirs do what they say.\n  adb: remove use of mkdirs from `adb backup`.\n"
    },
    {
      "commit": "fe1a61275bb5025e85feda6bd1a210ca247fd13a",
      "tree": "31d4300c4d123f3b8c44bd028445c2e1fd9b97e1",
      "parents": [
        "c1c3138eb79bb40146963b2992f22a1cbadd81a2"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Nov 04 14:51:23 2015 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Nov 04 14:51:23 2015 -0800"
      },
      "message": "adb: make mkdirs/secure_mkdirs do what they say.\n\nPreviously, mkdirs/secure_mkdirs wouldn\u0027t create a directory at the\nspecified path, only the ones above it.\n\nBug: http://b/25459942\nChange-Id: I70c94c4b44d90723cb4a063657fc40e5bcb3b10e\n"
    },
    {
      "commit": "f462e0bf5b192a7bd4035a820f00598847239688",
      "tree": "0dbe0907071bd39e470d9d0be89fb36079a66e1d",
      "parents": [
        "cb094c6f2848c6bec3b7a849605f8e768f81e98a"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Nov 03 18:52:35 2015 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Nov 04 14:21:35 2015 -0800"
      },
      "message": "adb: make adb_basename match the POSIX behavior.\n\nPreviously, adb_basename was behaving according to the GNU, POSIX-incompatible\nbasename, despite POSIX adb_dirname existing alongside it. This patch changes\nadb_basename to pass through to the POSIX basename.\n\nBug: http://b/25456821\nChange-Id: I62a4865cccf3b9cdbc112e3e53ff475aa4a23bd9\n"
    },
    {
      "commit": "5fc22317b7ad03a3b72e746e614f97921ccdfbfb",
      "tree": "229c68cd70a7ec87b681bdfb3faad85b3d163877",
      "parents": [
        "de01c94f969f6c59926bc7ace48c3ed0a707a670"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Oct 06 15:10:05 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Oct 06 16:15:30 2015 -0700"
      },
      "message": "adb: keep file flags in fdevent_install.\n\nBug: 24615098\nChange-Id: Ia791ecbe612f09aca3bbd5787513f121fae54da5\n"
    },
    {
      "commit": "19bec5b329fe202795688bfb76d77f4560adf2c6",
      "tree": "e046660c0f6fcf1038982323810cb15e0326d591",
      "parents": [
        "468978294e130807cc37ed295115863c2d7bacaa"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Sep 22 15:52:57 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Sep 23 12:53:38 2015 -0700"
      },
      "message": "Adb: use VLOG() to replace D() for verbose logging.\n\nAs there are too many D(), we can keep both VLOG() and D() now, and get\nrid of D() gradually.\n\nChange-Id: I2f1cb70bcab3e82c99fed939341d03f6b2216076\n"
    },
    {
      "commit": "815ad88d465c07b09eae296db6f41b7bef3c3cc4",
      "tree": "b52bacf0f8fdeaad7b5dfa89f3ffeff841dc8e1d",
      "parents": [
        "7d5e6e62f2d618ba376cbc9b8a5def881a73f1a9"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Sep 02 17:44:28 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Sep 02 20:21:00 2015 -0700"
      },
      "message": "adb: clean up debug tracing a little.\n\nAlways use LOG() for debug tracing.\nRemove useless D_lock. I believe it is useless to lock just before and after fprintf.\n\nI verified the log output both on host and on device. The output looks fine to me.\n\nChange-Id: I96ccfe408ff56864361551afe9ad464d197ae104\n"
    },
    {
      "commit": "b628cb1dae77603b27673d8de27ed87d2ccfbb60",
      "tree": "05b8a3794af4a8f2d5eefbf1810811e25a3def46",
      "parents": [
        "44be5ce75ec6c6d0414c7b71d824b385e9151a7b"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Aug 03 10:38:08 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Aug 24 11:15:01 2015 -0700"
      },
      "message": "adb sync cleanup.\n\nWe can double the speed of \"adb sync\" (on N9) if we increase SYNC_DATA_MAX\nfrom 64KiB to 256KiB. This change doesn\u0027t do that, because I still haven\u0027t\nmanaged to plumb through the information about whether we\u0027re a new adb/adbd\nto file_sync_client.cpp and file_sync_service.cpp. But this is already a big\nchange with a lot of cleanup, so let\u0027s do the cleanup and worry about the\nintended change another day...\n\nThis change does improve performance somewhat by halving the number of\nlstat(2) calls made on the client side, and ensuring that most packets are\nsent with a single write. This has the pleasing result of making the null\nsync on an AOSP N9 go from just over 300ms to around 100ms, which means it\nnow seems instantaneous (https://en.wikipedia.org/wiki/Mental_chronometry).\n\nChange-Id: If9f6d4c1f93ec752b95f71211bbbb1c513045166\n"
    },
    {
      "commit": "939d000706a597f75e78e7379133a60d43cb020e",
      "tree": "dbb4f3b4c051d202c4df640a08c758f917b887f2",
      "parents": [
        "5f4de22dcbf8da782aab363fe9dcec2009178e59"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Sat Aug 01 17:29:23 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Aug 03 13:24:18 2015 -0700"
      },
      "message": "adb: fix mkdirs / adb pull with relative paths, fix win32 issues\n\nRelative paths were being prefixed with OS_PATH_SEPARATOR on unix and\nwin32 causing adb to incorrectly try to make directories at the root.\nPlus, absolute paths didn\u0027t work on win32 (C: got prefixed into \\C:).\n\nThis fix is to use dirname (available on win32 via mingw\u0027s crt) to do\nthe messy parsing.\n\nI added a test for the relative path case.\n\nChange-Id: Ibb0a4a8ec7756351d252a4d267122ab18e182858\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "753d485aca0e35bc92a7dec0c3278f0530dc25ca",
      "tree": "7dfddab77e98b5fa205a0aed70ff8c6d0d5285e2",
      "parents": [
        "9897771f79a760bcd337cae67500ebb5ff1d619f"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Thu Jul 30 23:07:55 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Thu Jul 30 23:07:55 2015 -0700"
      },
      "message": "adb: win32: initial IPv6 support and improved Winsock error reporting\n\nCall getaddrinfo() for connecting to IPv6 destinations.\n\nWinsock APIs do not set errno. WSAGetLastError() returns Winsock errors\nthat are more numerous than BSD sockets, so it really doesn\u0027t make sense\nto map those to BSD socket errors. Plus, even if we did that, the\nWindows C Runtime (that mingw binaries use) has a strerror() that does\nnot recognize BSD socket error codes.\n\nThe solution is to wrap the various libcutils socket_* APIs with\nsysdeps.h network_* APIs. For POSIX, the network_* APIs just call\nstrerror(). For Windows, they call SystemErrorCodeToString() (adapted\nfrom Chromium).\n\nAlso in this change:\n\n - Various other code was modified to return errors in a std::string*\n   argument, to be able to surface the error string to the end-user.\n\n - Improved error checking and use of D() to log Winsock errors for\n   improved debuggability.\n\n - For sysdeps_win32.cpp, added unique_fh class that works like\n   std::unique_ptr, for calling _fh_close().\n\n - Fix win32 adb_socketpair() setting of errno in error case.\n\n - Improve _socket_set_errno() D() logging to reduce confusion. Map\n   a few extra error codes.\n\n - Move adb_shutdown() lower in sysdeps_win32.cpp so it can call\n   _socket_set_errno().\n\n - Move network_connect() from adb_utils.cpp to sysdeps.h.\n\n - Merge socket_loopback_server() and socket_inaddr_any_server() into\n   _network_server() since most of the code was identical.\n\nChange-Id: I945f36870f320578b3a11ba093852ba6f7b93400\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "d189cfb4837f978bec5d56042989b4a8e9bcc474",
      "tree": "ec93a69048905f2062f6737235ce301984f97fe6",
      "parents": [
        "28d1f8d69e63f96ce770417d256819d5bc1c5e14"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jul 30 17:42:01 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jul 30 17:46:58 2015 -0700"
      },
      "message": "More adb cleanup.\n\nThis removes adb_dirstart and adb_dirstop. It also fixes a couple of memory\nleaks by switching to std::string. This also fixes the bug in the previous\nchange --- mkdirs is given input like \"/system/bin/sh\" and only expected to\ncreate \"/system/bin\". In a later change, we should remove mkdirs and only\nexpose the intended \"unlink \u0026\u0026 mkdirs \u0026\u0026 create\" functionality.\n\nChange-Id: I30289dc1b3dff575cc1b158d993652178f587552\n"
    },
    {
      "commit": "28d1f8d69e63f96ce770417d256819d5bc1c5e14",
      "tree": "987e5cc564bc6e2441e097ff857afbd4a2295485",
      "parents": [
        "881c43397d990ecf026951de9946ff9bc5b1ad60"
      ],
      "author": {
        "name": "Alex Vallée",
        "email": "avallee@chromium.org",
        "time": "Wed May 06 16:26:00 2015 -0400"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jul 30 15:08:53 2015 -0700"
      },
      "message": "Write mkdirs in more idiomatic C++ style.\n\n~ Rewrote mkdirs to be in C++ style.\n~ Replaced adb_dir{start,stop} with std::string params and (r)find.\n+ Added test for mkdirs.\n\nAlso make base/test_utils.h public and support temporary directories\nas well as files.\n\nChange-Id: I6fcbdc5e0099f3359d3aac6b00c436f250ca1329\n"
    },
    {
      "commit": "24f9b083cba742a1f118ad85d81a63f2ae854d71",
      "tree": "bd08afcb9e4e5f1370698732264a5cf01afacbbe",
      "parents": [
        "a4169f96db89a7dae57f7d90b4d1b9dfb21f2259"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jul 27 21:21:39 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jul 28 08:07:21 2015 -0700"
      },
      "message": "Fix const-ness of strrchr callers.\n\nThis causes build failures in google3 where they use GCC. glibc only\nprovides const-correct overloads for string functions for GCC \u003e\u003d 4.4,\nbut clang -- which is what we use -- pretends to be GCC 4.2.\n\nChange-Id: I2a054823ea6201ebcea46d5e77b80a975eefc622\n"
    },
    {
      "commit": "fe44751e166013dbaf4ec60a73c3c4e62450e0e2",
      "tree": "77ff7e139f6aecec1658961aa01fe989c0cf124b",
      "parents": [
        "455ffbd15da28b05a489351af9def50b6c6ac948"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Jul 24 11:35:40 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Jul 24 11:35:40 2015 -0700"
      },
      "message": "Fix Win32 adb build.\n\nChange-Id: I0a07379c470b7fa7f9bdef68c17ccb7bd0bd2079\n"
    },
    {
      "commit": "43df109b4b0bb8e08cb4068c4983f32584dfef9a",
      "tree": "9946617f72ea0ea7400c68d9d56052890b7cb3d6",
      "parents": [
        "6cde25edd8c2ef313aebe5852496baa5218ee48a"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jul 23 17:12:58 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jul 23 21:14:38 2015 -0700"
      },
      "message": "Report getaddrinfo failures correctly.\n\nAlso move us off the \"convenience\" function because you can\u0027t get useful\nerror reporting from it.\n\nChange-Id: I5fcc6a6d762f5f60906980a7835f01a35045be65\n"
    },
    {
      "commit": "09ccf1fa62cef5ce1f3766683df29b8467444a79",
      "tree": "2be312cbca0b49375c67d451a2648042d3efa370",
      "parents": [
        "e91631558898a0b8f7a3ea2b74b7726d78c2f227"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sat Jul 18 12:21:30 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jul 21 15:25:14 2015 -0700"
      },
      "message": "Recognize IPv6 addresses for \"adb connect\".\n\nBug: http://b/22559299\nChange-Id: I32891d706b5010c38db84a056e76dd279b780f75\n"
    },
    {
      "commit": "e91631558898a0b8f7a3ea2b74b7726d78c2f227",
      "tree": "2ca29844619ea96de5b419da849a650a227d9c48",
      "parents": [
        "a53c848ebcbddde75415bf18f2d26e01a0e60758"
      ],
      "author": {
        "name": "Alex Vallée",
        "email": "avallee@chromium.org",
        "time": "Wed May 06 17:22:25 2015 -0400"
      },
      "committer": {
        "name": "Alex Vallée",
        "email": "avallee@google.com",
        "time": "Wed Jul 15 19:37:18 2015 +0000"
      },
      "message": "Move mkdirs to adb_utils.\n\nThere were duplicate implementations in commandline.cpp and\nfile_sync_client.cpp.\n\nChange-Id: Ib448f76c0d7ffdcd577336b1c610a881425bc2db\n"
    },
    {
      "commit": "3d978e686996480f3e5e1c7725c2bfdea276fe04",
      "tree": "07cfc912d2f13cb587d368ef5e1281e11c4c1a28",
      "parents": [
        "7d8fc468e4615cf1bcc9f47f3f98f28c704b205c"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jul 09 20:35:09 2015 +0000"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jul 09 20:35:09 2015 +0000"
      },
      "message": "Revert \"Turn on -Wformat-nonliteral.\"\n\nOne of my build aliases doesn\u0027t play nice with USE_MINGW\u003d1, so my build lied to me. Will revert until I fix it up.\n\nThis reverts commit 7d8fc468e4615cf1bcc9f47f3f98f28c704b205c.\n\nChange-Id: I7905c5ae5ee85fb2d228ce63d81c79f140998c18\n"
    },
    {
      "commit": "7d8fc468e4615cf1bcc9f47f3f98f28c704b205c",
      "tree": "dd37c9803937e98bcfb085ea3a05697b0ba9ecac",
      "parents": [
        "5f1d5ff74159582d2076120a85b1a70aeced1afe"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Jul 08 13:50:42 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Jul 09 10:47:24 2015 -0700"
      },
      "message": "Turn on -Wformat-nonliteral.\n\nApparently there are two classes of this warning in clang.\n-Wformat-security is only emitted for cases of\n`func(nonliteral_fmt_string)` (no args), and -Wformat-nonliteral is\nemitted for cases *with* arguments. For whatever reason, the latter\nisn\u0027t included in -Wextra and must be manually enabled.\n\nTo make this more easily portable to Windows, move the existing\ngnu_printf/__printf__ decision into base/macros.h as ATTRIBUTE_FORMAT.\n\nChange-Id: I3b0990e1d1f0a2e9c13b32f5cd60478946cb5fc6\n"
    },
    {
      "commit": "de52ce2dae9ca9a88425c07b7353dc948d29f1f7",
      "tree": "2dc2a8b17d94c14e04ad70762bc5c36bc6bc78ad",
      "parents": [
        "9529b3e16c99070f2abb3dcd232f4f39a60d702e"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 15 12:06:00 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 15 12:06:00 2015 -0700"
      },
      "message": "Fix \u0027 escaping in adb.\n\nYou can\u0027t just use \\\u0027 inside a single-quoted string.\n\nBug: http://b/20323053\nBug: http://b/3090932\nChange-Id: I73754b097671d02dc11c35052f0534b6dd789e4f\n"
    },
    {
      "commit": "88b4c85a6f7fbc094f55c9e5322e1e16857006a2",
      "tree": "5eae0ad266a6ac7680a12dd088142c1fb953fc7c",
      "parents": [
        "da94581ec4a749f738bebaaa5d0ebcca4017143e"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Apr 30 17:32:03 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 01 15:55:37 2015 -0700"
      },
      "message": "More adb buffer fixes.\n\nThis patch factors out a lot of the basic protocol code: sending OKAY,\nsending FAIL, and sending a length-prefixed string.\n\nADB_TRACE has been non-optional for a long time, so let\u0027s just remove\nthe #ifs.\n\nAlso actually build the device tracker test tool (and remove its duplicate).\n\nBug: http://b/20666660\nChange-Id: I6c7d59f18707bdc62ca69dea45547617f9f31fc6\n"
    },
    {
      "commit": "6780a7bf99d0d9fd8edaf937c27272e0e4fb9758",
      "tree": "d071dc602a9fa5db33ee9b3192e1db3e709aa1c1",
      "parents": [
        "c36b52c026f51e15a2296d28eb4002435f0d3ca9",
        "48db87f35909f825f1bfa17bb65962e34fe616a3"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Apr 21 16:47:43 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Apr 21 16:47:43 2015 +0000"
      },
      "message": "Merge \"Use \u0027 quoting to escape arguments.\""
    },
    {
      "commit": "df5bb431134cc7f198fac1a5cfff3da53b00d54e",
      "tree": "9e27a48c6148786fd5906cfd93dc2292529d2384",
      "parents": [
        "bebf693cba868feff20031443b534842c0b439c0"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sun Apr 19 13:17:01 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sun Apr 19 13:17:01 2015 -0700"
      },
      "message": "Fix the Windows adb build.\n\nIt looks like we can\u0027t use clang on Windows yet because libc++ isn\u0027t ready.\nSo move back to GCC for the Windows host clang. Work around the mingw\nprintf format string problems that made us want to switch to clang in the\nfirst place, and #include \"sysdeps.h\" in adb_utils.cpp to work around the\nabsence of lstat(2) on Windows.\n\nChange-Id: Icd0797a8c0c2d1d326bdd704ba6bcafcbaeb742f\n"
    },
    {
      "commit": "48db87f35909f825f1bfa17bb65962e34fe616a3",
      "tree": "5c5d47925637230f943cd52c141f6d19143f32ed",
      "parents": [
        "bebf693cba868feff20031443b534842c0b439c0"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Apr 17 20:50:11 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Apr 17 20:55:04 2015 -0700"
      },
      "message": "Use \u0027 quoting to escape arguments.\n\nThe specific motivating case is \"text;ls;1.apk\", but rather than continue\nadding individual characters to the list of characters to be escaped, let\u0027s\njust switch to quote all arguments with \u0027, which only leaves \u0027 itself to be\nescaped.\n\nBug: 20323053\nBug: 19734868\nChange-Id: I8bd71db9373bc2d1169fc11e46c889da6638550a\n"
    },
    {
      "commit": "7cf3575179f5374d0a5ba5a0c4cd7b61ad586cf8",
      "tree": "25f6d93b2a819d8b91d749b072ee5897440b50ae",
      "parents": [
        "bbb6b9843d5b28c9f515ac7d9cef690d772dcfaa"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Apr 17 17:03:59 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Apr 17 17:58:35 2015 -0700"
      },
      "message": "Remove yet more fixed-length buffers (and their overruns).\n\nBug: 20317724\nChange-Id: If137fc96f5f23576ccecd388ac87afefa47337c6\n"
    },
    {
      "commit": "38104453d910ce8fa46daa3d2b087be3b63ab39e",
      "tree": "bbb55a93308c0caac94bee1a6b8381932e3eb259",
      "parents": [
        "fa1cb7a5de95b478d6c60e2417f4a31f6c4567da"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Apr 17 13:57:15 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Apr 17 15:23:31 2015 -0700"
      },
      "message": "Fix more buffer overruns.\n\nAlso add some tests.\n\nBug: 20323050\nChange-Id: I9eaf3dc04efd85206663c4cca4f8c1208620a89a\n"
    }
  ]
}
