)]}'
{
  "log": [
    {
      "commit": "eaa81943e6c61d2cc24cfab021296567b77e4e58",
      "tree": "2344229df369159e5c881c78125fcbf9735015bd",
      "parents": [
        "e0a5552aef3178b809c14af8d127547e2ce6642d"
      ],
      "author": {
        "name": "Haiyang Pan",
        "email": "hypan@google.com",
        "time": "Tue Jan 20 22:24:12 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jan 20 22:24:12 2026"
      },
      "message": "Use getprop to get build properties.\n\nThe code used to read from builder properties from the file\n\"/system/build.prop\". However in the recent change on the android side,\nthe critical prop \"ro.build.product\" is removed from this file which\ncauses issues like http://crbug.com/456431976#comment10\n\nTo be future-proof, this CL changes the code to get build properties\nfrom output of `getprop`.\n\nBug: 476183863\nChange-Id: I0ba0daf2838a6c0db616816594316de0e362ce98\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/7488129\nCommit-Queue: Haiyang Pan \u003chypan@google.com\u003e\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "e0a5552aef3178b809c14af8d127547e2ce6642d",
      "tree": "a9ea3ff5c85f4336459fd7663ef889c6d958cca8",
      "parents": [
        "804fde7665fef285a7186e49170bce14b774c310"
      ],
      "author": {
        "name": "Daiwei Li",
        "email": "daiweili@google.com",
        "time": "Wed Nov 12 20:24:57 2025"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Nov 12 20:24:57 2025"
      },
      "message": "Switch pipes.quote to shlex.quote\n\npipes was removed in Python 3.13. shlex.quote was added in Python 3.3: https://docs.python.org/3/library/shlex.html#shlex.quote\n\nBug: b/439971614\nChange-Id: Ia7c7a42e8820f493526d684e850dbff01658dea7\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/7148280\nCommit-Queue: Daiwei Li \u003cdaiweili@google.com\u003e\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "804fde7665fef285a7186e49170bce14b774c310",
      "tree": "3144afcfe55e3d8db6ad700334183325e3597427",
      "parents": [
        "063868fcaa169bfae45c4266d1ffeff40df02c33"
      ],
      "author": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Tue Sep 30 18:57:09 2025"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Sep 30 18:57:09 2025"
      },
      "message": "Properly reset device cache when \u0027reset\u003dTrue\u0027 in InitCache\n\nInitCache has a \"reset\" arg that\u0027s supposed to forcibly reset the\ndevice prop cache. But the arg wasn\u0027t being handled properly, and so\neven if it was set to True, the old cache wouldn\u0027t get overwritten.\n\nThis fixes that so hopefully we\u0027re resetting the cache properly now.\n\nThis also plumbs the arg properly down the call stack from\nGetRemoteDevices() to _InitCache().\n\nBug: 436887355\nChange-Id: Iae9de726b091ca2276c21658a17eaf17b2caf811\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/7000989\nCommit-Queue: Ben Pastene \u003cbpastene@chromium.org\u003e\nReviewed-by: Haiyang Pan \u003chypan@google.com\u003e\n"
    },
    {
      "commit": "063868fcaa169bfae45c4266d1ffeff40df02c33",
      "tree": "363c1317d138ae689c8e89c873ce910c221c747e",
      "parents": [
        "ff7543cf2cb48569abdf7170f4d88da08db06794"
      ],
      "author": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Fri Aug 08 17:04:39 2025"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Aug 08 17:04:39 2025"
      },
      "message": "Reset caches for remote devices at every Connect() call\n\nPy ADB\u0027s per-device cache keys each device based on its port path.\nFor USB devices, these change every time the device disconnects and\nreconnects. This means rebooting the device changes its port path.\n\nFor TCP devices, that port path is likely just its IP and port, which\ndoesn\u0027t really change if you simply reboot the device.\n\nThis means that rebooting a USB device after flashing it would reset\nits caches, while does the same for a TCP device wouldn\u0027t. This leads\nto build properties of TCP devices not being updated after their\ndevices are flashed.\n\nForce resetting the device cache for every Connect() call of a remote\ndevice should avoid that.\n\nBug: 436887355\nChange-Id: I85c90c9d5f4bb1358831eaaaf05e7fdf083ceddd\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/6825864\nReviewed-by: Andrew Lamb \u003candrewlamb@chromium.org\u003e\nCommit-Queue: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "ff7543cf2cb48569abdf7170f4d88da08db06794",
      "tree": "0bf095f57956a7b9d1cf4a5f0d7aa40f06b8a6b2",
      "parents": [
        "1e1b3027ae573ab5cd21d179746b6a35780513e1"
      ],
      "author": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Thu May 01 20:20:10 2025"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu May 01 20:20:10 2025"
      },
      "message": "Handling missing init.svc.bootanim prop when checking boot state\n\nAt some point, recent android-desktop devices stopped reporting the\n\"init.svc.boot\" prop. This is believed to have made ~all their test\ntasks have a 5min overhead since from the PoV of swarming, all their\ndevices are still booting.\n\n\"service.bootanim.exit\" seems like a sufficient replacement prop, so\nthis will make swarming check that prop an additional to the old one.\n\nThis CL also changes the package-manager check to instead of calling\n`pm path` without a path arg and expecting it to fail, we simply ask\nfor the path to the system \"android\" APK. This should be accomplish\nthe same level of system check, without running a command that we\nexpect to fail. See also:\nhttps://source.chromium.org/chromium/chromium/src/+/main:third_party/catapult/devil/devil/android/device_utils.py;drc\u003df1f18d8a8d1547cf7441dc4e3e30c833fccf304b;l\u003d1242\n\nTested all this locally on my android-desktop DUT, and confirmed that\nthe 5min overhead disappears on a fully-booted DUT.\n\nBug: 413572031\nChange-Id: Ia9ebcc40aefcf3ef3d7a8907a783f7f91a480e43\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/6506964\nCommit-Queue: Ben Pastene \u003cbpastene@chromium.org\u003e\nReviewed-by: Andrew Lamb \u003candrewlamb@chromium.org\u003e\n"
    },
    {
      "commit": "1e1b3027ae573ab5cd21d179746b6a35780513e1",
      "tree": "dfc61bcd13041190c2269bbbcc2c7ed3383eb42a",
      "parents": [
        "3de63560e34039ad13dc7968cc24357e4e135e0a"
      ],
      "author": {
        "name": "Andrew Lamb",
        "email": "andrewlamb@chromium.org",
        "time": "Wed Apr 09 03:15:25 2025"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Apr 09 03:15:25 2025"
      },
      "message": "Handle TCP connections in OpenHandle() loop.\n\n- To allow waiting for the device to become available when\nrebooting. See example stack trace:\nhttps://paste.googleplex.com/6114663132299264.\n\nBug: 368004900\nChange-Id: I192ce25d4135128e81c707c553c0b6fdf4b5a6c4\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/6434730\nCommit-Queue: Andrew Lamb \u003candrewlamb@chromium.org\u003e\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "3de63560e34039ad13dc7968cc24357e4e135e0a",
      "tree": "9601e3783e30f183c307f6f667ff8e7bc6e5a342",
      "parents": [
        "eaf16c5467cd99eaa2fbba3d6b2992ad943b540f"
      ],
      "author": {
        "name": "Brian Sheedy",
        "email": "bsheedy@chromium.org",
        "time": "Tue Jan 07 18:51:43 2025"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jan 07 18:51:43 2025"
      },
      "message": "Add WaitUntilFullyBootedWithResets\n\nAdds WaitUntilFullyBootedWithResets to HighDevice. This is functionally\nsimilar to WaitUntilFullyBooted, but will periodically reset the device\nconnection if the device does not appear to be online. A functionally\nidentical implementation has been shown to improve stability in\nChromium\u0027s use cases.\n\nBug: b:344849382\nChange-Id: Iad5b57ae30e438d4cd2ec63247b2452d4eda9dfd\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/6139305\nCommit-Queue: Ben Pastene \u003cbpastene@chromium.org\u003e\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\nAuto-Submit: Brian Sheedy \u003cbsheedy@chromium.org\u003e\n"
    },
    {
      "commit": "eaf16c5467cd99eaa2fbba3d6b2992ad943b540f",
      "tree": "c790e43eb7c1cd3724b505b8ca8914a5e77dfb16",
      "parents": [
        "23d5a3964444c048ad34939e8a3c41b6bda4818e"
      ],
      "author": {
        "name": "Andrew Lamb",
        "email": "andrewlamb@chromium.org",
        "time": "Mon Dec 09 23:39:28 2024"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Dec 09 23:39:28 2024"
      },
      "message": "Loop to read all data in TcpHandle.BulkRead.\n\n- The length argument to recv is the maximum amount of data to\nreceive from the socket, but it doesn\u0027t guarantee that all data\nis available\n(https://docs.python.org/3/library/socket.html#socket.socket.recv).\nLoop until all data is read.\n\nBug: 368004900\nChange-Id: Iffce520983a21e0ee06fecb43e85e29ef6459bfd\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/6076227\nReviewed-by: Haiyang Pan \u003chypan@google.com\u003e\nCommit-Queue: Andrew Lamb \u003candrewlamb@chromium.org\u003e\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "23d5a3964444c048ad34939e8a3c41b6bda4818e",
      "tree": "e0867cfdd86648455d31bafbf63ef5824db8f656",
      "parents": [
        "dd712336790a5cfe899439e42d67a9bbf9da8c69"
      ],
      "author": {
        "name": "Andrew Lamb",
        "email": "andrewlamb@chromium.org",
        "time": "Fri Dec 06 19:20:34 2024"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Dec 06 19:20:34 2024"
      },
      "message": "Catch InvalidResponseErrors during reboot.\n\n- Similar to USB connections, with Ethernet connections it is\npossible adbd restarts the device and closes the connection before\nit has time to reply. Catch InvalidResponseError in addition to\nReadFailedError to handle this race.\n\nBug: 368004900\nChange-Id: I15901c1ae43a753a58c4e919c760194bdc0a1328\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/6072007\nAuto-Submit: Andrew Lamb \u003candrewlamb@chromium.org\u003e\nReviewed-by: Haiyang Pan \u003chypan@google.com\u003e\nCommit-Queue: Haiyang Pan \u003chypan@google.com\u003e\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "dd712336790a5cfe899439e42d67a9bbf9da8c69",
      "tree": "9a0c1bc079bde74c319454db9ed02e7cbf86c1af",
      "parents": [
        "4569be7aeea54679c7bd3823061b3eb7c91b4f75"
      ],
      "author": {
        "name": "Andrew Lamb",
        "email": "andrewlamb@chromium.org",
        "time": "Tue Dec 03 17:57:30 2024"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Dec 03 17:57:30 2024"
      },
      "message": "Add option for GetRemoteDevices to connect without _ADB_KEYS.\n\n- Hosts on chromeos-swarming won\u0027t have ADB keys deployed to\nthem, and devices should allow connections without keys. Add\nan option to continue instead of exiting early.\n\nBug: 368004900\nChange-Id: Ib49c4ebd72c48540acfaa71e64be4e4a78739592\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/6052875\nAuto-Submit: Andrew Lamb \u003candrewlamb@chromium.org\u003e\nReviewed-by: Haiyang Pan \u003chypan@google.com\u003e\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\nCommit-Queue: Haiyang Pan \u003chypan@google.com\u003e\n"
    },
    {
      "commit": "4569be7aeea54679c7bd3823061b3eb7c91b4f75",
      "tree": "26d356792db53fbd1c5e95a97f74a763a73f2c2a",
      "parents": [
        "e9b9ca5abc469908f62dc97e5d8160cd89636212"
      ],
      "author": {
        "name": "Brian Sheedy",
        "email": "bsheedy@chromium.org",
        "time": "Tue Jul 16 20:47:24 2024"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jul 16 20:47:24 2024"
      },
      "message": "Add temperature fallback\n\nAdds a fallback path for getting temperature data from devices if the\ndefault code path does not return any sensor values. This fallback\nrelies on \"dumpsys thermalservice\", and is thus only available on\nAndroid 10 and above.\n\nThere is only currently one known device that will actually use this\npath (Samsung S24 international version) and has been confirmed to work\nthere. However, it should work on any Android 10+ device that has\ntrouble reading sensor values directly, e.g. due to permission issues.\n\nBug: b:332809361\nChange-Id: I4f97bb11c51ed5485c980678e16df8c8b66c2efc\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/5703923\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\nCommit-Queue: Brian Sheedy \u003cbsheedy@chromium.org\u003e\nReviewed-by: Vadim Shtayura \u003cvadimsh@chromium.org\u003e\n"
    },
    {
      "commit": "e9b9ca5abc469908f62dc97e5d8160cd89636212",
      "tree": "5005fa0a7ce89091e1f0b164e0e99817cc5014d5",
      "parents": [
        "8da296dd49b7a5e6f566eb45241bf016a97f1bff"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Mon Aug 23 06:06:17 2021"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Aug 23 06:06:17 2021"
      },
      "message": "Encode command in StreamingCommand\n\nThe upstream repo also does similar conversion.\nhttps://github.com/google/python-adb/blob/f4e597fe55900651a8a91fccc1e09061fd96b5e9/adb/adb_protocol.py#L434-L435\n\nThis should fix the error in Skia script.\nhttps://console.cloud.google.com/errors/CMiJkO6AgOLHCQ?time\u003dPT6H\u0026project\u003dchrome-swarming\n\nBug: skia:11875\nChange-Id: Ib36b6ac6d430658c8f9120ce96b570beb8f077c3\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/3112166\nCommit-Queue: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nAuto-Submit: Junji Watanabe \u003cjwata@google.com\u003e\nReviewed-by: Takuto Ikuta \u003ctikuta@chromium.org\u003e\n"
    },
    {
      "commit": "8da296dd49b7a5e6f566eb45241bf016a97f1bff",
      "tree": "82b856986eccff47b6a84fd586de7cf900f0eb3f",
      "parents": [
        "48fc798364c7df80b7fa6654ac1062b85f01d73b"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Tue Jun 08 04:34:37 2021"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 08 04:34:37 2021"
      },
      "message": "fix concat error in PushKeys\n\nhttps://console.cloud.google.com/errors/CKSS9a7Iwe-gxwE?time\u003dP30D\u0026project\u003dchromium-swarm\n\nBug: 1198820\nChange-Id: I0cb5f0b1d6041f5f3b78c88b33c6f1888b7ad344\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2946866\nAuto-Submit: Junji Watanabe \u003cjwata@google.com\u003e\nCommit-Queue: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nReviewed-by: Takuto Ikuta \u003ctikuta@chromium.org\u003e\n"
    },
    {
      "commit": "48fc798364c7df80b7fa6654ac1062b85f01d73b",
      "tree": "69c09d466d8ef7bac76322fffcdbe6ec4e8c7409",
      "parents": [
        "ac3b9500c408a4ad05a51c52beb8f9d1584c2c04"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Mon Jun 07 07:14:22 2021"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 07 07:14:22 2021"
      },
      "message": "Fix byte string concat error in _HandleAUTH()\n\nThis fixes https://console.cloud.google.com/errors/CMebxsbZ1PzK8gE?time\u003dPT1H\u0026refresh\u003dauto\u0026project\u003dchromium-swarm\n\nBug: 1198820\nChange-Id: I88498d61a544b1107f0c7a138aae0900e4488e4a\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2943853\nAuto-Submit: Junji Watanabe \u003cjwata@google.com\u003e\nCommit-Queue: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nReviewed-by: Takuto Ikuta \u003ctikuta@chromium.org\u003e\n"
    },
    {
      "commit": "ac3b9500c408a4ad05a51c52beb8f9d1584c2c04",
      "tree": "9b60111c061177137cae7de2073fddceb265a161",
      "parents": [
        "7dc2c0f185d4658828933b0dcba6daacf2934792"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Thu Jun 03 07:47:13 2021"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jun 03 07:47:13 2021"
      },
      "message": "add universal_newlines\u003dTrue in KillADB()\n\nThis fixes https://console.cloud.google.com/errors/CLH79JmVktryMg?time\u003dP1D\u0026project\u003dchromium-swarm-dev\n\nBug: 1198820\nChange-Id: Id4041a93f17ef5d513b5e7587d051883d37b6fef\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2936244\nAuto-Submit: Junji Watanabe \u003cjwata@google.com\u003e\nCommit-Queue: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nReviewed-by: Takuto Ikuta \u003ctikuta@chromium.org\u003e\n"
    },
    {
      "commit": "7dc2c0f185d4658828933b0dcba6daacf2934792",
      "tree": "1b67277c551ce3927451d3d35bc06e4b5b2eda76",
      "parents": [
        "e99f19310debe58e78ffa6fa351793ea5edfedbe"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Wed Jun 02 06:50:48 2021"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jun 02 06:50:48 2021"
      },
      "message": "ensure filename to be str\n\nhttps://console.cloud.google.com/errors/CJHZ5PO1l_zPlwE?service\u003ddefault\u0026time\u003dPT1H\u0026refresh\u003dauto\u0026project\u003dchromium-swarm-dev\nhttps://console.cloud.google.com/errors/CIWdvZKN5PPObA?time\u003dPT1H\u0026refresh\u003dauto\u0026project\u003dchromium-swarm-dev\n\nI couldn\u0027t reproduce \"TypeError: must be str, not bytes\".\nBut the error didn\u0027t happen with this fix on dev.\n\nBug: 1198820\nChange-Id: I99e49f7713f4771c9bc89e5bf27035cd71a09459\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2931748\nCommit-Queue: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nAuto-Submit: Junji Watanabe \u003cjwata@google.com\u003e\nReviewed-by: Takuto Ikuta \u003ctikuta@chromium.org\u003e\n"
    },
    {
      "commit": "e99f19310debe58e78ffa6fa351793ea5edfedbe",
      "tree": "c1f2734857a8c08882da14a3278dd59e36ae5514",
      "parents": [
        "bb53130f450d37d747822f6f10302bc07d93a4e7"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Wed Jun 02 03:57:18 2021"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jun 02 03:57:18 2021"
      },
      "message": "ensure old_content to be binary only when adb_keys exist\n\nThis is a hot fix for https://console.cloud.google.com/errors/CJn03NGdqK2lQQ?time\u003dPT1H\u0026refresh\u003dauto\u0026project\u003dchromium-swarm\nIt can\u0027t retrieve adb_keys from devices when they aren\u0027t connected.\n\nBug: 1198820\nChange-Id: I9e22ddb363ce53a1823e440cae8fe2e5cf25a95a\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2931837\nCommit-Queue: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nAuto-Submit: Junji Watanabe \u003cjwata@google.com\u003e\nReviewed-by: Takuto Ikuta \u003ctikuta@chromium.org\u003e\n"
    },
    {
      "commit": "bb53130f450d37d747822f6f10302bc07d93a4e7",
      "tree": "1b1179dca6e9185c40ea4ea688ff220b06fb5dce",
      "parents": [
        "63049db49f399d3f2dd8d9ba6329bf7b07c31079"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Tue Jun 01 08:07:57 2021"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 01 08:07:57 2021"
      },
      "message": "Fix pyhton3 incompatibilities\n\nThis CL also tries to keep consistency with the google/python-adb as much as possible.\nhttps://github.com/google/python-adb\n\nBug: 1198820\nChange-Id: I0c1a9ef4912d5c20afb25467668f7e3f350c4b14\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2929918\nAuto-Submit: Junji Watanabe \u003cjwata@google.com\u003e\nReviewed-by: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nCommit-Queue: Junji Watanabe \u003cjwata@google.com\u003e\n"
    },
    {
      "commit": "63049db49f399d3f2dd8d9ba6329bf7b07c31079",
      "tree": "652d26595faa0e86807651b2d911dcb497219b7b",
      "parents": [
        "b9c2a05baf22f351d5f9e26d10ab169789d0b174"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Wed Apr 14 23:58:20 2021"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Apr 14 23:58:20 2021"
      },
      "message": "Support Python3\n\nThe previous CL https://crrev.com/c/2796724 passed luci-py\u0027s CQ.\nBut failed on dev.\n\nThis CL passes\n- high_test.py, parallel_test.py, sign_pythonrsa_test.py, fastboot_test.py in Python3.\n- looks working on dev http://screen/7Kfj72L4UfqNGti\n\nChanges\n- fixes import errors\n- fixes simple syntax errors caught by python-modernize\n- changes strings to byte strings everywhere.\n\nBug: 1012230\nChange-Id: I51347399f7e4e8b9bf3a4279f589691600fdab9e\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2820831\nAuto-Submit: Junji Watanabe \u003cjwata@google.com\u003e\nReviewed-by: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\nCommit-Queue: Junji Watanabe \u003cjwata@google.com\u003e\n"
    },
    {
      "commit": "b9c2a05baf22f351d5f9e26d10ab169789d0b174",
      "tree": "27b18686c2668c9e5a82d0da9e1758424b486098",
      "parents": [
        "adb84eb05066227df1a74bd566e2d846a09b17fd"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Wed Apr 14 02:25:21 2021"
      },
      "committer": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Wed Apr 14 02:26:26 2021"
      },
      "message": "add OWNERS file\n\nThis repo doesn\u0027t have ONWERS, which prevents CQ+2.\n\nBug: 1195050\nChange-Id: I3c17c27f1d0fb0d39ab9daa6305e0625385e6a98\n"
    },
    {
      "commit": "adb84eb05066227df1a74bd566e2d846a09b17fd",
      "tree": "c4d7aa99e7bee9a31cac8901393f5b438b25d409",
      "parents": [
        "d5794e753578a8ffa17273945ccab29c50607cbe"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@chromium.org",
        "time": "Thu Oct 10 13:41:02 2019"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Thu Oct 10 13:41:02 2019"
      },
      "message": "remove unused import\n\npython3 does not have cStringIO\n\nBug: 1012230\nChange-Id: I6cd0329a49042c1ca90dcc77baf0566a7eb739e3\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/1852386\nAuto-Submit: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "d5794e753578a8ffa17273945ccab29c50607cbe",
      "tree": "f82736beee4aa388ebe62335f6bd417a9ba3946d",
      "parents": [
        "adb763cb401578072ddfefd3031d2b5931535a19"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@chromium.org",
        "time": "Thu Oct 10 09:08:04 2019"
      },
      "committer": {
        "name": "Takuto Ikuta",
        "email": "tikuta@chromium.org",
        "time": "Thu Oct 10 09:08:04 2019"
      },
      "message": "Stop using unicode raw string\n\npython3 does not support ur prefix for literal.\n\nBug: 1012230\nChange-Id: I7d30aba3d9816824abec87a6b96dd1caf9fb3ef2\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/1852384\nReviewed-by: Yoshisato Yanagisawa \u003cyyanagisawa@google.com\u003e\n"
    },
    {
      "commit": "adb763cb401578072ddfefd3031d2b5931535a19",
      "tree": "5834d08a9c16e610e0223a5b594848ed9c65a2e9",
      "parents": [
        "9e1c536518e9d3e35f7e9bd4f4496c7982897619"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@chromium.org",
        "time": "Thu Oct 10 08:43:17 2019"
      },
      "committer": {
        "name": "Takuto Ikuta",
        "email": "tikuta@chromium.org",
        "time": "Thu Oct 10 08:43:17 2019"
      },
      "message": "replace xrange with range\n\nThis is a step to make this python3 compatible.\nI think we don\u0027t need to take care performance difference here.\n\nBug: 1010816\nChange-Id: Ia7fd31ac895e4544630c381b3be42f174c024d56\nReviewed-on: https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/1852225\nReviewed-by: Yoshisato Yanagisawa \u003cyyanagisawa@google.com\u003e\n"
    },
    {
      "commit": "9e1c536518e9d3e35f7e9bd4f4496c7982897619",
      "tree": "314650ab2c184f822a6626bcfe1e5c95558430be",
      "parents": [
        "27aca957d1dc826195db053d3ec01adb311f579d"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Thu Jan 31 20:08:01 2019"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Thu Jan 31 20:08:01 2019"
      },
      "message": "Stability improvements\n\nFixes crashes as observed via monitoring, as this generate noise on the\nSwarming server.\n\nBug: 927025\nChange-Id: I07a63f46bdbdc204f840cabe7cd9bcb0476a9faa\nReviewed-on: https://chromium-review.googlesource.com/c/1446187\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "27aca957d1dc826195db053d3ec01adb311f579d",
      "tree": "caad23cd01e258071d06c8a7116a6fe014a6c490",
      "parents": [
        "1c395fcd9a4fd1fbf3d797e7936e8a5c41651f09"
      ],
      "author": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Wed Jan 16 19:09:42 2019"
      },
      "committer": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Wed Jan 16 19:09:42 2019"
      },
      "message": "When uninstalling, use the output of \u0027pm path\u0027 instead of its exit code.\n\nOn K, \u0027pm path\u0027 exits with an exit code of 0 for non existant packages.\nOn M, it exits with an exit code of 1...\n\nSo let\u0027s scan its output instead.\n\nChange-Id: I894509d5da509feb7819e4be06e8210a3d8f0d2e\nReviewed-on: https://chromium-review.googlesource.com/c/1415711\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "1c395fcd9a4fd1fbf3d797e7936e8a5c41651f09",
      "tree": "6586d6726656572f789ccfbcec24ee3da75a6496",
      "parents": [
        "017007413e7400438c39623b92ce4288488a8272"
      ],
      "author": {
        "name": "bsheedy",
        "email": "bsheedy@chromium.org",
        "time": "Sat Dec 15 00:48:00 2018"
      },
      "committer": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Sat Dec 15 00:48:00 2018"
      },
      "message": "Change GetGMSCoreVersion to GetPackageVersion\n\nChanges GetGMSCore in high.py to a more generic GetPackageVersion.\n\nThis is in preparation for adding Playstore version to Android\ndimensions alongside the existing GMS Core version.\n\nBug: 914927\nChange-Id: I20f5de6f75a4d4cab757b62182f351e713e03be1\nReviewed-on: https://chromium-review.googlesource.com/c/1379068\nAuto-Submit: Brian Sheedy \u003cbsheedy@chromium.org\u003e\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "017007413e7400438c39623b92ce4288488a8272",
      "tree": "a02181ca00607ddbd4cea0748ac6df463a1cc38d",
      "parents": [
        "412d35c842fb0917233da6fd2c6c94dfa3450593"
      ],
      "author": {
        "name": "Ben Wagner",
        "email": "benjaminwagner@google.com",
        "time": "Wed Nov 28 20:54:27 2018"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Wed Nov 28 20:54:27 2018"
      },
      "message": "Add schedutil governor value.\n\nThis seems to be the only governor available on Samsung Galaxy S9.\n\nChange-Id: If2362b70a5964de11a91b158f02c4f7b316ef132\nReviewed-on: https://chromium-review.googlesource.com/c/1352666\nAuto-Submit: Ben Wagner \u003cbenjaminwagner@chromium.org\u003e\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "412d35c842fb0917233da6fd2c6c94dfa3450593",
      "tree": "5c9be2a3543765dbdf7e0f536edab4f0138edf20",
      "parents": [
        "b6a529e6be9b1bd0e9588e5fcc5db7d4b9c79528"
      ],
      "author": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Tue Oct 30 22:04:36 2018"
      },
      "committer": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Tue Oct 30 22:04:36 2018"
      },
      "message": "python-adb: Use cat instead of adb\u0027s filesync if we need su to be root.\n\nR\u003dmaruel, jbudorick\n\nBug: 780559\nChange-Id: I7650afbb2b7c2f983920a15b402387eb4dd1706f\nReviewed-on: https://chromium-review.googlesource.com/c/1309069\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "b6a529e6be9b1bd0e9588e5fcc5db7d4b9c79528",
      "tree": "268a23a570e32bd561ac4f135d187ee4eac53d00",
      "parents": [
        "3979f3c6af725a97df1a657c10ee76486578f5a6"
      ],
      "author": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Fri Oct 05 20:08:19 2018"
      },
      "committer": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Fri Oct 05 20:08:19 2018"
      },
      "message": "Revert \"python-adb: Print stack trace on failures to open an Android USB device.\"\n\nThis reverts commit 00ea410224d3eb69ae3f31cec2e0549f36e5d9d5.\n\nReason for revert: spams the logs too much\n\nChange-Id: I680dfcefe1684ea0c074892f963916e6e6eda9e9\nReviewed-on: https://chromium-review.googlesource.com/c/1264524\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "3979f3c6af725a97df1a657c10ee76486578f5a6",
      "tree": "1785ef548700eeac103a7df44d520f74b431a50e",
      "parents": [
        "00ea410224d3eb69ae3f31cec2e0549f36e5d9d5"
      ],
      "author": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Fri Oct 05 00:04:39 2018"
      },
      "committer": {
        "name": "Ben Pastene",
        "email": "bpastene@chromium.org",
        "time": "Fri Oct 05 00:04:39 2018"
      },
      "message": "python-adb: Add support for devices that need_su to attain root privileges.\n\nMolded after https://codesearch.chromium.org/chromium/src/third_party/catapult/devil/devil/android/device_utils.py?rcl\u003d2dd914402ebcc44ecb60034e5c7b9bfa3d0c9d89\u0026l\u003d462\n\nBug: 780559\nChange-Id: I2c32ee8219d897301dc76cc114513b5c9fb52763\nReviewed-on: https://chromium-review.googlesource.com/c/1260622\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "00ea410224d3eb69ae3f31cec2e0549f36e5d9d5",
      "tree": "ec5f6d5bc6157096bed6ea8d6e55cbfb1deba9e2",
      "parents": [
        "e4997e800cb42332728687cd6f5a260ebd30ae2a"
      ],
      "author": {
        "name": "Sergiy Byelozyorov",
        "email": "sergiyb@chromium.org",
        "time": "Tue Sep 11 18:23:03 2018"
      },
      "committer": {
        "name": "Sergiy Byelozyorov",
        "email": "sergiyb@chromium.org",
        "time": "Tue Sep 11 18:23:03 2018"
      },
      "message": "python-adb: Print stack trace on failures to open an Android USB device.\n\nThis will make it easier to see which code throws an exception and thus ease\nconnection debugging.\n\nR\u003dbpastene@chromium.org\n\nBug: 879936\nChange-Id: I4e4ce336a9285b7db6c44ac521774efb5538cd8e\nReviewed-on: https://chromium-review.googlesource.com/1219453\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "e4997e800cb42332728687cd6f5a260ebd30ae2a",
      "tree": "25853de33a87e8dfd6358f67b95b4d456dc08678",
      "parents": [
        "2d12b5662ec162675f98e33a236536b52ac7c782"
      ],
      "author": {
        "name": "Zhiling Huang",
        "email": "hzl@chromium.org",
        "time": "Wed Apr 18 22:42:08 2018"
      },
      "committer": {
        "name": "Zhiling Huang",
        "email": "hzl@google.com",
        "time": "Thu Apr 19 02:23:27 2018"
      },
      "message": "python-adb: Create GetGMSCoreVersion method in high.py.\n\nBug:832874\nChange-Id: If7a5a425909d90020a534ac6e44926707eb6569e\nReviewed-on: https://chromium-review.googlesource.com/1015797\nReviewed-by: Ben Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "2d12b5662ec162675f98e33a236536b52ac7c782",
      "tree": "92ffbd7a20488f4243209a49efdbb87cb183d017",
      "parents": [
        "135dd71bfa85b2b1a497c80b4c4d4953dd3af37a"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Fri Mar 30 18:33:28 2018"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Thu Apr 05 17:26:30 2018"
      },
      "message": "py-adb: Attempt to get py-adb working on P.\n\nThis:\nUpdates supported protocol versions.\nStops writing empty data packets following stand-alone headers.\nFix uptime fetching after boot.\n\nBug: 824478\nChange-Id: I29517b96a5f0b78f56e775cf74048a950f74141b\nReviewed-on: https://chromium-review.googlesource.com/988241\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "135dd71bfa85b2b1a497c80b4c4d4953dd3af37a",
      "tree": "128f6b1ba4d285396816a3b44e9d54490bed18aa",
      "parents": [
        "4b578d9eb95f7fa01a2b2ed123c66152f6c524ae"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Fri Nov 17 17:23:35 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Mon Nov 20 20:00:05 2017"
      },
      "message": "py-adb: Swallow InvalidResponseError when rooting.\n\nR\u003dmaruel@chromium.org\nBug: 784197\nChange-Id: Ic07893b9e579c1190faad538ee5099a9ea3e7c88\nReviewed-on: https://chromium-review.googlesource.com/777000\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "4b578d9eb95f7fa01a2b2ed123c66152f6c524ae",
      "tree": "dc6db9446e9fff92a0357b1a138d4d1a26518d60",
      "parents": [
        "34bfe6be0ca540a86302fa0493d85b034ca97402"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Tue Nov 14 20:05:25 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Tue Nov 14 20:11:11 2017"
      },
      "message": "py-adb: Detect another type of dumpsys error.\n\nR\u003dmaruel@chromium.org\nBug: 784197\nChange-Id: I891bc039450904f0d5d06daf96596b57a62cf894\nReviewed-on: https://chromium-review.googlesource.com/769344\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "34bfe6be0ca540a86302fa0493d85b034ca97402",
      "tree": "5a0bee7eae0606e47cda85ba047dcb20b76f2ed2",
      "parents": [
        "c57ccfe535a197401968031583a6f57e2926b58b"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Tue Sep 19 00:35:19 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Tue Sep 19 00:58:54 2017"
      },
      "message": "python-adb: Fallback to getprop when /system/build.prop is not readable.\n\nBug: 765679\nChange-Id: Ib5e65ea798231b0d99679322f37c98d0b0f32778\nReviewed-on: https://chromium-review.googlesource.com/671933\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "c57ccfe535a197401968031583a6f57e2926b58b",
      "tree": "eeeeecb467a0cca5bce2bff69903d59f9baec81d",
      "parents": [
        "e3ec660a6358e34f764652a83226a3f28909f53a"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Mon Sep 18 16:44:25 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Mon Sep 18 16:44:49 2017"
      },
      "message": "python-adb: Fix timeout arg.\n\nBug:\nChange-Id: I34b499c04e9c345008db8ac33b2ba3a157df127c\nReviewed-on: https://chromium-review.googlesource.com/671445\nReviewed-by: Benjamin Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "e3ec660a6358e34f764652a83226a3f28909f53a",
      "tree": "119963a4f639a72f4be92c1fe4e2e5bc98357a84",
      "parents": [
        "9717f0aebef872abb6758d54e58be46274032fc0"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Fri Sep 15 23:35:11 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Mon Sep 18 16:26:45 2017"
      },
      "message": "python-adb: Don\u0027t override timeout arg for shell commands.\n\nDon\u0027t override the argument if the caller passed a value less than\nthe default value. Default is default, not minimum. Let the caller\ndecide what timeout they want.\n\nR\u003dmaruel@chromium.org\nBug:\nChange-Id: I9ef76ef79fdefbd05e2ebc6a6ac90b4d06ade7f2\nReviewed-on: https://chromium-review.googlesource.com/669666\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "9717f0aebef872abb6758d54e58be46274032fc0",
      "tree": "83743c7e84dcae7eda3ef40d86f453cdcedcad5e",
      "parents": [
        "deedbd3dc128228b81e6f137b2b99f1801a08fc9"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Wed Aug 30 22:34:50 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Thu Aug 31 00:48:14 2017"
      },
      "message": "python-adb: Fallback to /proc/sysrq-trgger when rebooting fails.\n\nBug: 748145\nChange-Id: Ic07decade82f7b5350729e69169c9ee2c42b8a57\nReviewed-on: https://chromium-review.googlesource.com/644088\nReviewed-by: Marc-Antoine Ruel \u003cmaruel@chromium.org\u003e\n"
    },
    {
      "commit": "deedbd3dc128228b81e6f137b2b99f1801a08fc9",
      "tree": "01bed7d0f1957569f03cad6570270645d4f237db",
      "parents": [
        "bde63cfd5b457e421abacb2256b128a0be0da3e9"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Wed Aug 30 21:36:53 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Wed Aug 30 21:55:33 2017"
      },
      "message": "Add a codereview.settings file for python-adb.git\n\nBug:\nChange-Id: Icae9c0bfc7f199eed0d1c8f6bd4b9fabe8397ad4\nReviewed-on: https://chromium-review.googlesource.com/644489\nReviewed-by: Benjamin Pastene \u003cbpastene@chromium.org\u003e\n"
    },
    {
      "commit": "bde63cfd5b457e421abacb2256b128a0be0da3e9",
      "tree": "8d654f387e24a81eecd6b78dc7f2cb9706f0b99d",
      "parents": [
        "55aea29bfacb28a5383c1e7bfa0269382b0ddc03"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Wed Aug 16 21:29:51 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Wed Aug 16 21:29:52 2017"
      },
      "message": "python-adb: Optionally skip sd_card checking when booting up.\n\nBUG\u003d\nR\u003dmaruel@chromium.org\n\nReview-Url: https://codereview.chromium.org/3000103002 .\n"
    },
    {
      "commit": "55aea29bfacb28a5383c1e7bfa0269382b0ddc03",
      "tree": "21ff7f404a6dabb7bad60377ba4c8875cd69e8b8",
      "parents": [
        "bed58b92f2ede1c487a315f16fc71a09fe95bdbe"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Mon Aug 14 22:22:23 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@chromium.org",
        "time": "Mon Aug 14 22:22:39 2017"
      },
      "message": "python-adb: Add a high.IsDeviceFullyBooted check.\n\nWill be used to quarantine a bot if the check doesn\u0027t return True.\n\nBUG\u003d753046\nR\u003djbudorick@chromium.org\n\nReview-Url: https://codereview.chromium.org/2995893002 .\n"
    },
    {
      "commit": "bed58b92f2ede1c487a315f16fc71a09fe95bdbe",
      "tree": "0fd455d85b3d86f48b26c65c828572d7dd1b501a",
      "parents": [
        "9ad4aa55264944e765ba76614c6b5712b18f684c"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Sat Apr 29 00:25:17 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Sat Apr 29 00:25:24 2017"
      },
      "message": "python-adb: List tz sensors in GetDeviceTemperatures()\n\nThey\u0027re used for cpu readings in some devices:\nhttps://android.googlesource.com/kernel/msm/+/96394eb1f522c174f85666166d984f68cc9cb17c/Documentation/devicetree/bindings/arm/msm/msm_thermal.txt\n\nBUG\u003d\nR\u003dmaruel@chromium.org\n\nReview-Url: https://codereview.chromium.org/2852603002 .\n"
    },
    {
      "commit": "9ad4aa55264944e765ba76614c6b5712b18f684c",
      "tree": "b0c36a14766494f8066be196edc37215c99b84d4",
      "parents": [
        "0f6553ce41f17cb0748ae18ab3a8bb9f83c15916"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Mar 02 18:23:54 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Mar 02 18:23:54 2017"
      },
      "message": "python-adb: Use reentrant locks in the handles.\n\nThis solves a dead lock when an already opened device is opened again.\nLocation of deadlock:\nhttps://github.com/luci/python-adb/blob/0f6553ce41f17cb0748ae18ab3a8bb9f83c15916/adb/common.py#L159\n\nBUG\u003d\nR\u003dmaruel@chromium.org\n\nReview-Url: https://codereview.chromium.org/2720833005 .\n"
    },
    {
      "commit": "0f6553ce41f17cb0748ae18ab3a8bb9f83c15916",
      "tree": "fe6780819068cfe694028a4ec5e03dbd473f1cbe",
      "parents": [
        "75477ebf4fb8b906707f35e5fb385a9203256bef"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Jan 12 22:37:20 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Jan 12 22:37:20 2017"
      },
      "message": "python-adb: Fix KillADB logging.\n\nBUG\u003d\nR\u003dmaruel@chromium.org\n\nReview-Url: https://codereview.chromium.org/2633463003 .\n"
    },
    {
      "commit": "75477ebf4fb8b906707f35e5fb385a9203256bef",
      "tree": "7fd57d31fed9f6b98dbb459261aa27355970a2cf",
      "parents": [
        "42558a58e1be016f84b2cbf43a10511e1248ded9"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Fri Jan 06 17:20:15 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Fri Jan 06 17:20:15 2017"
      },
      "message": "python-adb: Make FindDevicesSafe true to its name.\n\nPreviously, if FindDevices threw an exception, FindDevicesSafe would\ncatch it and proceed to poll FindDevices for more devices. But if a\npython generator throws an exception, it stops all yielding. So it\nwasn\u0027t really finding all devices.\n\nThis just copy pastes the code in FindDevices into FindDevicesSafe\nwith some try-catching\u0027ing.\n\nBUG\u003d670879\nR\u003ddpranke@chromium.org\n\nReview-Url: https://codereview.chromium.org/2615913002 .\n"
    },
    {
      "commit": "42558a58e1be016f84b2cbf43a10511e1248ded9",
      "tree": "98668d30cb4ca7eb28a4023ec83054cfa659d390",
      "parents": [
        "f56093f0dd94c0c5a62c60f52feae9bcdb5cc148"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Fri Jan 06 01:28:34 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Fri Jan 06 01:28:34 2017"
      },
      "message": "python-adb: Ignore devices that don\u0027t expose a serial number.\n\nThis is intended as a quick smoke test for broken devices.\n\nBUG\u003d\nR\u003dstip@chromium.org\n\nReview-Url: https://codereview.chromium.org/2617033002 .\n"
    },
    {
      "commit": "f56093f0dd94c0c5a62c60f52feae9bcdb5cc148",
      "tree": "4a1ea5667e5c9218a5926c5c08f8202a221aacec",
      "parents": [
        "5d1bc3477b9be2fa74cc6a29fb6731ad0ab70b37"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Wed Jan 04 22:48:39 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Wed Jan 04 22:48:39 2017"
      },
      "message": "python-adb: Don\u0027t return port_path when asked for serial.\n\nBUG\u003d\nTBR\u003dmaruel@chromium.org\n\nReview-Url: https://codereview.chromium.org/2612893002 .\n"
    },
    {
      "commit": "5d1bc3477b9be2fa74cc6a29fb6731ad0ab70b37",
      "tree": "df133a43fa9dca874f78d2cbb910eddf8180c3e8",
      "parents": [
        "8626f278839300b6fc5e13559710ee6dbee9363c"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Wed Jan 04 22:43:47 2017"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Wed Jan 04 22:43:47 2017"
      },
      "message": "python-adb: Quit early when trying to connect to a missing device.\n\nThe logic here is that if the device doesn\u0027t show up, chances are it\nwon\u0027t show up for a bit. Best quit early and move on with life instead\nof sticking around and waiting for it.\n\nTested on -dev. Device reboots seem to work.\n\nBUG\u003d670879, 675270\nR\u003djbudorick@chromium.org\n\nReview-Url: https://codereview.chromium.org/2609313003 .\n"
    },
    {
      "commit": "8626f278839300b6fc5e13559710ee6dbee9363c",
      "tree": "626e8bca31bb96d3ffbd22882e2f0136444bd86e",
      "parents": [
        "6c0648954cc3a062482067948a956554a3532819"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Dec 01 00:39:43 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Dec 01 00:39:43 2016"
      },
      "message": "python-adb: Fix bug with shell command out.\n\nbleh\n\nTBR\u003dmaruel@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/2539543009 .\n"
    },
    {
      "commit": "6c0648954cc3a062482067948a956554a3532819",
      "tree": "6af3c6226e64207042b2e841e098bff9a250a426",
      "parents": [
        "e01e01fa3f863556d1748f71cd6e20bfa0e03e3e"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Dec 01 00:15:04 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Dec 01 00:15:04 2016"
      },
      "message": "python-adb: Fall back to executing su directly when testing for has_root\n\nBUG\u003d666821\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2543753002 .\n"
    },
    {
      "commit": "e01e01fa3f863556d1748f71cd6e20bfa0e03e3e",
      "tree": "9227d911041c54c87fdbcd690fefff2a1114b2de",
      "parents": [
        "0cbf609772dd844471690d62a1d55148ad40254b"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Nov 01 18:52:16 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Nov 01 18:52:16 2016"
      },
      "message": "python-adb: Check if message queue has been closed before consuming it.\n\nBUG\u003d647335\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2422943004 .\n"
    },
    {
      "commit": "0cbf609772dd844471690d62a1d55148ad40254b",
      "tree": "ea2994bd5974fdc4129c8ad27bb06092e59b909e",
      "parents": [
        "6dd8c970e64490cbadb74647338997bc54e332da"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Nov 01 18:50:37 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Nov 01 18:50:37 2016"
      },
      "message": "python-adb: Don\u0027t hang forever when attempting to kill adb servers.\n\nBUG\u003d639917\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2416493002 .\n"
    },
    {
      "commit": "6dd8c970e64490cbadb74647338997bc54e332da",
      "tree": "b4df412d36493e72bd24f64dadf83f0f6f4e8acd",
      "parents": [
        "8ff7d90ce75b5bce5494233a80440e3ac23a0c5c"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Nov 01 18:47:51 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Nov 01 18:47:51 2016"
      },
      "message": "Upstream reset-usb optional logic.\n\nBUG\u003d642440\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2461043002 .\n"
    },
    {
      "commit": "8ff7d90ce75b5bce5494233a80440e3ac23a0c5c",
      "tree": "ac20ea9d0fd548a2e6189298442987487b3c2d09",
      "parents": [
        "ca231dce96eb91c42cc099549add8645121f14dc"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Wed Oct 26 18:42:38 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Wed Oct 26 18:42:38 2016"
      },
      "message": "adb_commands_safe: Trap more exceptions.\n\nThis will now trap adb_protocol.InvalidResponseError, which has been a\nsignificant source of failures.\n\nR\u003dhinoka@chromium.org\n\nReview URL: https://codereview.chromium.org/2447163005 .\n"
    },
    {
      "commit": "ca231dce96eb91c42cc099549add8645121f14dc",
      "tree": "a9b59568e78b3b470cf6f93e45b04d693429a8b8",
      "parents": [
        "ec2f722789953607e3f36f9fa0f9c317e962d4a9"
      ],
      "author": {
        "name": "Ryan Tseng",
        "email": "hinoka@google.com",
        "time": "Fri Oct 21 01:43:59 2016"
      },
      "committer": {
        "name": "Ryan Tseng",
        "email": "hinoka@google.com",
        "time": "Fri Oct 21 01:43:59 2016"
      },
      "message": "high.py: Clean up current metric\n\nCurrent now output itself as \"-7476\\n\"\n\nBUG\u003d657605\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2443483002 .\n"
    },
    {
      "commit": "ec2f722789953607e3f36f9fa0f9c317e962d4a9",
      "tree": "c952d83cd40f47e9bd488d9725297ca8027c85c6",
      "parents": [
        "e1630f2659b58b9375f3cd00a896894884e7a676"
      ],
      "author": {
        "name": "Ryan Tseng",
        "email": "hinoka@google.com",
        "time": "Fri Oct 21 01:18:09 2016"
      },
      "committer": {
        "name": "Ryan Tseng",
        "email": "hinoka@google.com",
        "time": "Fri Oct 21 01:18:09 2016"
      },
      "message": "high.py: Fix current metric\n\nBUG\u003d657605\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2442623002 .\n"
    },
    {
      "commit": "e1630f2659b58b9375f3cd00a896894884e7a676",
      "tree": "3a9ba6ca4999999679d486f1f82588bbd1592dd0",
      "parents": [
        "36fb8119ee51cacb7358321bae2cced98a14be33"
      ],
      "author": {
        "name": "Ryan Tseng",
        "email": "hinoka@google.com",
        "time": "Fri Oct 21 00:48:43 2016"
      },
      "committer": {
        "name": "Ryan Tseng",
        "email": "hinoka@google.com",
        "time": "Fri Oct 21 00:48:43 2016"
      },
      "message": "Add current information to GetBattery()\n\nBUG\u003d657605\nR\u003dbpastene@chromium.org\n\nReview URL: https://codereview.chromium.org/2435603005 .\n"
    },
    {
      "commit": "36fb8119ee51cacb7358321bae2cced98a14be33",
      "tree": "fcebda103e9a567a8d43545b696f8e7c76c039f4",
      "parents": [
        "c9ac519abc2539534eb9dfc6c46fe5c8e371c90e"
      ],
      "author": {
        "name": "Ryan Tseng",
        "email": "hinoka@google.com",
        "time": "Thu Oct 20 19:30:24 2016"
      },
      "committer": {
        "name": "Ryan Tseng",
        "email": "hinoka@google.com",
        "time": "Thu Oct 20 19:30:24 2016"
      },
      "message": "high.py: Bail out of WaitUntilFullyBooted() if device is unavailable\n\nGetProp(\u0027init.svc.bootanim\u0027) returns one of 3 things:\n\u0027stopped\u0027: Boot animation has stopped, we can continue\n\u0027running\u0027: Boot animation is running, please wait...\nNone: Device is dead\n\nIf the device is dead, there\u0027s no point in waiting another 5 minutes for the\ndevice to finish its boot animation.\n\nBUG\u003d657605\nR\u003dmaruel@chromium.org, stip@chromium.org\n\nReview URL: https://codereview.chromium.org/2441523002 .\n"
    },
    {
      "commit": "c9ac519abc2539534eb9dfc6c46fe5c8e371c90e",
      "tree": "7e81a405f291b3d157d5a60e19c47d43143c8bef",
      "parents": [
        "775c24309c8b42913878401262111bdc1ba51d56"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Oct 11 20:14:40 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Oct 11 20:14:40 2016"
      },
      "message": "python-adb: Catch USBErrorIO when opening usb handle.\n\nSee https://chromium-swarm.appspot.com/restricted/bot/build40-b4 for\nexample.\n\nBUG\u003d639917\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2400323002 .\n"
    },
    {
      "commit": "775c24309c8b42913878401262111bdc1ba51d56",
      "tree": "2225de5a60e3bd7485dac226affbf90c4f9ec199",
      "parents": [
        "7e66a9c713a5ad1b12d52925028c1bed6e8bbcd3"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Aug 30 19:14:17 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Tue Aug 30 19:14:17 2016"
      },
      "message": "python-adb: Disable USB resets on USB failures.\n\nBUG\u003d642440\nR\u003djbudorick@chromium.org\n\nReview URL: https://codereview.chromium.org/2294023002 .\n"
    },
    {
      "commit": "7e66a9c713a5ad1b12d52925028c1bed6e8bbcd3",
      "tree": "04c55d942f322a75fcdb0e3638ee800f16fe5434",
      "parents": [
        "6e66b11329b1d55d98eab9f9242e31e6b5b9a5ae"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Mon Aug 29 18:29:29 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Mon Aug 29 18:29:29 2016"
      },
      "message": "python-adb: Ignore CLSE packets sent from the device for other streams.\n\nBUG\u003d626654\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2281183002 .\n"
    },
    {
      "commit": "6e66b11329b1d55d98eab9f9242e31e6b5b9a5ae",
      "tree": "6aa6d799c15c90b0d189cff5ea3cef521f020202",
      "parents": [
        "e655eaab1590513ec109650465a3c4ccc0e2909b"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Aug 25 20:47:48 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Aug 25 20:47:48 2016"
      },
      "message": "python-adb: Don\u0027t discard OKAYs from the device.\n\nEnqueue the OKAYs into the connection\u0027s message queue.\n\nAlso wait for the OKAY ack during file sync by popping from the queue.\n\nAlso report actual uptime and not cpu idle time.\n\nBUG\u003d638784\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2277523005 .\n"
    },
    {
      "commit": "e655eaab1590513ec109650465a3c4ccc0e2909b",
      "tree": "2868c2a9bffb2117b0d95f27cee3530b825f283a",
      "parents": [
        "ebee7e2e5e9c1a42d0b6ecbcd0ce87f7e73a4697"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Fri Aug 19 21:33:28 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Fri Aug 19 21:33:28 2016"
      },
      "message": "Explicitly trap usb1.USBErrorIO exceptions.\n\nI\u0027m not sure why but it seems it\u0027s not a children of usb1.USBError.\n\nR\u003dbpastene@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/2255083005 .\n"
    },
    {
      "commit": "ebee7e2e5e9c1a42d0b6ecbcd0ce87f7e73a4697",
      "tree": "17d777a370566ef9acbe17d0e7c3ae013b29a664",
      "parents": [
        "72674a1d640130b13da6d52c23c4e090e979d270"
      ],
      "author": {
        "name": "cyberstip",
        "email": "stip@chromium.org",
        "time": "Wed Aug 03 22:49:57 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Wed Aug 03 22:49:57 2016"
      },
      "message": "Handle LIBUSB_ERROR_NOT_FOUND. (#11)\n\n"
    },
    {
      "commit": "72674a1d640130b13da6d52c23c4e090e979d270",
      "tree": "146e7f9d4e895fdddd987a0e97c673b0dc9d04af",
      "parents": [
        "83afcaae4b045414bc47e10593c4b86d206112df"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Mon Jul 25 18:13:22 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Mon Jul 25 18:13:22 2016"
      },
      "message": "Add option to send reboot command and not wait for device.\n\nThis will be useful for devices that need ssh tunnels to communicate\n(i.e. GCE AVDs).\n\nAlso implement Reset() in TcpHandle.\n\nAlso add a ResetHandle() method to AdbCommands.\n\nBUG\u003d628769\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2177573003 .\n"
    },
    {
      "commit": "83afcaae4b045414bc47e10593c4b86d206112df",
      "tree": "5fd7403decc499812af4d48db7f16fb36bac8a23",
      "parents": [
        "2ac614444bcc994e7727fcc3501ed5d0060c76b9"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Sat Jul 23 00:53:54 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Sat Jul 23 00:53:54 2016"
      },
      "message": "Do not use assert on reply from the device.\n\nThese should only be exceptions or swallowed. This assert was a left over from\nprevious experimentation.\n\nR\u003dbpastene@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/2176673002 .\n"
    },
    {
      "commit": "2ac614444bcc994e7727fcc3501ed5d0060c76b9",
      "tree": "6bdeff46cf222aa14e7d07da34b6ff311cc4b52f",
      "parents": [
        "bb8e4239c31da3065155c46fd0cf5021c58cde7a"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Thu Jul 21 18:44:30 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Thu Jul 21 18:44:30 2016"
      },
      "message": "Remove assert from AdbCommandsSafe.Shell().\n\nConvert to returning exit_code \u003d\u003d 1.\n\nR\u003dbpastene@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/2165263002 .\n"
    },
    {
      "commit": "bb8e4239c31da3065155c46fd0cf5021c58cde7a",
      "tree": "a01d435693ed387a07da35e2a72e3cbe0cb4cd67",
      "parents": [
        "cbdf2489f1e465c333e609d0761232a7253eb569"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Thu Jul 21 18:43:00 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Thu Jul 21 18:43:00 2016"
      },
      "message": "Trap StopIteration and convert to InvalidResponseError.\n\nThen convert it to AdbCommandFailureException in filesync_protocol.\n\nR\u003dbpastene@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/2167153002 .\n"
    },
    {
      "commit": "cbdf2489f1e465c333e609d0761232a7253eb569",
      "tree": "08755a63b8315ec5bb20b8bf778e7c8fa382ba19",
      "parents": [
        "ede56eef7e41a9733b242efceefed0a1e59c1353"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Jul 21 16:44:36 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Jul 21 16:44:36 2016"
      },
      "message": "Expose sysfs port path for android devices.\n\nBUG\u003d\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2163633004 .\n"
    },
    {
      "commit": "ede56eef7e41a9733b242efceefed0a1e59c1353",
      "tree": "49a4542ec4a6a333d048b7753b0fb7043a0dac2a",
      "parents": [
        "1c657fc9f211e027c5a02cd3131e5b74c79c1da8"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Jul 14 18:32:11 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Thu Jul 14 18:32:11 2016"
      },
      "message": "Attempt to reset device handles when an I/O timeout occurs on connect.\n\nBUG\u003d\nR\u003dmaruel@chromium.org, stip@chromium.org\n\nReview URL: https://codereview.chromium.org/2146823004 .\n"
    },
    {
      "commit": "1c657fc9f211e027c5a02cd3131e5b74c79c1da8",
      "tree": "852a74ab7f63876f43d6ed2aba371e765764dbdf",
      "parents": [
        "5b8a6ebe7731f2ec3a4d8403ded1ce97124ea78b"
      ],
      "author": {
        "name": "cyberstip",
        "email": "stip@chromium.org",
        "time": "Tue Jun 21 20:57:38 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Tue Jun 21 20:57:38 2016"
      },
      "message": "Restore Timeout() logic. (#10)\n\n"
    },
    {
      "commit": "5b8a6ebe7731f2ec3a4d8403ded1ce97124ea78b",
      "tree": "aa07d9751b1fda7b92720cc1141663caa4c2e447",
      "parents": [
        "c707de073819ac5baca8d2c9980e3a6cf3ed81c9"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Fri Jun 17 17:28:51 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Fri Jun 17 17:29:00 2016"
      },
      "message": "Do not throw on when self.cache.available_frequencies is None.\n\nR\u003dbpastene@chromium.org\nBUG\u003d\n"
    },
    {
      "commit": "c707de073819ac5baca8d2c9980e3a6cf3ed81c9",
      "tree": "8fb03b7b125f40f666f2bacefbccf74406c9c7a7",
      "parents": [
        "3e79a6b4784e2338912522b24958249a16a06826"
      ],
      "author": {
        "name": "cyberstip",
        "email": "stip@chromium.org",
        "time": "Wed Jun 08 23:17:05 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Wed Jun 08 23:17:05 2016"
      },
      "message": "Report memory and process information for devices. (#9)"
    },
    {
      "commit": "3e79a6b4784e2338912522b24958249a16a06826",
      "tree": "21e2f8a4d3ecf49f571781433b9ea81f2c27b7b1",
      "parents": [
        "5d9f64bdcb43e3d92e343a6d90847938549965bf",
        "12812886b375c37532016c2f4d7f182ddbd84f18"
      ],
      "author": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Wed Jun 08 14:22:47 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Wed Jun 08 14:22:47 2016"
      },
      "message": "Merge pull request #8 from erock2112/master\n\nFix high_test after 65dec86"
    },
    {
      "commit": "12812886b375c37532016c2f4d7f182ddbd84f18",
      "tree": "21e2f8a4d3ecf49f571781433b9ea81f2c27b7b1",
      "parents": [
        "5d9f64bdcb43e3d92e343a6d90847938549965bf"
      ],
      "author": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Wed Jun 08 12:09:36 2016"
      },
      "committer": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Wed Jun 08 12:09:36 2016"
      },
      "message": "Fix high_test after 65dec86\n"
    },
    {
      "commit": "5d9f64bdcb43e3d92e343a6d90847938549965bf",
      "tree": "0f5ba308e60b9f59536ec33fcd865df18a419a09",
      "parents": [
        "3cf55dd8dc1309fad9616b9624e45f22af790f18",
        "65dec86524c3850f2fabe0bdb279e0f2c21198d6"
      ],
      "author": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Tue Jun 07 18:06:28 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Tue Jun 07 18:06:28 2016"
      },
      "message": "Merge pull request #7 from erock2112/master\n\nPlumb timeout through ReadAndDispatch, Shell(), use in long-running cmds"
    },
    {
      "commit": "65dec86524c3850f2fabe0bdb279e0f2c21198d6",
      "tree": "0f5ba308e60b9f59536ec33fcd865df18a419a09",
      "parents": [
        "3cf55dd8dc1309fad9616b9624e45f22af790f18"
      ],
      "author": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Tue Jun 07 18:04:00 2016"
      },
      "committer": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Tue Jun 07 18:04:00 2016"
      },
      "message": "Plumb timeout through ReadAndDispatch, Shell(), use in long-running cmds\n\nThis fixes a bug in which ReadAndDispatch hits a timeout for a\nlong-running command (eg. \u0027pm list packages\u0027) and assumes that the\nconnection was broken. When the command finally finishes, we get errors\nwhen reading output from subsequent commands.\n"
    },
    {
      "commit": "3cf55dd8dc1309fad9616b9624e45f22af790f18",
      "tree": "88b862702c154cbdc34b30b4b76066cb569eb8a4",
      "parents": [
        "69081bc4d0fbf8fbea59216aac30a1c31e7fccab",
        "7b18c0beb8253b81aa34e9402a96ff07fd11db65"
      ],
      "author": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Tue Jun 07 12:38:08 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Tue Jun 07 12:38:08 2016"
      },
      "message": "Merge pull request #6 from erock2112/master\n\nCPU scaling fallback to scaling_[min|max]_freq, not cpuinfo_...."
    },
    {
      "commit": "7b18c0beb8253b81aa34e9402a96ff07fd11db65",
      "tree": "88b862702c154cbdc34b30b4b76066cb569eb8a4",
      "parents": [
        "69081bc4d0fbf8fbea59216aac30a1c31e7fccab"
      ],
      "author": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Tue Jun 07 12:17:39 2016"
      },
      "committer": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Tue Jun 07 12:19:29 2016"
      },
      "message": "CPU scaling fallback to scaling_[min|max]_freq, not cpuinfo_....\n"
    },
    {
      "commit": "69081bc4d0fbf8fbea59216aac30a1c31e7fccab",
      "tree": "2b44f0b44d68822da4ab96250bdabaf5ce408d39",
      "parents": [
        "b9c59abf9d22c8c4c0c16090eab6c73f8b5512b1",
        "b4c1e955876883b12ce63dc4391cc78f6636ce2d"
      ],
      "author": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Mon Jun 06 21:03:43 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Mon Jun 06 21:03:43 2016"
      },
      "message": "Merge pull request #5 from erock2112/master\n\nFix fallback-to-shell in HighDevice.SetCPUSpeed()"
    },
    {
      "commit": "b4c1e955876883b12ce63dc4391cc78f6636ce2d",
      "tree": "2b44f0b44d68822da4ab96250bdabaf5ce408d39",
      "parents": [
        "b9c59abf9d22c8c4c0c16090eab6c73f8b5512b1"
      ],
      "author": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Mon Jun 06 18:47:12 2016"
      },
      "committer": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Mon Jun 06 18:47:12 2016"
      },
      "message": "Fix fallback-to-shell in HighDevice.SetCPUSpeed()\n"
    },
    {
      "commit": "b9c59abf9d22c8c4c0c16090eab6c73f8b5512b1",
      "tree": "7d00909d12c6673041bd6c9a5aa3329088a8e7d6",
      "parents": [
        "93e601cd4643767084b78b68835abb587264dfcc"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Fri May 27 22:21:48 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Fri May 27 22:21:48 2016"
      },
      "message": "Expose different types of device failures.\n\nAlso fix some pylint errors.\n\nBUG\u003d604080\nR\u003dmaruel@chromium.org\n\nReview URL: https://codereview.chromium.org/2013313004 .\n"
    },
    {
      "commit": "93e601cd4643767084b78b68835abb587264dfcc",
      "tree": "11d47498fee779145fb322a7d7e0b67e5d2e14cd",
      "parents": [
        "ba17ba29fddc79a097a3052d83e579c2efcbeec3",
        "06a26e3e6e4a099fecc2693ed8dc5152d2e178d4"
      ],
      "author": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Thu May 26 17:05:14 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Thu May 26 17:05:14 2016"
      },
      "message": "Merge pull request #4 from erock2112/master\n\nCPU scaling governors assert: Fix intersect-\u003eintersection"
    },
    {
      "commit": "06a26e3e6e4a099fecc2693ed8dc5152d2e178d4",
      "tree": "11d47498fee779145fb322a7d7e0b67e5d2e14cd",
      "parents": [
        "ba17ba29fddc79a097a3052d83e579c2efcbeec3"
      ],
      "author": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Thu May 26 16:59:02 2016"
      },
      "committer": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Thu May 26 17:04:15 2016"
      },
      "message": "CPU scaling governors assert: Fix intersect-\u003eintersection\n"
    },
    {
      "commit": "ba17ba29fddc79a097a3052d83e579c2efcbeec3",
      "tree": "216aee262df1394034da94830d84c4ffb83c5bba",
      "parents": [
        "c2fd392bb609e960768411f1af804bc403dda164",
        "5e64048cdc871e4cd991d1016e96a28e125bb895"
      ],
      "author": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Thu May 26 15:24:34 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Thu May 26 15:24:34 2016"
      },
      "message": "Merge pull request #3 from erock2112/master\n\nBe more forgiving with available CPU scaling governors assert"
    },
    {
      "commit": "5e64048cdc871e4cd991d1016e96a28e125bb895",
      "tree": "216aee262df1394034da94830d84c4ffb83c5bba",
      "parents": [
        "c2fd392bb609e960768411f1af804bc403dda164"
      ],
      "author": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Thu May 26 15:12:43 2016"
      },
      "committer": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Thu May 26 15:12:43 2016"
      },
      "message": "Be more forgiving with available CPU scaling governors assert\n\nRather than enforcing that all of the device\u0027s scaling governors are\nin the KNOWN_CPU_SCALING_GOVERNOR_VALUES list, enforce that at least\none of them is in the list. We already enforce that the desired governor\nis in the known list when we try to set it, so we just need to ensure\nthat there\u0027s at least one available which is valid.\n"
    },
    {
      "commit": "c2fd392bb609e960768411f1af804bc403dda164",
      "tree": "1f6bc9666ca86684a65217c57fc01d5be304e870",
      "parents": [
        "7b20f895c33a8a950a4e69b33c02108cb8c701f0",
        "a77c3fbea59f346acb4ced562a21bcc8ba95470d"
      ],
      "author": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Wed May 25 15:49:32 2016"
      },
      "committer": {
        "name": "M-A",
        "email": "maruel@gmail.com",
        "time": "Wed May 25 15:49:32 2016"
      },
      "message": "Merge pull request #2 from erock2112/master\n\nMimic self.Shell fallback from SetCPUScalingGovernor in SetCPUSpeed"
    },
    {
      "commit": "a77c3fbea59f346acb4ced562a21bcc8ba95470d",
      "tree": "1f6bc9666ca86684a65217c57fc01d5be304e870",
      "parents": [
        "7b20f895c33a8a950a4e69b33c02108cb8c701f0"
      ],
      "author": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Wed May 25 15:14:23 2016"
      },
      "committer": {
        "name": "Eric Boren",
        "email": "borenet@google.com",
        "time": "Wed May 25 15:14:23 2016"
      },
      "message": "Mimic self.Shell fallback from SetCPUScalingGovernor in SetCPUSpeed\n"
    },
    {
      "commit": "7b20f895c33a8a950a4e69b33c02108cb8c701f0",
      "tree": "48f657293ac084569663b1a509667053674f633b",
      "parents": [
        "043eb6ea4a4aa2c4513d087625a8dd38d67c242c"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Tue May 24 19:08:45 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Tue May 24 19:08:47 2016"
      },
      "message": "Fix WaitUntilFullyBooted() on android 4.4.\n\npm path may return an empty string when it\u0027s ready, instead of an error message.\nProbably yet-another-race-condition.\n"
    },
    {
      "commit": "043eb6ea4a4aa2c4513d087625a8dd38d67c242c",
      "tree": "1045b2fd8b889c8c4051b1ade5262a706e16f442",
      "parents": [
        "3ace39376437e2a679aae7e553a5c9c7839d0b25"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Thu Mar 31 19:19:30 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Tue Apr 19 20:04:02 2016"
      },
      "message": "Add hotplug as a known CPU governor.\n"
    },
    {
      "commit": "3ace39376437e2a679aae7e553a5c9c7839d0b25",
      "tree": "44b01f646d4b82c7878f388076fac7db292e7e9c",
      "parents": [
        "af6ef858bb87af5745cb301c43e4d8e3bc61c492"
      ],
      "author": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Mon Apr 11 17:39:05 2016"
      },
      "committer": {
        "name": "Benjamin Pastene",
        "email": "bpastene@google.com",
        "time": "Mon Apr 11 20:00:30 2016"
      },
      "message": "Fix/implement basic TCP support.\n"
    },
    {
      "commit": "af6ef858bb87af5745cb301c43e4d8e3bc61c492",
      "tree": "09153b3506b61a2c55ffb3b07cf2113c56b0c21f",
      "parents": [
        "0562f4de32aca19ae691a5480e6a32e37b05b7e9"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Fri Mar 18 22:16:09 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Fri Mar 18 22:16:09 2016"
      },
      "message": "Fix missing import, causing a double-exception.\n"
    },
    {
      "commit": "0562f4de32aca19ae691a5480e6a32e37b05b7e9",
      "tree": "f65c09c502dc76fa875881a8e737cb641d6f6a75",
      "parents": [
        "149a408e17c101544745b6903043cc7f0a534cd1",
        "29e0c8378ad13f3393ffbe386441661e15733b54"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Fri Feb 19 00:32:41 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Fri Feb 19 00:32:41 2016"
      },
      "message": "Merge remote-tracking branch \u0027origin/master\u0027 into luci_master\n"
    },
    {
      "commit": "29e0c8378ad13f3393ffbe386441661e15733b54",
      "tree": "725b01dfe09091d4157029b12ad90f2d78d7718a",
      "parents": [
        "39dc3feb3b27467e44fe65ca2499398b2353ec74",
        "34f41ee1b81eff9506063d3d37d721d9b81bb5c3"
      ],
      "author": {
        "name": "Fahrzin Hemmati",
        "email": "fahhem@users.noreply.github.com",
        "time": "Wed Feb 17 23:16:55 2016"
      },
      "committer": {
        "name": "Fahrzin Hemmati",
        "email": "fahhem@users.noreply.github.com",
        "time": "Wed Feb 17 23:16:55 2016"
      },
      "message": "Merge pull request #15 from maruel/clean\n\nFix --port_path"
    },
    {
      "commit": "39dc3feb3b27467e44fe65ca2499398b2353ec74",
      "tree": "6721ddf32282d9606755a2461ad14544bec59fa7",
      "parents": [
        "ebf881722efbace25853dbd6685445c5b904ef28",
        "f8cde27976b7238e73f43a8a4898afb4332f5f8e"
      ],
      "author": {
        "name": "Fahrzin Hemmati",
        "email": "fahhem@users.noreply.github.com",
        "time": "Wed Feb 17 23:15:37 2016"
      },
      "committer": {
        "name": "Fahrzin Hemmati",
        "email": "fahhem@users.noreply.github.com",
        "time": "Wed Feb 17 23:15:37 2016"
      },
      "message": "Merge pull request #14 from google/clean_rsa\n\nSeparate PythonRSASigner\u0027s second constructor path"
    },
    {
      "commit": "34f41ee1b81eff9506063d3d37d721d9b81bb5c3",
      "tree": "d4d0b960b81f119d52796e6173bf98d33cf67595",
      "parents": [
        "ebf881722efbace25853dbd6685445c5b904ef28"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Wed Feb 17 22:10:12 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Wed Feb 17 22:10:14 2016"
      },
      "message": "Fix --port_path; improve doc.\n\nadb_debug.py --port_path was broken because PortPathMatcher was called with a\nclass instance but the function wasn\u0027t decorated appropriately.\n\nImprove documentation for adb_debug.py output.\n"
    },
    {
      "commit": "149a408e17c101544745b6903043cc7f0a534cd1",
      "tree": "53cba277e9a7e4973c828077e35708f3bfaa7bc5",
      "parents": [
        "346e6b33332ab9666196572a63126e82b1de048b",
        "ebf881722efbace25853dbd6685445c5b904ef28"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Wed Feb 17 01:30:19 2016"
      },
      "committer": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@chromium.org",
        "time": "Wed Feb 17 01:30:19 2016"
      },
      "message": "Merge branch \u0027master\u0027 into luci_master\n"
    },
    {
      "commit": "f8cde27976b7238e73f43a8a4898afb4332f5f8e",
      "tree": "6721ddf32282d9606755a2461ad14544bec59fa7",
      "parents": [
        "8ac36344c0ca3ee0a8385a1b48d83e4403714ca1"
      ],
      "author": {
        "name": "Fahrzin Hemmati",
        "email": "fahhem@gmail.com",
        "time": "Tue Feb 16 23:08:42 2016"
      },
      "committer": {
        "name": "Fahrzin Hemmati",
        "email": "fahhem@gmail.com",
        "time": "Tue Feb 16 23:13:46 2016"
      },
      "message": "Move signer decision into import tree\n"
    },
    {
      "commit": "8ac36344c0ca3ee0a8385a1b48d83e4403714ca1",
      "tree": "0cd92e29b86350d64f16456fca8763f1c08d427d",
      "parents": [
        "ebf881722efbace25853dbd6685445c5b904ef28"
      ],
      "author": {
        "name": "Fahrzin Hemmati",
        "email": "fahhem@gmail.com",
        "time": "Tue Feb 16 23:07:47 2016"
      },
      "committer": {
        "name": "Fahrzin Hemmati",
        "email": "fahhem@gmail.com",
        "time": "Tue Feb 16 23:13:46 2016"
      },
      "message": "Move pythonrsa\u0027s key_path constructor to classmethod\n"
    }
  ],
  "next": "ebf881722efbace25853dbd6685445c5b904ef28"
}
