)]}'
{
  "log": [
    {
      "commit": "4d64fd81ae38d6f145abcd15e9e61b6adc53bf1f",
      "tree": "7c4ec8d9322d0533cf9d89e2f3a2c18271fb8ff5",
      "parents": [
        "d4641cc38074b8363d8a451064a33964dc48c3aa"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Aug 27 12:03:11 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Aug 27 14:41:07 2015 -0700"
      },
      "message": "adb: disconnect: fix write-after-free memory corruption and crash.\n\nTransport atransport objects are semi-reference counted: the input and\noutput threads each hold a reference. The adb disconnect command was\ncalling transport_unref to release a reference that it never had in the\nfirst place. This meant that the refcount dropped to zero and the object\nwas deleted before either the input or output thread released its\nreference. When that last thread released its reference, it wrote to\nfreed memory and also sometimes crashed.\n\nThis fix is to not release any unheld reference, instead it just kicks\nthe transport to break remote_read in output_thread. So all transport\nclose flow goes the following way:\noutput_thread (exit) -\u003e main thread (offline the transport) -\u003e\ninput thread (exit) -\u003e main thread (destroy the transport)\n\nChange-Id: Iad1fe718acc8716f3a79c8c22b426a1b2450452c\n"
    },
    {
      "commit": "10dedd8cd8d9d25068cef29b802c6583bb9bfbeb",
      "tree": "95ad9ee4985ab6c2ce18b4cd6f0f810ce1b6ef4b",
      "parents": [
        "9e0f034f7f8bf2a30288f93cd764b4a2d1bf004f"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Aug 26 11:18:42 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Aug 26 11:27:43 2015 -0700"
      },
      "message": "adb: keep all asocket operations in the main thread.\n\nAs far as I can see, all asockets operations happen in fdevent_loop()\nin the main thread, excepting close_all_sockets(). Instead of adding\nlock and ref_count for each asocket, a simpler way would be moving\nclose_all_sockets() from input_thread to the main thread.\n\nIn input_thread(), there are two path to break the loop and call\nclose_all_sockets(). One path is when receiving offline A_SYNC, which\nis sent by the main thread. The other path is when read_packet\nfails, which I believe is almost not possible and doesn\u0027t matter\n(Because t-\u003efd is closed just before t is freed.). So I move\nclose_all_sockets() to handle_offline() in the main thread.\n\nthe socket_list_lock in sockets.cpp could be removed. But I prefer\nto leave it for the following changes.\n\nBug: 6558362\nChange-Id: I5da23f60a67a331262c62693b9b127fe2689c799\n"
    },
    {
      "commit": "996c12efdccdb9b8c2a3ab1b29a37c688492ab2c",
      "tree": "baf78643d0a2f599c679647b254dc743b507dd97",
      "parents": [
        "be8e54b58cb35f4b58cbf6dc04db3796e630050a"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed May 20 18:58:41 2015 -0700"
      },
      "committer": {
        "name": "David Pursell",
        "email": "dpursell@google.com",
        "time": "Fri Aug 14 08:25:23 2015 -0700"
      },
      "message": "Add `adb features`.\n\nShows the features supported by the active adb server.\n\nChange-Id: I4a58a2ca082823c43f7a49e2c62ff80df6426756\n"
    },
    {
      "commit": "be8e54b58cb35f4b58cbf6dc04db3796e630050a",
      "tree": "8ed5592ef97fc60f85e748ec09b9666db476ef71",
      "parents": [
        "6d6cb544023baae04e60238bdde567976781955d"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon May 18 13:06:53 2015 -0700"
      },
      "committer": {
        "name": "David Pursell",
        "email": "dpursell@google.com",
        "time": "Fri Aug 14 08:24:37 2015 -0700"
      },
      "message": "Add feature list to connection banner.\n\nThis allows us to test for features explicitly rather than relying on\nthe protocol version number, allowing us to fall back gracefully if a\nfeature is not supported.\n\nThis will be needed for the upcoming shell upgrades for stdout/stderr\nseparation and exit code reporting.\n\nChange-Id: Ibb1d8ad2611f7209901ee76d51346b453e9c5873\n"
    },
    {
      "commit": "2521f51b977a7b667f4c65f24598c288a9a56795",
      "tree": "a927aa30455d8f0b4e68d7fa8211a55ebe2a3f7f",
      "parents": [
        "2ccc459e722ed5dda685e686536a721fc64a2ee1",
        "32625851925b0a2a933fdeeaa07035b6020295dc"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Aug 13 17:49:21 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Aug 13 17:49:21 2015 +0000"
      },
      "message": "Merge \"adb: improve network error info\""
    },
    {
      "commit": "85ee64b2951a74fb8cfef2b66443aa9ec97478ff",
      "tree": "39fd0c780ec8ab3b181464ac333768e38d16206f",
      "parents": [
        "086ed8768efdd187f916bd21bc14ef4ada9bfb63"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue Aug 11 17:05:02 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Wed Aug 12 20:14:55 2015 -0700"
      },
      "message": "adb: start-server and kill-server error output\n\n- handle_host_request\n  - When the host:kill command comes in, shutdown the socket before\n    calling exit(). If we don\u0027t do this, the client will output error info\n    even though everything is working ok.\n\n- adb_connect()\n  - If we can\u0027t parse the version string, explain this in error output\n    and don\u0027t goto error which would try to close an fd we already closed.\n  - If host:kill doesn\u0027t work, output error info. Don\u0027t try to close\n    already closed fd.\n\n- adb_main()\n  - If writing the ACK somehow has an error, output error info (I doubt\n    this will ever get hit).\n\n- adb_commandline()\n  - Fix typo about max port number.\n  - Make \u0027adb kill-server\u0027 and \u0027adb start-server\u0027 output any detailed\n    error info.\n\nChange-Id: Id1a309cc1bf516f7f49bd332b34d30f148b406da\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "3b1a373b82a55a3affda0bb1a1f06419d4c42143",
      "tree": "067da3fd1f55dbf2d2545e7ebf242a499be03cc1",
      "parents": [
        "dd96569e1325de2c33aa1f7c2bac9cb945807ef2",
        "5fe6d0d1319be46bb98144e00f9da10da68d02aa"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Aug 12 20:55:59 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Aug 12 20:55:59 2015 +0000"
      },
      "message": "Merge \"Remove confusing variable HOST.\""
    },
    {
      "commit": "b9f016413d9b3660fbb464fe42bd3acd0a509744",
      "tree": "7a64537c8ec254e0d65df39894c2111a38a56fe5",
      "parents": [
        "fe6ab81bec82779d28ffe85b1fab66b36bdc0860"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Aug 12 08:32:10 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Aug 12 08:32:10 2015 -0700"
      },
      "message": "Always include the adb version in the log.\n\n\"Are you running the right version?\" seems to be a common cause of debugging\nconfusion.\n\nChange-Id: I4a4ba95e876dafc05e515058ca059ea370273f78\n"
    },
    {
      "commit": "32625851925b0a2a933fdeeaa07035b6020295dc",
      "tree": "3f98d3b8928803e5ed4fb8f350ac392eacd8420c",
      "parents": [
        "3a698637918d05e1fed131ae445bf6c764ff525a"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue Aug 11 16:45:32 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue Aug 11 16:45:32 2015 -0700"
      },
      "message": "adb: improve network error info\n\n- handle_forward_request\n  - Because we have detailed info about which syscall failed (at least\n    on Win32), use a more generic prefix of \"cannot bind listener\" followed\n    by the detailed info.\n\n- install_listener\n  - Return string errors for a few errors even though I don\u0027t think any\n    callers actually output the string for those errors.\n\n  - Remove the printf since the callers print the message themselves.\n\n- adb_main\n  - LOG(FATAL) calls abort() which on Windows calls the Windows Error\n    Reporting service which pops up a dialog asking if you want a\n    crashdump to be uploaded to Microsoft. So really, abort() is\n    designed for app bugs. Windows isn\u0027t the only one doing this, Chromium\n    also makes LOG(FATAL) crashdump-ready. Since an error here is not\n    necessarily an app-bug, use a \u0027normal\u0027 error output API like fatal()\n    which prints an error and just uses exit().\n\n- sysdeps_win32.cpp\n  - When Winsock APIs fail, make the string clarify which API failed.\n    Use terse unix-style descriptions (like what you\u0027d get from\n    cp/mv/dd/etc.).\n\n  - Don\u0027t trace WSAEWOULDBLOCK from recv() which is a normal occurrence.\n\n  - Add a comment about WSAEWOULDBLOCK \u003d\u003e EAGAIN.\n\nChange-Id: I58e47f49fa2f6c1b4b92a36d0c4bfe369b456f2a\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "566d3e1cfc6559bac0a8614384f420a4aaf88895",
      "tree": "25c9adbed162a11d54ec608fd3664641f687501b",
      "parents": [
        "3a698637918d05e1fed131ae445bf6c764ff525a"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue Aug 11 15:48:15 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue Aug 11 15:48:15 2015 -0700"
      },
      "message": "adb: call android::base::InitLogging even when adb tracing is disabled\n\nThis is a follow-up to https://android-review.googlesource.com/153623\nwhich prevented android::base::InitLogging() from being called when\ntracing was disabled.\n\nIt is ok to call InitLogging() on a device or host because calling it\ndoes not imply that a logging file is used, which was the reason for\nnot calling it on a device.\n\nSo this change should preserve the device behavior of not using a\nlogging file when tracing is disabled, plus it will call InitLogging()\nall the time in case logging APIs are called.\n\nChange-Id: I3fd6ba2c567f67a2f111a85f174893fbf866ec57\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "5fe6d0d1319be46bb98144e00f9da10da68d02aa",
      "tree": "9e8115394b43baa4f2350e46382a7835d4c6826e",
      "parents": [
        "b28812f800fcf5eaf26cc8b3145661d85d910ea9"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Aug 11 13:40:42 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Aug 11 14:00:15 2015 -0700"
      },
      "message": "Remove confusing variable HOST.\n\nFirst, HOST is always 0 in adbd, which matches ADB_HOST\u003d0.\nSecond, HOST is always 1 when adb_main is called, which matches ADB_HOST\u003d1.\nFor adb client that doesn\u0027t call adb_main, it never touches local_init(),\ninit_transport_registration() and fdevent_loop(). So the changes in adb.cpp,\nservices.cpp and transport_local.cpp do nothing with it.\nAs a conclusion, I think we can remove HOST and use ADB_HOST instead.\n\nChange-Id: Ide0e0eca7468b6c3c130f6b50974406280678b2e\n"
    },
    {
      "commit": "b28812f800fcf5eaf26cc8b3145661d85d910ea9",
      "tree": "5ad8400eca8c7af26df5ab809a94f66745fb7215",
      "parents": [
        "a55dbd8dd32a1b12d337c4e4846fc6972e0dfb91"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Sat Aug 08 15:07:07 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Sat Aug 08 15:07:07 2015 -0700"
      },
      "message": "adb: win32: write ACK to separate pipe instead of stdout\n\nThe win32 version of a55dbd8dd32a1b12d337c4e4846fc6972e0dfb91. The big\ntechnique is to fit a Win32 HANDLE value in an int because it only uses\n32-bits. This allows most of the other adb code to stay the same.\n\nAlso, fix a regression in the \u0027adb server nodaemon\u0027 command that was\nerroneously returning an error when --reply-fd was not used, which\nshould not be necessary for this particular command.\n\nChange-Id: I37e9c609014b813af93bf0d6c12f665b59c93c41\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "a55dbd8dd32a1b12d337c4e4846fc6972e0dfb91",
      "tree": "c96c62656a9ddec795e3c746e900d5bda06fd65e",
      "parents": [
        "acbdda4d752aa2a5f4dd872f1c31855cc813862b"
      ],
      "author": {
        "name": "Siva Velusamy",
        "email": "vsiva@google.com",
        "time": "Fri Aug 07 10:10:29 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Aug 07 11:31:07 2015 -0700"
      },
      "message": "adb start-server: Use a separate fd for sending initial OK\n\nWhen \"adb start-server\" is issued, and a server needs to be launched,\nadb client forks itself and the child process runs the server routine.\nOnce the server initializes its various components, it sends an \"OK\\n\"\nback to the client via its stderror (or stdout on Windows).\n\nThis sequence breaks down if before sending the \"OK\\n\", the server\nhappens to log something on its stderr. In order to avoid this, the\nclient now expects the ack to come on a different fd rather than one\nof the standard streams.\n\nBug: https://code.google.com/p/android/issues/detail?id\u003d182150\n\nChange-Id: I9d58a08068d71eb3b77e8a7377e934631c016466\n"
    },
    {
      "commit": "1711e01f1452f8f8caf315ca23618b17f0811596",
      "tree": "ff2cbeba5e70405ad1af06daab19eeb0c505f390",
      "parents": [
        "d0bdf9a27e8a3e17b1e666887ed2d85d94d606b5"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Sun Aug 02 18:50:17 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Sun Aug 02 18:50:17 2015 -0700"
      },
      "message": "adb: win32: call SystemErrorCodeToString() from more places\n\nImprove some error messages, or trace output.\n\nChange-Id: Ib09fac33a296f090d37f125cad7556fc5b5e928e\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "6815c07fbe95c9f38362d5cbf80d8286e3d86950",
      "tree": "4675cd2e9c7cfc7cc929796485b1e36f081ac21e",
      "parents": [
        "c5dc27027a99fb09503d96a875a23c03eb4ac885"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Mon May 11 01:08:48 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Jul 31 13:30:41 2015 -0700"
      },
      "message": "adb: win32: Unicode path names, env vars, some console support\n\nInitial support for Unicode file/dir names. Unicode paths can be passed\non the command line, directory enumeration can enumerate Unicode paths,\nUnicode paths are used for file access, and Unicode paths can be output\non the console correctly.\n\nAlso Unicode environment variable access.\n\nInitial support for Unicode output from adb shell (which uses\nadb_fwrite()). This is partial because the corner case of an\nadb_fwrite() call with an incomplete UTF-8 multi-byte sequence does not\noutput correctly, but this should be uncommon, is better than what we\nhad before (*always* incorrect UTF-8 multi-byte sequences) and can be\nfixed in the future.\n\nCalls to Windows APIs with char strings were changed to pass wchar_t\nstrings to the FooW() variants.\n\nFor more details, see the giant comment in sysdeps_win32.cpp.\n\nhttps://code.google.com/p/android/issues/detail?id\u003d8185\n\nChange-Id: I7ebf6713bb635638b986ccee97b354428837c9c5\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": "9536513ff43a98b0c35c60df3fa6d9e834b8458a",
      "tree": "e152d64b1f80779e4911f6b72efcde233ff67631",
      "parents": [
        "94c05fb9d2d23038837196a0553b49c2ba85d174"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Wed Jul 29 17:21:21 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Wed Jul 29 17:21:21 2015 -0700"
      },
      "message": "fix adb {forward,reverse} --no-rebind\n\nadb forward --no-rebind (and the matching reverse command) seem to have\nbeen broken by d98ca8a92f6bf81a351472f36fac9a04a402327e. I fixed-up the\nstring parsing and also fixed the error message not to include\nstrerror(errno) since that does not apply because it is an\napplication-level error that doesn\u0027t have anything to do with the\nOS/libc.\n\nChange-Id: Iba7286283bfcf1782076355edcd9c355c0a0edfd\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "a1c60c0597f8f978fd6568c19fb90993592e031d",
      "tree": "167659e4796194f01f2109748ba035e5e7230f5f",
      "parents": [
        "34f6f58d0fdbaa23288ad4f79503bfd51c7a7ce5"
      ],
      "author": {
        "name": "Tamas Berghammer",
        "email": "tberghammer@google.com",
        "time": "Mon Jul 13 19:12:28 2015 +0100"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 22 13:06:06 2015 -0700"
      },
      "message": "Increase size of the the adb packets sent over the wire\n\nThe reason behing this change is to increase the adb push/pull speed\nwith reduceing the number of packets sent between the host and the\ndevice because the communication is heavily bound by packet latency.\n\nThe change maintains two way compatibility in the communication\nprotocol with negotiating a packet size between the target and the\nhost with the CONNECT packets.\n\nAfter this change the push/pull speeds improved significantly\n(measured from Linux-x86_64 with 100MB of data):\n\n           | Old push | Old pull || New push  | New pull  |\n-----------------------------------------------------------\nHammerhead | 4.6 MB/s | 3.9 MB/s || 13.1 MB/s | 16.5 MB/s |\n-----------------------------------------------------------\nVolantis   | 6.0 MB/s | 6.2 MS/s || 25.9 MB/s | 29.0 MB/s |\n-----------------------------------------------------------\nFugu       | 6.0 MB/s | 5.1 MB/s || 27.9 MB/s | 33.2 MB/s |\n-----------------------------------------------------------\n\nChange-Id: Id9625de31266e43394289e325c7e7e473379c5d8\n"
    },
    {
      "commit": "ad7c49f50fc1bbc82f4c9307f46ef11f1f6ee261",
      "tree": "38fe843e2d484b963ad731829ed53f207159f2c3",
      "parents": [
        "5c761bdf94bcdaf3a619cde002ef60c9b226f5c3",
        "09ccf1fa62cef5ce1f3766683df29b8467444a79"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jul 21 22:29:05 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Jul 21 22:29:05 2015 +0000"
      },
      "message": "Merge \"Recognize IPv6 addresses for \"adb connect\".\""
    },
    {
      "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": "5c761bdf94bcdaf3a619cde002ef60c9b226f5c3",
      "tree": "62e95a1ffffde3814c2818c52b2d9404856b57ae",
      "parents": [
        "bba4d471283190dd9b153b7e13efdb28da0b6695"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue Jul 21 02:06:26 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Tue Jul 21 02:06:26 2015 -0700"
      },
      "message": "adb: logging: newlines, thread ids, error code overwriting\n\nAdd missing \\n to uses of legacy D() macro. This should make the legacy\nlogging easier to read (and harder to miss important stuff).\n\nOn POSIX, use gettid() from libcutils instead of pthread_self() so that\nthe output shows a more reasonable number instead of a pointer value.\nThis should be ok since libbase\u0027s logging already uses gettid().\n\nWin32:\n\nDon\u0027t let the Win32 last error get overwritten by API calls after the\noriginal error\u0027ing API. When encountering an unknown error, log the\nspecific error code.\n\nChange-Id: Ib8f72754efa7ba895d2f1cd914251fec2a1d894c\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "24f5276345d7f1b6cba973ed728179d7df0b8f22",
      "tree": "0b0aef126945f6a606906468a096d9826daab531",
      "parents": [
        "d7eb85491f7f2347a21fad16300f7f3c653f108b"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jun 23 13:00:32 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jun 24 10:36:41 2015 -0700"
      },
      "message": "Improve the \"device \u0027(null)\u0027 not found\" error.\n\nNow we\u0027ll say \"no devices found\" if you haven\u0027t set ANDROID_SERIAL and\nthere\u0027s no device connected to default to.\n\nAlso clean up the relevant code a little.\n\nChange-Id: Id254929629ce0888628d5ba8e67cd996ffbf9c8a\n"
    },
    {
      "commit": "d7eb85491f7f2347a21fad16300f7f3c653f108b",
      "tree": "e4bb87a59fc2a1be6bc31771e50eb74c27cce7ac",
      "parents": [
        "11f73a1fe2e2aa2954b6f744d1947faca82ecca0"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jun 17 15:23:42 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jun 18 10:19:30 2015 -0700"
      },
      "message": "Ignore ro.adb.secure in user builds.\n\nRequire authorization by default, and remove the ability to override\nthat in user builds. (userdebug and eng are still free to do whatever\nthey want.)\n\nBug: http://b/21862859\nChange-Id: Ibf8af375be5bf1141c1ad481eee7a59fb10a7adb\n"
    },
    {
      "commit": "675f1bdbc2c4d8f7ef421861ec226eebbdb2e7b3",
      "tree": "79f9e9ec95e021d63ef0c472de78f861dcbdbf15",
      "parents": [
        "2b113d6427ee3accc07cd85d833f81a9bf46bfe7",
        "4911f4b02685d0f41e043f2cef8e3d1f7403ff09"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jun 08 22:21:30 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Jun 08 22:21:31 2015 +0000"
      },
      "message": "Merge \"adb: win32: fix logging to adb.log\""
    },
    {
      "commit": "f4ca27d01692f924591889e16f933fef1b8de332",
      "tree": "01fcd33fc28944aaf9c1a91b09256966d249ee61",
      "parents": [
        "7f0dba11cf1784de4a038eb7bebe02f307892218"
      ],
      "author": {
        "name": "Paul Lawrence",
        "email": "paullawrence@google.com",
        "time": "Fri Jun 05 16:00:07 2015 -0700"
      },
      "committer": {
        "name": "Paul Lawrence",
        "email": "paullawrence@google.com",
        "time": "Fri Jun 05 16:01:48 2015 -0700"
      },
      "message": "adb shouldn\u0027t trace unless told to\n\nPrevents clean unmount of /data in crypto bounce\n\nBug: 21516860\nChange-Id: I1f761dfdf216dcb35b4609cd46cc4d0644cc4a81\n"
    },
    {
      "commit": "45ca8941d31cbcc7febe46527631adbee09d4cf1",
      "tree": "b2a85a1ef08e8077c9022ab54449babe59c2efb8",
      "parents": [
        "d98ca8a92f6bf81a351472f36fac9a04a402327e",
        "3a2421b940e844e6c29da9ec389da42dc87f90f2"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jun 04 22:28:49 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Jun 04 22:28:50 2015 +0000"
      },
      "message": "Merge \"adb: fix adb_close() vs. unix_close() usage\""
    },
    {
      "commit": "4911f4b02685d0f41e043f2cef8e3d1f7403ff09",
      "tree": "aed3c1cd78f581def1238b0d1c54356350396ba8",
      "parents": [
        "d98ca8a92f6bf81a351472f36fac9a04a402327e"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Wed May 20 23:17:26 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "compareandswap@gmail.com",
        "time": "Tue Jun 02 21:04:56 2015 +0000"
      },
      "message": "adb: win32: fix logging to adb.log\n\nIn the adb client, redirect stdin and stderr of the adb server to `nul\u0027,\nso that when the adb server starts up, it avoids issues in the C Runtime\nwhere it closes stderr, making it hard to properly reopen. There are\nprobably other ways to avoid this issue, but I think this is the\ncleanest that will keep working over the years and will exercise the\nmost commonly used code-paths in the C Runtime.\n\nFix some adb_close() calls to be unix_close() (only really matters on\nWindows).\n\nMake stderr non-buffered on Windows, to match the (sensible) Linux\nbehavior.\n\nChange-Id: I1b15c64240e50dbeb56788b0d0d901f4536ad788\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "d98ca8a92f6bf81a351472f36fac9a04a402327e",
      "tree": "52b3e4106efcec99a1e03f95ab8d443582ba130f",
      "parents": [
        "b1d05de8a377b369b424d0e6c79f1843581bc1e9"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 29 17:55:19 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 29 18:03:57 2015 -0700"
      },
      "message": "Fix error handling/reporting for \"adb forward\" and \"adb reverse\".\n\nWe really need better infrastructure for parsing adb subcommands, but\nin the meantime...\n\nAt least this cleans up a little more of the implementation too.\n\nBug: http://b/20736014\nChange-Id: I76209847da3724906c71924017bcb69fa31e0b49\n"
    },
    {
      "commit": "3a2421b940e844e6c29da9ec389da42dc87f90f2",
      "tree": "331a2e72aa1ce7167daba893914f0ffc386b1b2f",
      "parents": [
        "b1d05de8a377b369b424d0e6c79f1843581bc1e9"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Fri May 22 20:09:06 2015 -0700"
      },
      "committer": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Fri May 22 20:20:49 2015 -0700"
      },
      "message": "adb: fix adb_close() vs. unix_close() usage\n\nDocument the differences between adb_*() and unix_*() in the function\nprototypes in sysdeps.h. See the file for the details (CR/LF\ntranslation, well-known file descriptors, etc.).\n\nFix adb_read(), adb_write(), and adb_close() calls that should really be\nunix_read(), unix_write(), and unix_close(). Note that this should have\nno impact on unix because on unix, unix_read/unix_write/unix_close are\nmacros that map to adb_read/adb_write/adb_close.\n\nImprove sysdeps_win32.cpp file descriptor diagnostic logging to output\nthe name of the function that was passed a bad file descriptor.\n\nChange-Id: I0a1d9c28772656c80bcc303ef8b61fccf4cd637c\nSigned-off-by: Spencer Low \u003cCompareAndSwap@gmail.com\u003e\n"
    },
    {
      "commit": "08d552b1da44146fe91e7448cde7f9aff0fcf18f",
      "tree": "571e89b7fedd58a5092338223060c26ff8988cb0",
      "parents": [
        "4f246adfa10dcf9439d3c1c352414c9d7bb50032"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu May 21 13:58:50 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu May 21 16:25:57 2015 -0700"
      },
      "message": "Improve logging.\n\nAny output from the LOG family will now go to stderr and logcat on the\ndevice. stderr is usually redirected to a log file, but that is now\ninhibited for adbd if being run from a tty (useful when debugging with\nthe serial console).\n\nThis also fixes sending logs to the file on device for the trace mask\nof \"all\". The \"all\" tag was specifically handled to return early from\nthe function, preventing the file initialization from happening.\n\nChange-Id: Id253577bfd1500fbce92dbfba0f9be23dbfd5ee4\n"
    },
    {
      "commit": "27929b0f8282de39293fe57962a561c3cf72f6b8",
      "tree": "a53d14a1f265eb9f9126e73dde767084944cdc38",
      "parents": [
        "9ca39e3b3771099dc41dd37968c56a2d15c3a4fc"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Mar 19 13:25:27 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu May 21 15:03:44 2015 -0700"
      },
      "message": "Clean up adb_trace_init.\n\nOld code was a mess for splitting a string and then searching a list\nwhen they really wanted a map.\n\nTo more closely match ANDROID_LOG_TAG, only use a space separated list\nrather than space/colon/semi-colon/comma.\n\nChange-Id: I915ff4968e42d5f8dec1b43b6eacc0c8d7b44d7b\n"
    },
    {
      "commit": "9a50f4ccb8668f15c8d4eaf924fcfd769b1003ff",
      "tree": "797356a734389ac53d6f03132d7fa8af7af42dab",
      "parents": [
        "5bf0f162de66a2f5a189c75fc63aac23d7b2c387"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon May 18 16:43:57 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon May 18 17:10:33 2015 -0700"
      },
      "message": "Make connection states a proper type.\n\nChange-Id: I809f9b327c832b88dd63151bf7dcb012d88e81c4\n"
    },
    {
      "commit": "53a3744981a350cd3a35f7e062c6fd05cf8be24a",
      "tree": "76bd2c0a306a9dac27d9c9b03e72a241a56e61c9",
      "parents": [
        "e66e677c1d14ad932700d37844d8e78bec584078"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri May 08 16:13:53 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri May 08 17:33:21 2015 -0700"
      },
      "message": "Revert \"Revert \"Split adb_main.cpp into client and daemon.\"\"\n\nThis reverts commit 151f4887d194a642b4a276276344d4ea5b05d477.\n\nChange-Id: I74088db34983dc99e316a07c6ddc294340e0eb71\n"
    },
    {
      "commit": "151f4887d194a642b4a276276344d4ea5b05d477",
      "tree": "0e11729e2cedfdc40c88cab2982ec76a495689d0",
      "parents": [
        "100889ccbdc10c603445feb83455d9438b932289"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri May 08 16:08:57 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri May 08 16:08:57 2015 -0700"
      },
      "message": "Revert \"Split adb_main.cpp into client and daemon.\"\n\nThis reverts commit ad87c02ce2e9545a255991b646e057337718b728.\n"
    },
    {
      "commit": "ad87c02ce2e9545a255991b646e057337718b728",
      "tree": "498db75192460a033fb1a8580f1ff6bc321b7324",
      "parents": [
        "818aa86ae676c2895a0779efcd9eb4e261c40be3"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue May 05 19:25:23 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri May 08 10:20:26 2015 -0700"
      },
      "message": "Split adb_main.cpp into client and daemon.\n\nThe name \"client\" is somewhat misleading as it also contains the host\nside adb server, but it\u0027s a part of the client binary.\n\nChange-Id: I128b7bab213e330eb21b5010cd1fec5f7a62c8af\n"
    },
    {
      "commit": "9d07feecf5ab3d3471a5e15d1499351a24008ac4",
      "tree": "80c649a41c27b7fe82bb4b002249986886aa7e67",
      "parents": [
        "7dc759fb0c860d8e8cf44375556ed1c9089b52e8"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu May 07 21:38:41 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu May 07 21:38:41 2015 -0700"
      },
      "message": "Add some missing \u0027const\u0027s.\n\nChange-Id: I5bd26d4366e10fc8c6bc255b7ddb174a7a8b82a5\n"
    },
    {
      "commit": "3aec2ba9f5297a94b52f479cbf741121e2910152",
      "tree": "02dc43658386df1391e0d6cf54d42bc53d41a234",
      "parents": [
        "32ce0f86ecc3f4a187de76e7facd4b0d171fe46b"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue May 05 13:10:43 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue May 05 13:10:43 2015 -0700"
      },
      "message": "Give enum types CamelCase names for clarity.\n\nChange-Id: I1c89f1cc155ee839f372fb14d972a288183b8bcd\n"
    },
    {
      "commit": "fb59684b188e9dd2649592f5e357fd4996522138",
      "tree": "7849490fabea8d735e4096b9064e680b839012b3",
      "parents": [
        "88b4c85a6f7fbc094f55c9e5322e1e16857006a2"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 01 17:04:38 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 01 17:36:46 2015 -0700"
      },
      "message": "Add WriteFdFmt and clean up more code.\n\nAlso say *which* device wasn\u0027t found.\n\nBug: http://b/20666660\nChange-Id: I50e234ad89e39ae0a8995083c0b642c61275c5a3\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": "b27e24180f62900160c5734d005706b6cf128efc",
      "tree": "e9a2e16429bdd65bd1411e043f2b48451cbc97cb",
      "parents": [
        "59a1fb8a1846a1f14e0a3f1a6136717fb3f45ae1"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Apr 29 22:37:25 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Apr 29 22:37:25 2015 -0700"
      },
      "message": "Add missing \u0027else\u0027 to fix all devices showing up as \"host\".\n\nBug: http://b/20705355\nChange-Id: I4f7830278f0c2bc87d95d148d85455b8da894645\n"
    },
    {
      "commit": "fb2ba514edb9ae9a086daef54aa7a61708595442",
      "tree": "0e5ac03f0144b548c0938e3599fd8b8573b41394",
      "parents": [
        "949f2620c7ae33742ad639cf893c007204dc2074"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Apr 24 23:02:00 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Apr 27 19:42:20 2015 -0700"
      },
      "message": "Remove strtok from adb.\n\nAlso fix android::base::Split to behave like Java, Python, and google3.\n\nChange-Id: Ifbffd4e92950a79e7aea5d153c95fe0980648417\n"
    },
    {
      "commit": "a585cbd5aa8210095c7ed5e098dd67ab20649424",
      "tree": "721a7b7260106e6d56002feef2c6f57a858e18a2",
      "parents": [
        "bebf693cba868feff20031443b534842c0b439c0"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Apr 20 08:09:20 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Apr 20 08:09:20 2015 -0700"
      },
      "message": "Always explain why bind(2) failed.\n\nThis has confused several people lately.\n\nBug: http://b/20219978\nChange-Id: I2537ceb83bff0b3166c230c728d4389a983db858\n"
    },
    {
      "commit": "ab88242ece4a44d79acb5dfc8dd52bb418f5c427",
      "tree": "4de96573c4e36b7fb03aa823f762a991d41c8f47",
      "parents": [
        "c084e0c4116d0b001184a69c70d0ef564dc93579"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Apr 16 22:54:44 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Apr 16 22:54:44 2015 -0700"
      },
      "message": "Show $ADB_VENDOR_KEYS if authentication fails.\n\nIncorrectly set $ADB_VENDOR_KEYS is the most likely cause of failed\nadb connections. Make it easier to debug such problems by including\nthe value in use in the error message.\n\nBug: 20165551\nChange-Id: I64c1d98ae6d3fb40eea9e1f0ddcfcf4f2d9d7318\n"
    },
    {
      "commit": "dec2b249b4ab158e3bb7304081bd517825e7a877",
      "tree": "e127539e7221887a839af9a58ec9fef8618178ed",
      "parents": [
        "d174d5f1fd9a05f4aac8029fe530f268012b97f1"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Mar 19 22:53:30 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri Mar 20 09:49:15 2015 -0700"
      },
      "message": "Additional cleanup of start_device_log.\n\nAddresses nnk\u0027s post commit review comments on\nhttps://android-review.googlesource.com/#/c/139381/\n\nRemove unneeded code for creating /data/adb.\n\nAdd an O_CLOEXEC.\n\nMove the closing of stdin out to main().\n\nAppend the pid of the current process to the log file to avoid\nclobbering the log if the process crashes and restarts within the same\nsecond.\n\nChange-Id: Ide0be86b4b33256486634c29ba02efaf10cf913d\n"
    },
    {
      "commit": "ecbd87460fd8027fbc7dd309281104766dc6e70a",
      "tree": "3ba96a30194d05164579102c734a2bc48495b418",
      "parents": [
        "fdd3d644b3680f22e06ecf0d4e84f8adc26fd68a"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Sun Mar 08 21:12:08 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Mar 19 21:50:10 2015 -0700"
      },
      "message": "Use text based trace masks for adbd.\n\nPreviously the adbd trace mask had to be set as raw hex rather than\nwith the colon separated list. We all have better things to do than\nmemorize bitmasks, so make adbd use the same trace mask setting code\nas adb.\n\nChange-Id: I0bf0ab61c070d06d1cc2acf1ed90b2b77ccd261b\n"
    },
    {
      "commit": "db6fe6428c1ca5f397d3853f2b96c3e3e878b172",
      "tree": "7c788a60093d22977baee6c6625107abf40b66e3",
      "parents": [
        "0e0ce0662e948b9cfb1b42e48f18d3c4643b6c1e"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Mar 19 15:21:08 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Thu Mar 19 15:32:33 2015 -0700"
      },
      "message": "File header cleanup.\n\n * sysdeps.h should always be included first.\n * TRACE_TAG needs to be defined before anything is included.\n * Some files were missing copyright headers.\n * Save precious bytes on my SSD by removing useless whitespace.\n\nChange-Id: I88980e6e00b5be1093806cf286740d9e4a033b94\n"
    },
    {
      "commit": "f30d73c74d85ccc2b1f55d6946f616e62d67e48e",
      "tree": "b2302299d3d083ba83949a80213b92d66540201f",
      "parents": [
        "b5f43a12723896c2d8fc98eed5abce563a16f56b"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Wed Feb 25 17:51:28 2015 -0800"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon Mar 09 14:06:11 2015 -0700"
      },
      "message": "Move adb to C++.\n\nI keep trying to clean things up and needing std::strings. Might as\nwell just do this now.\n\nusb_linux_client.c is going to stay as C because GCC isn\u0027t smart\nenough to deal with the designated initializers it uses (though for\nsome reason it is in C mode).\n\nThe Darwin files are staying as C because I don\u0027t have a way to test\nthat they build.\n\nThe Windows files are staying as C because while I can actually build\nfor them, it\u0027s slow and painful.\n\nChange-Id: I75367d29205a9049d34460032b3bb36384f43941\n"
    },
    {
      "commit": "b5f43a12723896c2d8fc98eed5abce563a16f56b",
      "tree": "f81933396150903b8b0d0fa38e9faa081376253a",
      "parents": [],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon Mar 09 20:29:02 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Mar 09 20:29:07 2015 +0000"
      },
      "message": "Merge \"Fix a writex transcription error.\""
    }
  ]
}
