{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/comments/166989525","pull_request_review_id":95139199,"id":166989525,"diff_hunk":"@@ -16,35 +16,234 @@\n \n package com.google.cloud.tools.intellij.appengine.sdk;\n \n+import com.google.cloud.tools.intellij.util.ThreadUtil;\n+import com.google.cloud.tools.managedcloudsdk.ManagedCloudSdk;\n+import com.google.cloud.tools.managedcloudsdk.ManagedSdkVerificationException;\n+import com.google.cloud.tools.managedcloudsdk.ManagedSdkVersionMismatchException;\n+import com.google.cloud.tools.managedcloudsdk.MessageListener;\n+import com.google.cloud.tools.managedcloudsdk.UnsupportedOsException;\n+import com.google.cloud.tools.managedcloudsdk.command.CommandExecutionException;\n+import com.google.cloud.tools.managedcloudsdk.command.CommandExitException;\n+import com.google.cloud.tools.managedcloudsdk.components.SdkComponent;\n+import com.google.cloud.tools.managedcloudsdk.install.SdkInstallerException;\n+import com.google.cloud.tools.managedcloudsdk.install.UnknownArchiveTypeException;\n+import com.google.common.annotations.VisibleForTesting;\n+import com.google.common.collect.Lists;\n+import com.google.common.util.concurrent.FutureCallback;\n+import com.google.common.util.concurrent.Futures;\n+import com.google.common.util.concurrent.ListenableFuture;\n+import com.intellij.openapi.application.ApplicationManager;\n+import com.intellij.openapi.diagnostic.Logger;\n+import java.io.IOException;\n import java.nio.file.Path;\n+import java.util.Collection;\n import org.jetbrains.annotations.Nullable;\n \n /**\n  * {@link CloudSdkService} providing SDK that is managed and automatically installable, see {@link\n- * com.google.cloud.tools.managedcloudsdk.ManagedCloudSdk}\n+ * com.google.cloud.tools.managedcloudsdk.ManagedCloudSdk}.\n+ *\n+ * <p>Some methods ({@link #install()} do their work on background thread but listeners methods are\n+ * always called on EDT thread. This class is not thread-safe, must be used on UI thread.\n  */\n-// TODO(ivanporty) implementation coming in the next PR\n public class ManagedCloudSdkService implements CloudSdkService {\n+  private Logger logger = Logger.getInstance(ManagedCloudSdkService.class);\n+\n+  private ManagedCloudSdk managedCloudSdk;\n+\n+  private SdkStatus sdkStatus = SdkStatus.NOT_AVAILABLE;\n+\n+  private final Collection<SdkStatusUpdateListener> statusUpdateListeners = Lists.newArrayList();\n+\n+  private volatile ListenableFuture<Path> runningInstallationJob;\n+\n+  @Override\n+  public void activate() {\n+    // TODO track event that custom SDK is activated and used.\n+\n+    install();\n+  }\n \n   @Nullable\n   @Override\n   public Path getSdkHomePath() {\n-    return null;\n+    switch (sdkStatus) {\n+      case READY:\n+        return managedCloudSdk.getSdkHome();\n+      default:\n+        return null;\n+    }\n   }\n \n   @Override\n-  public void setSdkHomePath(String path) {}\n+  public void setSdkHomePath(String path) {\n+    /* unsupported, to be removed. */\n+  }\n \n   @Override\n   public SdkStatus getStatus() {\n-    return SdkStatus.NOT_AVAILABLE;\n+    return sdkStatus;\n   }\n \n   @Override\n-  public boolean installAutomatically() {\n+  public boolean install() {\n+    // check if installation is already running first, to prevent multiple jobs running.\n+    if (runningInstallationJob == null || runningInstallationJob.isDone()) {\n+      runningInstallationJob =\n+          ThreadUtil.getInstance().executeInBackground(this::installManagedSdk);\n+      Futures.addCallback(\n+          runningInstallationJob,\n+          new FutureCallback<Path>() {\n+            @Override\n+            public void onSuccess(Path path) {\n+              if (path != null) {\n+                logger.info(\"Managed Google Cloud SDK successfully installed at: \" + path);\n+              }\n+            }\n+\n+            @Override\n+            public void onFailure(Throwable t) {\n+              if (t instanceof InterruptedException) {\n+                logger.info(\"Managed Google Cloud SDK installation cancelled.\");\n+              }\n+            }\n+          });\n+    }\n+\n     return true;\n   }\n \n   @Override\n-  public void addStatusUpdateListener(SdkStatusUpdateListener listener) {}\n+  public void addStatusUpdateListener(SdkStatusUpdateListener listener) {\n+    statusUpdateListeners.add(listener);\n+  }\n+\n+  @Override\n+  public void removeStatusUpdateListener(SdkStatusUpdateListener listener) {\n+    statusUpdateListeners.remove(listener);\n+  }\n+\n+  public void cancelInstall() {\n+    if (runningInstallationJob != null) {\n+      runningInstallationJob.cancel(true);\n+    }\n+  }\n+\n+  @VisibleForTesting\n+  ManagedCloudSdk createManagedSdk() throws UnsupportedOsException {\n+    return ManagedCloudSdk.newManagedSdk();\n+  }\n+\n+  @VisibleForTesting\n+  void setLogger(Logger logger) {\n+    this.logger = logger;\n+  }\n+\n+  @VisibleForTesting\n+  void invokeOnApplicationUIThread(Runnable runnable) {\n+    ApplicationManager.getApplication().invokeLater(runnable);\n+  }\n+\n+  /**\n+   * Checks for Managed Cloud SDK status and creates/installs it if necessary.\n+   *\n+   * @return Path of the installed managed SDK, null if error occurred while installing.\n+   * @throws InterruptedException if Managed Cloud SDK has been interrupted by {@link\n+   *     #cancelInstall()}\n+   */\n+  private Path installManagedSdk() throws InterruptedException {\n+    if (managedCloudSdk == null) {\n+      try {\n+        managedCloudSdk = createManagedSdk();\n+      } catch (UnsupportedOsException ex) {\n+        logger.error(\"Unsupported OS for Managed Cloud SDK\", ex);\n+        updateStatus(SdkStatus.NOT_AVAILABLE);\n+        return null;\n+      }\n+    }\n+\n+    updateStatus(SdkStatus.INSTALLING);\n+\n+    Path installedManagedSdkPath;\n+    try {\n+      installedManagedSdkPath = installSdk();\n+    } catch (InterruptedException iex) {\n+      updateStatus(SdkStatus.NOT_AVAILABLE);\n+      throw iex;","path":"google-cloud-tools-plugin/src/com/google/cloud/tools/intellij/appengine/sdk/ManagedCloudSdkService.java","position":164,"original_position":164,"commit_id":"03087176122f813cdc3dd66e0f64c788059b7a79","original_commit_id":"03087176122f813cdc3dd66e0f64c788059b7a79","user":{"login":"ivanporty","id":11686100,"avatar_url":"https://avatars3.githubusercontent.com/u/11686100?v=4","gravatar_id":"","url":"https://api.github.com/users/ivanporty","html_url":"https://github.com/ivanporty","followers_url":"https://api.github.com/users/ivanporty/followers","following_url":"https://api.github.com/users/ivanporty/following{/other_user}","gists_url":"https://api.github.com/users/ivanporty/gists{/gist_id}","starred_url":"https://api.github.com/users/ivanporty/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ivanporty/subscriptions","organizations_url":"https://api.github.com/users/ivanporty/orgs","repos_url":"https://api.github.com/users/ivanporty/repos","events_url":"https://api.github.com/users/ivanporty/events{/privacy}","received_events_url":"https://api.github.com/users/ivanporty/received_events","type":"User","site_admin":false},"body":"It does feel filled with various exceptions, I discussed with Appu which ones means what and it's not pretty.\r\nThere are a few things here why this happens:\r\n* InterruptedException is not an error but sign that process was gracefully cancelled so that's the reason it goes out to the top and will be logged in UI\r\n* ManagedSdkVerificationException | ManagedSdkVersionMismatchException are not fatal and means SDK was there but it failed to execute status check on them - it just means we go ahead and re-install it. Those happen for both base SDK and App Engine Java and we need to log different messages about them.\r\n* Other exceptions are fatal.\r\n\r\nSo it's possible `onFailure()` can become really ugly method, especially when we need to distinguish between SDK / App Engine Java component errors. WDYT?","created_at":"2018-02-08T16:25:34Z","updated_at":"2018-02-08T16:25:34Z","html_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij/pull/1890#discussion_r166989525","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/1890","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/comments/166989525"},"html":{"href":"https://github.com/GoogleCloudPlatform/google-cloud-intellij/pull/1890#discussion_r166989525"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/1890"}},"in_reply_to_id":166986016},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/1890","id":167535408,"html_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij/pull/1890","diff_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij/pull/1890.diff","patch_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij/pull/1890.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues/1890","number":1890,"state":"open","locked":false,"title":"Managed SDK service implementation","user":{"login":"ivanporty","id":11686100,"avatar_url":"https://avatars3.githubusercontent.com/u/11686100?v=4","gravatar_id":"","url":"https://api.github.com/users/ivanporty","html_url":"https://github.com/ivanporty","followers_url":"https://api.github.com/users/ivanporty/followers","following_url":"https://api.github.com/users/ivanporty/following{/other_user}","gists_url":"https://api.github.com/users/ivanporty/gists{/gist_id}","starred_url":"https://api.github.com/users/ivanporty/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ivanporty/subscriptions","organizations_url":"https://api.github.com/users/ivanporty/orgs","repos_url":"https://api.github.com/users/ivanporty/repos","events_url":"https://api.github.com/users/ivanporty/events{/privacy}","received_events_url":"https://api.github.com/users/ivanporty/received_events","type":"User","site_admin":false},"body":"Implements:\r\n* SDK service interface \r\n* background installation \r\n* low level logging\r\n* cancellation and other housekeeping.\r\n\r\nNot here, for the following PRs:\r\n* UI and integration\r\n* SDK auto-updates\r\n","created_at":"2018-02-06T21:35:05Z","updated_at":"2018-02-08T16:25:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cfba2e1c2b39ec61ed93063fb41422da7d5eeb33","assignee":null,"assignees":[],"requested_reviewers":[{"login":"nbashirbello","id":6805942,"avatar_url":"https://avatars1.githubusercontent.com/u/6805942?v=4","gravatar_id":"","url":"https://api.github.com/users/nbashirbello","html_url":"https://github.com/nbashirbello","followers_url":"https://api.github.com/users/nbashirbello/followers","following_url":"https://api.github.com/users/nbashirbello/following{/other_user}","gists_url":"https://api.github.com/users/nbashirbello/gists{/gist_id}","starred_url":"https://api.github.com/users/nbashirbello/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nbashirbello/subscriptions","organizations_url":"https://api.github.com/users/nbashirbello/orgs","repos_url":"https://api.github.com/users/nbashirbello/repos","events_url":"https://api.github.com/users/nbashirbello/events{/privacy}","received_events_url":"https://api.github.com/users/nbashirbello/received_events","type":"User","site_admin":false}],"requested_teams":[],"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/1890/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/1890/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues/1890/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/statuses/03087176122f813cdc3dd66e0f64c788059b7a79","head":{"label":"GoogleCloudPlatform:managedsdk-implementation","ref":"managedsdk-implementation","sha":"03087176122f813cdc3dd66e0f64c788059b7a79","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars0.githubusercontent.com/u/2810941?v=4","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":38834157,"name":"google-cloud-intellij","full_name":"GoogleCloudPlatform/google-cloud-intellij","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars0.githubusercontent.com/u/2810941?v=4","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij","description":"Plugin to support the Google Cloud Platform in IntelliJ IDEA.","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/releases{/id}","deployments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/deployments","created_at":"2015-07-09T17:08:59Z","updated_at":"2018-02-05T02:49:52Z","pushed_at":"2018-02-07T22:49:51Z","git_url":"git://github.com/GoogleCloudPlatform/google-cloud-intellij.git","ssh_url":"git@github.com:GoogleCloudPlatform/google-cloud-intellij.git","clone_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij.git","svn_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij","homepage":"","size":19384,"stargazers_count":79,"watchers_count":79,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":29,"mirror_url":null,"archived":false,"open_issues_count":173,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":29,"open_issues":173,"watchers":79,"default_branch":"master"}},"base":{"label":"GoogleCloudPlatform:master","ref":"master","sha":"d62a5d7b834f62b9de515f1ae40b7b7730fa9e17","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars0.githubusercontent.com/u/2810941?v=4","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":38834157,"name":"google-cloud-intellij","full_name":"GoogleCloudPlatform/google-cloud-intellij","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars0.githubusercontent.com/u/2810941?v=4","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij","description":"Plugin to support the Google Cloud Platform in IntelliJ IDEA.","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/releases{/id}","deployments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/deployments","created_at":"2015-07-09T17:08:59Z","updated_at":"2018-02-05T02:49:52Z","pushed_at":"2018-02-07T22:49:51Z","git_url":"git://github.com/GoogleCloudPlatform/google-cloud-intellij.git","ssh_url":"git@github.com:GoogleCloudPlatform/google-cloud-intellij.git","clone_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij.git","svn_url":"https://github.com/GoogleCloudPlatform/google-cloud-intellij","homepage":"","size":19384,"stargazers_count":79,"watchers_count":79,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":29,"mirror_url":null,"archived":false,"open_issues_count":173,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":29,"open_issues":173,"watchers":79,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/1890"},"html":{"href":"https://github.com/GoogleCloudPlatform/google-cloud-intellij/pull/1890"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues/1890"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/issues/1890/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/1890/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/pulls/1890/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-intellij/statuses/03087176122f813cdc3dd66e0f64c788059b7a79"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"ivanporty"}}