{"action":"created","comment":{"url":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/comments/69475426","id":69475426,"diff_hunk":"@@ -192,4 +257,340 @@ public String getIconClassName() {\n     public boolean isApplicable(CredentialsProvider provider) {\n         return true;\n     }\n+\n+    /**\n+     * In some cases the nearest {@link AncestorInPath} {@link ModelObject} is one of the Credentials plugins wrapper\n+     * classes.\n+     * This helper method unwraps those to return the correct context.\n+     *\n+     * @param context the context (wrapped or unwrapped).\n+     * @return the unwrapped context.\n+     * @since 2.1.5\n+     */\n+    @NonNull\n+    public static ModelObject unwrapContext(@NonNull ModelObject context) {\n+        if (context instanceof CredentialsSelectHelper.WrappedCredentialsStore) {\n+            return ((CredentialsSelectHelper.WrappedCredentialsStore) context).getStore().getContext();\n+        }\n+        if (context instanceof CredentialsStoreAction.CredentialsWrapper) {\n+            return ((CredentialsStoreAction.CredentialsWrapper) context).getStore().getContext();\n+        }\n+        if (context instanceof CredentialsStoreAction.DomainWrapper) {\n+            return ((CredentialsStoreAction.DomainWrapper) context).getStore().getContext();\n+        }\n+        return context;\n+    }\n+\n+    /**\n+     * Looks up the context given the provider and token.\n+     * @param provider the provider.\n+     * @param token the token.\n+     * @return the context.\n+     *\n+     * @since 2.1.5\n+     */\n+    @CheckForNull\n+    public static ModelObject lookupContext(String provider, String token) {\n+        for (CredentialsSelectHelper.ContextResolver r : ExtensionList\n+                .lookup(CredentialsSelectHelper.ContextResolver.class)) {\n+            if (r.getClass().getName().equals(provider)) {\n+                return r.getContext(token);\n+            }\n+        }\n+        return null;\n+    }\n+\n+    /**\n+     * Attempts to resolve the credentials context from the {@link Stapler#getCurrentRequest()} (includes special\n+     * handling of the HTTP Referer to enable resolution from AJAX requests).\n+     *\n+     * @param type the type of context.\n+     * @param <T> the type of context.\n+     * @return the context from the request\n+     * @since 2.1.5\n+     */\n+    @CheckForNull\n+    public static <T extends ModelObject> T findContextInPath(@NonNull Class<T> type) {\n+        return findContextInPath(Stapler.getCurrentRequest(), type);\n+    }\n+\n+    /**\n+     * Attempts to resolve the credentials context from the {@link StaplerRequest} (includes special\n+     * handling of the HTTP Referer to enable resolution from AJAX requests).\n+     *\n+     * @param request the {@link StaplerRequest}.\n+     * @param type the type of context.\n+     * @param <T>  the type of context.\n+     * @return the context from the request\n+     * @since 2.1.5\n+     */\n+    @CheckForNull\n+    public static <T extends ModelObject> T findContextInPath(@NonNull StaplerRequest request, @NonNull Class<T> type) {\n+        List<Ancestor> ancestors = request.getAncestors();\n+        for (int i = ancestors.size() - 1; i >= 0; i--) {\n+            Ancestor a = ancestors.get(i);\n+            Object o = a.getObject();\n+            // special case of unwrapping our internal wrapper classes.\n+            if (o instanceof CredentialsSelectHelper.WrappedCredentialsStore) {\n+                o = ((CredentialsSelectHelper.WrappedCredentialsStore) o).getStore().getContext();\n+            } else if (o instanceof CredentialsStoreAction.CredentialsWrapper) {\n+                o = ((CredentialsStoreAction.CredentialsWrapper) o).getStore().getContext();\n+            } else if (o instanceof CredentialsStoreAction.DomainWrapper) {\n+                o = ((CredentialsStoreAction.DomainWrapper) o).getStore().getContext();\n+            } else if (o instanceof Descriptor && i == 1) { // URL is /descriptorByName/...\n+                // we need to try an infer from the Referer as this is likely a doCheck or a doFill method\n+                String referer = request.getReferer();\n+                String rootPath = request.getRootPath();\n+                if (referer != null && rootPath != null && referer.startsWith(rootPath)) {\n+                    // strip out any query portion of the referer URL.\n+                    String path = URI.create(referer.substring(rootPath.length())).getPath().substring(1);\n+                    // TODO have Stapler expose a method that can walk a path and produce the ancestors and use that\n+\n+                    // what now follows is an example of a realy evil hack, consequently this means...\n+                    //\n+                    //                         7..       ,\n+                    //                      MMM.          MMM.\n+                    //                     MMMMM        .MMMMMM\n+                    //                    MMMM.           MMMMM.\n+                    //                  OMMM                 MMZ\n+                    //                  MMM                    MM\n+                    //                .MMMM    $.     .       .MM,\n+                    //                MMMMM    MMM   MM        MMM\n+                    //               .MMMMM. MMMMD  8MMM.     MMMM\n+                    //               MMMMMMM.MMMM    MMMMM.  MMMMMM\n+                    //               MMMMMMMM.M .     MMM.  MMMMMMM\n+                    //               MMMMMMMMM.            MMMMMMMM\n+                    //               MMMMMMMMM . ..     MMMMMMMMMMM\n+                    //               MMMMMMMM  IMMMM  Z.MMMMMMMMMM ,\n+                    //               .MMMMMMM   .M:M   MMMMMMMMMMM M\n+                    //              I MMMMMMM.         MMMMMMMMMO  M\n+                    //           MMMM  MMMMMMM       .MMMMMMMMM.   .\n+                    //         :MMMMMM.MMMMMMM.      MMMMMMMM   .MMMM\n+                    //         MMMMMMMMMMMMMMMM      MMMMMMM   MMMMMMMM\n+                    //        MMMMMMMMM.MMMMMMM      MMMMMMM MMMMMMMMMM.\n+                    //        MMMMMMMMMMMMMMMM?      MMMMMM MMMMMMMMMMM\n+                    //        MMMMMMMMMM  .  .       MMMMMIMMMMMMMMMMMM.\n+                    //        MMMMMMMMMM               .. :MMMMMMMMMMMM.\n+                    //        DMMMMMMMMMM                 MMMMMMMMMMMMM.\n+                    //         MMMMMMMMMM.M.              MMMMMMMMMMMM.\n+                    //           MMMMMM,                    ....\n+                    //\n+                    //                   I AM A SAD PANDA\n+\n+                    List<String> pathSegments = new ArrayList<String>(Arrays.asList(StringUtils.split(path, \"/\")));\n+                    // strip out any leading junk\n+                    while (!pathSegments.isEmpty() && StringUtils.isBlank(pathSegments.get(0))) {\n+                        pathSegments.remove(0);\n+                    }\n+                    if (pathSegments.size() >= 2) {\n+                        String firstSegment = pathSegments.get(0);\n+                        if (\"user\".equals(firstSegment)) {\n+                            User user = User.get(pathSegments.get(1));\n+                            if (type.isInstance(user) && CredentialsProvider.hasStores(user)) {\n+                                // we have a winner\n+                                return type.cast(user);\n+                            }\n+                        } else if (\"job\".equals(firstSegment) || \"item\".equals(firstSegment) || \"view\"\n+                                .equals(firstSegment)) {\n+                            int index = 0;\n+                            while (index < pathSegments.size()) {\n+                                String segment = pathSegments.get(index);\n+                                if (\"view\".equals(segment)) {\n+                                    // remove the /view/\n+                                    pathSegments.remove(index);\n+                                    if (index < pathSegments.size()) {\n+                                        // remove the /view/{name}\n+                                        pathSegments.remove(index);\n+                                    }\n+                                } else if (\"job\".equals(segment) || \"item\".equals(segment)) {\n+                                    // remove the /job/\n+                                    pathSegments.remove(index);\n+                                    // skip the name\n+                                    index++;\n+                                } else {\n+                                    // we have gone as far as we can parse the item path structure\n+                                    while (index < pathSegments.size()) {\n+                                        // remove the remainder\n+                                        pathSegments.remove(index);\n+                                    }\n+                                }\n+                            }\n+                            Jenkins jenkins = Jenkins.getActiveInstance();\n+                            while (!pathSegments.isEmpty()) {\n+                                String fullName = StringUtils.join(pathSegments, \"/\");\n+                                Item item = jenkins.getItemByFullName(fullName);\n+                                if (item != null) {\n+                                    if (type.isInstance(item) && CredentialsProvider.hasStores(item)) {\n+                                        // we have a winner\n+                                        return type.cast(item);\n+                                    }\n+                                }\n+                                // walk back up and try one level less deep\n+                                pathSegments.remove(pathSegments.size() - 1);\n+                            }\n+                        }\n+                    }\n+                    // ok we give up, we are not thirsty for more, we'll let \"normal\" ancestor in path logic continue\n+                }\n+            }\n+            if (type.isInstance(o) && o instanceof ModelObject && CredentialsProvider.hasStores((ModelObject) o)) {\n+                return type.cast(o);\n+            }\n+        }\n+        return null;\n+\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    public FormValidation.CheckMethod getCheckMethod(String fieldName) {\n+        // this is an ugly hack to make the @ContextInPath annotation more failsafe\n+        // requires that you explicitly call out the checkUrl: checkUrl=\"${descriptor.getCheckUrl('fieldName')}\"\n+        FormValidation.CheckMethod method = enhancedCheckMethods.get(fieldName);\n+        if (method == null) {\n+            method = new EnhancedCheckMethod(this, fieldName);\n+            enhancedCheckMethods.put(fieldName, method);\n+        }\n+        return method;\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    public void calcFillSettings(String field, Map<String, Object> attributes) {\n+        if (attributes.containsKey(\"fillUrl\")) {\n+            // the user already provided a custom one, get out of the way\n+            super.calcFillSettings(field, attributes);\n+            return;\n+        }\n+        // this is an ugly hack to make the @ContextInPath annotation more failsafe\n+        super.calcFillSettings(field, attributes);\n+        if (attributes.containsKey(\"fillUrl\")) {\n+            try {\n+                JellyContext jelly = Functions.getCurrentJellyContext();\n+                Object it = jelly.findVariable(\"it\");\n+                if (it instanceof CredentialsStore) {\n+                    ModelObject context = ((CredentialsStore) it).getContext();\n+                    for (CredentialsSelectHelper.ContextResolver r : ExtensionList\n+                            .lookup(CredentialsSelectHelper.ContextResolver.class)) {\n+                        String token = r.getToken(context);\n+                        if (token != null) {\n+                            String fillUrl = (String) attributes.get(\"fillUrl\");\n+                            if (fillUrl.indexOf('?') != -1) {\n+                                fillUrl = fillUrl + '&';\n+                            } else {\n+                                fillUrl = fillUrl + '?';\n+                            }\n+                            attributes.put(\"fillUrl\", fillUrl + \"$provider=\" + r.getClass().getName() + \"&\"\n+                                    + \"$token=\" + URLEncoder.encode(token, \"UTF-8\"));\n+                        }\n+                    }\n+\n+                }\n+            } catch (AssertionError e) {\n+                // ignore, we did the best we could\n+            } catch (UnsupportedEncodingException e) {\n+                // ignore, we did the best we could\n+            }\n+        }\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    public void calcAutoCompleteSettings(String field, Map<String, Object> attributes) {\n+        if (attributes.containsKey(\"autoCompleteUrl\")) {\n+            // the user already provided a custom one, get out of the way\n+            super.calcAutoCompleteSettings(field, attributes);\n+            return;\n+        }\n+        // this is an ugly hack to make the @ContextInPath annotation more failsafe\n+        super.calcAutoCompleteSettings(field, attributes);\n+        if (attributes.containsKey(\"autoCompleteUrl\")) {\n+            try {\n+                JellyContext jelly = Functions.getCurrentJellyContext();\n+                Object it = jelly.findVariable(\"it\");\n+                if (it instanceof CredentialsStore) {\n+                    ModelObject context = ((CredentialsStore) it).getContext();\n+                    for (CredentialsSelectHelper.ContextResolver r : ExtensionList\n+                            .lookup(CredentialsSelectHelper.ContextResolver.class)) {\n+                        String token = r.getToken(context);\n+                        if (token != null) {\n+                            String fillUrl = (String) attributes.get(\"autoCompleteUrl\");\n+                            if (fillUrl.indexOf('?') != -1) {\n+                                fillUrl = fillUrl + '&';\n+                            } else {\n+                                fillUrl = fillUrl + '?';\n+                            }\n+                            attributes.put(\"autoCompleteUrl\", fillUrl + \"$provider=\" + r.getClass().getName() + \"&\"","path":"src/main/java/com/cloudbees/plugins/credentials/CredentialsDescriptor.java","position":446,"original_position":443,"commit_id":"b6164856e171b451564ac7fbb05aa11643bb30a9","original_commit_id":"e16af9944f3343fea413972e1e13ad71ac68a2e7","user":{"login":"oleg-nenashev","id":3000480,"avatar_url":"https://avatars.githubusercontent.com/u/3000480?v=3","gravatar_id":"","url":"https://api.github.com/users/oleg-nenashev","html_url":"https://github.com/oleg-nenashev","followers_url":"https://api.github.com/users/oleg-nenashev/followers","following_url":"https://api.github.com/users/oleg-nenashev/following{/other_user}","gists_url":"https://api.github.com/users/oleg-nenashev/gists{/gist_id}","starred_url":"https://api.github.com/users/oleg-nenashev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oleg-nenashev/subscriptions","organizations_url":"https://api.github.com/users/oleg-nenashev/orgs","repos_url":"https://api.github.com/users/oleg-nenashev/repos","events_url":"https://api.github.com/users/oleg-nenashev/events{/privacy}","received_events_url":"https://api.github.com/users/oleg-nenashev/received_events","type":"User","site_admin":false},"body":"as above","created_at":"2016-07-04T16:01:09Z","updated_at":"2016-07-04T16:01:09Z","html_url":"https://github.com/jenkinsci/credentials-plugin/pull/62#discussion_r69475426","pull_request_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/62","_links":{"self":{"href":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/comments/69475426"},"html":{"href":"https://github.com/jenkinsci/credentials-plugin/pull/62#discussion_r69475426"},"pull_request":{"href":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/62"}}},"pull_request":{"url":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/62","id":76178753,"html_url":"https://github.com/jenkinsci/credentials-plugin/pull/62","diff_url":"https://github.com/jenkinsci/credentials-plugin/pull/62.diff","patch_url":"https://github.com/jenkinsci/credentials-plugin/pull/62.patch","issue_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues/62","number":62,"state":"open","locked":false,"title":"[FIXED JENKINS-36315] Make it easier to infer the context in form binding","user":{"login":"stephenc","id":209336,"avatar_url":"https://avatars.githubusercontent.com/u/209336?v=3","gravatar_id":"","url":"https://api.github.com/users/stephenc","html_url":"https://github.com/stephenc","followers_url":"https://api.github.com/users/stephenc/followers","following_url":"https://api.github.com/users/stephenc/following{/other_user}","gists_url":"https://api.github.com/users/stephenc/gists{/gist_id}","starred_url":"https://api.github.com/users/stephenc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stephenc/subscriptions","organizations_url":"https://api.github.com/users/stephenc/orgs","repos_url":"https://api.github.com/users/stephenc/repos","events_url":"https://api.github.com/users/stephenc/events{/privacy}","received_events_url":"https://api.github.com/users/stephenc/received_events","type":"User","site_admin":false},"body":"@reviewbybees","created_at":"2016-07-04T15:27:01Z","updated_at":"2016-07-04T16:01:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8e5b8267f83e3b0514fa4f89e66c151447271ba7","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/62/commits","review_comments_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/62/comments","review_comment_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues/62/comments","statuses_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/statuses/b6164856e171b451564ac7fbb05aa11643bb30a9","head":{"label":"jenkinsci:jenkins-36315","ref":"jenkins-36315","sha":"b6164856e171b451564ac7fbb05aa11643bb30a9","user":{"login":"jenkinsci","id":107424,"avatar_url":"https://avatars.githubusercontent.com/u/107424?v=3","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":3528768,"name":"credentials-plugin","full_name":"jenkinsci/credentials-plugin","owner":{"login":"jenkinsci","id":107424,"avatar_url":"https://avatars.githubusercontent.com/u/107424?v=3","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/credentials-plugin","description":"","fork":false,"url":"https://api.github.com/repos/jenkinsci/credentials-plugin","forks_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/forks","keys_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/teams","hooks_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/hooks","issue_events_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/events","assignees_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/tags","blobs_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/languages","stargazers_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/stargazers","contributors_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/contributors","subscribers_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/subscribers","subscription_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/subscription","commits_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/merges","archive_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/downloads","issues_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/labels{/name}","releases_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/releases{/id}","deployments_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/deployments","created_at":"2012-02-23T18:57:07Z","updated_at":"2016-06-13T19:51:43Z","pushed_at":"2016-07-04T16:00:47Z","git_url":"git://github.com/jenkinsci/credentials-plugin.git","ssh_url":"git@github.com:jenkinsci/credentials-plugin.git","clone_url":"https://github.com/jenkinsci/credentials-plugin.git","svn_url":"https://github.com/jenkinsci/credentials-plugin","homepage":"http://wiki.jenkins-ci.org/display/JENKINS/Credentials+Plugin","size":1084,"stargazers_count":12,"watchers_count":12,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":42,"mirror_url":null,"open_issues_count":2,"forks":42,"open_issues":2,"watchers":12,"default_branch":"master"}},"base":{"label":"jenkinsci:master","ref":"master","sha":"042adbe4fb8bad0b765f104b1b1ebfb390451018","user":{"login":"jenkinsci","id":107424,"avatar_url":"https://avatars.githubusercontent.com/u/107424?v=3","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":3528768,"name":"credentials-plugin","full_name":"jenkinsci/credentials-plugin","owner":{"login":"jenkinsci","id":107424,"avatar_url":"https://avatars.githubusercontent.com/u/107424?v=3","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/credentials-plugin","description":"","fork":false,"url":"https://api.github.com/repos/jenkinsci/credentials-plugin","forks_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/forks","keys_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/teams","hooks_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/hooks","issue_events_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/events","assignees_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/tags","blobs_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/languages","stargazers_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/stargazers","contributors_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/contributors","subscribers_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/subscribers","subscription_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/subscription","commits_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/merges","archive_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/downloads","issues_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/labels{/name}","releases_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/releases{/id}","deployments_url":"https://api.github.com/repos/jenkinsci/credentials-plugin/deployments","created_at":"2012-02-23T18:57:07Z","updated_at":"2016-06-13T19:51:43Z","pushed_at":"2016-07-04T16:00:47Z","git_url":"git://github.com/jenkinsci/credentials-plugin.git","ssh_url":"git@github.com:jenkinsci/credentials-plugin.git","clone_url":"https://github.com/jenkinsci/credentials-plugin.git","svn_url":"https://github.com/jenkinsci/credentials-plugin","homepage":"http://wiki.jenkins-ci.org/display/JENKINS/Credentials+Plugin","size":1084,"stargazers_count":12,"watchers_count":12,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":42,"mirror_url":null,"open_issues_count":2,"forks":42,"open_issues":2,"watchers":12,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/62"},"html":{"href":"https://github.com/jenkinsci/credentials-plugin/pull/62"},"issue":{"href":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues/62"},"comments":{"href":"https://api.github.com/repos/jenkinsci/credentials-plugin/issues/62/comments"},"review_comments":{"href":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/62/comments"},"review_comment":{"href":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/jenkinsci/credentials-plugin/pulls/62/commits"},"statuses":{"href":"https://api.github.com/repos/jenkinsci/credentials-plugin/statuses/b6164856e171b451564ac7fbb05aa11643bb30a9"}}}}
{"actor":{"display_login":"oleg-nenashev"}}