)]}'
{
  "log": [
    {
      "commit": "4b549587bd8eaa6e42f99e2cbf6d8b05ef0f7935",
      "tree": "ee738243ef847e7755aa89716b710ccdaf882e9b",
      "parents": [
        "60e6feaf3eb2b02194da29946430b09add817292",
        "4a86c6af2d3691a6bceea47da0ab1bee9594ac92"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Fri Dec 07 16:14:37 2018 -0800"
      },
      "committer": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Fri Dec 07 16:14:37 2018 -0800"
      },
      "message": "DO NOT MERGE\n\nMerge pie-platform-release (PPRL.181205.001, history only) into master\n\nBug: 120502534\nChange-Id: I3547ab297163ddea6ad2dcfbf6ba1a8e0d2c6c74\n"
    },
    {
      "commit": "60e6feaf3eb2b02194da29946430b09add817292",
      "tree": "ee738243ef847e7755aa89716b710ccdaf882e9b",
      "parents": [
        "4258671cc524f424e7935661ee0cdc9fa42dcb63",
        "11769a8584c75e10fa194ccebe41489ab53a3bc5"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Tue Aug 07 17:06:08 2018 -0700"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Aug 07 17:06:08 2018 -0700"
      },
      "message": "Merge Android Pie into master am: ea6533a4d4\nam: 11769a8584\n\nChange-Id: I7e7edac95a266bcdb5ef23b13ee7dc80abb3d06a\n"
    },
    {
      "commit": "11769a8584c75e10fa194ccebe41489ab53a3bc5",
      "tree": "ee738243ef847e7755aa89716b710ccdaf882e9b",
      "parents": [
        "a34c168a3ebe6206b5e2dcef0f9f44ad83f300cf",
        "ea6533a4d41a55bb9bdb19d793cf37be457bcff3"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Tue Aug 07 13:28:05 2018 -0700"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Aug 07 13:28:05 2018 -0700"
      },
      "message": "Merge Android Pie into master\nam: ea6533a4d4\n\nChange-Id: I5464453d2ba908d96709ff7baa3e2e33007cf919\n"
    },
    {
      "commit": "ea6533a4d41a55bb9bdb19d793cf37be457bcff3",
      "tree": "ee738243ef847e7755aa89716b710ccdaf882e9b",
      "parents": [
        "5222d76c31640dbb9c2f319f7f09cb42074002f9",
        "a34c168a3ebe6206b5e2dcef0f9f44ad83f300cf"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Mon Aug 06 16:50:27 2018 -0700"
      },
      "committer": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Mon Aug 06 16:50:27 2018 -0700"
      },
      "message": "Merge Android Pie into master\n\nBug: 112104996\nChange-Id: Id6b6c101cd3a966aa1f7b3200f7e5f78b6fa2261\n"
    },
    {
      "commit": "4258671cc524f424e7935661ee0cdc9fa42dcb63",
      "tree": "ee738243ef847e7755aa89716b710ccdaf882e9b",
      "parents": [
        "8b170d2ed92ea3d771ce071e42dfff5fa32a66ae",
        "a34c168a3ebe6206b5e2dcef0f9f44ad83f300cf"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Sat Jun 09 01:54:39 2018 -0700"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Sat Jun 09 01:54:39 2018 -0700"
      },
      "message": "Merge pi-dev-plus-aosp-without-vendor into stage-aosp-master\nam: a34c168a3e\n\nChange-Id: I8068c5f0b1e644b920635530387fce8d41259983\n"
    },
    {
      "commit": "a34c168a3ebe6206b5e2dcef0f9f44ad83f300cf",
      "tree": "ee738243ef847e7755aa89716b710ccdaf882e9b",
      "parents": [
        "4ea07eb5fff3830efe24c0bf022f7838c2fd1f9d",
        "8b170d2ed92ea3d771ce071e42dfff5fa32a66ae"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Fri Jun 08 11:07:08 2018 -0700"
      },
      "committer": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Fri Jun 08 11:07:08 2018 -0700"
      },
      "message": "Merge pi-dev-plus-aosp-without-vendor into stage-aosp-master\n\nBug: 79597307\nChange-Id: I153a61cb66c0138f54463227d9d2069f5dc8f059\n"
    },
    {
      "commit": "4a86c6af2d3691a6bceea47da0ab1bee9594ac92",
      "tree": "ee738243ef847e7755aa89716b710ccdaf882e9b",
      "parents": [
        "21ff26529b05a9f3038ff4a25ab8bf6d5eeb77f3",
        "8b170d2ed92ea3d771ce071e42dfff5fa32a66ae"
      ],
      "author": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Wed Feb 14 08:26:56 2018 +0000"
      },
      "committer": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Wed Feb 14 08:26:56 2018 +0000"
      },
      "message": "Snap for 4603395 from 8b170d2ed92ea3d771ce071e42dfff5fa32a66ae to pi-release\n\nChange-Id: I78f4c578ceea467a715aa1fa4f67517cb1850ad8\n"
    },
    {
      "commit": "8b170d2ed92ea3d771ce071e42dfff5fa32a66ae",
      "tree": "ee738243ef847e7755aa89716b710ccdaf882e9b",
      "parents": [
        "8ce39908334d01c277cf96a3c029c6a53887d816",
        "885de8d53c95a4467a9b160953d69c924d1605ab"
      ],
      "author": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Wed Feb 14 02:00:04 2018 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Wed Feb 14 02:00:04 2018 +0000"
      },
      "message": "Add metadata am: 5222d76c31 am: 4ea07eb5ff\nam: 885de8d53c\n\nChange-Id: I84b273543440eba6a741807254edf0eb3a39a5d3\n"
    },
    {
      "commit": "885de8d53c95a4467a9b160953d69c924d1605ab",
      "tree": "44ee4fbb6480d5f3899fea0dffa30fccdd42defd",
      "parents": [
        "13f838c7ab03dee52e15af9b045928173afb2a4f",
        "4ea07eb5fff3830efe24c0bf022f7838c2fd1f9d"
      ],
      "author": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Wed Feb 14 01:55:11 2018 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Wed Feb 14 01:55:11 2018 +0000"
      },
      "message": "Add metadata am: 5222d76c31\nam: 4ea07eb5ff\n\nChange-Id: I8c09b684af1af4b290487c9e056ed2d1c1e1134c\n"
    },
    {
      "commit": "4ea07eb5fff3830efe24c0bf022f7838c2fd1f9d",
      "tree": "44ee4fbb6480d5f3899fea0dffa30fccdd42defd",
      "parents": [
        "aaa36187f88419afb7a2d326862d6e9f25989379",
        "5222d76c31640dbb9c2f319f7f09cb42074002f9"
      ],
      "author": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Wed Feb 14 01:50:35 2018 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Wed Feb 14 01:50:35 2018 +0000"
      },
      "message": "Add metadata\nam: 5222d76c31\n\nChange-Id: I62de2cebe5d5e94c2c9e7be5f070c809059c83dc\n"
    },
    {
      "commit": "5222d76c31640dbb9c2f319f7f09cb42074002f9",
      "tree": "44ee4fbb6480d5f3899fea0dffa30fccdd42defd",
      "parents": [
        "03f7102740197bb19c4b28bc96f6190c18fd4563"
      ],
      "author": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Tue Feb 13 14:42:07 2018 -0800"
      },
      "committer": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Tue Feb 13 16:00:05 2018 -0800"
      },
      "message": "Add metadata\n\nExempt-From-Owner-Approval: meta data\n\nBUG:69316045\nChange-Id: I5ff5e1d29b41ad5b49d9487f34b46e83f1e5b59d\n"
    },
    {
      "commit": "21ff26529b05a9f3038ff4a25ab8bf6d5eeb77f3",
      "tree": "7cc246329b1ea3670696d0a3577f5be9e0b26cda",
      "parents": [
        "4ea3cbd5fca6b3b6cd075941bcc7ecaf59e5495a",
        "8ce39908334d01c277cf96a3c029c6a53887d816"
      ],
      "author": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Mon Dec 11 12:09:57 2017 +0000"
      },
      "committer": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Mon Dec 11 12:09:57 2017 +0000"
      },
      "message": "Snap for 4496165 from 8ce39908334d01c277cf96a3c029c6a53887d816 to pi-release\n\nChange-Id: I49e93f943d3a64cb2ab9bbd2f0951cbaa8d13609\n"
    },
    {
      "commit": "8ce39908334d01c277cf96a3c029c6a53887d816",
      "tree": "7cc246329b1ea3670696d0a3577f5be9e0b26cda",
      "parents": [
        "9c6652c2a8cfb4681581e620ed67e375d140419d",
        "13f838c7ab03dee52e15af9b045928173afb2a4f"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Thu Dec 07 21:00:03 2017 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Thu Dec 07 21:00:03 2017 +0000"
      },
      "message": "DO NOT MERGE: Merge Oreo MR1 into master am: 03f7102740  -s ours am: aaa36187f8\nam: 13f838c7ab  -s ours\n\nChange-Id: I40370e272ea3ed9c2aaf433a98e748af516071d8\n"
    },
    {
      "commit": "13f838c7ab03dee52e15af9b045928173afb2a4f",
      "tree": "2de0c37ad0c7254d3f38e422ef702f9e19ab6106",
      "parents": [
        "1db35330e4b5e65527e49d0a6abbbfca632006c6",
        "aaa36187f88419afb7a2d326862d6e9f25989379"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Thu Dec 07 06:20:06 2017 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Thu Dec 07 06:20:06 2017 +0000"
      },
      "message": "DO NOT MERGE: Merge Oreo MR1 into master am: 03f7102740  -s ours\nam: aaa36187f8\n\nChange-Id: Ifdeeba1cefe57e029843d5da67e3579cbede2d52\n"
    },
    {
      "commit": "aaa36187f88419afb7a2d326862d6e9f25989379",
      "tree": "2de0c37ad0c7254d3f38e422ef702f9e19ab6106",
      "parents": [
        "36c7b759083511d4a3651bd9bd3da2b04e584a88",
        "03f7102740197bb19c4b28bc96f6190c18fd4563"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Thu Dec 07 03:55:21 2017 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Thu Dec 07 03:55:21 2017 +0000"
      },
      "message": "DO NOT MERGE: Merge Oreo MR1 into master\nam: 03f7102740  -s ours\n\nChange-Id: Ife66bc9a7c2beb0f29ede969e87d5eae901d1cd8\n"
    },
    {
      "commit": "03f7102740197bb19c4b28bc96f6190c18fd4563",
      "tree": "2de0c37ad0c7254d3f38e422ef702f9e19ab6106",
      "parents": [
        "63fd9cc1fc6e6b0ceb78950d96f905fdd3edee32",
        "36c7b759083511d4a3651bd9bd3da2b04e584a88"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Wed Dec 06 11:51:52 2017 -0800"
      },
      "committer": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Wed Dec 06 14:24:46 2017 -0800"
      },
      "message": "DO NOT MERGE: Merge Oreo MR1 into master\n\nExempt-From-Owner-Approval: Changes already landed internally\nChange-Id: Ic08d3b8fa839c1860765c87a0951e86271c5f0a6\n"
    },
    {
      "commit": "4ea3cbd5fca6b3b6cd075941bcc7ecaf59e5495a",
      "tree": "7cc246329b1ea3670696d0a3577f5be9e0b26cda",
      "parents": [
        "32f856dc8c984a501952d82728b3d035b60b8ec7",
        "9c6652c2a8cfb4681581e620ed67e375d140419d"
      ],
      "author": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Wed Nov 15 08:40:43 2017 +0000"
      },
      "committer": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Wed Nov 15 08:40:43 2017 +0000"
      },
      "message": "Snap for 4453288 from 9c6652c2a8cfb4681581e620ed67e375d140419d to pi-release\n\nChange-Id: I423cebcc17c7e2c9c85d31a21625cda116da7cfb\n"
    },
    {
      "commit": "9c6652c2a8cfb4681581e620ed67e375d140419d",
      "tree": "7cc246329b1ea3670696d0a3577f5be9e0b26cda",
      "parents": [
        "836f184ad6da4abf088973cd40a05b1d6351c4bc",
        "1db35330e4b5e65527e49d0a6abbbfca632006c6"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Wed Nov 15 01:53:53 2017 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Wed Nov 15 01:53:53 2017 +0000"
      },
      "message": "Merge remote-tracking branch \u0027goog/stage-aosp-master\u0027 into HEAD\nam: 1db35330e4\n\nChange-Id: Ia9dbdf5652dc7fbd5c299ca0f7160865c856aae6\n"
    },
    {
      "commit": "1db35330e4b5e65527e49d0a6abbbfca632006c6",
      "tree": "2de0c37ad0c7254d3f38e422ef702f9e19ab6106",
      "parents": [
        "cacad4c29a2e437680e701d6cffae04a6825a89c",
        "36c7b759083511d4a3651bd9bd3da2b04e584a88"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Tue Nov 14 16:38:11 2017 -0800"
      },
      "committer": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Tue Nov 14 16:38:11 2017 -0800"
      },
      "message": "Merge remote-tracking branch \u0027goog/stage-aosp-master\u0027 into HEAD\n\nChange-Id: I4e6248df3d1f3ec26125dd2b4560667a5ab76cd7\n"
    },
    {
      "commit": "36c7b759083511d4a3651bd9bd3da2b04e584a88",
      "tree": "2de0c37ad0c7254d3f38e422ef702f9e19ab6106",
      "parents": [
        "5ff310359fe39e3fe4d1de5144bc26d0d3e8048d",
        "a928cca9a2dfb75b990d5f03cc65ad7096869e88"
      ],
      "author": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Mon Nov 13 14:35:23 2017 -0800"
      },
      "committer": {
        "name": "Xin Li",
        "email": "delphij@google.com",
        "time": "Mon Nov 13 14:35:23 2017 -0800"
      },
      "message": "Merge commit \u0027a928cca9a2dfb75b990d5f03cc65ad7096869e88\u0027 into HEAD\n\nChange-Id: Ic70668c4d3061cb5ce534bb4d828286dee4f7e1a\n"
    },
    {
      "commit": "32f856dc8c984a501952d82728b3d035b60b8ec7",
      "tree": "7cc246329b1ea3670696d0a3577f5be9e0b26cda",
      "parents": [
        "08671feb561d03e318da33f33a2e22b9083b1dd0",
        "836f184ad6da4abf088973cd40a05b1d6351c4bc"
      ],
      "author": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Sun Oct 29 08:11:15 2017 +0000"
      },
      "committer": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Sun Oct 29 08:11:15 2017 +0000"
      },
      "message": "Snap for 4422293 from 836f184ad6da4abf088973cd40a05b1d6351c4bc to pi-release\n\nChange-Id: I144a86772cc765573c349a79a0aa76d2e986aded\n"
    },
    {
      "commit": "08671feb561d03e318da33f33a2e22b9083b1dd0",
      "tree": "6256c2082bdaec02a8e871e5c375b730580100d5",
      "parents": [
        "2d18ac0079984ecb844bbf144dc0b87561b89b43",
        "edb5a90452c6a47724453b62ffc1517517932b26"
      ],
      "author": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Wed Oct 25 08:08:49 2017 +0000"
      },
      "committer": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Wed Oct 25 08:08:49 2017 +0000"
      },
      "message": "Snap for 4415813 from edb5a90452c6a47724453b62ffc1517517932b26 to pi-release\n\nChange-Id: If7e2dcdfd71ab79f122c87508833c34e38073abe\n"
    },
    {
      "commit": "836f184ad6da4abf088973cd40a05b1d6351c4bc",
      "tree": "7cc246329b1ea3670696d0a3577f5be9e0b26cda",
      "parents": [
        "edb5a90452c6a47724453b62ffc1517517932b26",
        "af0ed2ab4806fa15edec3f16c83c651da82a5757"
      ],
      "author": {
        "name": "Kevin DuBois",
        "email": "kevindubois@google.com",
        "time": "Tue Oct 24 16:15:46 2017 -0700"
      },
      "committer": {
        "name": "Kevin DuBois",
        "email": "kevindubois@google.com",
        "time": "Tue Oct 24 16:52:28 2017 -0700"
      },
      "message": "Merge branch \u0027master\u0027 of ssh://github.com/ARM-software/devlib\n\nChange-Id: I6d3051f6ef0e49ea2efb26daec42ff1cd0dce8b0\n"
    },
    {
      "commit": "edb5a90452c6a47724453b62ffc1517517932b26",
      "tree": "6256c2082bdaec02a8e871e5c375b730580100d5",
      "parents": [
        "865cf9598537f5a405e8ada5ffed91daae9ac414",
        "cacad4c29a2e437680e701d6cffae04a6825a89c"
      ],
      "author": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Tue Oct 24 20:35:46 2017 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Oct 24 20:35:46 2017 +0000"
      },
      "message": "Merge remote-tracking branch \u0027goog/stage-aosp-master\u0027 into HEAD am: 63fd9cc1fc am: 5ff310359f\nam: cacad4c29a\n\nChange-Id: Ibc8eff977b742730470a309036810a9f5dca702a\n"
    },
    {
      "commit": "cacad4c29a2e437680e701d6cffae04a6825a89c",
      "tree": "2de0c37ad0c7254d3f38e422ef702f9e19ab6106",
      "parents": [
        "a928cca9a2dfb75b990d5f03cc65ad7096869e88",
        "5ff310359fe39e3fe4d1de5144bc26d0d3e8048d"
      ],
      "author": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Tue Oct 24 20:31:16 2017 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Oct 24 20:31:16 2017 +0000"
      },
      "message": "Merge remote-tracking branch \u0027goog/stage-aosp-master\u0027 into HEAD am: 63fd9cc1fc\nam: 5ff310359f\n\nChange-Id: I2a8ba246c8dd8f794f8ceec41e3ce6f5db41b186\n"
    },
    {
      "commit": "5ff310359fe39e3fe4d1de5144bc26d0d3e8048d",
      "tree": "16cbc42364994cee6f0479f575e906f7dcad4755",
      "parents": [
        "9c29690314577c966c69c481547d3c376abb257f",
        "63fd9cc1fc6e6b0ceb78950d96f905fdd3edee32"
      ],
      "author": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Tue Oct 24 20:24:30 2017 +0000"
      },
      "committer": {
        "name": "android-build-merger",
        "email": "android-build-merger@google.com",
        "time": "Tue Oct 24 20:24:30 2017 +0000"
      },
      "message": "Merge remote-tracking branch \u0027goog/stage-aosp-master\u0027 into HEAD\nam: 63fd9cc1fc\n\nChange-Id: I800cb64d4413f38804f94db48340c2553b893ece\n"
    },
    {
      "commit": "63fd9cc1fc6e6b0ceb78950d96f905fdd3edee32",
      "tree": "16cbc42364994cee6f0479f575e906f7dcad4755",
      "parents": [
        "517fa9ee1a9f3617d37c9a8aa317367ad44a857b",
        "9c29690314577c966c69c481547d3c376abb257f"
      ],
      "author": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Tue Oct 24 12:04:14 2017 -0700"
      },
      "committer": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Tue Oct 24 12:04:14 2017 -0700"
      },
      "message": "Merge remote-tracking branch \u0027goog/stage-aosp-master\u0027 into HEAD\n"
    },
    {
      "commit": "af0ed2ab4806fa15edec3f16c83c651da82a5757",
      "tree": "126c59ca7a18b652718daae5bef2b5e5a7dc2202",
      "parents": [
        "dcffccbb690fbc636d66383a4010c84ebf1bd141",
        "417ab3df3e292393bd6c75046091815ade575f79"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Tue Oct 24 16:29:17 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 24 16:29:17 2017 +0100"
      },
      "message": "Merge pull request #196 from bjackman/is-network-connected\n\ntarget: Ensure returning False when is_network_connected fails"
    },
    {
      "commit": "417ab3df3e292393bd6c75046091815ade575f79",
      "tree": "40e6f0ab2dab3ee725276731cc19707dc745ff48",
      "parents": [
        "486b3f524e6b2e7baf3e12446dfe9125d69c88b7"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Tue Oct 24 16:03:10 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Tue Oct 24 16:05:05 2017 +0100"
      },
      "message": "target: Ensure returning False when is_network_connected fails\n"
    },
    {
      "commit": "dcffccbb690fbc636d66383a4010c84ebf1bd141",
      "tree": "8ea35af54c39600e399840857155dc467287166e",
      "parents": [
        "1ce96e0097a73346a17c91f04847e8d989283167",
        "486b3f524e6b2e7baf3e12446dfe9125d69c88b7"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Tue Oct 24 14:36:37 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 24 14:36:37 2017 +0100"
      },
      "message": "Merge pull request #193 from bjackman/is-network-connected\n\ntarget: Add is_network_connected method"
    },
    {
      "commit": "517fa9ee1a9f3617d37c9a8aa317367ad44a857b",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [],
      "author": {
        "name": "Bill Yi",
        "email": "byi@google.com",
        "time": "Mon Oct 23 16:09:04 2017 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Oct 23 16:09:04 2017 +0000"
      },
      "message": "Initial empty repository\n"
    },
    {
      "commit": "486b3f524e6b2e7baf3e12446dfe9125d69c88b7",
      "tree": "3b54ef5d3b235fc86dbe17875fd881c73f416b76",
      "parents": [
        "16d5e0b6a78c676449596b3bae41ff65979b4181"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Oct 18 11:28:08 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 23 14:46:16 2017 +0100"
      },
      "message": "target: Add is_network_connected method\n"
    },
    {
      "commit": "1ce96e0097a73346a17c91f04847e8d989283167",
      "tree": "c776e35301dfad42f730ee702b88d3126866c604",
      "parents": [
        "3056e333e16697a5fa71b4e754e7d53fa26c825d",
        "fe403b629ec42bdd7decca3c02a92abe7f6d7f7c"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Mon Oct 23 12:59:08 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 23 12:59:08 2017 +0100"
      },
      "message": "Merge pull request #194 from bjackman/screen-rotation-int\n\nAndroidTarget: Make get_rotation return an int"
    },
    {
      "commit": "3056e333e16697a5fa71b4e754e7d53fa26c825d",
      "tree": "e4cfc974b7c207e2151ac91f5a419219def4bbc9",
      "parents": [
        "16d5e0b6a78c676449596b3bae41ff65979b4181",
        "a679d579fd7bf4f7fbcf42b74334ee9b95db9931"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Mon Oct 23 12:55:02 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 23 12:55:02 2017 +0100"
      },
      "message": "Merge pull request #195 from bjackman/fix-logcat-logfile\n\nLogcatMonitor: Fix opening logfile for write"
    },
    {
      "commit": "a679d579fd7bf4f7fbcf42b74334ee9b95db9931",
      "tree": "e4cfc974b7c207e2151ac91f5a419219def4bbc9",
      "parents": [
        "16d5e0b6a78c676449596b3bae41ff65979b4181"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Fri Oct 20 16:08:32 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Fri Oct 20 16:08:32 2017 +0100"
      },
      "message": "LogcatMonitor: Fix opening logfile for write\n"
    },
    {
      "commit": "fe403b629ec42bdd7decca3c02a92abe7f6d7f7c",
      "tree": "4b7083111445d0e55e8f1ccc69f5c2d423297243",
      "parents": [
        "16d5e0b6a78c676449596b3bae41ff65979b4181"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Oct 18 14:26:09 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Oct 18 14:26:54 2017 +0100"
      },
      "message": "AndroidTarget: Make get_rotation return an int\n\nThat means you can pass the result back to set_rotation without\nhaving to change its type.\n"
    },
    {
      "commit": "16d5e0b6a78c676449596b3bae41ff65979b4181",
      "tree": "001ae8836cf72f0b0d5a3799cba3947b5a31754e",
      "parents": [
        "9837b4012bcf94d1fe97361e4fe0d50229428ea3",
        "4a6aacef992e1d5b78f9d80004936fb540740bf5"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Thu Oct 12 16:34:48 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 12 16:34:48 2017 +0100"
      },
      "message": "Merge pull request #192 from derkling/acme_fix_iio-capture_release\n\nInstrument/Acmecape: ensure iio-capture termination"
    },
    {
      "commit": "4a6aacef992e1d5b78f9d80004936fb540740bf5",
      "tree": "001ae8836cf72f0b0d5a3799cba3947b5a31754e",
      "parents": [
        "9837b4012bcf94d1fe97361e4fe0d50229428ea3"
      ],
      "author": {
        "name": "Patrick Bellasi",
        "email": "patrick.bellasi@arm.com",
        "time": "Thu Oct 12 14:51:19 2017 +0100"
      },
      "committer": {
        "name": "Patrick Bellasi",
        "email": "patrick.bellasi@arm.com",
        "time": "Thu Oct 12 15:01:28 2017 +0100"
      },
      "message": "Instrument/Acmecape: ensure iio-capture termination\n\nOnce an ACME cape instrument is released, if the stop() method has not\nbeen called by the client code, let\u0027s ensure to release the channels by\nkilling the corresponding iio-caputure process.\n\nSigned-off-by: Patrick Bellasi \u003cpatrick.bellasi@arm.com\u003e\n"
    },
    {
      "commit": "9837b4012bcf94d1fe97361e4fe0d50229428ea3",
      "tree": "1acebc1027636910358f58790cb19dc39974b6fe",
      "parents": [
        "5421ddaae8b7431ca504a454b3fc8595e098a3bb",
        "71d5b8bc79b4c2a89422836e6f7169f16a2d3640"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Thu Oct 12 14:46:09 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 12 14:46:09 2017 +0100"
      },
      "message": "Merge pull request #191 from bjackman/master\n\nLogcatMonitor: Fix clear_log"
    },
    {
      "commit": "71d5b8bc79b4c2a89422836e6f7169f16a2d3640",
      "tree": "1acebc1027636910358f58790cb19dc39974b6fe",
      "parents": [
        "5421ddaae8b7431ca504a454b3fc8595e098a3bb"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Thu Oct 12 14:39:27 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Thu Oct 12 14:39:27 2017 +0100"
      },
      "message": "LogcatMonitor: Fix clear_log\n"
    },
    {
      "commit": "5421ddaae8b7431ca504a454b3fc8595e098a3bb",
      "tree": "e8e0bd104c7c46f9ac2dd41c6128a1ac19d02b31",
      "parents": [
        "a01418b075ad0a6f627352e8275f04e322bf9c6a",
        "1d85501181fd205f4c670dd4e7a2d4b1778459ed"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Thu Oct 12 13:43:45 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 12 13:43:45 2017 +0100"
      },
      "message": "Merge pull request #190 from bjackman/logcat-pexpect\n\nandroid: Use pexpect for LogcatMonitor"
    },
    {
      "commit": "1d85501181fd205f4c670dd4e7a2d4b1778459ed",
      "tree": "fe27b6da4d251ad9dbca79593011fe5895249654",
      "parents": [
        "da22befd8006e4927a039c503fb688f3643f07a5"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Thu Sep 21 12:30:13 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Thu Oct 12 10:35:08 2017 +0100"
      },
      "message": "utils/android: Use pexpect for LogcatMonitor\n\nUsing a pexpect.spawn object simplifies the LogcatMonitor by removing\nthe need for a separate thread along with the synchronization that\nbrings. Since pexpect.spawn creates a logfile that is flushed with\neach write, it also removes the need for code to handle flushing.\n\nI originally wrote this to allow more complex features that are made\npossible by the pexpect API, however I then discovered those features\nare not necessary and did not submit this for merging.\n\nHowever I then discovered that in Python 2.7,\nthreading.Event.wait (used in the `wait_for` method) makes the task\nuninterriptible (i.e. can\u0027t be killed with Ctrl+C/SIGINT), which is\nrather frustrating. This issue doesn\u0027t arise when using pexpect\u0027s\nexpect method, so that\u0027s why I\u0027m submitting this now.\n"
    },
    {
      "commit": "a01418b075ad0a6f627352e8275f04e322bf9c6a",
      "tree": "f119fa637236201b014511385a3cdbe785344f9b",
      "parents": [
        "0f2ac2589fd4a8fa95dac01306334ef29cab1d23"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 11 17:08:24 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 11 17:09:22 2017 +0100"
      },
      "message": "platform/arm: propagate model parameter\n\nVExpress platforms were not updated to handle \"model\" parameter when it\nwas added to Platfrom.\n"
    },
    {
      "commit": "0f2ac2589fd4a8fa95dac01306334ef29cab1d23",
      "tree": "b833dd2478d79a6ce6217eb19ef653ebf0a5813b",
      "parents": [
        "dc453ad8916cfb914c9dafaad8b0b440d3a4b443",
        "0bfb6e4e544e1221220a77c19f83cca7de9dfca2"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Wed Oct 11 15:21:56 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 11 15:21:56 2017 +0100"
      },
      "message": "Merge pull request #189 from bjackman/master\n\nAndroidTarget: Add boolean \u0027state\u0027 to airplane mode intent broadcast"
    },
    {
      "commit": "da22befd8006e4927a039c503fb688f3643f07a5",
      "tree": "c11d6c3495a211d360ef0056e9176e6544fe52da",
      "parents": [
        "dc453ad8916cfb914c9dafaad8b0b440d3a4b443"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Thu Sep 21 12:32:18 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Oct 11 13:40:25 2017 +0100"
      },
      "message": "libs/android: Add get_adb_command function\n\nThis is just like adb_command but instead of executing the command it just\nreturns it.\n"
    },
    {
      "commit": "0bfb6e4e544e1221220a77c19f83cca7de9dfca2",
      "tree": "b833dd2478d79a6ce6217eb19ef653ebf0a5813b",
      "parents": [
        "dc453ad8916cfb914c9dafaad8b0b440d3a4b443"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Oct 11 13:09:15 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Oct 11 13:22:37 2017 +0100"
      },
      "message": "AndroidTarget: Add boolean \u0027state\u0027 to airplane mode intent broadcast\n\nRecently I\u0027ve been seeing some errors with enabling airplane mode on\nhikey960 - firstly I get a \u0027broken pipe\u0027 error followed by a \u0027cmd:\nCan\u0027t find service: settings\u0027. This missing boolean was the first\nthing I found that had changed wrt. the code I used to use, and\nadding it back appears to fix the issue.\n"
    },
    {
      "commit": "dc453ad8916cfb914c9dafaad8b0b440d3a4b443",
      "tree": "c254eab4c01cf60f6d0a42e75d96b8d4fa674fe2",
      "parents": [
        "b0457f7ed75e9717fc2dcb4a1540a25315eb81e7",
        "1072a1a9f0fd9594e2259ea37b52fe07f6d81f8f"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Tue Oct 10 08:37:08 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 10 08:37:08 2017 +0100"
      },
      "message": "Merge pull request #184 from setrofim/master\n\nANSI escape sequences stripping fixes for gem5"
    },
    {
      "commit": "b0457f7ed75e9717fc2dcb4a1540a25315eb81e7",
      "tree": "d1bb08ae521695813f53c4679ad5bcb7352d5598",
      "parents": [
        "4d269774f7087bcf9f6c53deb0dbe6a3503d821b",
        "99aca2543835d56001eec63ce60e6c7dc73a4570"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Tue Oct 10 08:35:55 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 10 08:35:55 2017 +0100"
      },
      "message": "Merge pull request #188 from bjackman/apkinfo-better-error\n\nApkInfo: Improve error for bad .apk files"
    },
    {
      "commit": "4d269774f7087bcf9f6c53deb0dbe6a3503d821b",
      "tree": "716b7692e44e0fb95ff68b78b8458e784b6c748c",
      "parents": [
        "34e7e4c89534235ec30b8ba217d4fbf1bfaf724e",
        "8a0554faab92b6d1ff30a124a24312a8e126b134"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Tue Oct 10 08:35:03 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 10 08:35:03 2017 +0100"
      },
      "message": "Merge pull request #187 from bjackman/clear-logcat-lock\n\nAndroidTarget: prevent concurrent invocations of \u0027logcat -c\u0027"
    },
    {
      "commit": "34e7e4c89534235ec30b8ba217d4fbf1bfaf724e",
      "tree": "a5dcd35d6f84edfdbaf052f1f1ff57ba939a4f57",
      "parents": [
        "535fc7ea63c233c061b99f1c99e480ccfb3d6730",
        "7dd781135546cc081f84bc2acd6d3c44afd5c785"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Tue Oct 10 08:33:56 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 10 08:33:56 2017 +0100"
      },
      "message": "Merge pull request #186 from bjackman/acmecape-improvements\n\nAcmecape improvements"
    },
    {
      "commit": "535fc7ea63c233c061b99f1c99e480ccfb3d6730",
      "tree": "d78a8288c38967223aa520cc7a8603b6befdbdb3",
      "parents": [
        "7e073c1fce9304cdf7b60f507208f15a66939bc0",
        "17bcabd461b22434db00552056e7de995fc7f498"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Tue Oct 10 08:31:33 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 10 08:31:33 2017 +0100"
      },
      "message": "Merge pull request #185 from bjackman/master\n\ntarget: Install busybox before updating modules"
    },
    {
      "commit": "99aca2543835d56001eec63ce60e6c7dc73a4570",
      "tree": "2adb0716c9a009bd56ba4cb87207fffb689d4338",
      "parents": [
        "7e073c1fce9304cdf7b60f507208f15a66939bc0"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 18:30:06 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 18:31:32 2017 +0100"
      },
      "message": "ApkInfo: Improve error for bad .apk files\n\nProvide a more specific error, including the output from aapt.\n"
    },
    {
      "commit": "7dd781135546cc081f84bc2acd6d3c44afd5c785",
      "tree": "8dfad02aebb83e8cfb6e5566fa2a02d0038143ec",
      "parents": [
        "dbe568f51be54c4cb2db9540489c8a0de5c6a19b"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 15:28:57 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 18:25:03 2017 +0100"
      },
      "message": "acmecape: Add note on how to reboot ACME\n\nThe ACME firmware sometimes benefits from turning-it-off-and-on-again.\n"
    },
    {
      "commit": "dbe568f51be54c4cb2db9540489c8a0de5c6a19b",
      "tree": "16b223c4282d8f050ae21d16af32d648b31f36d2",
      "parents": [
        "0b04ffcc443f27424146905a0525491f90cd084c"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Oct 04 17:32:32 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 18:25:03 2017 +0100"
      },
      "message": "acmecape: Add check for nonzero return code from iio-capture\n"
    },
    {
      "commit": "0b04ffcc443f27424146905a0525491f90cd084c",
      "tree": "1f2e3aa9fd1207d4c22bbd6ce1cd13b879279f36",
      "parents": [
        "7e073c1fce9304cdf7b60f507208f15a66939bc0"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Oct 04 17:12:27 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 18:25:03 2017 +0100"
      },
      "message": "acmecape: Fix default iio-capture binary name\n"
    },
    {
      "commit": "8a0554faab92b6d1ff30a124a24312a8e126b134",
      "tree": "3fd3e0b54b93f786363840d15c3815eb8ff09377",
      "parents": [
        "7e073c1fce9304cdf7b60f507208f15a66939bc0"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 17:08:38 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 17:15:41 2017 +0100"
      },
      "message": "AndroidTarget: prevent concurrent invocations of \u0027logcat -c\u0027\n\n\u0027adb logcat -c\u0027 has been observed to fail when called twice concurrently. Rather\nthan requiring all devlib users to fix their usage patterns, let\u0027s just delay\nwhenever clear_logcat is called twice.\n"
    },
    {
      "commit": "17bcabd461b22434db00552056e7de995fc7f498",
      "tree": "d78a8288c38967223aa520cc7a8603b6befdbdb3",
      "parents": [
        "7e073c1fce9304cdf7b60f507208f15a66939bc0"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 15:15:24 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Mon Oct 09 15:15:24 2017 +0100"
      },
      "message": "target: Install busybox before updating modules\n\nDue to the new read_tree_values API, some devlib modules now use\nshutils in their __init__, which happens from\nTarget::connect(). Therefore ensure we have busybox on the target\nbefore we get to that stage.\n"
    },
    {
      "commit": "1072a1a9f0fd9594e2259ea37b52fe07f6d81f8f",
      "tree": "8e08911c5de7c033452836e0937c17c68ebdb2f7",
      "parents": [
        "661ba191147b453f3e1c9eb006b4fe1b2455b928"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Fri Oct 06 16:20:33 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Fri Oct 06 16:20:33 2017 +0100"
      },
      "message": "utils/ssh: fix Gem5Connection.pull\n\nGem5Connection lists the path to be pulled, however it was not stripping\nANSI escape sequences from resulting output, which would corrupt the\npath.\n"
    },
    {
      "commit": "661ba191147b453f3e1c9eb006b4fe1b2455b928",
      "tree": "b6c1b6aa157299ab3a7316dd1879246cc9719af9",
      "parents": [
        "7e073c1fce9304cdf7b60f507208f15a66939bc0"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Fri Oct 06 16:17:56 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Fri Oct 06 16:17:56 2017 +0100"
      },
      "message": "utils/misc: strip more with strip_bash_colors\n\nUpdate regex used by strip_bash_colors to match more ANSI escape\nsequencies.\n"
    },
    {
      "commit": "7e073c1fce9304cdf7b60f507208f15a66939bc0",
      "tree": "5cbf4af787dda2e56dea86958279ccc80050a522",
      "parents": [
        "98e19ae04862aed915d285952fe17aa652585bb4"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Fri Oct 06 13:37:00 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Fri Oct 06 13:38:41 2017 +0100"
      },
      "message": "read_tree_values: more robust parsing.\n\nSkip entries not containing a \":\".\n"
    },
    {
      "commit": "98e19ae04862aed915d285952fe17aa652585bb4",
      "tree": "e0086c69be238ba5ca07df806ca5a422171ee5f9",
      "parents": [
        "d1e83b53a32d75848712c2c5aa1fd57b888db94e",
        "3e3f964e43d6fec8fe0db536a9054567239547c7"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Thu Oct 05 16:55:07 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 05 16:55:07 2017 +0100"
      },
      "message": "Merge pull request #183 from setrofim/master\n\nshuilt: re-introduce speedup"
    },
    {
      "commit": "3e3f964e43d6fec8fe0db536a9054567239547c7",
      "tree": "e0086c69be238ba5ca07df806ca5a422171ee5f9",
      "parents": [
        "d1e83b53a32d75848712c2c5aa1fd57b888db94e"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Oct 05 16:37:30 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Oct 05 16:41:26 2017 +0100"
      },
      "message": "shuilt: re-introduce speedup\n\nThe previous fix for read_tree_values fixed the issue with sh not\nsupporting arrays, but looping over paths and counting them. Hover each\ncount increment requires spawning a subshell. For a large number of paths,\nthis can eat away any performance benefits of using read_tree_values.\n\nSince we only care whether the count is greater than one, detect that\nand break out of the loop early to re-introduce the performance\nimprovement.\n"
    },
    {
      "commit": "d1e83b53a32d75848712c2c5aa1fd57b888db94e",
      "tree": "e3b5122f3a0721c416b8c8515afb233bfadc3035",
      "parents": [
        "5c28e4167757eeaef722b1e2a88797266c013259",
        "a0b273b0317bbfc748435a1ebc80d1d589f9d479"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Thu Oct 05 14:48:26 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 05 14:48:26 2017 +0100"
      },
      "message": "Merge pull request #182 from setrofim/master\n\nshutil: fix read_tree_values and hotplug_online_all for sh"
    },
    {
      "commit": "a0b273b0317bbfc748435a1ebc80d1d589f9d479",
      "tree": "e3b5122f3a0721c416b8c8515afb233bfadc3035",
      "parents": [
        "5c28e4167757eeaef722b1e2a88797266c013259"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Oct 05 13:58:46 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Oct 05 14:33:06 2017 +0100"
      },
      "message": "shutil: fix read_tree_values and hotplug_online_all for sh\n\nread_tree_values and hotplug_online_all relied on () array evaluation\nwhich is a Bash thing and is broken in sh; this fixes things for sh.\n"
    },
    {
      "commit": "5c28e4167757eeaef722b1e2a88797266c013259",
      "tree": "124324e55db031853963809768463b8de6f80f2d",
      "parents": [
        "d560aea660690598eebc7f77efee51efcc8ad2a6"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Oct 05 10:59:22 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Oct 05 10:59:22 2017 +0100"
      },
      "message": "shutils: fix read_tree_values\n\nMy bash fu was off on my previous list. The output of find was being\ntreated as a single string, rather than an array of paths; which ment\nthat the test that there was more than one path returned failed,\nresulting in null output not just for empty directories but for\neveryting.\n\nThis fixes the issue by converting find output to an array.\n"
    },
    {
      "commit": "d560aea660690598eebc7f77efee51efcc8ad2a6",
      "tree": "26b6051884bad1acc90a1f6fc97e17e70746bb5f",
      "parents": [
        "4d8da589f8367a5c4ea2d60fae072c3df2e98a46"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Oct 05 09:35:11 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Oct 05 09:41:40 2017 +0100"
      },
      "message": "Target: fix read_tree_values for empty dir\n\ngrep was existing with 1 when passed an empty directory, resulting in\nTargetError being raised unless explicitly suppressed with\ncheck_exit_code\u003dFalse. This case is now fixed to correctly return an\nempty dict without error.\n\nread_tree_values bash function has also been optimized to not\nunnecessarily run find in a subshell if the path passed to the function\ndoes not exist.\n"
    },
    {
      "commit": "4d8da589f8367a5c4ea2d60fae072c3df2e98a46",
      "tree": "506a851116a6c96f1964733c431bcc8ae698e74f",
      "parents": [
        "e21265f6f64fa4c4ad530ce6163eca13e8737006",
        "f0426467922bb8cb195de0f73c10ddf9bcf5d835"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Wed Oct 04 16:23:18 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 04 16:23:18 2017 +0100"
      },
      "message": "Merge pull request #181 from setrofim/master\n\nModule initialization optimizations."
    },
    {
      "commit": "f0426467922bb8cb195de0f73c10ddf9bcf5d835",
      "tree": "506a851116a6c96f1964733c431bcc8ae698e74f",
      "parents": [
        "d7ca39e4d13ea1bebb12cd27ae09835f683ed327"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 04 13:19:26 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 04 15:59:19 2017 +0100"
      },
      "message": "module/hotplug: optimize online_all\n\nOptimize online_all by offloading it to a shutils function which only\nrequres a single call to the target.\n"
    },
    {
      "commit": "d7ca39e4d13ea1bebb12cd27ae09835f683ed327",
      "tree": "685fe254f9814267fe39287c6e1304f62accb682",
      "parents": [
        "5a599f91db437d3a95f3ae15e1113704418fa9c1"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 04 09:28:09 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 04 15:59:19 2017 +0100"
      },
      "message": "module/cpuidle: optimize initialization.\n\nOptimize cpuidle module initialization by using the new Target.grep_values\ncall to get information about all idle states in a single call to the\ntarget during module intialization, rather lazily fetching them from the\ntarget afterwards.\n"
    },
    {
      "commit": "5a599f91db437d3a95f3ae15e1113704418fa9c1",
      "tree": "bec1933a27ba8582f09472d61ffb1646e6cde68a",
      "parents": [
        "181bc180c4f9f13208e4e19e3f2ed2d1013b7db1"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Oct 03 16:52:40 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 04 15:59:19 2017 +0100"
      },
      "message": "module/hwmon: optimize initialization.\n\nOptimize hwmon module initialization by using the new Target.grep_values\ncall to get information about all HWMON devices in a single call to the\ntarget.\n"
    },
    {
      "commit": "181bc180c4f9f13208e4e19e3f2ed2d1013b7db1",
      "tree": "5b2b870a73837236f1de62df4024f25199fa421e",
      "parents": [
        "92fb54d57b1c0d221101fae4c6aeb56a5948b3e2"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Oct 03 16:28:09 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 04 15:58:22 2017 +0100"
      },
      "message": "Target: add read_tree_values and read_tree_values_flat\n\nAdd two new methods to target that allow querying values of all sysfs\nnodes in a sub-directory structure all at once. The difference is that\nread_tree_values_flat returns a flat dict of path-\u003evalue mappings;\nread_tree_values returns a nested dict structure that mimics the\nscanned sub-directories tree.\n"
    },
    {
      "commit": "92fb54d57b1c0d221101fae4c6aeb56a5948b3e2",
      "tree": "6c5c66ded159154e30f0e67bac2860eefb7e07c9",
      "parents": [
        "bfb472171560f7bbdad0bfbafb6da7afeaedacb1"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Oct 03 16:50:23 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 04 13:21:26 2017 +0100"
      },
      "message": "module: nicer logger name\n\nUse Module.name rather than Module.__name__ to name the logger for\nslightly more readable log output.\n"
    },
    {
      "commit": "bfb472171560f7bbdad0bfbafb6da7afeaedacb1",
      "tree": "f8976b69f37769380e7bfa6e7240cef519575282",
      "parents": [
        "e21265f6f64fa4c4ad530ce6163eca13e8737006"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Oct 03 16:47:11 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Oct 04 13:21:26 2017 +0100"
      },
      "message": "Target: ensure shutils is always set\n\nMake sure shutils is always set, even if setup() has not been\ncalled by initializing  it on first access if necessary.\n"
    },
    {
      "commit": "2d18ac0079984ecb844bbf144dc0b87561b89b43",
      "tree": "6256c2082bdaec02a8e871e5c375b730580100d5",
      "parents": [
        "268042e3c02d3d84b3754279c1ba833f39d453df",
        "865cf9598537f5a405e8ada5ffed91daae9ac414"
      ],
      "author": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Tue Oct 03 08:07:53 2017 +0000"
      },
      "committer": {
        "name": "android-build-team Robot",
        "email": "android-build-team-robot@google.com",
        "time": "Tue Oct 03 08:07:53 2017 +0000"
      },
      "message": "Snap for 4373608 from 865cf9598537f5a405e8ada5ffed91daae9ac414 to pi-release\n\nChange-Id: I0be21aa121f715464c395246dd05d9ff4ea1a9e1\n"
    },
    {
      "commit": "865cf9598537f5a405e8ada5ffed91daae9ac414",
      "tree": "6256c2082bdaec02a8e871e5c375b730580100d5",
      "parents": [
        "07048eeb8bf34603db2670cb40630df2d5e59d49"
      ],
      "author": {
        "name": "Suren Baghdasaryan",
        "email": "surenb@google.com",
        "time": "Thu Aug 31 13:28:47 2017 -0700"
      },
      "committer": {
        "name": "Suren Baghdasaryan",
        "email": "surenb@google.com",
        "time": "Mon Oct 02 23:29:14 2017 +0000"
      },
      "message": "utils/android_build: Remove methods to build kernel\n\nKernel build process will be described in an external script referenced\nfrom board config file.\n\nChange-Id: Ied74824996a4121cdfded55b283e196e8193c6bc\nSigned-off-by: Suren Baghdasaryan \u003csurenb@google.com\u003e\n"
    },
    {
      "commit": "e21265f6f64fa4c4ad530ce6163eca13e8737006",
      "tree": "8e3e41c296eab6dd2f7e4af516cc61b1a0ebec7c",
      "parents": [
        "a3f78cabc17ae2653e6b747207be1f3f27342aa0",
        "6bb24aa12a8ca20c2803a8c3fb3c7fc2c3bd79e7"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Mon Oct 02 10:37:25 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 02 10:37:25 2017 +0100"
      },
      "message": "Merge pull request #177 from bjackman/hwmon-no-permissions\n\nhwmon: Disable if no permissions"
    },
    {
      "commit": "a3f78cabc17ae2653e6b747207be1f3f27342aa0",
      "tree": "2eab3e7233ba8f1bfbdfe857e43ac92943431cc8",
      "parents": [
        "e4fda7898dc39f357dbb388406a3f06c0ff050c1",
        "4593d8605de3edaf5210c18a4b3d41f5884a0267"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Fri Sep 29 16:15:25 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 29 16:15:25 2017 +0100"
      },
      "message": "Merge pull request #179 from setrofim/fps\n\nAdd FPS derived metrics"
    },
    {
      "commit": "4593d8605de3edaf5210c18a4b3d41f5884a0267",
      "tree": "2eab3e7233ba8f1bfbdfe857e43ac92943431cc8",
      "parents": [
        "9f666320f38db60fdadb096b656076208faa915a"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Fri Sep 22 13:46:32 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Sep 27 14:45:27 2017 +0100"
      },
      "message": "gfxinfo fixes\n\n- Make sure timestamps are actually reported in microseconds.\n- Eliminate duplicate entries from successive dumps\n"
    },
    {
      "commit": "9f666320f38db60fdadb096b656076208faa915a",
      "tree": "cfb7095f9411c958329446b6c04e40413598d2a0",
      "parents": [
        "f692315d9c4de4e9d9693acf3304e5ed6d69efa8"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Sep 13 11:45:55 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Sep 27 14:45:27 2017 +0100"
      },
      "message": "derived: add DerivedSurfaceFlingerStats\n\nAdd DerivedSurfaceFlingerStats that parse output from\nSurfaceFlingerFramesInstrument to produce FPS data and rendering\nstatistics.\n"
    },
    {
      "commit": "f692315d9c4de4e9d9693acf3304e5ed6d69efa8",
      "tree": "97de5c0bcc887ec63c29d9ff15d80ae07b61f65f",
      "parents": [
        "e4fda7898dc39f357dbb388406a3f06c0ff050c1"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Sep 07 17:36:18 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Sep 27 14:45:27 2017 +0100"
      },
      "message": "derived: add DerivedGfxInfoStats\n\nAdd DerivedGfxInfoStats that parse output from GfxInfoFramesInstrument\nto produce FPS data and rendering statistics.\n"
    },
    {
      "commit": "e4fda7898dc39f357dbb388406a3f06c0ff050c1",
      "tree": "603e40374b49cc90b03b9ecc95ac63a5976cb168",
      "parents": [
        "e7a319b0a751079a76d0323508df1c764305b311",
        "109fcc6deb79606faf197b58a131e977355afec6"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Wed Sep 27 14:00:26 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 27 14:00:26 2017 +0100"
      },
      "message": "Merge pull request #178 from setrofim/master\n\nVarious fixes."
    },
    {
      "commit": "109fcc6deb79606faf197b58a131e977355afec6",
      "tree": "21ec01259231e030dce45828fc3836031c952651",
      "parents": [
        "96693a30354955b0037ba128bb0cf152e71020dd"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Sep 26 13:30:15 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Sep 27 10:44:44 2017 +0100"
      },
      "message": "AndroidTarget: fix ps()\n\nps() splits the output on whiestspace into fields; always expecting\nnine. In some cases, wchan field may be blank, resulting in only eight\nchunks after the split. Detect that case and insert and empty entry at\nthe appropriate index.\n"
    },
    {
      "commit": "96693a30354955b0037ba128bb0cf152e71020dd",
      "tree": "c582c4f3d41f08bbde4723b121fa1f1e402d03f9",
      "parents": [
        "d952abf52e4fbe1688b279a69ba3dee43897ed67"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Fri Sep 22 17:39:17 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Sep 27 10:44:44 2017 +0100"
      },
      "message": "AndroidTarget: fix get_pid_of for recent Androids\n\nps on recent Androids no longer takes an optional comm name; use\nTarget.ps() instead, and filter by process name on the host.\n"
    },
    {
      "commit": "d952abf52e4fbe1688b279a69ba3dee43897ed67",
      "tree": "dfbff9ca439b99f082c50170fcdd39eba8c5f37a",
      "parents": [
        "50dfb297cd1dfc2082a60a25e422796869b97186"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Sep 19 13:48:08 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Sep 27 10:44:44 2017 +0100"
      },
      "message": "utils/rendering: frame collectors should respect column order\n\nPreviously FrameCollector.write_frames used \"columns\" argument only as a\nfilter for which columns to write, but the order would always be the\nsame as in raw output.\n\nThe Instrument API requires that the column ordering in the resulting\nMeasurementsCsv matches the ordering of channels specified in reset()\n(if any). This means the collectors should respect the ordering\nspecified in the \"columns\" parameter (which gets populated based on\nactive channels).\n"
    },
    {
      "commit": "50dfb297cd1dfc2082a60a25e422796869b97186",
      "tree": "d50b6f6d074fd7390558cfc14c4ebaee28fb62ce",
      "parents": [
        "a8ca0fc6c834a2e3e145e6d102fff9133cee2db6"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Sep 13 11:36:41 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Wed Sep 27 10:44:43 2017 +0100"
      },
      "message": "utils/rendering: fix surfaceflinger list\n\nSurfaceFlingerFrameCollector.list now converts line endings before\nsplitting, so it now works when the endings are something other than\n\"\\r\\n\".\n"
    },
    {
      "commit": "e7a319b0a751079a76d0323508df1c764305b311",
      "tree": "d750d31e350ef02cb2b915ec776bc0d83bc5435d",
      "parents": [
        "e1ec1eacfb901460ca05bde7b7ab6042ba8bd86e",
        "fb5a260f4b4879503bd5385f96a97612b0e49d13"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Thu Sep 21 14:08:33 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 21 14:08:33 2017 +0100"
      },
      "message": "Merge pull request #176 from bjackman/logcat-docs\n\nutils/anroid: Documentation for LogcatMonitor"
    },
    {
      "commit": "6bb24aa12a8ca20c2803a8c3fb3c7fc2c3bd79e7",
      "tree": "19573dc2cea8016e1e61d0afc0238848e744b821",
      "parents": [
        "25ad53feff50ea8b81072e2601f1adc22e5ffd5e"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Thu Sep 21 13:30:33 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Thu Sep 21 13:31:59 2017 +0100"
      },
      "message": "hwmon: Disable if no permissions\n\nIf we don\u0027t have permissions, scan() currently raises a\nTargetError. Instead we should return False from probe() so the\nmodule is disabled\n"
    },
    {
      "commit": "fb5a260f4b4879503bd5385f96a97612b0e49d13",
      "tree": "0bbf0b1e8bc3678b8148da1c013ccc5c496f4bac",
      "parents": [
        "25ad53feff50ea8b81072e2601f1adc22e5ffd5e"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Thu Sep 21 13:20:46 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Thu Sep 21 13:23:10 2017 +0100"
      },
      "message": "utils/anroid: Documentation for LogcatMonitor\n"
    },
    {
      "commit": "e1ec1eacfb901460ca05bde7b7ab6042ba8bd86e",
      "tree": "1877882058cf3053e30af29733cdbb33f4727165",
      "parents": [
        "a59093465d67f1476af8d5acbf92328094b06d69",
        "22c1f5e911356867c4feb419379b50a83e5317b6"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Wed Sep 20 15:52:34 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 20 15:52:34 2017 +0100"
      },
      "message": "Merge pull request #175 from bjackman/logcat-race\n\nFix race in LogcatMonitor"
    },
    {
      "commit": "22c1f5e911356867c4feb419379b50a83e5317b6",
      "tree": "372a9696358d116519ae28e08a1aad12a2f359fe",
      "parents": [
        "8cf4a44bd74fefa78b25bc01a508482517adf2d1"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Sep 20 15:04:15 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Sep 20 15:08:31 2017 +0100"
      },
      "message": "utils/android: Don\u0027t lock up if LogcatMonitor stopped before start\n\nCalling stop before start will result in hanging in self._started.wait(),\nbecause that event will never get set. Although stop before start is an illegal\nusage pattern, let\u0027s try not to fail annoyingly.\n"
    },
    {
      "commit": "8cf4a44bd74fefa78b25bc01a508482517adf2d1",
      "tree": "ab1d8daa7f3e21f91ddcf911d44b5476674f684f",
      "parents": [
        "b3242a1ee4d16eb05b303f49538748f66e1b8dac"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Sep 20 13:40:43 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Sep 20 14:06:34 2017 +0100"
      },
      "message": "utils/android: Fix race condition in LogcatMonitor\n\nIf you call .start then immediately call .stop, the thread may not\nyet have set ._logcat, resulting in an AttributeError.\n\nI initially fixed this by setting _logcat \u003d None in __init__, then putting the\n`kill` calls inside `if self._logcat`. The problem with this, as pointed out by\n@valschneider, is that we can then have this sequence:\n\n main thread:                          monitor thread\n\n stop()                                run()\n   if self._logcat:                      .\n     # False, don\u0027t kill process         .\n   join()                                .\n                                         self._logcat \u003d \u003c...\u003e\n\nTherefore, just have the stop() method wait until the process is started before\nunconditionally killing it.\n"
    },
    {
      "commit": "a59093465d67f1476af8d5acbf92328094b06d69",
      "tree": "d92814c52eafb061b07f9003fe2c4490f6de31c8",
      "parents": [
        "25ad53feff50ea8b81072e2601f1adc22e5ffd5e",
        "a290d2883512d50829afc38eec1ccd734ecee883"
      ],
      "author": {
        "name": "setrofim",
        "email": "setrofim@gmail.com",
        "time": "Wed Sep 20 13:59:02 2017 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 20 13:59:02 2017 +0100"
      },
      "message": "Merge pull request #174 from bjackman/adb-start-server\n\nutils/android: Start ADB server before listing devices"
    },
    {
      "commit": "b3242a1ee4d16eb05b303f49538748f66e1b8dac",
      "tree": "c9a080d26875a8a065591983f1923262c7c3f97f",
      "parents": [
        "25ad53feff50ea8b81072e2601f1adc22e5ffd5e"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Sep 20 13:40:36 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Sep 20 13:42:36 2017 +0100"
      },
      "message": "utils/android: whitespace\n"
    },
    {
      "commit": "a290d2883512d50829afc38eec1ccd734ecee883",
      "tree": "d92814c52eafb061b07f9003fe2c4490f6de31c8",
      "parents": [
        "25ad53feff50ea8b81072e2601f1adc22e5ffd5e"
      ],
      "author": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Sep 20 13:02:44 2017 +0100"
      },
      "committer": {
        "name": "Brendan Jackman",
        "email": "brendan.jackman@arm.com",
        "time": "Wed Sep 20 13:04:25 2017 +0100"
      },
      "message": "utils/android: Start ADB server before listing devices\n\nOtherwise if the server isn\u0027t started we fail to parse the output of\n\u0027adb devices\u0027\n"
    },
    {
      "commit": "a8ca0fc6c834a2e3e145e6d102fff9133cee2db6",
      "tree": "e706bfdb7964485c7a62d45b6f62b1d998eda9ff",
      "parents": [
        "01b5cffe03b68bb5cb74c4f344b0552e7cb75309"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Sep 07 14:34:55 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Sep 19 13:34:43 2017 +0100"
      },
      "message": "util/rendering: add gfxinfo_get_last_dump\n\nAdd gfxinfo_get_last_dump utility function to get the last gfxinfo dump\nfrom a (potentially large) file containing a concatenation of such dumps\n(as in the raw output of the GfxinfoFrames instrument).\n"
    },
    {
      "commit": "01b5cffe03b68bb5cb74c4f344b0552e7cb75309",
      "tree": "d4b8fecdccd3e30f9bff98d5511a727628d87292",
      "parents": [
        "adf25f93bb34eb8c293f80dc1ce3f82022dccfca"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Sep 07 14:26:04 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Sep 19 13:34:43 2017 +0100"
      },
      "message": "instrument: Update MeasurementType table\n\n- Add generic \"count\" and \"percent\" MeasurementType\u0027s.\n- Add \"fps\" MeasurementType.\n- Add \"thermal\" category for \"termperature\"\n- Add a comment describing each category\n"
    },
    {
      "commit": "adf25f93bb34eb8c293f80dc1ce3f82022dccfca",
      "tree": "0a42be7d8c619b36888ba7c9892062524fee310f",
      "parents": [
        "dd26b43ac5237d967dca702deb5274a566a8e885"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Sep 07 14:19:24 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Sep 19 13:34:43 2017 +0100"
      },
      "message": "DerivedMeasurements: add process_raw() + doc updates\n\n- Add process_raw() method to the API. This is inteneded to be invoked\n  on any raw output (i.e. not MeasurmentCsv) generated by an Instrument.\n- Both process() process_raw() are portional to be overriden by\n  impolementation; the default behavior is to return an empty list.\n- The output specification for both is extened to allow\n  MeasurementCsv\u0027s, as well as DerivedMetric\u0027s.\n- Documentation has been reworded for clarity.\n"
    },
    {
      "commit": "dd26b43ac5237d967dca702deb5274a566a8e885",
      "tree": "44ea70c8b5e188f44d82e39701ef4a2731daf48d",
      "parents": [
        "8479af48c46f76607ad6080daea7bc2b2e1863da"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Sep 07 11:13:34 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Sep 19 13:34:43 2017 +0100"
      },
      "message": "derived: DerivedMeasurments now return DerivedMetrics\n\nDerivedMeasurments processors now return DerviedMetrics rather than\nmeasurments. The notion of an InstrumentChannel doesn\u0027t really make\nsense in the context of DerivedMeasurments, which are not directly\nmeasured on the target. Since Measurement\u0027s require a channel, a simpler\nDerviedMetric is added that only requires a name and a type.\n"
    },
    {
      "commit": "8479af48c46f76607ad6080daea7bc2b2e1863da",
      "tree": "bf78f0036eb9d7b4b8450553646b5890e91799d1",
      "parents": [
        "07ba177e58bfe5cd7e9a2788c519d0a173653fc9"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Sep 07 10:13:59 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Sep 19 13:34:43 2017 +0100"
      },
      "message": "MeasurementCsv: various enhancements\n\n- Added values() and iter_values() methods. These return each row as a\n  named tuple, with channel labels as the field names.\n- __cmp__ has been made more generic by checking wether other has\n  \"value\" attribute, rather than wether it is an instance of Measurment.\n- MeasurementCsv no longer keeps an open handle to the file, and instead\n  re-opens the file each time it needs it. This removes the need for\n  managing the open handle, and alows parallel iterations over the\n  values (each iteration will have it\u0027s own read handle into the files).\n"
    },
    {
      "commit": "07ba177e58bfe5cd7e9a2788c519d0a173653fc9",
      "tree": "735bf49ed1931d841d1e4b364225d51606a83657",
      "parents": [
        "9192deb8ee13a8105742631cece3b4be095c077f"
      ],
      "author": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Thu Sep 07 09:52:20 2017 +0100"
      },
      "committer": {
        "name": "Sergei Trofimov",
        "email": "sergei.trofimov@arm.com",
        "time": "Tue Sep 19 13:34:43 2017 +0100"
      },
      "message": "InstrumentChannel: allow None sites\n\nAllow site to be None (still must be explicitly specified). If the site\nis None, the label if created using only the measurement type.\n"
    }
  ],
  "next": "9192deb8ee13a8105742631cece3b4be095c077f"
}
