{"action":"created","comment":{"url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/comments/33071172","id":33071172,"diff_hunk":"@@ -0,0 +1,311 @@\n+/*\n+ * Original work copyright (c) 2015, Alex Antonov. All rights reserved.\n+ * Modified work copyright (c) 2015, Google Inc. All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *\n+ * 1. Redistributions of source code must retain the above copyright notice, this\n+ * list of conditions and the following disclaimer.\n+ *\n+ * 2. Redistributions in binary form must reproduce the above copyright notice,\n+ * this list of conditions and the following disclaimer in the documentation\n+ * and/or other materials provided with the distribution.\n+ *\n+ * 3. Neither the name of the copyright holder nor the names of its contributors\n+ * may be used to endorse or promote products derived from this software without\n+ * specific prior written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+package com.google.protobuf.gradle\n+\n+import com.google.common.base.Preconditions\n+import com.google.common.collect.ImmutableList\n+import org.gradle.api.tasks.SourceSet\n+import org.gradle.api.logging.LogLevel\n+import org.gradle.api.tasks.TaskAction\n+import org.gradle.api.DefaultTask\n+import org.gradle.api.GradleException\n+import org.gradle.api.Named\n+import org.gradle.api.NamedDomainObjectContainer\n+import org.gradle.api.Project\n+import org.gradle.util.ConfigureUtil\n+\n+/**\n+ * The task that compiles proto files into Java files.\n+ */\n+public class GenerateProtoTask extends DefaultTask {\n+\n+  private final List includeDirs = new ArrayList()\n+  private final NamedDomainObjectContainer<PluginOptions> builtins\n+  private final NamedDomainObjectContainer<PluginOptions> plugins\n+\n+  // These fields are set by the Protobuf plugin only when initializing the\n+  // task.  Ideally they should be final fields, but Gradle task cannot have\n+  // constructor arguments. We use the initializing flag to prevent users from\n+  // accidentally modifying them.\n+  private String outputBaseDir\n+  // Tags for selectors inside protobuf.generateProtoTasks\n+  private SourceSet sourceSet\n+  private Object variant\n+  private ImmutableList<String> flavors\n+  private String buildType\n+\n+  private boolean initializing = true\n+  private void checkInitializing() {\n+    Preconditions.checkState(initializing, 'Should not be called after initilization has finished')\n+  }\n+\n+  void setOutputBaseDir(String outputBaseDir) {\n+    checkInitializing()\n+    Preconditions.checkState(this.outputBaseDir == null, 'outputBaseDir is already set')\n+    this.outputBaseDir = outputBaseDir\n+    outputs.dir outputBaseDir\n+  }\n+\n+  void setSourceSet(SourceSet sourceSet) {\n+    checkInitializing()\n+    Preconditions.checkState(!Utils.isAndroidProject(project),\n+        'sourceSet should not be set in an Android project')\n+    this.sourceSet = sourceSet\n+  }\n+\n+  void setVariant(Object variant) {\n+    checkInitializing()\n+    Preconditions.checkState(Utils.isAndroidProject(project),\n+        'variant should not be set in a Java project')\n+    this.variant = variant\n+  }\n+\n+  void setFlavors(ImmutableList<String> flavors) {\n+    checkInitializing()\n+    Preconditions.checkState(Utils.isAndroidProject(project),\n+        'flavors should not be set in a Java project')\n+    this.flavors = flavors\n+  }\n+\n+  void setBuildType(String buildType) {\n+    checkInitializing()\n+    Preconditions.checkState(Utils.isAndroidProject(project),\n+        'buildType should not be set in a Java project')\n+    this.buildType = buildType\n+  }\n+\n+  SourceSet getSourceSet() {\n+    Preconditions.checkState(!Utils.isAndroidProject(project),\n+        'sourceSet should not be used in an Android project')\n+    Preconditions.checkNotNull(sourceSet, 'sourceSet is not set')\n+    return sourceSet\n+  }\n+\n+  Object getVariant() {\n+    Preconditions.checkState(Utils.isAndroidProject(project),\n+        'variant should not be used in a Java project')\n+    Preconditions.checkNotNull(variant, 'variant is not set')\n+    return variant\n+  }\n+\n+  ImmutableList<String> getFlavors() {\n+    Preconditions.checkState(Utils.isAndroidProject(project),\n+        'flavors should not be used in a Java project')\n+    Preconditions.checkNotNull(flavors, 'flavors is not set')\n+    return flavors\n+  }\n+\n+  String getBuildType() {\n+    Preconditions.checkState(Utils.isAndroidProject(project),\n+        'buildType should not be used in a Java project')\n+    Preconditions.checkNotNull(buildType, 'buildType is not set')\n+    return buildType\n+  }\n+\n+  void doneInitializing() {\n+    initializing = false\n+  }\n+\n+  public GenerateProtoTask() {\n+    builtins = project.container(PluginOptions)\n+    plugins = project.container(PluginOptions)\n+  }\n+\n+  //===========================================================================\n+  //        Configuration methods\n+  //===========================================================================\n+\n+  /**\n+   * Configures the protoc builtins in a closure, which will be maniuplating a\n+   * NamedDomainObjectContainer<PluginOptions>.\n+   */\n+  public void builtins(Closure configureClosure) {\n+    ConfigureUtil.configure(configureClosure, builtins)\n+  }\n+\n+  /**\n+   * Configures the protoc plugins in a closure, which will be maniuplating a\n+   * NamedDomainObjectContainer<PluginOptions>.\n+   */\n+  public void plugins(Closure configureClosure) {\n+    ConfigureUtil.configure(configureClosure, plugins)\n+  }\n+\n+  /**\n+   * Add a directory to protoc's include path.\n+   */\n+  public void include(Object dir) {\n+      if (dir instanceof File) {\n+          includeDirs.add(dir)\n+      } else {\n+          includeDirs.add(project.file(dir))\n+      }\n+  }\n+\n+  /**\n+   * The container of command-line options for a protoc plugin or a built-in output.\n+   */\n+  public static class PluginOptions implements Named {\n+    private final ArrayList<String> options = new ArrayList<String>()\n+    private final String name\n+\n+    public PluginOptions(String name) {\n+      this.name = name\n+    }\n+\n+    /**\n+     * Adds a plugin option.\n+     */\n+    public PluginOptions option(String option) {\n+      options.add(option)\n+      return this\n+    }\n+\n+    public List<String> getOptions() {\n+      return options\n+    }\n+\n+    /**\n+     * Returns the name of the plugin or builtin.\n+     */\n+    @Override\n+    public String getName() {\n+      return name\n+    }\n+  }\n+\n+  //===========================================================================\n+  //    protoc invocation logic\n+  //===========================================================================\n+\n+  // protoc allows you to prefix comma-delimited options to the path in\n+  // the --*_out flags, e.g.,\n+  // - Without options: --java_out=/path/to/output\n+  // - With options: --java_out=option1,option2:/path/to/output\n+  // This method generates the prefix out of the given options.\n+  def String makeOptionsPrefix(List<String> options) {\n+    StringBuilder prefix = new StringBuilder()\n+    if (!options.isEmpty()) {\n+      options.each { option ->\n+        if (prefix.length() > 0) {\n+          prefix.append(',')\n+        }\n+        prefix.append(option)\n+      }\n+      prefix.append(':')\n+    }\n+    return prefix.toString()\n+  }\n+\n+  String getOutputDir(PluginOptions plugin) {\n+    return \"${outputBaseDir}/${plugin.name}\"\n+  }\n+\n+  Collection<File> getAllOutputDirs() {\n+    ImmutableList.Builder<File> dirs = ImmutableList.builder()\n+    builtins.each { builtin ->\n+      dirs.add(new File(getOutputDir(builtin)))\n+    }\n+    plugins.each { plugin ->\n+      dirs.add(new File(getOutputDir(plugin)))\n+    }\n+    return dirs.build()\n+  }\n+\n+  @TaskAction\n+  def compile() {\n+    Preconditions.checkState(!initializing, 'doneInitializing() has not been called')\n+\n+    // Only at this point all outputs are finalized, then we can register the\n+    // generated source dirs to java compilation.\n+\n+    // NOTE(zhangkun83): does this mean we can actually allow per-plugin output\n+    // dir reconfiguraiton? Not actually -- the basedir of all outputs must be\n+    // registered to task.outputs before Gradle starts to execute tasks, so\n+    // that the task can be correctly skipped.  We may only allow plugins to","path":"src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy","position":252,"original_position":252,"commit_id":"5139025dc066770343f339bd92506f17ea8f9ec0","original_commit_id":"5139025dc066770343f339bd92506f17ea8f9ec0","user":{"login":"zhangkun83","id":9053690,"avatar_url":"https://avatars.githubusercontent.com/u/9053690?v=3","gravatar_id":"","url":"https://api.github.com/users/zhangkun83","html_url":"https://github.com/zhangkun83","followers_url":"https://api.github.com/users/zhangkun83/followers","following_url":"https://api.github.com/users/zhangkun83/following{/other_user}","gists_url":"https://api.github.com/users/zhangkun83/gists{/gist_id}","starred_url":"https://api.github.com/users/zhangkun83/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhangkun83/subscriptions","organizations_url":"https://api.github.com/users/zhangkun83/orgs","repos_url":"https://api.github.com/users/zhangkun83/repos","events_url":"https://api.github.com/users/zhangkun83/events{/privacy}","received_events_url":"https://api.github.com/users/zhangkun83/received_events","type":"User","site_admin":false},"body":"I thought task dependency graph was created during evaluation, but [it seems](https://docs.gradle.org/current/userguide/build_lifecycle.html) dependency is calculated after evaluation, then this should be fine. I will update the comment to include a TODO instead.","created_at":"2015-06-23T17:58:52Z","updated_at":"2015-06-23T17:58:52Z","html_url":"https://github.com/google/protobuf-gradle-plugin/pull/19#discussion_r33071172","pull_request_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/19","_links":{"self":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/comments/33071172"},"html":{"href":"https://github.com/google/protobuf-gradle-plugin/pull/19#discussion_r33071172"},"pull_request":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/19"}}},"pull_request":{"url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/19","id":38288983,"html_url":"https://github.com/google/protobuf-gradle-plugin/pull/19","diff_url":"https://github.com/google/protobuf-gradle-plugin/pull/19.diff","patch_url":"https://github.com/google/protobuf-gradle-plugin/pull/19.patch","issue_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues/19","number":19,"state":"open","locked":false,"title":"Implements the most of the changes for 0.5.0","user":{"login":"zhangkun83","id":9053690,"avatar_url":"https://avatars.githubusercontent.com/u/9053690?v=3","gravatar_id":"","url":"https://api.github.com/users/zhangkun83","html_url":"https://github.com/zhangkun83","followers_url":"https://api.github.com/users/zhangkun83/followers","following_url":"https://api.github.com/users/zhangkun83/following{/other_user}","gists_url":"https://api.github.com/users/zhangkun83/gists{/gist_id}","starred_url":"https://api.github.com/users/zhangkun83/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhangkun83/subscriptions","organizations_url":"https://api.github.com/users/zhangkun83/orgs","repos_url":"https://api.github.com/users/zhangkun83/repos","events_url":"https://api.github.com/users/zhangkun83/events{/privacy}","received_events_url":"https://api.github.com/users/zhangkun83/received_events","type":"User","site_admin":false},"body":"- ``android.sourceSets`` will have the ``proto`` extension for customizing proto source directories/files, just like what the top-level ``sourceSets`` does. (#11)\r\n- The plugin generates a ``generate*Proto`` task (implemented by ``GenerateProtoTask``)  for each ``variant`` in Android projects. (#11)\r\n- Top-level options are moved into the ``protobuf`` block (implemented by ``ProtobufConfigurator``) with more Gradlely syntax. (#14, #16)\r\n- Code-gen options are configured through the ``generate*Proto`` tasks instead of in ``sourceSets``. We provide convenient helpers ``protobuf.generateProtoTasks`` for users to configure a certain subset of tasks at a time.\r\n- ``extractedProtosDir`` option is removed, because the user should not really care about it.\r\n- Default code-gen output directory is ``\"$buildDir/generated/source/proto/$sourceSet/$name\"``, where ``$name`` could be ``java``, ``python`` etc. The basedir i.e. ``$buildDir/generated/source/proto/`` is configurable through ``protobuf.generatedFilesBaseDir`` (#13, #16)\r\n\r\nDesign doc is [here](https://docs.google.com/document/d/1l_Rjj6kwR440PRbkCcHREqpF44-PvyBPLz1Ngg_wZ7I/edit#).\r\n@ejona86 please review\r\n@madongfly please help verify the Android support works\r\n","created_at":"2015-06-22T23:53:07Z","updated_at":"2015-06-23T17:58:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fcd15281b5b09e43bc1802e6806cbaae0c21ee89","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/19/commits","review_comments_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/19/comments","review_comment_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues/19/comments","statuses_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/statuses/5139025dc066770343f339bd92506f17ea8f9ec0","head":{"label":"zhangkun83:android_extend_sourcesets","ref":"android_extend_sourcesets","sha":"5139025dc066770343f339bd92506f17ea8f9ec0","user":{"login":"zhangkun83","id":9053690,"avatar_url":"https://avatars.githubusercontent.com/u/9053690?v=3","gravatar_id":"","url":"https://api.github.com/users/zhangkun83","html_url":"https://github.com/zhangkun83","followers_url":"https://api.github.com/users/zhangkun83/followers","following_url":"https://api.github.com/users/zhangkun83/following{/other_user}","gists_url":"https://api.github.com/users/zhangkun83/gists{/gist_id}","starred_url":"https://api.github.com/users/zhangkun83/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhangkun83/subscriptions","organizations_url":"https://api.github.com/users/zhangkun83/orgs","repos_url":"https://api.github.com/users/zhangkun83/repos","events_url":"https://api.github.com/users/zhangkun83/events{/privacy}","received_events_url":"https://api.github.com/users/zhangkun83/received_events","type":"User","site_admin":false},"repo":{"id":32406261,"name":"protobuf-gradle-plugin","full_name":"zhangkun83/protobuf-gradle-plugin","owner":{"login":"zhangkun83","id":9053690,"avatar_url":"https://avatars.githubusercontent.com/u/9053690?v=3","gravatar_id":"","url":"https://api.github.com/users/zhangkun83","html_url":"https://github.com/zhangkun83","followers_url":"https://api.github.com/users/zhangkun83/followers","following_url":"https://api.github.com/users/zhangkun83/following{/other_user}","gists_url":"https://api.github.com/users/zhangkun83/gists{/gist_id}","starred_url":"https://api.github.com/users/zhangkun83/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhangkun83/subscriptions","organizations_url":"https://api.github.com/users/zhangkun83/orgs","repos_url":"https://api.github.com/users/zhangkun83/repos","events_url":"https://api.github.com/users/zhangkun83/events{/privacy}","received_events_url":"https://api.github.com/users/zhangkun83/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/zhangkun83/protobuf-gradle-plugin","description":"Protobuf Plugin for Gradle","fork":true,"url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin","forks_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/forks","keys_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/teams","hooks_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/hooks","issue_events_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/events","assignees_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/tags","blobs_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/languages","stargazers_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/stargazers","contributors_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/contributors","subscribers_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/subscribers","subscription_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/subscription","commits_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/merges","archive_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/downloads","issues_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/labels{/name}","releases_url":"https://api.github.com/repos/zhangkun83/protobuf-gradle-plugin/releases{/id}","created_at":"2015-03-17T16:39:14Z","updated_at":"2015-05-07T23:14:47Z","pushed_at":"2015-06-22T23:29:00Z","git_url":"git://github.com/zhangkun83/protobuf-gradle-plugin.git","ssh_url":"git@github.com:zhangkun83/protobuf-gradle-plugin.git","clone_url":"https://github.com/zhangkun83/protobuf-gradle-plugin.git","svn_url":"https://github.com/zhangkun83/protobuf-gradle-plugin","homepage":"","size":621,"stargazers_count":0,"watchers_count":0,"language":"Protocol Buffer","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"google:master","ref":"master","sha":"de66162a91716a4494ba2eadba3a0aaf1b047f56","user":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?v=3","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"repo":{"id":33881870,"name":"protobuf-gradle-plugin","full_name":"google/protobuf-gradle-plugin","owner":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?v=3","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/google/protobuf-gradle-plugin","description":"Protobuf Plugin for Gradle","fork":true,"url":"https://api.github.com/repos/google/protobuf-gradle-plugin","forks_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/forks","keys_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/teams","hooks_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/hooks","issue_events_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/events","assignees_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/tags","blobs_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/languages","stargazers_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/stargazers","contributors_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/contributors","subscribers_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/subscribers","subscription_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/subscription","commits_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/merges","archive_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/downloads","issues_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/labels{/name}","releases_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/releases{/id}","created_at":"2015-04-13T17:06:00Z","updated_at":"2015-06-08T02:53:26Z","pushed_at":"2015-06-22T23:53:08Z","git_url":"git://github.com/google/protobuf-gradle-plugin.git","ssh_url":"git@github.com:google/protobuf-gradle-plugin.git","clone_url":"https://github.com/google/protobuf-gradle-plugin.git","svn_url":"https://github.com/google/protobuf-gradle-plugin","homepage":"","size":648,"stargazers_count":10,"watchers_count":10,"language":"Protocol Buffer","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":7,"forks":2,"open_issues":7,"watchers":10,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/19"},"html":{"href":"https://github.com/google/protobuf-gradle-plugin/pull/19"},"issue":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues/19"},"comments":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues/19/comments"},"review_comments":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/19/comments"},"review_comment":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/19/commits"},"statuses":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/statuses/5139025dc066770343f339bd92506f17ea8f9ec0"}}}}