{"action":"created","comment":{"url":"https://api.github.com/repos/appium/appium-adb/pulls/comments/224964848","pull_request_review_id":164468699,"id":224964848,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNDk2NDg0OA==","diff_hunk":"@@ -0,0 +1,114 @@\n+import { exec } from 'teen_process';\n+import log from '../logger.js';\n+import path from 'path';\n+import _ from 'lodash';\n+import {getJavaForOs} from \"../helpers\";\n+\n+let bundletool = {};\n+\n+/**\n+ * Check bundletool version\n+ *\n+ * @return {string} Version of bundletool. i.e., BundleTool 0.6.0\n+ * @throws {Error} If get version fails\n+ */\n+bundletool.version = async function () {\n+  try {\n+    return await exec(getJavaForOs(), [\n+      '-jar', path.resolve(this.helperJarPath, 'bundletool.jar'), 'version'\n+    ]);\n+  } catch (e) {\n+    throw new Error(`Could not get bundle tool version. Original error ${e.message}`);\n+  }\n+};\n+\n+/**\n+ * Install apks\n+ *\n+ * @param {string} apks - The full path to the local apks file.\n+ * @param {string} deviceId - The device serial to install the apks to.\n+ * @param {[string]} modules - List of modules to be installed (defaults to all of them).\n+ *                           Note that the dependent modules will also be installed.\n+ *                           Ignored if the device receives a standalone APK.\n+ * @return {string} Command stdout\n+ * @throws {Error} If installation fails. e.g. INSTALL_PARSE_FAILED_NO_CERTIFICATES\n+ */\n+bundletool.installApks = async function (apks, deviceId, modules = []) {\n+  // TODO: Append install options after bundletool implement it.\n+  // https://github.com/google/bundletool/blob/f855ea639a02216780b2813ce29bd6e927ad4503/src/main/java/com/android/tools/build/bundletool/device/DdmlibDevice.java#L89-L107\n+  let installArgs = [\n+    '-jar', path.resolve(this.helperJarPath, 'bundletool.jar'), 'install-apks',\n+    '--apks', apks, '--device-id', deviceId\n+  ];\n+\n+  if (!_.isEmpty(modules)) {\n+    installArgs.push('--modules', modules.join(','));\n+  }\n+\n+  log.info(`Install apks with: ${installArgs}`);\n+  try {\n+    return await exec(getJavaForOs(), installArgs);\n+  } catch (e) {\n+    throw new Error(`Failed to install apks. Original error ${e.message}`);\n+  }\n+};\n+\n+/**\n+ * Check build version\n+ *\n+ * @param {string} bundle - The full path to the local `aab` file.\n+ * @param {string} deviceId - The device serial to install the apks to.\n+ * @param {string} output - List of modules to be installed (defaults to all of them).\n+ *                           Note that the dependent modules will also be installed.\n+ *                           Ignored if the device receives a standalone APK.\n+ * @param {object} buildApksOpts - Options\n+ * @property {string} ks - Path to the keystore that should be used to sign the\n+ *                         generated APKs. If not set, the APKs will not be signed. If set, the\n+ *                         flag 'ks-key-alias' must also be set.\n+ * @property {string} ksKeyAlias - Alias of the key to use in the keystore to sign the generated APKs.\n+ * @property {string} ksPass - Alias of the key to use in the keystore to sign the generated APKs.\n+ *                             Password of the keystore to use to sign the generated APKs.\n+ *                             If provided, must be prefixed with either 'pass:' (if the password\n+ *                             is passed in clear text, e.g. 'pass:qwerty') or 'file:' (if the password\n+ *                             is the first line of a file, e.g. 'file:/tmp/myPassword.txt'). If this\n+ *                             flag is not set, the password will be requested on the prompt.\n+ * @property {string} overwrite If set, any previous existing output will be overwritten.                           --overwrite\n+ * @property {string} otherOptions - Add additional option\n+ * @return {string} A path to apks\n+ * @throws {Error} If building apks fails.\n+ */\n+bundletool.buildApks = async function (bundle, deviceId, output, buildApksOpts = {}) {\n+  let buildApksArgs = [\n+    '-jar', path.resolve(this.helperJarPath, 'bundletool.jar'), 'build-apks',\n+    '--bundle', bundle,\n+    '--output', output,\n+    '--connected-device', '--device-id', deviceId\n+  ];\n+\n+  if (buildApksOpts.ks && buildApksOpts.ksKeyAlias) {\n+    buildApksArgs.push('--ks', buildApksOpts.ks);\n+    buildApksArgs.push('--ks-key-alias', buildApksOpts.ksKeyAlias);\n+  }\n+\n+  if (buildApksOpts.ksPass) {\n+    buildApksArgs.push('--ks-pass', buildApksOpts.ksPass);\n+  }\n+\n+  if (buildApksOpts.overwrite) {\n+    buildApksArgs.push('--overwrite');\n+  }\n+\n+  if (buildApksOpts.otherOptions) {\n+    buildApksArgs.push(buildApksOpts.otherOptions);","path":"lib/tools/bundletool.js","position":102,"original_position":102,"commit_id":"accb085480ff6c7cb9ecc1ccf6671ab68f10ff55","original_commit_id":"accb085480ff6c7cb9ecc1ccf6671ab68f10ff55","user":{"login":"mykola-mokhnach","id":7767781,"node_id":"MDQ6VXNlcjc3Njc3ODE=","avatar_url":"https://avatars1.githubusercontent.com/u/7767781?v=4","gravatar_id":"","url":"https://api.github.com/users/mykola-mokhnach","html_url":"https://github.com/mykola-mokhnach","followers_url":"https://api.github.com/users/mykola-mokhnach/followers","following_url":"https://api.github.com/users/mykola-mokhnach/following{/other_user}","gists_url":"https://api.github.com/users/mykola-mokhnach/gists{/gist_id}","starred_url":"https://api.github.com/users/mykola-mokhnach/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mykola-mokhnach/subscriptions","organizations_url":"https://api.github.com/users/mykola-mokhnach/orgs","repos_url":"https://api.github.com/users/mykola-mokhnach/repos","events_url":"https://api.github.com/users/mykola-mokhnach/events{/privacy}","received_events_url":"https://api.github.com/users/mykola-mokhnach/received_events","type":"User","site_admin":false},"body":"will it work this way? shouldn't otherOptions be an array, which is them merged to buildApksArgs? ","created_at":"2018-10-13T16:36:03Z","updated_at":"2018-10-13T16:36:03Z","html_url":"https://github.com/appium/appium-adb/pull/366#discussion_r224964848","pull_request_url":"https://api.github.com/repos/appium/appium-adb/pulls/366","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/appium/appium-adb/pulls/comments/224964848"},"html":{"href":"https://github.com/appium/appium-adb/pull/366#discussion_r224964848"},"pull_request":{"href":"https://api.github.com/repos/appium/appium-adb/pulls/366"}}},"pull_request":{"url":"https://api.github.com/repos/appium/appium-adb/pulls/366","id":222655556,"node_id":"MDExOlB1bGxSZXF1ZXN0MjIyNjU1NTU2","html_url":"https://github.com/appium/appium-adb/pull/366","diff_url":"https://github.com/appium/appium-adb/pull/366.diff","patch_url":"https://github.com/appium/appium-adb/pull/366.patch","issue_url":"https://api.github.com/repos/appium/appium-adb/issues/366","number":366,"state":"open","locked":false,"title":"Add bundletool for .aab module","user":{"login":"KazuCocoa","id":5511591,"node_id":"MDQ6VXNlcjU1MTE1OTE=","avatar_url":"https://avatars3.githubusercontent.com/u/5511591?v=4","gravatar_id":"","url":"https://api.github.com/users/KazuCocoa","html_url":"https://github.com/KazuCocoa","followers_url":"https://api.github.com/users/KazuCocoa/followers","following_url":"https://api.github.com/users/KazuCocoa/following{/other_user}","gists_url":"https://api.github.com/users/KazuCocoa/gists{/gist_id}","starred_url":"https://api.github.com/users/KazuCocoa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KazuCocoa/subscriptions","organizations_url":"https://api.github.com/users/KazuCocoa/orgs","repos_url":"https://api.github.com/users/KazuCocoa/repos","events_url":"https://api.github.com/users/KazuCocoa/events{/privacy}","received_events_url":"https://api.github.com/users/KazuCocoa/received_events","type":"User","site_admin":false},"body":"Google starts providing [appbundle](https://developer.android.com/platform/technology/app-bundle/). When we build a release module with the app-bundle, `.aab` file is generated. Developers upload the `.aab` to the play console.\r\n\r\nWe can get `apks` file by https://github.com/google/bundletool on our local. We can install a proper apk included in the `apks` by the bundletool. https://github.com/KazuCocoa/AppBundleSample is an example to install a proper apk for connected device from `.aab` and `.apks`.\r\n\r\nIn this PR, I've added the 0.6.0 bundletool. Each command follows https://github.com/KazuCocoa/AppBundleSample which I ensured I could install an apk from aab correctly. (And could launch the installed apk)\r\n\r\nWe should take care of all of `apk` arguments. So, this is partial implementation.\r\nOne concern is a size of bundletool. It's 35MB so far...\r\n\r\nWhat do you think adding `.aab` support?\r\n(Eventually, we'd like to make it enough to put `aab` and necessary arguments in capability by users. It means this module has a responsibility for generating `apks` and install a proper apk for a connected device (which is a test device) via bundletool)\r\n\r\nAnother option is preparing a guide to get proper `apk` by users from `.aab` like https://codelabs.developers.google.com/codelabs/your-first-dynamic-app/index.html?index=..%2F..%2Fio2018#4 with unziping `.apks` and getting proper standalone apk.","created_at":"2018-10-13T15:05:48Z","updated_at":"2018-10-13T16:36:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a03e0a67e4303cd0680603916b5edbc7823f3847","assignee":null,"assignees":[],"requested_reviewers":[{"login":"jlipps","id":605053,"node_id":"MDQ6VXNlcjYwNTA1Mw==","avatar_url":"https://avatars3.githubusercontent.com/u/605053?v=4","gravatar_id":"","url":"https://api.github.com/users/jlipps","html_url":"https://github.com/jlipps","followers_url":"https://api.github.com/users/jlipps/followers","following_url":"https://api.github.com/users/jlipps/following{/other_user}","gists_url":"https://api.github.com/users/jlipps/gists{/gist_id}","starred_url":"https://api.github.com/users/jlipps/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jlipps/subscriptions","organizations_url":"https://api.github.com/users/jlipps/orgs","repos_url":"https://api.github.com/users/jlipps/repos","events_url":"https://api.github.com/users/jlipps/events{/privacy}","received_events_url":"https://api.github.com/users/jlipps/received_events","type":"User","site_admin":false},{"login":"dpgraham","id":852574,"node_id":"MDQ6VXNlcjg1MjU3NA==","avatar_url":"https://avatars2.githubusercontent.com/u/852574?v=4","gravatar_id":"","url":"https://api.github.com/users/dpgraham","html_url":"https://github.com/dpgraham","followers_url":"https://api.github.com/users/dpgraham/followers","following_url":"https://api.github.com/users/dpgraham/following{/other_user}","gists_url":"https://api.github.com/users/dpgraham/gists{/gist_id}","starred_url":"https://api.github.com/users/dpgraham/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dpgraham/subscriptions","organizations_url":"https://api.github.com/users/dpgraham/orgs","repos_url":"https://api.github.com/users/dpgraham/repos","events_url":"https://api.github.com/users/dpgraham/events{/privacy}","received_events_url":"https://api.github.com/users/dpgraham/received_events","type":"User","site_admin":false},{"login":"imurchie","id":2614354,"node_id":"MDQ6VXNlcjI2MTQzNTQ=","avatar_url":"https://avatars2.githubusercontent.com/u/2614354?v=4","gravatar_id":"","url":"https://api.github.com/users/imurchie","html_url":"https://github.com/imurchie","followers_url":"https://api.github.com/users/imurchie/followers","following_url":"https://api.github.com/users/imurchie/following{/other_user}","gists_url":"https://api.github.com/users/imurchie/gists{/gist_id}","starred_url":"https://api.github.com/users/imurchie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/imurchie/subscriptions","organizations_url":"https://api.github.com/users/imurchie/orgs","repos_url":"https://api.github.com/users/imurchie/repos","events_url":"https://api.github.com/users/imurchie/events{/privacy}","received_events_url":"https://api.github.com/users/imurchie/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/appium/appium-adb/pulls/366/commits","review_comments_url":"https://api.github.com/repos/appium/appium-adb/pulls/366/comments","review_comment_url":"https://api.github.com/repos/appium/appium-adb/pulls/comments{/number}","comments_url":"https://api.github.com/repos/appium/appium-adb/issues/366/comments","statuses_url":"https://api.github.com/repos/appium/appium-adb/statuses/accb085480ff6c7cb9ecc1ccf6671ab68f10ff55","head":{"label":"KazuCocoa:add-bundletool","ref":"add-bundletool","sha":"accb085480ff6c7cb9ecc1ccf6671ab68f10ff55","user":{"login":"KazuCocoa","id":5511591,"node_id":"MDQ6VXNlcjU1MTE1OTE=","avatar_url":"https://avatars3.githubusercontent.com/u/5511591?v=4","gravatar_id":"","url":"https://api.github.com/users/KazuCocoa","html_url":"https://github.com/KazuCocoa","followers_url":"https://api.github.com/users/KazuCocoa/followers","following_url":"https://api.github.com/users/KazuCocoa/following{/other_user}","gists_url":"https://api.github.com/users/KazuCocoa/gists{/gist_id}","starred_url":"https://api.github.com/users/KazuCocoa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KazuCocoa/subscriptions","organizations_url":"https://api.github.com/users/KazuCocoa/orgs","repos_url":"https://api.github.com/users/KazuCocoa/repos","events_url":"https://api.github.com/users/KazuCocoa/events{/privacy}","received_events_url":"https://api.github.com/users/KazuCocoa/received_events","type":"User","site_admin":false},"repo":{"id":111267085,"node_id":"MDEwOlJlcG9zaXRvcnkxMTEyNjcwODU=","name":"appium-adb","full_name":"KazuCocoa/appium-adb","private":false,"owner":{"login":"KazuCocoa","id":5511591,"node_id":"MDQ6VXNlcjU1MTE1OTE=","avatar_url":"https://avatars3.githubusercontent.com/u/5511591?v=4","gravatar_id":"","url":"https://api.github.com/users/KazuCocoa","html_url":"https://github.com/KazuCocoa","followers_url":"https://api.github.com/users/KazuCocoa/followers","following_url":"https://api.github.com/users/KazuCocoa/following{/other_user}","gists_url":"https://api.github.com/users/KazuCocoa/gists{/gist_id}","starred_url":"https://api.github.com/users/KazuCocoa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KazuCocoa/subscriptions","organizations_url":"https://api.github.com/users/KazuCocoa/orgs","repos_url":"https://api.github.com/users/KazuCocoa/repos","events_url":"https://api.github.com/users/KazuCocoa/events{/privacy}","received_events_url":"https://api.github.com/users/KazuCocoa/received_events","type":"User","site_admin":false},"html_url":"https://github.com/KazuCocoa/appium-adb","description":"Wrapper around adb used by appium + helper libs","fork":true,"url":"https://api.github.com/repos/KazuCocoa/appium-adb","forks_url":"https://api.github.com/repos/KazuCocoa/appium-adb/forks","keys_url":"https://api.github.com/repos/KazuCocoa/appium-adb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/KazuCocoa/appium-adb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/KazuCocoa/appium-adb/teams","hooks_url":"https://api.github.com/repos/KazuCocoa/appium-adb/hooks","issue_events_url":"https://api.github.com/repos/KazuCocoa/appium-adb/issues/events{/number}","events_url":"https://api.github.com/repos/KazuCocoa/appium-adb/events","assignees_url":"https://api.github.com/repos/KazuCocoa/appium-adb/assignees{/user}","branches_url":"https://api.github.com/repos/KazuCocoa/appium-adb/branches{/branch}","tags_url":"https://api.github.com/repos/KazuCocoa/appium-adb/tags","blobs_url":"https://api.github.com/repos/KazuCocoa/appium-adb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/KazuCocoa/appium-adb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/KazuCocoa/appium-adb/git/refs{/sha}","trees_url":"https://api.github.com/repos/KazuCocoa/appium-adb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/KazuCocoa/appium-adb/statuses/{sha}","languages_url":"https://api.github.com/repos/KazuCocoa/appium-adb/languages","stargazers_url":"https://api.github.com/repos/KazuCocoa/appium-adb/stargazers","contributors_url":"https://api.github.com/repos/KazuCocoa/appium-adb/contributors","subscribers_url":"https://api.github.com/repos/KazuCocoa/appium-adb/subscribers","subscription_url":"https://api.github.com/repos/KazuCocoa/appium-adb/subscription","commits_url":"https://api.github.com/repos/KazuCocoa/appium-adb/commits{/sha}","git_commits_url":"https://api.github.com/repos/KazuCocoa/appium-adb/git/commits{/sha}","comments_url":"https://api.github.com/repos/KazuCocoa/appium-adb/comments{/number}","issue_comment_url":"https://api.github.com/repos/KazuCocoa/appium-adb/issues/comments{/number}","contents_url":"https://api.github.com/repos/KazuCocoa/appium-adb/contents/{+path}","compare_url":"https://api.github.com/repos/KazuCocoa/appium-adb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/KazuCocoa/appium-adb/merges","archive_url":"https://api.github.com/repos/KazuCocoa/appium-adb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/KazuCocoa/appium-adb/downloads","issues_url":"https://api.github.com/repos/KazuCocoa/appium-adb/issues{/number}","pulls_url":"https://api.github.com/repos/KazuCocoa/appium-adb/pulls{/number}","milestones_url":"https://api.github.com/repos/KazuCocoa/appium-adb/milestones{/number}","notifications_url":"https://api.github.com/repos/KazuCocoa/appium-adb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/KazuCocoa/appium-adb/labels{/name}","releases_url":"https://api.github.com/repos/KazuCocoa/appium-adb/releases{/id}","deployments_url":"https://api.github.com/repos/KazuCocoa/appium-adb/deployments","created_at":"2017-11-19T05:24:47Z","updated_at":"2017-11-19T05:24:49Z","pushed_at":"2018-10-13T14:45:05Z","git_url":"git://github.com/KazuCocoa/appium-adb.git","ssh_url":"git@github.com:KazuCocoa/appium-adb.git","clone_url":"https://github.com/KazuCocoa/appium-adb.git","svn_url":"https://github.com/KazuCocoa/appium-adb","homepage":null,"size":64539,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"appium:master","ref":"master","sha":"025981dce6fa44eaefb4c541f781731e522f7b46","user":{"login":"appium","id":3221291,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMyMjEyOTE=","avatar_url":"https://avatars2.githubusercontent.com/u/3221291?v=4","gravatar_id":"","url":"https://api.github.com/users/appium","html_url":"https://github.com/appium","followers_url":"https://api.github.com/users/appium/followers","following_url":"https://api.github.com/users/appium/following{/other_user}","gists_url":"https://api.github.com/users/appium/gists{/gist_id}","starred_url":"https://api.github.com/users/appium/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/appium/subscriptions","organizations_url":"https://api.github.com/users/appium/orgs","repos_url":"https://api.github.com/users/appium/repos","events_url":"https://api.github.com/users/appium/events{/privacy}","received_events_url":"https://api.github.com/users/appium/received_events","type":"Organization","site_admin":false},"repo":{"id":17339088,"node_id":"MDEwOlJlcG9zaXRvcnkxNzMzOTA4OA==","name":"appium-adb","full_name":"appium/appium-adb","private":false,"owner":{"login":"appium","id":3221291,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMyMjEyOTE=","avatar_url":"https://avatars2.githubusercontent.com/u/3221291?v=4","gravatar_id":"","url":"https://api.github.com/users/appium","html_url":"https://github.com/appium","followers_url":"https://api.github.com/users/appium/followers","following_url":"https://api.github.com/users/appium/following{/other_user}","gists_url":"https://api.github.com/users/appium/gists{/gist_id}","starred_url":"https://api.github.com/users/appium/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/appium/subscriptions","organizations_url":"https://api.github.com/users/appium/orgs","repos_url":"https://api.github.com/users/appium/repos","events_url":"https://api.github.com/users/appium/events{/privacy}","received_events_url":"https://api.github.com/users/appium/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/appium/appium-adb","description":"Wrapper around adb used by appium + helper libs","fork":false,"url":"https://api.github.com/repos/appium/appium-adb","forks_url":"https://api.github.com/repos/appium/appium-adb/forks","keys_url":"https://api.github.com/repos/appium/appium-adb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/appium/appium-adb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/appium/appium-adb/teams","hooks_url":"https://api.github.com/repos/appium/appium-adb/hooks","issue_events_url":"https://api.github.com/repos/appium/appium-adb/issues/events{/number}","events_url":"https://api.github.com/repos/appium/appium-adb/events","assignees_url":"https://api.github.com/repos/appium/appium-adb/assignees{/user}","branches_url":"https://api.github.com/repos/appium/appium-adb/branches{/branch}","tags_url":"https://api.github.com/repos/appium/appium-adb/tags","blobs_url":"https://api.github.com/repos/appium/appium-adb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/appium/appium-adb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/appium/appium-adb/git/refs{/sha}","trees_url":"https://api.github.com/repos/appium/appium-adb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/appium/appium-adb/statuses/{sha}","languages_url":"https://api.github.com/repos/appium/appium-adb/languages","stargazers_url":"https://api.github.com/repos/appium/appium-adb/stargazers","contributors_url":"https://api.github.com/repos/appium/appium-adb/contributors","subscribers_url":"https://api.github.com/repos/appium/appium-adb/subscribers","subscription_url":"https://api.github.com/repos/appium/appium-adb/subscription","commits_url":"https://api.github.com/repos/appium/appium-adb/commits{/sha}","git_commits_url":"https://api.github.com/repos/appium/appium-adb/git/commits{/sha}","comments_url":"https://api.github.com/repos/appium/appium-adb/comments{/number}","issue_comment_url":"https://api.github.com/repos/appium/appium-adb/issues/comments{/number}","contents_url":"https://api.github.com/repos/appium/appium-adb/contents/{+path}","compare_url":"https://api.github.com/repos/appium/appium-adb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/appium/appium-adb/merges","archive_url":"https://api.github.com/repos/appium/appium-adb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/appium/appium-adb/downloads","issues_url":"https://api.github.com/repos/appium/appium-adb/issues{/number}","pulls_url":"https://api.github.com/repos/appium/appium-adb/pulls{/number}","milestones_url":"https://api.github.com/repos/appium/appium-adb/milestones{/number}","notifications_url":"https://api.github.com/repos/appium/appium-adb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/appium/appium-adb/labels{/name}","releases_url":"https://api.github.com/repos/appium/appium-adb/releases{/id}","deployments_url":"https://api.github.com/repos/appium/appium-adb/deployments","created_at":"2014-03-02T14:20:10Z","updated_at":"2018-10-11T06:34:16Z","pushed_at":"2018-10-13T15:05:48Z","git_url":"git://github.com/appium/appium-adb.git","ssh_url":"git@github.com:appium/appium-adb.git","clone_url":"https://github.com/appium/appium-adb.git","svn_url":"https://github.com/appium/appium-adb","homepage":null,"size":31064,"stargazers_count":102,"watchers_count":102,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":108,"mirror_url":null,"archived":false,"open_issues_count":2,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":108,"open_issues":2,"watchers":102,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/appium/appium-adb/pulls/366"},"html":{"href":"https://github.com/appium/appium-adb/pull/366"},"issue":{"href":"https://api.github.com/repos/appium/appium-adb/issues/366"},"comments":{"href":"https://api.github.com/repos/appium/appium-adb/issues/366/comments"},"review_comments":{"href":"https://api.github.com/repos/appium/appium-adb/pulls/366/comments"},"review_comment":{"href":"https://api.github.com/repos/appium/appium-adb/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/appium/appium-adb/pulls/366/commits"},"statuses":{"href":"https://api.github.com/repos/appium/appium-adb/statuses/accb085480ff6c7cb9ecc1ccf6671ab68f10ff55"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"mykola-mokhnach"}}