{"action":"created","comment":{"url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/comments/178024748","pull_request_review_id":108009062,"id":178024748,"diff_hunk":"@@ -0,0 +1,191 @@\n+/*\n+ * The MIT License\n+ *\n+ * Copyright (c) 2018, CloudBees, Inc.\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining a copy\n+ * of this software and associated documentation files (the \"Software\"), to deal\n+ * in the Software without restriction, including without limitation the rights\n+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+ * copies of the Software, and to permit persons to whom the Software is\n+ * furnished to do so, subject to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included in\n+ * all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n+ * THE SOFTWARE.\n+ */\n+\n+package org.jenkinsci.plugins.pipeline.modeldefinition.generator;\n+\n+import hudson.Extension;\n+import hudson.Functions;\n+import hudson.model.Action;\n+import hudson.model.Descriptor;\n+import hudson.model.DescriptorByNameOwner;\n+import hudson.model.Item;\n+import hudson.model.Job;\n+import hudson.model.RootAction;\n+import jenkins.model.Jenkins;\n+import jenkins.model.TransientActionFactory;\n+import net.sf.json.JSONObject;\n+import org.jenkinsci.plugins.structs.SymbolLookup;\n+import org.jenkinsci.plugins.structs.describable.UninstantiatedDescribable;\n+import org.jenkinsci.plugins.workflow.cps.CpsFlowExecution;\n+import org.jenkinsci.plugins.workflow.cps.Snippetizer;\n+import org.jenkinsci.plugins.workflow.steps.StepDescriptor;\n+import org.kohsuke.accmod.Restricted;\n+import org.kohsuke.accmod.restrictions.DoNotUse;\n+import org.kohsuke.accmod.restrictions.NoExternalUse;\n+import org.kohsuke.stapler.HttpResponse;\n+import org.kohsuke.stapler.HttpResponses;\n+import org.kohsuke.stapler.QueryParameter;\n+import org.kohsuke.stapler.StaplerRequest;\n+\n+import javax.annotation.CheckForNull;\n+import javax.annotation.Nonnull;\n+import java.util.Collection;\n+import java.util.Collections;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.Set;\n+import java.util.logging.Level;\n+import java.util.logging.Logger;\n+\n+@Extension\n+public class DirectiveGenerator implements RootAction, DescriptorByNameOwner {\n+\n+    public static final String ACTION_URL = \"directive-generator\";\n+\n+    @Restricted(NoExternalUse.class)\n+    public static final String GENERATE_URL = ACTION_URL + \"/generateDirective\";\n+\n+    @Override public String getUrlName() {\n+        return ACTION_URL;\n+    }\n+\n+    @Override public String getIconFileName() {\n+        return null;\n+    }\n+\n+    @Override public String getDisplayName() {\n+        // Do not want to add to main Jenkins sidepanel.\n+        return null;\n+    }\n+\n+    @Override public Descriptor getDescriptorByName(String id) {\n+        return Jenkins.getActiveInstance().getDescriptorByName(id);\n+    }\n+\n+    @Nonnull\n+    public List<DirectiveDescriptor> getDirectives() {\n+        return DirectiveDescriptor.all();\n+    }\n+\n+    @Restricted(DoNotUse.class) // for stapler\n+    public @CheckForNull\n+    Item getItem(StaplerRequest req) {\n+        return req.findAncestorObject(Item.class);\n+    }\n+\n+    @Restricted(DoNotUse.class) // accessed via REST API\n+    public HttpResponse doGenerateDirective(StaplerRequest req, @QueryParameter String json) throws Exception {\n+        // TODO is there not an easier way to do this? Maybe Descriptor.newInstancesFromHeteroList on a one-element JSONArray?\n+        JSONObject jsonO = JSONObject.fromObject(json);\n+        Jenkins j = Jenkins.getActiveInstance();\n+        Class<?> c = j.getPluginManager().uberClassLoader.loadClass(jsonO.getString(\"stapler-class\"));\n+        DirectiveDescriptor descriptor = (DirectiveDescriptor)j.getDescriptor(c.asSubclass(AbstractDirective.class));\n+        if (descriptor == null) {\n+            return HttpResponses.plainText(\"<could not find \" + c.getName() + \">\");\n+        }\n+        Object o;\n+        try {\n+            o = descriptor.newInstance(req, jsonO);\n+        } catch (RuntimeException x) { // e.g. IllegalArgumentException\n+            return HttpResponses.plainText(Functions.printThrowable(x));\n+        }\n+        try {\n+            String groovy = descriptor.toGroovy((AbstractDirective)o);\n+            return HttpResponses.plainText(groovy);\n+        } catch (UnsupportedOperationException x) {\n+            Logger.getLogger(CpsFlowExecution.class.getName()).log(Level.WARNING, \"failed to render \" + json, x);\n+            return HttpResponses.plainText(x.getMessage());\n+        }\n+    }\n+\n+    @Restricted(NoExternalUse.class)\n+    public static String mapToClosure(Map<String,?> args) {\n+        StringBuilder result = new StringBuilder(\"{\\n\");\n+        for (Map.Entry<String,?> arg : args.entrySet()) {\n+            if (!(arg.getValue() instanceof String && arg.getValue().equals(\"\"))) {\n+                result.append(arg.getKey()).append(\" \");\n+                if (arg.getValue() instanceof Map) {\n+                    result.append(mapToClosure((Map<String, ?>) arg.getValue()));\n+                } else if (arg.getValue() instanceof UninstantiatedDescribable) {\n+                    result.append(mapToClosure(((UninstantiatedDescribable) arg.getValue()).getArguments()));\n+                } else if (arg.getValue() != null) {\n+                    result.append(Snippetizer.object2Groovy(arg.getValue())).append(\"\\n\");\n+                }\n+            }\n+        }\n+        result.append(\"}\\n\");\n+        return result.toString();\n+    }\n+\n+    @Restricted(DoNotUse.class)  // For stapler\n+    public static String getSymbolForDescriptor(Descriptor d) {\n+        if (d instanceof StepDescriptor) {\n+            return ((StepDescriptor) d).getFunctionName();\n+        } else {\n+            Set<String> symbols = SymbolLookup.getSymbolValue(d);\n+            if (!symbols.isEmpty()) {\n+                return symbols.iterator().next();\n+            } else {\n+                return \"(unknown)\";","path":"pipeline-model-definition/src/main/java/org/jenkinsci/plugins/pipeline/modeldefinition/generator/DirectiveGenerator.java","position":129,"original_position":150,"commit_id":"51f25e2d69d9662dcdd8b9792739c337b03ef67c","original_commit_id":"7a38c440d103405070c470b9ef65cd966c6e0d04","user":{"login":"rsandell","id":300688,"avatar_url":"https://avatars2.githubusercontent.com/u/300688?v=4","gravatar_id":"","url":"https://api.github.com/users/rsandell","html_url":"https://github.com/rsandell","followers_url":"https://api.github.com/users/rsandell/followers","following_url":"https://api.github.com/users/rsandell/following{/other_user}","gists_url":"https://api.github.com/users/rsandell/gists{/gist_id}","starred_url":"https://api.github.com/users/rsandell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rsandell/subscriptions","organizations_url":"https://api.github.com/users/rsandell/orgs","repos_url":"https://api.github.com/users/rsandell/repos","events_url":"https://api.github.com/users/rsandell/events{/privacy}","received_events_url":"https://api.github.com/users/rsandell/received_events","type":"User","site_admin":false},"body":":man_facepalming: ","created_at":"2018-03-29T11:15:02Z","updated_at":"2018-03-29T11:15:03Z","html_url":"https://github.com/jenkinsci/pipeline-model-definition-plugin/pull/250#discussion_r178024748","pull_request_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/250","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/comments/178024748"},"html":{"href":"https://github.com/jenkinsci/pipeline-model-definition-plugin/pull/250#discussion_r178024748"},"pull_request":{"href":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/250"}},"in_reply_to_id":172150529},"pull_request":{"url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/250","id":172617024,"html_url":"https://github.com/jenkinsci/pipeline-model-definition-plugin/pull/250","diff_url":"https://github.com/jenkinsci/pipeline-model-definition-plugin/pull/250.diff","patch_url":"https://github.com/jenkinsci/pipeline-model-definition-plugin/pull/250.patch","issue_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/issues/250","number":250,"state":"open","locked":false,"title":"[JENKINS-49893] Add a Declarative directive snippet generator","user":{"login":"abayer","id":120218,"avatar_url":"https://avatars2.githubusercontent.com/u/120218?v=4","gravatar_id":"","url":"https://api.github.com/users/abayer","html_url":"https://github.com/abayer","followers_url":"https://api.github.com/users/abayer/followers","following_url":"https://api.github.com/users/abayer/following{/other_user}","gists_url":"https://api.github.com/users/abayer/gists{/gist_id}","starred_url":"https://api.github.com/users/abayer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abayer/subscriptions","organizations_url":"https://api.github.com/users/abayer/orgs","repos_url":"https://api.github.com/users/abayer/repos","events_url":"https://api.github.com/users/abayer/events{/privacy}","received_events_url":"https://api.github.com/users/abayer/received_events","type":"User","site_admin":false},"body":"* JENKINS issue(s):\r\n    * [JENKINS-49893](https://issues.jenkins-ci.org/browse/JENKINS-49893)\r\n* Description:\r\n    * Adds a snippet generator specifically for Declarative directives (initially included: `agent`, `parameters`, `triggers`, and `options`), with only valid options included in the dropdowns, proper syntax generation, useful descriptions, etc.\r\n    * You can take a look by checking out this PR, running `mvn hpi:run`, creating a Pipeline job, and going to the `Declarative Directive Generator` link in the side panel.\r\n    * Downstream of https://github.com/jenkinsci/workflow-cps-plugin/pull/208\r\n- [x] Tests that we actually generate the code we're expecting.\r\n- [x] `when` directive support\r\n- [x] `input` directive support (a bit janky, but it works)\r\n- [x] Help HTML and explanatory text for each directive.\r\n- [x] Figure out exactly what to call it in the sidepanel.\r\n- [x] Improve `config.jelly` for various `Describable`s provided by Declarative.\r\n- [x] Maybe tests for making sure the generated code is actually *right*? As in toss it into a `Jenkinsfile` with other minimal stuff, run it, make sure the right things happened? Probably makes sense, probably takes some effort. Will work on it. (NOTE: Gonna punt this for now. May revisit later)\r\n- [x] `tools` directive\r\n- [x] `libraries` directive\r\n- [x] `environment` directive in some form (NOTE: Need to figure out credentials support somehow)\r\n- [x] `post` directive in some form\r\n- [x] `parallel` directive (as a placeholder) (NOTE: Ended up deciding to just have you choose whether the stage is gonna have parallel or steps)\r\n- [x] `stage` directive\r\n- [ ] https://github.com/jenkinsci/workflow-cps-plugin/pull/208 gets merged and released\r\n- [x] Doc PR\r\n* Documentation changes:\r\n    * https://github.com/jenkins-infra/jenkins.io/pull/1472\r\n* Users/aliases to notify:\r\n    * @reviewbybees \r\n","created_at":"2018-03-02T22:09:30Z","updated_at":"2018-03-29T11:15:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9dac8f171238b170a40ca275394902525a4735e4","assignee":null,"assignees":[],"requested_reviewers":[{"login":"michaelneale","id":14976,"avatar_url":"https://avatars0.githubusercontent.com/u/14976?v=4","gravatar_id":"","url":"https://api.github.com/users/michaelneale","html_url":"https://github.com/michaelneale","followers_url":"https://api.github.com/users/michaelneale/followers","following_url":"https://api.github.com/users/michaelneale/following{/other_user}","gists_url":"https://api.github.com/users/michaelneale/gists{/gist_id}","starred_url":"https://api.github.com/users/michaelneale/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaelneale/subscriptions","organizations_url":"https://api.github.com/users/michaelneale/orgs","repos_url":"https://api.github.com/users/michaelneale/repos","events_url":"https://api.github.com/users/michaelneale/events{/privacy}","received_events_url":"https://api.github.com/users/michaelneale/received_events","type":"User","site_admin":false},{"login":"rtyler","id":26594,"avatar_url":"https://avatars0.githubusercontent.com/u/26594?v=4","gravatar_id":"","url":"https://api.github.com/users/rtyler","html_url":"https://github.com/rtyler","followers_url":"https://api.github.com/users/rtyler/followers","following_url":"https://api.github.com/users/rtyler/following{/other_user}","gists_url":"https://api.github.com/users/rtyler/gists{/gist_id}","starred_url":"https://api.github.com/users/rtyler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rtyler/subscriptions","organizations_url":"https://api.github.com/users/rtyler/orgs","repos_url":"https://api.github.com/users/rtyler/repos","events_url":"https://api.github.com/users/rtyler/events{/privacy}","received_events_url":"https://api.github.com/users/rtyler/received_events","type":"User","site_admin":false},{"login":"i386","id":50156,"avatar_url":"https://avatars2.githubusercontent.com/u/50156?v=4","gravatar_id":"","url":"https://api.github.com/users/i386","html_url":"https://github.com/i386","followers_url":"https://api.github.com/users/i386/followers","following_url":"https://api.github.com/users/i386/following{/other_user}","gists_url":"https://api.github.com/users/i386/gists{/gist_id}","starred_url":"https://api.github.com/users/i386/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/i386/subscriptions","organizations_url":"https://api.github.com/users/i386/orgs","repos_url":"https://api.github.com/users/i386/repos","events_url":"https://api.github.com/users/i386/events{/privacy}","received_events_url":"https://api.github.com/users/i386/received_events","type":"User","site_admin":false},{"login":"bitwiseman","id":1958953,"avatar_url":"https://avatars3.githubusercontent.com/u/1958953?v=4","gravatar_id":"","url":"https://api.github.com/users/bitwiseman","html_url":"https://github.com/bitwiseman","followers_url":"https://api.github.com/users/bitwiseman/followers","following_url":"https://api.github.com/users/bitwiseman/following{/other_user}","gists_url":"https://api.github.com/users/bitwiseman/gists{/gist_id}","starred_url":"https://api.github.com/users/bitwiseman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bitwiseman/subscriptions","organizations_url":"https://api.github.com/users/bitwiseman/orgs","repos_url":"https://api.github.com/users/bitwiseman/repos","events_url":"https://api.github.com/users/bitwiseman/events{/privacy}","received_events_url":"https://api.github.com/users/bitwiseman/received_events","type":"User","site_admin":false},{"login":"kshultzCB","id":21689198,"avatar_url":"https://avatars2.githubusercontent.com/u/21689198?v=4","gravatar_id":"","url":"https://api.github.com/users/kshultzCB","html_url":"https://github.com/kshultzCB","followers_url":"https://api.github.com/users/kshultzCB/followers","following_url":"https://api.github.com/users/kshultzCB/following{/other_user}","gists_url":"https://api.github.com/users/kshultzCB/gists{/gist_id}","starred_url":"https://api.github.com/users/kshultzCB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kshultzCB/subscriptions","organizations_url":"https://api.github.com/users/kshultzCB/orgs","repos_url":"https://api.github.com/users/kshultzCB/repos","events_url":"https://api.github.com/users/kshultzCB/events{/privacy}","received_events_url":"https://api.github.com/users/kshultzCB/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/milestones/19","html_url":"https://github.com/jenkinsci/pipeline-model-definition-plugin/milestone/19","labels_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/milestones/19/labels","id":3071714,"number":19,"title":"1.2.8","description":"","creator":{"login":"abayer","id":120218,"avatar_url":"https://avatars2.githubusercontent.com/u/120218?v=4","gravatar_id":"","url":"https://api.github.com/users/abayer","html_url":"https://github.com/abayer","followers_url":"https://api.github.com/users/abayer/followers","following_url":"https://api.github.com/users/abayer/following{/other_user}","gists_url":"https://api.github.com/users/abayer/gists{/gist_id}","starred_url":"https://api.github.com/users/abayer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abayer/subscriptions","organizations_url":"https://api.github.com/users/abayer/orgs","repos_url":"https://api.github.com/users/abayer/repos","events_url":"https://api.github.com/users/abayer/events{/privacy}","received_events_url":"https://api.github.com/users/abayer/received_events","type":"User","site_admin":false},"open_issues":3,"closed_issues":7,"state":"open","created_at":"2018-01-29T14:42:22Z","updated_at":"2018-03-27T17:31:13Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/250/commits","review_comments_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/250/comments","review_comment_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/issues/250/comments","statuses_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/statuses/51f25e2d69d9662dcdd8b9792739c337b03ef67c","head":{"label":"abayer:directive-generator","ref":"directive-generator","sha":"51f25e2d69d9662dcdd8b9792739c337b03ef67c","user":{"login":"abayer","id":120218,"avatar_url":"https://avatars2.githubusercontent.com/u/120218?v=4","gravatar_id":"","url":"https://api.github.com/users/abayer","html_url":"https://github.com/abayer","followers_url":"https://api.github.com/users/abayer/followers","following_url":"https://api.github.com/users/abayer/following{/other_user}","gists_url":"https://api.github.com/users/abayer/gists{/gist_id}","starred_url":"https://api.github.com/users/abayer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abayer/subscriptions","organizations_url":"https://api.github.com/users/abayer/orgs","repos_url":"https://api.github.com/users/abayer/repos","events_url":"https://api.github.com/users/abayer/events{/privacy}","received_events_url":"https://api.github.com/users/abayer/received_events","type":"User","site_admin":false},"repo":{"id":66791984,"name":"pipeline-model-definition-plugin","full_name":"abayer/pipeline-model-definition-plugin","owner":{"login":"abayer","id":120218,"avatar_url":"https://avatars2.githubusercontent.com/u/120218?v=4","gravatar_id":"","url":"https://api.github.com/users/abayer","html_url":"https://github.com/abayer","followers_url":"https://api.github.com/users/abayer/followers","following_url":"https://api.github.com/users/abayer/following{/other_user}","gists_url":"https://api.github.com/users/abayer/gists{/gist_id}","starred_url":"https://api.github.com/users/abayer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abayer/subscriptions","organizations_url":"https://api.github.com/users/abayer/orgs","repos_url":"https://api.github.com/users/abayer/repos","events_url":"https://api.github.com/users/abayer/events{/privacy}","received_events_url":"https://api.github.com/users/abayer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/abayer/pipeline-model-definition-plugin","description":null,"fork":true,"url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin","forks_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/forks","keys_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/teams","hooks_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/hooks","issue_events_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/events","assignees_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/tags","blobs_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/languages","stargazers_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/stargazers","contributors_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/contributors","subscribers_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/subscribers","subscription_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/subscription","commits_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/merges","archive_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/downloads","issues_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/labels{/name}","releases_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/releases{/id}","deployments_url":"https://api.github.com/repos/abayer/pipeline-model-definition-plugin/deployments","created_at":"2016-08-28T21:35:16Z","updated_at":"2016-12-14T16:40:34Z","pushed_at":"2018-03-28T16:39:13Z","git_url":"git://github.com/abayer/pipeline-model-definition-plugin.git","ssh_url":"git@github.com:abayer/pipeline-model-definition-plugin.git","clone_url":"https://github.com/abayer/pipeline-model-definition-plugin.git","svn_url":"https://github.com/abayer/pipeline-model-definition-plugin","homepage":"","size":3449,"stargazers_count":2,"watchers_count":2,"language":"Groovy","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":1,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"jenkinsci:master","ref":"master","sha":"18983eb645767d8c152e9427baa32cff3dc1ab63","user":{"login":"jenkinsci","id":107424,"avatar_url":"https://avatars0.githubusercontent.com/u/107424?v=4","gravatar_id":"","url":"https://api.github.com/users/jenkinsci","html_url":"https://github.com/jenkinsci","followers_url":"https://api.github.com/users/jenkinsci/followers","following_url":"https://api.github.com/users/jenkinsci/following{/other_user}","gists_url":"https://api.github.com/users/jenkinsci/gists{/gist_id}","starred_url":"https://api.github.com/users/jenkinsci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jenkinsci/subscriptions","organizations_url":"https://api.github.com/users/jenkinsci/orgs","repos_url":"https://api.github.com/users/jenkinsci/repos","events_url":"https://api.github.com/users/jenkinsci/events{/privacy}","received_events_url":"https://api.github.com/users/jenkinsci/received_events","type":"Organization","site_admin":false},"repo":{"id":66677338,"name":"pipeline-model-definition-plugin","full_name":"jenkinsci/pipeline-model-definition-plugin","owner":{"login":"jenkinsci","id":107424,"avatar_url":"https://avatars0.githubusercontent.com/u/107424?v=4","gravatar_id":"","url":"https://api.github.com/users/jenkinsci","html_url":"https://github.com/jenkinsci","followers_url":"https://api.github.com/users/jenkinsci/followers","following_url":"https://api.github.com/users/jenkinsci/following{/other_user}","gists_url":"https://api.github.com/users/jenkinsci/gists{/gist_id}","starred_url":"https://api.github.com/users/jenkinsci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jenkinsci/subscriptions","organizations_url":"https://api.github.com/users/jenkinsci/orgs","repos_url":"https://api.github.com/users/jenkinsci/repos","events_url":"https://api.github.com/users/jenkinsci/events{/privacy}","received_events_url":"https://api.github.com/users/jenkinsci/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/jenkinsci/pipeline-model-definition-plugin","description":null,"fork":false,"url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin","forks_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/forks","keys_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/teams","hooks_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/hooks","issue_events_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/events","assignees_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/tags","blobs_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/languages","stargazers_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/stargazers","contributors_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/contributors","subscribers_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/subscribers","subscription_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/subscription","commits_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/merges","archive_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/downloads","issues_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/labels{/name}","releases_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/releases{/id}","deployments_url":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/deployments","created_at":"2016-08-26T20:28:39Z","updated_at":"2018-03-28T17:56:31Z","pushed_at":"2018-03-28T16:39:15Z","git_url":"git://github.com/jenkinsci/pipeline-model-definition-plugin.git","ssh_url":"git@github.com:jenkinsci/pipeline-model-definition-plugin.git","clone_url":"https://github.com/jenkinsci/pipeline-model-definition-plugin.git","svn_url":"https://github.com/jenkinsci/pipeline-model-definition-plugin","homepage":"https://plugins.jenkins.io/pipeline-model-definition","size":2875,"stargazers_count":264,"watchers_count":264,"language":"Groovy","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":82,"mirror_url":null,"archived":false,"open_issues_count":13,"license":null,"forks":82,"open_issues":13,"watchers":264,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/250"},"html":{"href":"https://github.com/jenkinsci/pipeline-model-definition-plugin/pull/250"},"issue":{"href":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/issues/250"},"comments":{"href":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/issues/250/comments"},"review_comments":{"href":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/250/comments"},"review_comment":{"href":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/pulls/250/commits"},"statuses":{"href":"https://api.github.com/repos/jenkinsci/pipeline-model-definition-plugin/statuses/51f25e2d69d9662dcdd8b9792739c337b03ef67c"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"rsandell"}}