{"action":"created","comment":{"url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/comments/45563341","id":45563341,"diff_hunk":"@@ -0,0 +1,347 @@\n+package com.google.protobuf.gradle\n+\n+import org.gradle.testkit.runner.GradleRunner\n+import org.gradle.testkit.runner.TaskOutcome\n+import org.junit.Rule\n+import org.junit.rules.TemporaryFolder\n+import spock.lang.Specification\n+\n+class ProtobufModelPluginTest extends Specification {\n+  @Rule\n+  final TemporaryFolder testProjectDir = new TemporaryFolder()\n+  File buildFile\n+\n+  def setup() {\n+    buildFile = testProjectDir.newFile('build.gradle')\n+\n+    def pluginClasspathResource = getClass().classLoader.findResource(\"plugin-classpath.txt\")\n+    if (pluginClasspathResource == null) {\n+      throw new IllegalStateException(\"Did not find plugin classpath resource, run `testClasses` build task.\")\n+    }\n+\n+    def pluginClasspath = pluginClasspathResource.readLines()\n+        .collect { it.replace('\\\\', '\\\\\\\\') } // escape backslashes in Windows paths\n+        .collect { \"'$it'\" }\n+        .join(\", \")\n+\n+    // Add the logic under test to the test build\n+    buildFile << \"\"\"\n+          buildscript {\n+            dependencies {\n+              classpath files($pluginClasspath)\n+            }\n+          }\n+        \"\"\"\n+\n+    // Generate some useful path\n+    def userDir = System.getProperty(\"user.dir\").replace(\"\\\\\", \"\\\\\\\\\")\n+    def vendorDir = \"$userDir/vendor\"\n+    def vendorBinaryDir = \"$vendorDir/build/binaries\"\n+\n+    // Check to see if the vendor binaries were generated prior to running the test\n+    assert new File(\"$vendorBinaryDir/protocExecutable\").exists()\n+    assert new File(\"$vendorBinaryDir/protobufStaticLibrary\").exists()\n+    assert new File(\"$vendorBinaryDir/protobufLiteStaticLibrary\").exists()\n+\n+    buildFile << \"\"\"\n+          apply plugin: 'cpp'\n+\n+          // Repositories doesn't seems to be working for this.\n+          binaries.all {\n+            if (toolChain instanceof VisualCpp) {\n+              cppCompiler.args \"/I$vendorDir/protobuf/src\"\n+              linker.args \"/LIBPATH:$vendorBinaryDir/protobufStaticLibrary\", \"protobuf.lib\"\n+              linker.args \"/LIBPATH:$vendorBinaryDir/protobufLiteStaticLibrary\", \"protobufLite.lib\"\n+            } else {\n+              cppCompiler.args \"-I$vendorDir/protobuf/src\"\n+              linker.args \"-L$vendorBinaryDir/protobufStaticLibrary\", \"-lprotobuf\"\n+              linker.args \"-L$vendorBinaryDir/protobufLiteStaticLibrary\", \"-lprotobufLite\"\n+            }\n+          }\n+\n+          import com.google.protobuf.gradle.*\n+          apply plugin: 'com.google.protobuf'\n+\n+          model {\n+            protobuf {\n+              protoc {\n+                path = \"$vendorBinaryDir/protocExecutable/protoc\"\n+              }\n+            }\n+          }\n+        \"\"\"\n+\n+    testProjectDir.newFolder('src', 'main', 'cpp')\n+    testProjectDir.newFolder(\"src\", \"main\", \"proto\")\n+  }\n+\n+  def \"a default protobuf source set exists for configuration\"() {\n+    given: \"a native executable with proto source set configuration\"\n+    buildFile << \"\"\"\n+          model {\n+            components {\n+              main(NativeExecutableSpec)\n+            }\n+          }\n+        \"\"\"\n+\n+    when: \"tasks is invoked\"\n+    def result = GradleRunner.create()\n+        .withProjectDir(testProjectDir.root)\n+        .withArguments('tasks')\n+        .build()\n+\n+    then: \"it succeed\"\n+    result.task(\":tasks\").outcome == TaskOutcome.SUCCESS\n+  }\n+\n+  def \"it doesn't execute the protobuf source generation task if source set is empty\"() {\n+    given: \"a native executable\"\n+    buildFile << \"\"\"\n+          model {\n+            components {\n+              main(NativeExecutableSpec)\n+            }\n+          }\n+        \"\"\"\n+\n+    and: \"a main c++ source file\"\n+    testProjectDir.newFile('src/main/cpp/main.cc').text = \"\"\"\n+          int main() {\n+            return 0;\n+          }\n+        \"\"\"\n+\n+    and: \"no protobuf files\"\n+    // no proto files\n+\n+    when: \"main executable is built\"\n+    def result = GradleRunner.create()\n+        .withProjectDir(testProjectDir.root)\n+        .withArguments('mainExecutable')\n+        .build()\n+\n+    then: \"the generate task is not ran\"\n+    result.task(\":generateMainExecutableMainProto\") == null\n+  }\n+\n+  def \"can create additional protobuf source set and configure them\"() {\n+    given: \"a native executable with an additional proto source set\"\n+    buildFile << \"\"\"\n+          model {\n+            components {\n+              main(NativeExecutableSpec) {\n+                sources {\n+                  anotherProto(ProtobufSourceSet) {\n+                    source.include \"*.proto\"\n+                    generatedSourceSet.withType(CppSourceSet) {\n+                      cpp.lib it\n+                    }\n+                  }\n+                }\n+              }\n+            }\n+          }\n+        \"\"\"\n+\n+    when: \"tasks is invoked\"\n+    def result = GradleRunner.create()\n+        .withProjectDir(testProjectDir.root)\n+        .withArguments('tasks')\n+        .build()\n+\n+    then: \"it succeed\"\n+    result.task(\":tasks\").outcome == TaskOutcome.SUCCESS\n+  }\n+\n+  def \"it execute the protobuf source generation task if source set is not empty\"() {\n+    given: \"a native executable\"\n+    buildFile << \"\"\"\n+          model {\n+            components {\n+              main(NativeExecutableSpec)\n+            }\n+          }\n+        \"\"\"\n+\n+    and: \"a protobuf file\"\n+    testProjectDir.newFile(\"src/main/proto/Test.proto\").text = \"\"\"\n+          message TestMessage {\n+            optional int32 exit_value = 1 [default = 42];\n+          }\n+        \"\"\"\n+\n+    and: \"a c++ source file not referencing the protobuf\"\n+    testProjectDir.newFile(\"src/main/cpp/main.cc\").text = \"\"\"\n+          int main() {\n+            return 0;\n+          }\n+        \"\"\"\n+\n+    when: \"main executable is built\"\n+    def result = GradleRunner.create()\n+        .withProjectDir(testProjectDir.root)\n+        .withArguments('mainExecutable')\n+        .build()\n+\n+    then: \"the generate task is successfully invoked\"\n+    result.task(\":generateMainExecutableMainProto\").outcome == TaskOutcome.SUCCESS\n+  }\n+\n+  def \"it can use the protobuf generated code in the application\"() {\n+    given: \"a native executable\"\n+    buildFile << \"\"\"\n+          model {\n+            components {\n+              main(NativeExecutableSpec)\n+            }\n+          }\n+        \"\"\"\n+\n+    and: \"a protobuf file\"\n+    testProjectDir.newFile(\"src/main/proto/Test.proto\").text = \"\"\"\n+          message TestMessage {\n+            optional int32 exit_value = 1 [default = 42];\n+          }\n+        \"\"\"\n+\n+    and: \"a c++ source file referencing the protobuf\"\n+    testProjectDir.newFile(\"src/main/cpp/main.cc\").text = \"\"\"\n+          #include \"Test.pb.h\"\n+          int main() {\n+            TestMessage m;\n+            return m.exit_value();\n+          }\n+        \"\"\"\n+\n+    when: \"main executable is built\"\n+    def result = GradleRunner.create()\n+        .withProjectDir(testProjectDir.root)\n+        .withArguments('mainExecutable')\n+        .build()\n+\n+    then: \"the generate task is successfully invoked\"\n+    result.task(\":generateMainExecutableMainProto\").outcome == TaskOutcome.SUCCESS\n+  }\n+\n+  def \"it can use protobuf generated code from multiple source set in the application\"() {\n+    given: \"a native executable with multiple protobuf source set\"\n+    buildFile << \"\"\"\n+          model {\n+            components {\n+              main(NativeExecutableSpec) {\n+                sources {\n+                  anotherProto(ProtobufSourceSet) {\n+                    generatedSourceSet.withType(CppSourceSet) {\n+                      cpp.lib it\n+                    }\n+                  }\n+                }\n+              }\n+            }\n+          }\n+        \"\"\"\n+\n+    and: \"protobuf files across multiple source set\"\n+    testProjectDir.newFile(\"src/main/proto/Test.proto\").text = \"\"\"\n+          message TestMessage {\n+            optional int32 exit_value = 1 [default = 42];\n+          }\n+        \"\"\"\n+    testProjectDir.newFolder(\"src\", \"main\", \"anotherProto\", \"foo\")\n+    testProjectDir.newFile(\"src/main/anotherProto/foo/Test.proto\").text = \"\"\"\n+          package foo;\n+          message AnotherTestMessage {\n+            optional int32 value = 1 [default = 42];\n+          }\n+        \"\"\"\n+\n+    and: \"a c++ source file referencing the protobuf messages\"\n+    testProjectDir.newFile(\"src/main/cpp/main.cc\").text = \"\"\"\n+          #include \"Test.pb.h\"\n+          #include \"foo/Test.pb.h\"\n+          int main() {\n+            TestMessage m1;\n+            foo::AnotherTestMessage m2;\n+            return m1.exit_value() + m2.value();\n+          }\n+        \"\"\"\n+\n+    when: \"main executable is built\"\n+    def result = GradleRunner.create()\n+        .withProjectDir(testProjectDir.root)\n+        .withArguments('mainExecutable')\n+        .build()\n+\n+    then: \"the generate tasks are successfully invoked\"\n+    result.task(\":generateMainExecutableMainProto\").outcome == TaskOutcome.SUCCESS\n+    result.task(\":generateMainExecutableMainAnotherProto\").outcome == TaskOutcome.SUCCESS\n+  }\n+\n+  def \"it can have same include from different source set without conflict at compile time\"() {\n+    given: \"a native executable with additional cpp and proto source set\"\n+    buildFile << \"\"\"\n+          model {\n+            components {\n+              main(NativeExecutableSpec) {\n+                sources {\n+                  anotherCpp(CppSourceSet)\n+                  anotherProto(ProtobufSourceSet) {\n+                    generatedSourceSet.withType(CppSourceSet) {\n+                      anotherCpp.lib it\n+                    }\n+                  }\n+                }\n+              }\n+            }\n+          }\n+        \"\"\"\n+\n+    and: \"protobuf files across multiple source set that end up having the same include files\"","path":"src/test/groovy/com/google/protobuf/gradle/ProtobufModelPluginTest.groovy","position":300,"original_position":300,"commit_id":"798b4c427e0994b9a9121f80e78a5d3df7f6cbcf","original_commit_id":"798b4c427e0994b9a9121f80e78a5d3df7f6cbcf","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":"Do you mean \"the same include file names?\"","created_at":"2015-11-22T19:42:35Z","updated_at":"2015-11-22T19:42:35Z","html_url":"https://github.com/google/protobuf-gradle-plugin/pull/44#discussion_r45563341","pull_request_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/44","_links":{"self":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/comments/45563341"},"html":{"href":"https://github.com/google/protobuf-gradle-plugin/pull/44#discussion_r45563341"},"pull_request":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/44"}}},"pull_request":{"url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/44","id":46501869,"html_url":"https://github.com/google/protobuf-gradle-plugin/pull/44","diff_url":"https://github.com/google/protobuf-gradle-plugin/pull/44.diff","patch_url":"https://github.com/google/protobuf-gradle-plugin/pull/44.patch","issue_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues/44","number":44,"state":"open","locked":false,"title":"Initial support of Gradle's model for C++","user":{"login":"Shad0w1nk","id":1980084,"avatar_url":"https://avatars.githubusercontent.com/u/1980084?v=3","gravatar_id":"","url":"https://api.github.com/users/Shad0w1nk","html_url":"https://github.com/Shad0w1nk","followers_url":"https://api.github.com/users/Shad0w1nk/followers","following_url":"https://api.github.com/users/Shad0w1nk/following{/other_user}","gists_url":"https://api.github.com/users/Shad0w1nk/gists{/gist_id}","starred_url":"https://api.github.com/users/Shad0w1nk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Shad0w1nk/subscriptions","organizations_url":"https://api.github.com/users/Shad0w1nk/orgs","repos_url":"https://api.github.com/users/Shad0w1nk/repos","events_url":"https://api.github.com/users/Shad0w1nk/events{/privacy}","received_events_url":"https://api.github.com/users/Shad0w1nk/received_events","type":"User","site_admin":false},"body":"This is the first step toward supporting the new model in Gradle. More works need to be done to better integrate the code with the Java plugin, however it was starting to be a bit intrusive and I wanted to cut a release and keep working on the detail later. This pull request contains the following:\r\n - Upgrade the wrapper to the latest release, Gradle 2.7\r\n - tools in ProtobufConfigurator was changed to protected as it should not be available to the public but seems to be needed in the model. How the extension is registered differ from Java which make the statement protobuf.tools.resolve() fail in the model as the member variable is private. A better way for fixing this problem should be implemented.\r\n - The ProtobufPlugin class was modified to choose between the Java/Android or model (c++) implementation. As much code as possible was shared between both world meaning we are reusing the task and the convention. Unfortunately, the source set use a separate class in order to support the model.\r\n - Integration test were added using TestKit available in the latest Gradle. Some wiring of tasks had to be done according to the documentation.\r\n - A submodule to a release version of Protobuf was added to make the C++ work without having to do any kung fun with installing library. Gradle will build protoc and protobuf library from source and use them in the example project and Gradle TestKit. All the wiring of the building has been done so executing \"./gradlew test\" will automatically build the necessary protobuf binary. As long as gcc (linux), clang (mac os) and msvc 2013 (windows) is installed, everything will work out of the box. A check has been added if someone forgot to sync the submodule.\r\n\r\nWhat's the next step? The logic for building protobuf is a bit different then the legacy Java as the model does add some flexibility that needs to be taken into account (see the integration test for example of what can be done). Some discussion and more work will need to be done in order to prepare the Java plugin for the model and integrate more code with that plugin.\r\n\r\nAny input is welcome and I will fix anything that need to be fixed.","created_at":"2015-10-01T09:29:30Z","updated_at":"2015-11-22T19:42:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6962fcbdcc464f4017327656b8096eb9561d4504","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/44/commits","review_comments_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/44/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/44/comments","statuses_url":"https://api.github.com/repos/google/protobuf-gradle-plugin/statuses/798b4c427e0994b9a9121f80e78a5d3df7f6cbcf","head":{"label":"Shad0w1nk:native","ref":"native","sha":"798b4c427e0994b9a9121f80e78a5d3df7f6cbcf","user":{"login":"Shad0w1nk","id":1980084,"avatar_url":"https://avatars.githubusercontent.com/u/1980084?v=3","gravatar_id":"","url":"https://api.github.com/users/Shad0w1nk","html_url":"https://github.com/Shad0w1nk","followers_url":"https://api.github.com/users/Shad0w1nk/followers","following_url":"https://api.github.com/users/Shad0w1nk/following{/other_user}","gists_url":"https://api.github.com/users/Shad0w1nk/gists{/gist_id}","starred_url":"https://api.github.com/users/Shad0w1nk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Shad0w1nk/subscriptions","organizations_url":"https://api.github.com/users/Shad0w1nk/orgs","repos_url":"https://api.github.com/users/Shad0w1nk/repos","events_url":"https://api.github.com/users/Shad0w1nk/events{/privacy}","received_events_url":"https://api.github.com/users/Shad0w1nk/received_events","type":"User","site_admin":false},"repo":{"id":43487356,"name":"protobuf-gradle-plugin-1","full_name":"Shad0w1nk/protobuf-gradle-plugin-1","owner":{"login":"Shad0w1nk","id":1980084,"avatar_url":"https://avatars.githubusercontent.com/u/1980084?v=3","gravatar_id":"","url":"https://api.github.com/users/Shad0w1nk","html_url":"https://github.com/Shad0w1nk","followers_url":"https://api.github.com/users/Shad0w1nk/followers","following_url":"https://api.github.com/users/Shad0w1nk/following{/other_user}","gists_url":"https://api.github.com/users/Shad0w1nk/gists{/gist_id}","starred_url":"https://api.github.com/users/Shad0w1nk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Shad0w1nk/subscriptions","organizations_url":"https://api.github.com/users/Shad0w1nk/orgs","repos_url":"https://api.github.com/users/Shad0w1nk/repos","events_url":"https://api.github.com/users/Shad0w1nk/events{/privacy}","received_events_url":"https://api.github.com/users/Shad0w1nk/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Shad0w1nk/protobuf-gradle-plugin-1","description":"Protobuf Plugin for Gradle","fork":true,"url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1","forks_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/forks","keys_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/teams","hooks_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/hooks","issue_events_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/issues/events{/number}","events_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/events","assignees_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/assignees{/user}","branches_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/branches{/branch}","tags_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/tags","blobs_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/statuses/{sha}","languages_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/languages","stargazers_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/stargazers","contributors_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/contributors","subscribers_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/subscribers","subscription_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/subscription","commits_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/contents/{+path}","compare_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/merges","archive_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/downloads","issues_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/issues{/number}","pulls_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/pulls{/number}","milestones_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/milestones{/number}","notifications_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/labels{/name}","releases_url":"https://api.github.com/repos/Shad0w1nk/protobuf-gradle-plugin-1/releases{/id}","created_at":"2015-10-01T09:05:03Z","updated_at":"2015-10-01T09:05:04Z","pushed_at":"2015-11-17T10:32:30Z","git_url":"git://github.com/Shad0w1nk/protobuf-gradle-plugin-1.git","ssh_url":"git@github.com:Shad0w1nk/protobuf-gradle-plugin-1.git","clone_url":"https://github.com/Shad0w1nk/protobuf-gradle-plugin-1.git","svn_url":"https://github.com/Shad0w1nk/protobuf-gradle-plugin-1","homepage":"","size":551,"stargazers_count":0,"watchers_count":0,"language":"Groovy","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"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":"2a2f4e09e7ad54b1539053a0392dd3e8ef2ae551","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":false,"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-11-19T15:01:28Z","pushed_at":"2015-11-17T10:32:31Z","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":1210,"stargazers_count":56,"watchers_count":56,"language":"Groovy","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":9,"mirror_url":null,"open_issues_count":12,"forks":9,"open_issues":12,"watchers":56,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/44"},"html":{"href":"https://github.com/google/protobuf-gradle-plugin/pull/44"},"issue":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues/44"},"comments":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/issues/44/comments"},"review_comments":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/pulls/44/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/44/commits"},"statuses":{"href":"https://api.github.com/repos/google/protobuf-gradle-plugin/statuses/798b4c427e0994b9a9121f80e78a5d3df7f6cbcf"}}}}