)]}'
{
  "log": [
    {
      "commit": "e76e5ef43ceba003ce5a62314019c4626d33265a",
      "tree": "f41cd05251da414e946eb7cde2cf6c66ce07c6de",
      "parents": [
        "d3e5a5dc5313792dd66f0531c8075ec6e5cf0bf1"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jun 25 21:43:49 2024 +0000"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jun 25 21:43:49 2024 +0000"
      },
      "message": "Move error_exit() and perror_exit() into client/.\n\nThey\u0027re only meant to be used in the client. This does mean one small change needed to a daemon fork child, but `_exit(127)` is the traditional way to say \"exec failed\" anyway.\n\nChange-Id: I5ed2d85cf5532d005358ffa546e321b9cc6edbcd\n"
    },
    {
      "commit": "79fe9ab01d3d62f279700b3a0b155ad2878e38c6",
      "tree": "dc77ac150ea14c2351659cfaa9aadf4a1f2975f8",
      "parents": [
        "835d90e88b019cc0661d6702940b4f7145a80318"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jul 30 12:26:31 2019 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jul 30 12:26:31 2019 -0700"
      },
      "message": "Allow overriding the log path.\n\nBug: https://issuetracker.google.com/112588493\nTest: manual\nChange-Id: Ic273d46544479332b8e031f30feadd1840f2d653\n"
    },
    {
      "commit": "90228a63bb6a59e8195165fbb7c332be27459696",
      "tree": "627a2f393951cc4f4b0b307c04e1d09b8eda942e",
      "parents": [
        "527a1b3a82b4038bb86e9b43c00b76283e1350d2"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Apr 25 14:04:57 2019 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Mon May 06 16:18:02 2019 -0700"
      },
      "message": "Revert \"Revert \"Add a way to turn off unique_fd\u0027s operator int.\"\"\n\nThe original commit broke aosp-master-with-phones, because of\nvendor libraries the depended on the int versions of libbase functions.\n\nThis patch reverts the revert, and also adds ABI-compatibility shims for\nthe replaced functions.\n\nThis reverts commit dfdf916d09f6583d3fd1db1e33c79ed60bff2480.\n\nBug: http://b/131312539\nTest: treehugger\nTest: forrest run of aosp-master-with-phones\nChange-Id: I75cc84ec8d963e20862f7662e8e2f409471f41cc\n"
    },
    {
      "commit": "dfdf916d09f6583d3fd1db1e33c79ed60bff2480",
      "tree": "8e02ad6551dcc3593b5105963c1d1d5a72fceefc",
      "parents": [
        "6bc77009177ba2de4c25a2c8f17bee826c0540a3"
      ],
      "author": {
        "name": "Ian Kasprzak",
        "email": "iankaz@google.com",
        "time": "Thu Apr 25 15:59:28 2019 +0000"
      },
      "committer": {
        "name": "Ian Kasprzak",
        "email": "iankaz@google.com",
        "time": "Thu Apr 25 15:59:28 2019 +0000"
      },
      "message": "Revert \"Add a way to turn off unique_fd\u0027s operator int.\"\n\nThis reverts commit 6bc77009177ba2de4c25a2c8f17bee826c0540a3.\n\nReason for revert: b/131312539 - All aosp-master-with-phones phones failing boot / health check.\n\nChange-Id: Id4239f93484b7d6b8d9bcd355a59cbd40d9766e2\n"
    },
    {
      "commit": "6bc77009177ba2de4c25a2c8f17bee826c0540a3",
      "tree": "97b63d6b7c86394ab0a1dc40eedca8f7ce305378",
      "parents": [
        "4c0c9c90e1ae4fb8ef7312833a825bc3c3bee62b"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Apr 18 16:39:30 2019 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Apr 24 12:59:42 2019 -0700"
      },
      "message": "Add a way to turn off unique_fd\u0027s operator int.\n\nunique_fd\u0027s implicit conversion to int has led to tons of problems (see\nall of the overloads for close, fdopen, fdopendir, etc.). Add a switch\nthat can turn it off, and reduce the ridiculous amount of work to fix up\ncallers by introducing a borrowed_fd type that can be constructed from\neither int or unique_fd.\n\nTest: treehugger\nChange-Id: If77cf5cbcaddacdaec5919a15b3520fb68f51a62\n"
    },
    {
      "commit": "e2f32340d2d852c7d43a2ef07c74faac0d0f7ee5",
      "tree": "ccd9752029e49e7ae441264e3f9f4e63c0331ba6",
      "parents": [
        "c7a409036e606a1d0cace8b066ef9a87e61c5b48"
      ],
      "author": {
        "name": "Greg Kaiser",
        "email": "gkaiser@google.com",
        "time": "Tue Mar 26 11:58:53 2019 -0700"
      },
      "committer": {
        "name": "Greg Kaiser",
        "email": "gkaiser@google.com",
        "time": "Tue Mar 26 12:00:19 2019 -0700"
      },
      "message": "adb: Avoid extra std::string copies\n\nWhen a function argument takes a std::string, it\u0027s inefficient to\npass std::string::c_str(), since that creates an additional copy.\nSo we change these calling sites.\n\nTest: TreeHugger\nChange-Id: I1c0fde7275eb3ebd3baf05ec62581b0243655608\n"
    },
    {
      "commit": "114cf9913ecd4c5a1e021245b311f0dcaadbb4ec",
      "tree": "ba72e2f3180ff773e3e15c2526bc55a99b505eca",
      "parents": [
        "281aab7a0ab90fe9cb468ccefa28af2f6e1fd0fd"
      ],
      "author": {
        "name": "Robert Yang",
        "email": "decatf@gmail.com",
        "time": "Wed Oct 24 13:07:50 2018 -0400"
      },
      "committer": {
        "name": "Robert Yang",
        "email": "decatf@gmail.com",
        "time": "Wed Oct 24 15:23:55 2018 -0400"
      },
      "message": "adb: Use a default _SC_GETPW_R_SIZE_MAX size\n\nsysconf(_SC_GETPW_R_SIZE_MAX) may return −1 if there is no hard limit\non the the buffer size. Some libc implementations such as musl don\u0027t\ndefine this limit and will return -1.\n\nUse a default buffer size to handle this case.\n\nChange-Id: I997b13a2c2dca00574e049a259135e61c8ed8e03\nSigned-off-by: Robert Yang \u003cdecatf@gmail.com\u003e\n"
    },
    {
      "commit": "0119a91d6ae95ee9f607240f2e918cec5359ff14",
      "tree": "64e119ab861995610fb1020472ac2eeef6fb80a1",
      "parents": [
        "e64126b0e3735f94c08f1802f0ef483b17b2e37d"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Oct 22 17:02:51 2018 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Oct 22 17:04:32 2018 -0700"
      },
      "message": "adb: don\u0027t use \u003cerror.h\u003e.\n\nThis should fix the bloody Mac build, which doesn\u0027t have \u003cerror.h\u003e. Since\nwe weren\u0027t entirely happy with error(3) anyway, switch to the toybox\nstyle of error_exit and perror_exit, which are slightly briefer and quite\na bit more intention-revealing.\n\nBug: N/A\nTest: builds\nChange-Id: Ic8e411906c363af51657da5ce947b25a0b6bb1f3\n"
    },
    {
      "commit": "e64126b0e3735f94c08f1802f0ef483b17b2e37d",
      "tree": "a90ac1906d678934278fe88afd10902fd943d927",
      "parents": [
        "2b8b5059abd1ffacf7520e952b806bf667c73b21"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Oct 19 13:59:44 2018 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Oct 19 14:04:24 2018 -0700"
      },
      "message": "adb: rationalize fatal/error logging.\n\nLet\u0027s use LOG(FATAL)/PLOG(FATAL) for actual fatal stuff.\n\nAdd a Windows error(3) and move folks who didn\u0027t really mean \"abort\"\nfatal over to it. Also get rid of syntax_error which wasn\u0027t adding a\nlot of value, and most of the places it was adding \"usage: \" didn\u0027t seem\nentirely appropriate anyway.\n\nIn particular, we seemed to have confused fastdeploy.cpp into aborting\nin most user error cases, and none of the reviewers noticed. Clearly\nwe\u0027d all lost track of far too many options.\n\n(I\u0027ve also cleaned up a few random instances of fprintf(3) + exit(2).)\n\nBug: N/A\nTest: manual\nChange-Id: I3e8440848a24e30d928de9eded505916bc324786\n"
    },
    {
      "commit": "7d13c5981a8f77ff625404d187cc35494f34a2d0",
      "tree": "efd158dd134b8eaf13e996442706755e2b7e8a20",
      "parents": [
        "a67a11d95739a1c2136a1caa30b04f492610b353"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Oct 11 13:49:24 2018 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Oct 12 16:38:52 2018 -0700"
      },
      "message": "adb: extract helper for dumping a packet header.\n\nTest: mma\nChange-Id: I3e15296eb917d9df11ca13591d26d3aa54d66412\n"
    },
    {
      "commit": "c3462f4dabf26b0959e8235011f23c3ec9c92716",
      "tree": "75b07d6d9302b5970479dc08f612c329b8f0a998",
      "parents": [
        "288cbc9db1df9114e97a6fba9db4a3226c9943d7"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Sep 05 12:13:11 2018 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Sep 05 12:13:11 2018 -0700"
      },
      "message": "adb: static constexpr.\n\nAlso inline some single-use constants.\n\nBug: N/A\nTest: ran tests\nChange-Id: I1ac028667772599291da402120a270d0667fed04\n"
    },
    {
      "commit": "028e97e5edc98373a0b9c7216e3b116e005bd463",
      "tree": "a6709ce25b965f19b2ac3520e1184c506ed5fa81",
      "parents": [
        "b7011367ba36543b9c04ef2d54646d579508d94d"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Mon Aug 06 18:36:58 2018 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Mon Aug 06 18:50:10 2018 -0700"
      },
      "message": "adb: move AdbCloser to its rightful place.\n\nTest: mma\nChange-Id: Ie74c49e8abf72f594a35d04b2b0d99b96f58f8d0\n"
    },
    {
      "commit": "934d4b18f132df2c3e2a64ef7e82da43f2635d61",
      "tree": "1562cb1d3fc5ab85830f3c4b460fe552470dcb73",
      "parents": [
        "f96711775ea639054f9904db6c29a778d3b4e332"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Mon Jul 09 23:51:58 2018 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Tue Jul 10 23:32:09 2018 -0700"
      },
      "message": "adb: fix escape_arg for multiple quotes\n\nescape_arg reuses the same index for the source (s) and the destination\n(result), so it breaks on strings containing more than one quote, e.g:\n\n * a\u0027b\u0027c    \u003d\u003d\u003e \u0027a\u0027\\\u0027\u0027b\u0027c\u0027\n * a\u0027bcde\u0027f \u003d\u003d\u003e \u0027a\u0027\\\u0027\u0027b\u0027\\\u0027cde\u0027f\u0027\n\nAlso make the function more efficient by doing fewer string copies. This\ncode is based on the android::base::Split code.\n\nUse EXPECT_EQ because the tests can keep going if one fails.\n\nBug: none\nTest: adb_test --gtest_filter\u003dadb_utils.escape_arg\nChange-Id: I6ca6e905fa53cc61b9a87276cb7116a5df7e8017\n"
    },
    {
      "commit": "fc45f280b6be557e4a037236ee2a3070ec792de3",
      "tree": "592e2df8c7d3281e8b326feec786bd798a96a2b6",
      "parents": [
        "1046bc5b64951e88435bd312f48409627c46d88a"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Jun 27 13:26:14 2017 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Jun 27 13:26:14 2017 -0700"
      },
      "message": "Indicate that a packet was truncated.\n\nTest: make checkbuild, check adb log\nBug: None\nChange-Id: I0006ed284697f01966fdd79ca0b05dbc6d2eecf0\n"
    },
    {
      "commit": "cd61ae3a66975b17796326c6b720dd2ef8bb5c65",
      "tree": "f8919098e340b573747371b30e32ae1ef303e11f",
      "parents": [
        "bb0d0245b3868c420284a7e3fda49e0d481d535d"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jun 15 08:35:24 2017 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jun 20 14:21:41 2017 -0700"
      },
      "message": "Give a clear error message if we can\u0027t start the server.\n\nBug: http://b/35218713\nTest: adb kill-server ; export HOME\u003d/ ; adb devices\nChange-Id: I53cc30213be0eab84e42b09c7b501362d6e44b05\n"
    },
    {
      "commit": "65bc227d3e59b78b05f81ee2ed19636b78c52e73",
      "tree": "934891891ab7676c07a3b159fd95063d021d87b5",
      "parents": [
        "b087d3062c76dc97e19e02d198dba540bb7ad7cb"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Apr 18 14:34:16 2017 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Apr 18 14:51:27 2017 -0700"
      },
      "message": "Fix various adb error reporting bugs.\n\n`adb install` was writing success to stderr rather than stdout.\n\nServer mismatch messages were going to stdout rather than stderr.\n\nError messages should consistently start with a lower case letter.\n\nAlso improve consistency of syntax error reporting.\n\nBug: https://issuetracker.google.com/37128706 (adb install success to stdout)\nBug: https://issuetracker.google.com/37140458 (server mismatch on stderr)\nBug: http://b/32413861 (consistency)\nTest: ran tests\nChange-Id: I0d6cb0c7482bec03483dacefd996644b7a28d273\n"
    },
    {
      "commit": "a0e185b07f7d70d1f3a7b4920e6839cda776c1f3",
      "tree": "4ec66520044b50136aa101ab3ea0f8cfad9b20ae",
      "parents": [
        "75bd1e0dd49ba423251b0d040fd846f15ca9732d"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Mar 23 16:05:12 2017 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Mar 23 16:19:55 2017 -0700"
      },
      "message": "adb: allow symlinks to directories in directory_exists.\n\nBug: http://b/36516955\nTest: python test_device.py\nChange-Id: Ie81e87aac3b157182bde0955bdba23d48bfea873\n"
    },
    {
      "commit": "e6794076f51e3762fdda315a82e2dbc79f15627a",
      "tree": "e838c86040272d4968fca946cb13443d0e49dd47",
      "parents": [
        "30e9fe635737dfd46c6ceef241a2e8c7ab9c76fb"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Thu Feb 23 21:23:05 2017 -0800"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Feb 27 18:18:31 2017 -0800"
      },
      "message": "Move adb_dirname and adb_basename to libbase\n\nadb already provides an implementation of dirname and basename that\ntake and produce std::strings, move it into libbase so it can be\nused in the implementation of GetExecutableDirectory.\n\nTest: out/host/linux-x86/nativetest64/adb_test/adb_test\nTest: out/host/linux-x86/nativetest64/libbase_test/libbase_test\nTest: adb shell /data/nativetest64/libbase_test/libbase_test64\nChange-Id: Ideb1627607b14562121316d4ed27fa6fb0930684\n"
    },
    {
      "commit": "97e74bb0f3057eb4168822f8608337a176c7e762",
      "tree": "27e440e8d68428cee3fb2cc5b85efc82fe2bdb8f",
      "parents": [
        "f3ca63d4327db60ab5c6e42f4316bb0dcac14800"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Feb 06 16:20:30 2017 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Feb 06 16:20:30 2017 -0800"
      },
      "message": "Don\u0027t print 168^W143 lines of help when someone makes a typo.\n\nPrint actual usage messages in most cases.\n\nAdd --help and --version.\n\nBug: http://b/28054087\nTest: manual\nChange-Id: I39c1cb7a84f52e0c35d24f140ec55c3a181283fb\n"
    },
    {
      "commit": "e7daf5751162830000425c0e7de13a90809f1988",
      "tree": "f21497070656cfc371214565b607eae4ea5e7d52",
      "parents": [
        "007036c0c78dacdf00cff08fe79568f1409d61fc"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Sep 21 12:37:10 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Sep 21 17:22:22 2016 -0700"
      },
      "message": "adb: kill adb_mutex_t, adb_cond_t.\n\nNow that we have support for std::mutex and std::condition_variable on\nWindows, remove our mutex compatibility layer in favor of the C++ one.\n\nBug: http://b/31653591\nTest: mma \u0026\u0026 $ANDROID_HOST_OUT/nativetest64/adb_test/adb_test \u0026\u0026 \\\n      python test_adb.py \u0026\u0026 python test_device.py\n      (also on Windows)\n\nChange-Id: I5b7ed9c45cc2a32edcf4e77b56dc28e441f15f34\n"
    },
    {
      "commit": "ea7457b76d45543d27c5019da925098cd956e8f3",
      "tree": "19d8a9fb93375cb0874c0337450c4ed29392c75a",
      "parents": [
        "62ff9d49da6d3d0d1387eec61fce88cbcb62e57b"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Aug 30 15:39:25 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Sep 01 15:49:06 2016 -0700"
      },
      "message": "adb: extract the adb-specific unique_fd out into its own header.\n\nSome POSIX-only files would like to use functions declared in\nadb_utils.h without being forced to use the sysdeps stuff for open,\nclose, etc. Extract the adb-specific unique_fd into its own header so\nthose files can use adb_utils.h alongside the real unique_fd.\n\nChange-Id: I10344ef26b7e72fce46bf7e3033f89aa54bd6118\nTest: mm\n"
    },
    {
      "commit": "62ff9d49da6d3d0d1387eec61fce88cbcb62e57b",
      "tree": "1436cb0ed31aa74e68ce95af299d2b282b93901b",
      "parents": [
        "827a4a575d5a880f68d2647f9d4a581aca0341fc"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Aug 30 15:23:35 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Sep 01 15:43:22 2016 -0700"
      },
      "message": "adb: add helper to get the ~/.android directory.\n\nExtract the logic for creating ~/.android out of get_user_key_path into\nits own function. Also, fall back to getpwuid_r when $HOME isn\u0027t\ndefined.\n\nChange-Id: I676a7c750cb364f89b544818ffda07903d14fb97\nTest: ran adb with ~/.android missing\n"
    },
    {
      "commit": "cc3a895eb2bdae62901b7c6f6d310a33d5bf1e2b",
      "tree": "83b9314182971205f3c89d436aa1ee6717fea17b",
      "parents": [
        "cd6cc2c5c0e805dc70c167f7a3447c491bd7874a",
        "c0889ab3b0b953e138edc3ace3ffeb10643a9ed5"
      ],
      "author": {
        "name": "Yurii Zubrytskyi",
        "email": "zyy@google.com",
        "time": "Fri May 27 11:07:40 2016 -0700"
      },
      "committer": {
        "name": "Yurii Zubrytskyi",
        "email": "zyy@google.com",
        "time": "Fri May 27 11:07:40 2016 -0700"
      },
      "message": "resolve merge conflicts of c0889ab to nyc-dev-plus-aosp\n\nChange-Id: Ic77afb008f68ebc455d3a788119b669a52a254dc\n"
    },
    {
      "commit": "c0889ab3b0b953e138edc3ace3ffeb10643a9ed5",
      "tree": "8a7056717e44fad172a6efcd061b728074e4836c",
      "parents": [
        "19b0109d3ac2995915945f5cb64a379c41191073"
      ],
      "author": {
        "name": "Yurii Zubrytskyi",
        "email": "zyy@google.com",
        "time": "Wed May 25 15:17:10 2016 -0700"
      },
      "committer": {
        "name": "Yurii Zubrytskyi",
        "email": "zyy@google.com",
        "time": "Thu May 26 18:11:59 2016 -0700"
      },
      "message": "[adb] Issue the \"auth\" emulator command before any other one\n\nEmulator console now requires authentication; this means\n\u0027adb emu ...\u0027 commands silently fail because of it.\nThis CL adds an \u0027auth \u003ctoken\u003e\u0027 command to each user command,\nmaking sure it won\u0027t be silently ignored.\n\nBug: https://code.google.com/p/android/issues/detail?id\u003d211233\nChange-Id: Id9ca4999fd2e6393cc88278eaf444243e13c0ec0\n"
    },
    {
      "commit": "19d0c23a5a8730cf30baeaed51ba9d2c8890cb60",
      "tree": "721bbf170deaba71d54149bfb7be3382207156f0",
      "parents": [
        "e29499c30c394708de7543c558c2fa3567d0dc23"
      ],
      "author": {
        "name": "David Pursell",
        "email": "dpursell@google.com",
        "time": "Thu Apr 07 11:25:48 2016 -0700"
      },
      "committer": {
        "name": "David Pursell",
        "email": "dpursell@google.com",
        "time": "Mon May 09 16:55:10 2016 -0700"
      },
      "message": "adb: support forwarding TCP port 0.\n\nThis CL adds support to forward or reverse TCP port 0 to allow the\nsystem to automatically select an open port. The resolved port number\nwill be printed to stdout:\n  $ adb forward tcp:0 tcp:8000\n  12345\n  $ adb reverse tcp:0 tcp:9000\n  23456\nThis allows testing to be more robust by not hardcoding TCP ports which\nmay already be in use.\n\nForwarding port 0 is a host-only change and will work with any device,\nbut reversing port 0 requires the device to be updated with a new adbd\nbinary.\n\nThis CL also does a little bit of cleanup such as moving the alistener\nclass out of adb.h, and adds some error checking and additional tests.\n\nBug: 28051746\nTest: python -m unittest discover\nTest: adb_test\nTest: `adb forward` and `adb reverse` with tcp:0\nChange-Id: Icaa87346685b403ab5da7f0e6aa186aa091da572\n"
    },
    {
      "commit": "c446744a0d688001205d1d2f58aba1d5cb0c2a78",
      "tree": "c543f628f04c5d9b03c41102dbe431e1af07f169",
      "parents": [
        "9c059617b6b8719fc57d0dac93b1c0c55d94de5d"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Feb 26 13:26:55 2016 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Mar 03 15:46:50 2016 -0800"
      },
      "message": "adb: symlinks to dirs count as dirs for pull destination.\n\nThis matches scp\u0027s behavior when pulling a directory that collides\nwith a symlink to a directory.\n\nBug: http://b/27362811\nChange-Id: I0936d1ad48f13e24cd382e8e8400cc752bac3b66\n(cherry picked from commit 1e611a33d524a7c7a31181aca10d1f4a4c9fc1b2)\n"
    },
    {
      "commit": "49726bc326b4af34ff20f9700b5e790dd417ef16",
      "tree": "fafa1975abb57513d83827460885b7f87756dc97",
      "parents": [
        "7634e8824c5590502d4da20199f87457a164076a"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Feb 26 13:26:55 2016 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Mar 02 15:29:02 2016 -0800"
      },
      "message": "adb: symlinks to dirs count as dirs for pull destination.\n\nThis matches scp\u0027s behavior when pulling a directory that collides\nwith a symlink to a directory.\n\nBug: http://b/27362811\nChange-Id: I0936d1ad48f13e24cd382e8e8400cc752bac3b66\n"
    },
    {
      "commit": "f2b81236a96bd817fa18eec14f416dd4d70e614a",
      "tree": "d9adc2547554d69b6a39b6f68994c1364d1a2925",
      "parents": [
        "e9f72f10e58a5f158a2c94eea25c2824b55e1815"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Feb 16 17:34:53 2016 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Mon Feb 22 15:57:08 2016 -0800"
      },
      "message": "adb: don\u0027t emulate fdevent or socketpair on Windows.\n\nChange-Id: I16cf7d4427eb79f36db39e91f85402a268fa72f5\n(cherry picked from commit 3777d2ecc05d397ca501f4ee296e4e66568bb1bd)\n"
    },
    {
      "commit": "9a9827fe48e025a9f62ac372c7da92223af02d22",
      "tree": "b32e82ceb7ca2b24f60e9f9cfde7c30b27a7b595",
      "parents": [
        "9efe32161843994c2486e7875f466a7c2bfb9c24"
      ],
      "author": {
        "name": "Spencer Low",
        "email": "CompareAndSwap@gmail.com",
        "time": "Wed Feb 10 15:03:50 2016 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Mon Feb 22 15:57:08 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(cherry picked from commit 1ec9ceb6eea5e6c5657ddcad5fc32bcaa52c9620)\n"
    },
    {
      "commit": "e7388127438794f516143c3dade932cb297d6042",
      "tree": "2e48d3bfd4c9d74d8f690102665c784558de8af6",
      "parents": [
        "50493b21257953a4466797989dadc5c077df014d"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Feb 16 17:34:53 2016 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Fri Feb 19 11:24:51 2016 -0800"
      },
      "message": "adb: don\u0027t emulate fdevent or socketpair on Windows.\n\nChange-Id: I16cf7d4427eb79f36db39e91f85402a268fa72f5\n"
    },
    {
      "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"
    }
  ]
}
