{"action":"created","comment":{"url":"https://api.github.com/repos/gradle/gradle/pulls/comments/75517278","id":75517278,"diff_hunk":"@@ -290,52 +290,673 @@\n     </section>\n \n     <section id=\"sec:up_to_date_checks\">\n-        <title>Skipping tasks that are up-to-date</title>\n-        <para>If you are using one of the tasks that come with Gradle, such as a task added by the Java plugin,\n-            you might have noticed that Gradle will skip tasks that are up-to-date. This behaviour is also available\n-            for your tasks, not just for built-in tasks.\n+        <title>Up-to-date checks (AKA Incremental Build)</title>\n+        <para>An important part of any build tool is the ability to avoid doing work that has already\n+            been done. Consider the process of compilation. Once your source files have been compiled,\n+            there should be no need to recompile them unless something has changed that affects the\n+            output, such as the modification of a source file or the removal of an output file. And\n+            compilation can take a significant amount of time, so skipping the step when it’s not needed\n+            saves a lot of time.\n         </para>\n+        <para>Gradle supports this behavior out of the box through a feature it calls incremental build.\n+            You have almost certainly already seen it in action: it’s active nearly<footnote>\n+                <para>You will also see <literal>UP-TO-DATE</literal> next to tasks that have no actions,\n+                even though that’s nothing to do with incremental build.\n+                </para>\n+            </footnote> every time the <literal>UP-TO-DATE</literal> text appears next to the name of a\n+            task when you run a build.\n+        </para>\n+        <para>How does incremental build work? And what does it take to make use of it in your own\n+            custom tasks? Let’s take a look.\n+        </para>\n+    \n         <section id=\"sec:task_inputs_outputs\">\n-            <title>Declaring a task's inputs and outputs</title>\n-            <para>\n-                Let's have a look at an example. Here our task generates several output files from a source XML file. Let's\n-                run it a couple of times.\n+            <title>Task inputs and outputs</title>\n+            <para>In the most common case, a task takes some inputs and generates some outputs. If we\n+                use the compilation example from earlier, we can see that the source files are the\n+                inputs and, in the case of Java, the generated class files are the outputs. Other inputs\n+                might include things like whether debug information should be included.\n             </para>\n-            <sample id=\"generatorTask\" dir=\"userguide/tasks/incrementalBuild/noInputsAndOutputs\" title=\"A generator task\">\n-                <sourcefile file=\"build.gradle\"/>\n-                <output args=\"transform\" ignoreExtraLines=\"true\"/>\n-                <output args=\"transform\" ignoreExtraLines=\"true\"/>\n-            </sample>\n-            <para>Notice that Gradle executes this task a second time, and does not skip the task even though nothing has\n-                changed. Our example task was defined using an action closure. Gradle has no idea what the closure does and\n-                cannot automatically figure out whether the task is up-to-date or not. To use Gradle's up-to-date checking,\n-                you need to declare the inputs and outputs of the task.\n-            </para>\n-            <para>Each task has an <literal>inputs</literal> and <literal>outputs</literal> property, which you use to\n-                declare the inputs and outputs of the task. Below, we have changed our example to declare that it takes\n-                the source XML file as an input and produces output to a destination directory. Let's run it a couple\n-                of times.\n+\n+            <figure>\n+                <title>Example task inputs and outputs</title>\n+                <imageobject>\n+                    <imagedata fileref=\"img/taskInputsOutputs.png\" width=\"160mm\"/>\n+                </imageobject>\n+            </figure>\n+\n+            <para>An important characteristic of an input is that it affects one or more outputs, as\n+                you can see from the previous figure. Different bytecode is generated depending on the\n+                content of the source files and the minimum version of the Java runtime you want to \n+                run the code on. That makes them task inputs. But whether the compilation runs in a\n+                forked process or not, determined by the <literal>fork</literal> property, has no\n+                impact on what bytecode gets generated. So <literal>fork</literal> is a plain task\n+                property.\n             </para>\n-            <sample id=\"incrementalTask\" dir=\"userguide/tasks/incrementalBuild/inputsAndOutputs\" title=\"Declaring the inputs and outputs of a task\">\n-                <sourcefile file=\"build.gradle\"/>\n-                <output args=\"transform\" outputFile=\"generatorTask.out\" ignoreExtraLines=\"true\"/>\n-                <output args=\"transform\" ignoreExtraLines=\"true\"/>\n-            </sample>\n-            <para>Now, Gradle knows which files to check to determine whether the task is up-to-date or not.</para>\n-            <para>\n-                The task's <literal>inputs</literal> property is of type <apilink class=\"org.gradle.api.tasks.TaskInputs\"/>.\n-                The task's <literal>outputs</literal> property is of type <apilink class=\"org.gradle.api.tasks.TaskOutputs\"/>.\n+            <para>As part of incremental build, Gradle tests whether any of the task inputs or outputs\n+                have changed since the last build. If they haven’t, Gradle can consider the task up to\n+                date and therefore skip it. Also note that incremental build won’t work unless a task\n+                has at least one task output, although tasks usually have at least one input as well.\n             </para>\n-            <para>\n-                A task with no defined outputs will <emphasis>never</emphasis> be considered up-to-date.\n-                For scenarios where the outputs of a task are not files, or for more complex scenarios, the\n-                <apilink class=\"org.gradle.api.tasks.TaskOutputs\" method=\"upToDateWhen(groovy.lang.Closure)\" /> method allows you to calculate programmatically if\n-                the tasks outputs should be considered up to date.\n+            <para>What this means for build authors is simple: you need to tell Gradle which task\n+                properties are inputs and which are outputs. If a task property affects the output, be\n+                sure to register it as an input, otherwise the task will be considered up to date when\n+                it’s not. Conversely, don’t register properties as inputs if they don’t affect the\n+                output, otherwise the task will potentially execute when it doesn’t need to. Also be\n+                careful of non-deterministic tasks that may generate different output for exactly the\n+                same inputs: these should not be configured for incremental build as the up-to-date\n+                checks won’t work.\n             </para>\n-            <para>\n-                A task with only outputs defined will be considered up-to-date if those outputs are unchanged since the previous build.\n+            <para>Let’s now look at how you can register task properties as inputs and outputs.</para>\n+\n+            <section id=\"sec:task_input_output_annotations\">\n+                <title>Custom task types</title>\n+                <para>If you’re implementing a custom task as a class, then it takes just two steps to\n+                    make it work with incremental build:\n+                </para>\n+                <orderedlist>\n+                    <listitem>Create typed fields or properties (via getter methods) for each of your\n+                        task inputs and outputs</listitem>\n+                    <listitem>Add the appropriate annotation to each of those fields and getter methods\n+                    </listitem>\n+                </orderedlist>\n+                <para>Gradle supports three main categories of input and output:</para>\n+                <itemizedlist>\n+                    <listitem><para>Simple values</para>\n+                        <para>Things like strings and numbers. More generally, a simple value can have\n+                        any type that implements <literal>Serializable</literal>.</para>\n+                    </listitem>\n+                    <listitem><para>Filesystem types</para>\n+                        <para>These consist of the standard <literal>File</literal> class but also\n+                        derivatives of Gradle’s <apilink class=\"org.gradle.api.file.FileCollection\"/>\n+                        type and anything else that can be passed to either the\n+                        <apilink class=\"org.gradle.api.Project\" method=\"file(java.lang.Object)\"/>\n+                        method - for single file/directory properties - or the\n+                        <apilink class=\"org.gradle.api.Project\" method=\"files(java.lang.Object[])\"/>\n+                        method.</para>\n+                    </listitem>\n+                    <listitem><para>Nested values</para>\n+                        <para>Custom types that don’t conform to the other two categories but have\n+                        their own properties that are inputs or outputs. In effect, the task inputs\n+                        or outputs are nested inside these custom types.</para>\n+                    </listitem>\n+                </itemizedlist>\n+                <para>As an example, imagine you have a task that processes templates of varying types,\n+                    such as FreeMarker, Velocity, Moustache, etc. It takes template source files and\n+                    combines them with some model data to generate populated versions of the template files.\n+                </para>\n+                <para>This task will have three inputs and one output:</para>\n+                <itemizedlist>\n+                    <listitem>Template source files</listitem>\n+                    <listitem>Model data</listitem>\n+                    <listitem>Template engine</listitem>\n+                    <listitem>Where the output files are written</listitem>\n+                </itemizedlist>\n+                <para>When you’re writing a custom task class, it’s easy to register properties as\n+                    inputs or outputs via annotations. To demonstrate, here is a skeleton task\n+                    implementation with some suitable inputs and outputs, along with their annotations:\n+                </para>\n+                <sample id=\"customTaskClassWithInputOutputAnnotations\"\n+                        dir=\"userguide/tasks/incrementalBuild/customTaskClass\"\n+                        title=\"Custom task class\">\n+                    <sourcefile file=\"buildSrc/src/main/java/org/example/ProcessTemplates.java\"\n+                                snippet=\"custom-task-class\"/>\n+                    <sourcefile file=\"buildSrc/src/main/java/org/example/TemplateData.java\"/>\n+                    <output args=\"processTemplates\" ignoreExtraLines=\"true\" ignoreLineOrder=\"true\"/>\n+                    <output args=\"processTemplates\" ignoreExtraLines=\"true\" ignoreLineOrder=\"true\"\n+                            outputFile=\"customTaskClassWithInputOutputAnnotationsUpToDate.out\"/>\n+                </sample>\n+                <para>There’s plenty to talk about in this example, so let’s work through each of the\n+                    input and output properties in turn:</para>\n+                <itemizedlist>\n+                    <listitem><para><literal>templateEngine</literal></para>\n+                        <para>Represents which engine to use when processing the source templates, e.g.\n+                            FreeMarker, Velocity, etc. You could implement this as a string, but in this\n+                            case we have gone for a custom enum as it provides greater type information\n+                            and safety. Since enums implement <literal>Serializable</literal> automatically,\n+                            we can treat this as a simple value and use the <literal>@Input</literal>\n+                            annotation, just as we would with a <literal>String</literal> property.\n+                        </para>\n+                    </listitem>\n+                    <listitem><para><literal>sourceFiles</literal></para>\n+                        <para>The source templates that the task will be processing. Single files and\n+                            collections of files need their own special annotations. In this case, we’re\n+                            dealing with a collection of input files and so we use the\n+                            <literal>@InputFiles</literal> annotation. You’ll see more file-oriented\n+                            annotations in a table later.\n+                        </para>\n+                    </listitem>\n+                    <listitem><para><literal>templateData</literal></para>\n+                        <para>For this example, we’re using a custom class to represent the model data.\n+                            However, it does not implement <literal>Serializable</literal>, so we can’t\n+                            use the <literal>@Input</literal> annotation. That’s not a problem as the\n+                            properties within <literal>TemplateData</literal> - a string and a hash map\n+                            with serializable type parameters - are serializable and can be annotated with\n+                            <literal>@Input</literal>. We use <literal>@Nested</literal> on\n+                            <literal>templateData</literal> to let Gradle know that this is a value with\n+                            nested input properties.\n+                       </para>\n+                    </listitem>\n+                    <listitem><para><literal>outputDir</literal></para>\n+                        <para>The directory where the generated files go. As with input files, there are\n+                            several annotations for output files and directories. A property representing\n+                            a single directory requires <literal>@OutputDirectory</literal>. You’ll learn\n+                            about the others soon.\n+                        </para>\n+                    </listitem>\n+                </itemizedlist>\n+\n+                <para>These annotated properties mean that Gradle will skip the task if none of the source\n+                    files, template engine, model data or generated files have changed since the previous\n+                    time Gradle executed the task. This will often save a significant amount of time. You\n+                    can learn how Gradle detects <xref linkend=\"sec:how_does_inc_build_work\">changes later</xref>.\n+                </para>\n+\n+                <para>This example is particularly interesting because it works with collections of source\n+                    files. What happens if only one source file changes? Does the task process all the\n+                    source files again or just the modified one? That depends on the task implementation.\n+                    If the latter, then the task itself is incremental, but that’s a different feature to\n+                    the one we’re discussing here. Gradle does help task implementers with this via its\n+                    <xref linkend=\"incremental_tasks\">incremental task inputs</xref> feature.\n+                </para>\n+\n+                <para>Now that you have seen some of the input and output annotations in practice, let’s\n+                    take a look at all the annotations available to you and when you should use them. The\n+                    table below lists the available annotations and the corresponding property type you\n+                    can use with each one.\n+                </para>\n+                <table>\n+                    <title>Incremental build annotations</title>\n+                    <thead>\n+                        <tr>\n+                            <th>Annotation</th>\n+                            <th>Expected property type</th>\n+                            <th>Description</th>\n+                        </tr>\n+                    </thead>\n+                    <tr>\n+                        <td><literal>@Input</literal></td>\n+                        <td>Any serializable type</td>\n+                        <td>A simple input value</td>\n+                    </tr>\n+\n+                    <tr>\n+                        <td><literal>@InputFile</literal></td>\n+                        <td><literal>File</literal>*</td>\n+                        <td>A single input file (not directory)</td>\n+                    </tr>\n+\n+                    <tr>\n+                        <td><literal>@InputDirectory</literal></td>\n+                        <td><literal>File</literal>*</td>\n+                        <td>A single input directory (not file)</td>\n+                    </tr>\n+\n+                    <tr>\n+                        <td><literal>@InputFiles</literal></td>\n+                        <td><literal>FileCollection</literal>*</td>\n+                        <td>A collection of input files (no directories)</td>\n+                    </tr>\n+\n+                    <tr>\n+                        <td><literal>@OutputFile</literal></td>\n+                        <td><literal>FileCollection</literal>*</td>\n+                        <td>A single output file (not directory)</td>\n+                    </tr>\n+\n+                    <tr>\n+                        <td><literal>@OutputDirectory</literal></td>\n+                        <td><literal>File</literal>*</td>\n+                        <td>A single output directory (not file)</td>\n+                    </tr>\n+\n+                    <tr>\n+                        <td><literal>@OutputFiles</literal></td>\n+                        <td><literal>FileCollection</literal>*</td>","path":"subprojects/docs/src/docs/userguide/tasks.xml","position":264,"original_position":264,"commit_id":"7df587b828c4d84464429ea08a6a20ca4d7163df","original_commit_id":"7df587b828c4d84464429ea08a6a20ca4d7163df","user":{"login":"pledbrook","id":19075,"avatar_url":"https://avatars.githubusercontent.com/u/19075?v=3","gravatar_id":"","url":"https://api.github.com/users/pledbrook","html_url":"https://github.com/pledbrook","followers_url":"https://api.github.com/users/pledbrook/followers","following_url":"https://api.github.com/users/pledbrook/following{/other_user}","gists_url":"https://api.github.com/users/pledbrook/gists{/gist_id}","starred_url":"https://api.github.com/users/pledbrook/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pledbrook/subscriptions","organizations_url":"https://api.github.com/users/pledbrook/orgs","repos_url":"https://api.github.com/users/pledbrook/repos","events_url":"https://api.github.com/users/pledbrook/events{/privacy}","received_events_url":"https://api.github.com/users/pledbrook/received_events","type":"User","site_admin":false},"body":"A `FileTree` is a `FileCollection`, so I don't see why we should put both. Unless something has changed?","created_at":"2016-08-19T17:07:30Z","updated_at":"2016-08-19T17:07:30Z","html_url":"https://github.com/gradle/gradle/pull/688#discussion_r75517278","pull_request_url":"https://api.github.com/repos/gradle/gradle/pulls/688","_links":{"self":{"href":"https://api.github.com/repos/gradle/gradle/pulls/comments/75517278"},"html":{"href":"https://github.com/gradle/gradle/pull/688#discussion_r75517278"},"pull_request":{"href":"https://api.github.com/repos/gradle/gradle/pulls/688"}}},"pull_request":{"url":"https://api.github.com/repos/gradle/gradle/pulls/688","id":81812913,"html_url":"https://github.com/gradle/gradle/pull/688","diff_url":"https://github.com/gradle/gradle/pull/688.diff","patch_url":"https://github.com/gradle/gradle/pull/688.patch","issue_url":"https://api.github.com/repos/gradle/gradle/issues/688","number":688,"state":"open","locked":false,"title":"Improve user manual section on incremental build.","user":{"login":"pledbrook","id":19075,"avatar_url":"https://avatars.githubusercontent.com/u/19075?v=3","gravatar_id":"","url":"https://api.github.com/users/pledbrook","html_url":"https://github.com/pledbrook","followers_url":"https://api.github.com/users/pledbrook/followers","following_url":"https://api.github.com/users/pledbrook/following{/other_user}","gists_url":"https://api.github.com/users/pledbrook/gists{/gist_id}","starred_url":"https://api.github.com/users/pledbrook/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pledbrook/subscriptions","organizations_url":"https://api.github.com/users/pledbrook/orgs","repos_url":"https://api.github.com/users/pledbrook/repos","events_url":"https://api.github.com/users/pledbrook/events{/privacy}","received_events_url":"https://api.github.com/users/pledbrook/received_events","type":"User","site_admin":false},"body":"This is a rewrite and expansion of the incremental build section of the user\r\nmanual. It provides proper coverage of this important topic while introducing\r\nsome of the new features in Gradle 3.0.","created_at":"2016-08-18T13:11:33Z","updated_at":"2016-08-19T17:07:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"99bdcdd6e8a03d617a6c0a30fcb156953c48cfa4","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/gradle/gradle/pulls/688/commits","review_comments_url":"https://api.github.com/repos/gradle/gradle/pulls/688/comments","review_comment_url":"https://api.github.com/repos/gradle/gradle/pulls/comments{/number}","comments_url":"https://api.github.com/repos/gradle/gradle/issues/688/comments","statuses_url":"https://api.github.com/repos/gradle/gradle/statuses/7df587b828c4d84464429ea08a6a20ca4d7163df","head":{"label":"pledbrook:incremental-build-doc","ref":"incremental-build-doc","sha":"7df587b828c4d84464429ea08a6a20ca4d7163df","user":{"login":"pledbrook","id":19075,"avatar_url":"https://avatars.githubusercontent.com/u/19075?v=3","gravatar_id":"","url":"https://api.github.com/users/pledbrook","html_url":"https://github.com/pledbrook","followers_url":"https://api.github.com/users/pledbrook/followers","following_url":"https://api.github.com/users/pledbrook/following{/other_user}","gists_url":"https://api.github.com/users/pledbrook/gists{/gist_id}","starred_url":"https://api.github.com/users/pledbrook/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pledbrook/subscriptions","organizations_url":"https://api.github.com/users/pledbrook/orgs","repos_url":"https://api.github.com/users/pledbrook/repos","events_url":"https://api.github.com/users/pledbrook/events{/privacy}","received_events_url":"https://api.github.com/users/pledbrook/received_events","type":"User","site_admin":false},"repo":{"id":527173,"name":"gradle","full_name":"pledbrook/gradle","owner":{"login":"pledbrook","id":19075,"avatar_url":"https://avatars.githubusercontent.com/u/19075?v=3","gravatar_id":"","url":"https://api.github.com/users/pledbrook","html_url":"https://github.com/pledbrook","followers_url":"https://api.github.com/users/pledbrook/followers","following_url":"https://api.github.com/users/pledbrook/following{/other_user}","gists_url":"https://api.github.com/users/pledbrook/gists{/gist_id}","starred_url":"https://api.github.com/users/pledbrook/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pledbrook/subscriptions","organizations_url":"https://api.github.com/users/pledbrook/orgs","repos_url":"https://api.github.com/users/pledbrook/repos","events_url":"https://api.github.com/users/pledbrook/events{/privacy}","received_events_url":"https://api.github.com/users/pledbrook/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pledbrook/gradle","description":"A powerful build system for the JVM","fork":true,"url":"https://api.github.com/repos/pledbrook/gradle","forks_url":"https://api.github.com/repos/pledbrook/gradle/forks","keys_url":"https://api.github.com/repos/pledbrook/gradle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pledbrook/gradle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pledbrook/gradle/teams","hooks_url":"https://api.github.com/repos/pledbrook/gradle/hooks","issue_events_url":"https://api.github.com/repos/pledbrook/gradle/issues/events{/number}","events_url":"https://api.github.com/repos/pledbrook/gradle/events","assignees_url":"https://api.github.com/repos/pledbrook/gradle/assignees{/user}","branches_url":"https://api.github.com/repos/pledbrook/gradle/branches{/branch}","tags_url":"https://api.github.com/repos/pledbrook/gradle/tags","blobs_url":"https://api.github.com/repos/pledbrook/gradle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pledbrook/gradle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pledbrook/gradle/git/refs{/sha}","trees_url":"https://api.github.com/repos/pledbrook/gradle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pledbrook/gradle/statuses/{sha}","languages_url":"https://api.github.com/repos/pledbrook/gradle/languages","stargazers_url":"https://api.github.com/repos/pledbrook/gradle/stargazers","contributors_url":"https://api.github.com/repos/pledbrook/gradle/contributors","subscribers_url":"https://api.github.com/repos/pledbrook/gradle/subscribers","subscription_url":"https://api.github.com/repos/pledbrook/gradle/subscription","commits_url":"https://api.github.com/repos/pledbrook/gradle/commits{/sha}","git_commits_url":"https://api.github.com/repos/pledbrook/gradle/git/commits{/sha}","comments_url":"https://api.github.com/repos/pledbrook/gradle/comments{/number}","issue_comment_url":"https://api.github.com/repos/pledbrook/gradle/issues/comments{/number}","contents_url":"https://api.github.com/repos/pledbrook/gradle/contents/{+path}","compare_url":"https://api.github.com/repos/pledbrook/gradle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pledbrook/gradle/merges","archive_url":"https://api.github.com/repos/pledbrook/gradle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pledbrook/gradle/downloads","issues_url":"https://api.github.com/repos/pledbrook/gradle/issues{/number}","pulls_url":"https://api.github.com/repos/pledbrook/gradle/pulls{/number}","milestones_url":"https://api.github.com/repos/pledbrook/gradle/milestones{/number}","notifications_url":"https://api.github.com/repos/pledbrook/gradle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pledbrook/gradle/labels{/name}","releases_url":"https://api.github.com/repos/pledbrook/gradle/releases{/id}","deployments_url":"https://api.github.com/repos/pledbrook/gradle/deployments","created_at":"2010-02-20T07:06:20Z","updated_at":"2015-05-18T17:45:46Z","pushed_at":"2016-08-18T13:10:30Z","git_url":"git://github.com/pledbrook/gradle.git","ssh_url":"git@github.com:pledbrook/gradle.git","clone_url":"https://github.com/pledbrook/gradle.git","svn_url":"https://github.com/pledbrook/gradle","homepage":"www.gradle.org","size":141056,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":false,"has_downloads":false,"has_wiki":true,"has_pages":true,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"gradle:master","ref":"master","sha":"cfe27a1a11c1dbfed5a24f33e88702c8432fd296","user":{"login":"gradle","id":124156,"avatar_url":"https://avatars.githubusercontent.com/u/124156?v=3","gravatar_id":"","url":"https://api.github.com/users/gradle","html_url":"https://github.com/gradle","followers_url":"https://api.github.com/users/gradle/followers","following_url":"https://api.github.com/users/gradle/following{/other_user}","gists_url":"https://api.github.com/users/gradle/gists{/gist_id}","starred_url":"https://api.github.com/users/gradle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gradle/subscriptions","organizations_url":"https://api.github.com/users/gradle/orgs","repos_url":"https://api.github.com/users/gradle/repos","events_url":"https://api.github.com/users/gradle/events{/privacy}","received_events_url":"https://api.github.com/users/gradle/received_events","type":"Organization","site_admin":false},"repo":{"id":302322,"name":"gradle","full_name":"gradle/gradle","owner":{"login":"gradle","id":124156,"avatar_url":"https://avatars.githubusercontent.com/u/124156?v=3","gravatar_id":"","url":"https://api.github.com/users/gradle","html_url":"https://github.com/gradle","followers_url":"https://api.github.com/users/gradle/followers","following_url":"https://api.github.com/users/gradle/following{/other_user}","gists_url":"https://api.github.com/users/gradle/gists{/gist_id}","starred_url":"https://api.github.com/users/gradle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gradle/subscriptions","organizations_url":"https://api.github.com/users/gradle/orgs","repos_url":"https://api.github.com/users/gradle/repos","events_url":"https://api.github.com/users/gradle/events{/privacy}","received_events_url":"https://api.github.com/users/gradle/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/gradle/gradle","description":"A powerful build system for the JVM","fork":false,"url":"https://api.github.com/repos/gradle/gradle","forks_url":"https://api.github.com/repos/gradle/gradle/forks","keys_url":"https://api.github.com/repos/gradle/gradle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gradle/gradle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gradle/gradle/teams","hooks_url":"https://api.github.com/repos/gradle/gradle/hooks","issue_events_url":"https://api.github.com/repos/gradle/gradle/issues/events{/number}","events_url":"https://api.github.com/repos/gradle/gradle/events","assignees_url":"https://api.github.com/repos/gradle/gradle/assignees{/user}","branches_url":"https://api.github.com/repos/gradle/gradle/branches{/branch}","tags_url":"https://api.github.com/repos/gradle/gradle/tags","blobs_url":"https://api.github.com/repos/gradle/gradle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gradle/gradle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gradle/gradle/git/refs{/sha}","trees_url":"https://api.github.com/repos/gradle/gradle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gradle/gradle/statuses/{sha}","languages_url":"https://api.github.com/repos/gradle/gradle/languages","stargazers_url":"https://api.github.com/repos/gradle/gradle/stargazers","contributors_url":"https://api.github.com/repos/gradle/gradle/contributors","subscribers_url":"https://api.github.com/repos/gradle/gradle/subscribers","subscription_url":"https://api.github.com/repos/gradle/gradle/subscription","commits_url":"https://api.github.com/repos/gradle/gradle/commits{/sha}","git_commits_url":"https://api.github.com/repos/gradle/gradle/git/commits{/sha}","comments_url":"https://api.github.com/repos/gradle/gradle/comments{/number}","issue_comment_url":"https://api.github.com/repos/gradle/gradle/issues/comments{/number}","contents_url":"https://api.github.com/repos/gradle/gradle/contents/{+path}","compare_url":"https://api.github.com/repos/gradle/gradle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gradle/gradle/merges","archive_url":"https://api.github.com/repos/gradle/gradle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gradle/gradle/downloads","issues_url":"https://api.github.com/repos/gradle/gradle/issues{/number}","pulls_url":"https://api.github.com/repos/gradle/gradle/pulls{/number}","milestones_url":"https://api.github.com/repos/gradle/gradle/milestones{/number}","notifications_url":"https://api.github.com/repos/gradle/gradle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gradle/gradle/labels{/name}","releases_url":"https://api.github.com/repos/gradle/gradle/releases{/id}","deployments_url":"https://api.github.com/repos/gradle/gradle/deployments","created_at":"2009-09-09T18:27:19Z","updated_at":"2016-08-19T11:08:09Z","pushed_at":"2016-08-19T14:25:57Z","git_url":"git://github.com/gradle/gradle.git","ssh_url":"git@github.com:gradle/gradle.git","clone_url":"https://github.com/gradle/gradle.git","svn_url":"https://github.com/gradle/gradle","homepage":"gradle.org","size":190879,"stargazers_count":3824,"watchers_count":3824,"language":"Java","has_issues":false,"has_downloads":false,"has_wiki":true,"has_pages":false,"forks_count":1471,"mirror_url":null,"open_issues_count":12,"forks":1471,"open_issues":12,"watchers":3824,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/gradle/gradle/pulls/688"},"html":{"href":"https://github.com/gradle/gradle/pull/688"},"issue":{"href":"https://api.github.com/repos/gradle/gradle/issues/688"},"comments":{"href":"https://api.github.com/repos/gradle/gradle/issues/688/comments"},"review_comments":{"href":"https://api.github.com/repos/gradle/gradle/pulls/688/comments"},"review_comment":{"href":"https://api.github.com/repos/gradle/gradle/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/gradle/gradle/pulls/688/commits"},"statuses":{"href":"https://api.github.com/repos/gradle/gradle/statuses/7df587b828c4d84464429ea08a6a20ca4d7163df"}}}}
{"actor":{"display_login":"pledbrook"}}