{"action":"created","comment":{"url":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/comments/40169158","id":40169158,"diff_hunk":"@@ -0,0 +1,246 @@\n+package org.jboss.da.communication.pom;\n+\n+import org.apache.commons.io.FileUtils;\n+import org.commonjava.cartographer.CartoDataException;\n+import org.commonjava.cartographer.CartographerCore;\n+import org.commonjava.cartographer.graph.MavenModelProcessor;\n+import org.commonjava.cartographer.graph.discover.DiscoveryConfig;\n+import org.commonjava.cartographer.graph.discover.DiscoveryResult;\n+import org.commonjava.maven.atlas.graph.rel.ProjectRelationship;\n+import org.commonjava.maven.atlas.ident.ref.ProjectVersionRef;\n+import org.commonjava.maven.galley.TransferException;\n+import org.commonjava.maven.galley.maven.GalleyMavenException;\n+import org.commonjava.maven.galley.maven.model.view.MavenPomView;\n+import org.commonjava.maven.galley.maven.parse.MavenPomReader;\n+import org.commonjava.maven.galley.maven.parse.PomPeek;\n+import org.commonjava.maven.galley.maven.util.ArtifactPathUtils;\n+import org.commonjava.maven.galley.model.Location;\n+import org.commonjava.maven.galley.model.SimpleLocation;\n+import org.jboss.da.communication.aprox.model.GAVDependencyTree;\n+import org.jboss.da.communication.model.GAV;\n+import org.jboss.da.communication.pom.model.MavenProject;\n+import org.jboss.da.communication.pom.model.MavenRepository;\n+import org.jboss.da.communication.pom.qualifier.DACartographerCore;\n+\n+import javax.enterprise.context.ApplicationScoped;\n+import javax.inject.Inject;\n+import java.io.File;\n+import java.io.IOException;\n+import java.net.URI;\n+import java.net.URISyntaxException;\n+import java.nio.file.Files;\n+import java.util.Collection;\n+import java.util.HashMap;\n+import java.util.LinkedList;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.Optional;\n+import java.util.Set;\n+import java.util.stream.Collectors;\n+\n+@ApplicationScoped\n+public class PomAnalyzer {\n+\n+    @Inject\n+    private PomReader pomReader;\n+\n+    @Inject\n+    @DACartographerCore\n+    private CartographerCore carto;\n+\n+    public GAVDependencyTree readRelationships(File pomRepoDir, File pomPath)\n+            throws PomAnalysisException {\n+\n+        try {\n+            GAVDependencyTree root = null;\n+\n+            File tempDir = Files.createTempDirectory(\"deps\").toFile();\n+\n+            Map<GAV, GAVDependencyTree> gavDependencyTreeMap = new HashMap<>();\n+\n+            try {\n+                // map of file and ProjectVersionRefs that represent all the pom.xmls found in the pomRepoDir directory\n+                Map<File, ProjectVersionRef> projectVersionRefs = getProjectVersionRefs(tempDir,\n+                        findAllPomFiles(pomRepoDir));\n+\n+                // for each pom.xml\n+                for (File path : projectVersionRefs.keySet()) {\n+                    ProjectVersionRef ref = projectVersionRefs.get(path);\n+\n+                    // find all the dependencies / plugins / parents / plugins etc for each pom.xml\n+                    Set<ProjectRelationship<?, ?>> relationships = getDiscoveryResult(tempDir,\n+                            pomRepoDir, ref).getAcceptedRelationships();\n+\n+                    boolean rootRelationship = false;\n+\n+                    // need to use canonical path to get better way of knowing if 2 paths are the same\n+                    if (pomPath.getCanonicalPath().equals(path.getCanonicalPath())) {\n+                        rootRelationship = true;\n+                    }\n+\n+                    for (ProjectRelationship<?, ?> relationship : relationships) {\n+                        ProjectVersionRef origin = relationship.getDeclaring();\n+                        ProjectVersionRef target = relationship.getTarget();\n+\n+                        // convert from ProjectVersionRef to GAV\n+                        GAV originGAV = generateGAV(origin);\n+                        GAV targetGAV = generateGAV(target);\n+\n+                        // get the origin GAVDependencyTree\n+                        GAVDependencyTree originScmGAVTree = addGAVDependencyTreeToMapper(\n+                                gavDependencyTreeMap, originGAV);\n+                        GAVDependencyTree targetScmGavTree = addGAVDependencyTreeToMapper(\n+                                gavDependencyTreeMap, targetGAV);\n+\n+                        if (rootRelationship)\n+                            root = originScmGAVTree;\n+\n+                        addTargetToGAVDependencyTree(originScmGAVTree, targetScmGavTree,\n+                                relationship);\n+                    }\n+                }\n+\n+                return root;\n+\n+            } finally {\n+                // cleanup\n+                FileUtils.deleteDirectory(tempDir);\n+            }\n+        } catch (TransferException | GalleyMavenException | URISyntaxException | CartoDataException\n+                | IOException e) {\n+            throw new PomAnalysisException(e);\n+        }\n+    }\n+\n+    /**\n+     * Return an existing GAVDependencyTree if present in the map, otherwise create a new GAVDependencyTree\n+     * and map the GAV to the GAVDependencyTree\n+     *\n+     * @param map\n+     * @param gav\n+     * @return\n+     */\n+    private GAVDependencyTree addGAVDependencyTreeToMapper(Map<GAV, GAVDependencyTree> map, GAV gav) {\n+        return map.computeIfAbsent(gav, (k) -> new GAVDependencyTree(k));\n+    }\n+\n+    private GAV generateGAV(ProjectVersionRef ref) {\n+        return new GAV(ref.getGroupId(), ref.getArtifactId(), ref.getVersionString());\n+    }\n+\n+    private DiscoveryResult getDiscoveryResult(File tempDir, File repoDir, ProjectVersionRef ref)\n+            throws GalleyMavenException, URISyntaxException, CartoDataException {\n+\n+        MavenPomReader mavenPomReader = carto.getGalley().getPomReader();\n+        MavenPomView pomView = mavenPomReader.read(ref, getRepoLocations(tempDir, repoDir));\n+\n+        Location location = new SimpleLocation(\"file:\" + tempDir.getAbsolutePath());\n+        URI src = new URI(location.getUri());\n+\n+        DiscoveryConfig disConf = new DiscoveryConfig(src);\n+        disConf.setIncludeBuildSection(false);\n+        disConf.setIncludeManagedDependencies(false);\n+        disConf.setIncludeManagedPlugins(false);\n+\n+        MavenModelProcessor processor = new MavenModelProcessor();\n+        return processor.readRelationships(pomView, src, disConf);\n+    }\n+\n+    private List<Location> getRepoLocations(File cacheDir, File repoDir) {\n+\n+        Location location = new SimpleLocation(\"file:\" + cacheDir.getAbsolutePath());\n+\n+        List<Location> repoLocations = new LinkedList<>();\n+        // add local location\n+        repoLocations.add(location);\n+\n+        // add maven central location\n+        repoLocations.add(new SimpleLocation(\"central\", \"http://repo.maven.apache.org/maven2/\"));\n+\n+        // add all the repositories mentioned in the pom.xml\n+        List<SimpleLocation> locationsInPom = getLocationsDefinedInPom(repoDir);\n+        repoLocations.addAll(locationsInPom);\n+\n+        return repoLocations;\n+    }\n+\n+    private List<SimpleLocation> getLocationsDefinedInPom(File repoDir) {\n+\n+        List<String> pomFilePaths = findAllPomFiles(repoDir);\n+        List<SimpleLocation> locations = new LinkedList<>();\n+\n+        for (String pom : pomFilePaths) {\n+            Optional<MavenProject> project = pomReader.analyze(new File(pom));\n+            if (project.isPresent() && project.get().getMavenRepositories() != null) {\n+                for (MavenRepository repo : project.get().getMavenRepositories()) {\n+                    locations.add(new SimpleLocation(repo.getId(), repo.getUrl()));\n+                }\n+            }\n+        }","path":"communication/src/main/java/org/jboss/da/communication/pom/PomAnalyzer.java","position":179,"original_position":179,"commit_id":"52dac79ed69b903f161cd749efac9128ea531a73","original_commit_id":"52dac79ed69b903f161cd749efac9128ea531a73","user":{"login":"thescouser89","id":630746,"avatar_url":"https://avatars.githubusercontent.com/u/630746?v=3","gravatar_id":"","url":"https://api.github.com/users/thescouser89","html_url":"https://github.com/thescouser89","followers_url":"https://api.github.com/users/thescouser89/followers","following_url":"https://api.github.com/users/thescouser89/following{/other_user}","gists_url":"https://api.github.com/users/thescouser89/gists{/gist_id}","starred_url":"https://api.github.com/users/thescouser89/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thescouser89/subscriptions","organizations_url":"https://api.github.com/users/thescouser89/orgs","repos_url":"https://api.github.com/users/thescouser89/repos","events_url":"https://api.github.com/users/thescouser89/events{/privacy}","received_events_url":"https://api.github.com/users/thescouser89/received_events","type":"User","site_admin":false},"body":"Actually after re-reading the lambda I think I like my for loop more.","created_at":"2015-09-23T03:49:37Z","updated_at":"2015-09-23T03:49:37Z","html_url":"https://github.com/project-ncl/dependency-analysis/pull/133#discussion_r40169158","pull_request_url":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/133","_links":{"self":{"href":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/comments/40169158"},"html":{"href":"https://github.com/project-ncl/dependency-analysis/pull/133#discussion_r40169158"},"pull_request":{"href":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/133"}}},"pull_request":{"url":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/133","id":45246148,"html_url":"https://github.com/project-ncl/dependency-analysis/pull/133","diff_url":"https://github.com/project-ncl/dependency-analysis/pull/133.diff","patch_url":"https://github.com/project-ncl/dependency-analysis/pull/133.patch","issue_url":"https://api.github.com/repos/project-ncl/dependency-analysis/issues/133","number":133,"state":"open","locked":false,"title":"[DA-114] Analyze local maven repositories and implement '/report/scm' endpoint","user":{"login":"thescouser89","id":630746,"avatar_url":"https://avatars.githubusercontent.com/u/630746?v=3","gravatar_id":"","url":"https://api.github.com/users/thescouser89","html_url":"https://github.com/thescouser89","followers_url":"https://api.github.com/users/thescouser89/followers","following_url":"https://api.github.com/users/thescouser89/following{/other_user}","gists_url":"https://api.github.com/users/thescouser89/gists{/gist_id}","starred_url":"https://api.github.com/users/thescouser89/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thescouser89/subscriptions","organizations_url":"https://api.github.com/users/thescouser89/orgs","repos_url":"https://api.github.com/users/thescouser89/repos","events_url":"https://api.github.com/users/thescouser89/events{/privacy}","received_events_url":"https://api.github.com/users/thescouser89/received_events","type":"User","site_admin":false},"body":"This PR adds support for analysis of a maven project using\r\nCartographer.\r\n\r\nThe '/reports/scm' REST endpoint is also implemented. Note that the\r\navailable version, and best match version for each of the dependencies\r\nin the are not yet provided in the REST endpoint, but will be in the\r\nfuture.\r\n\r\n`SCMRequest` was deleted since it was very similar to `SCMLocator`\r\n\r\nError Handling\r\n--------------\r\n1. The `PomAnalyzer` object will throw a `PomAnalysisException` for any\r\n   errors that occur in the analysis.\r\n\r\n2. The SCM checkout process will throw an `ScmException` error.\r\n\r\n3. AproxConnector's `getDependencyTreeOfRevision` method will throw\r\n   both the `ScmException` and the `PomAnalysisException` if something\r\n   wrong happens while getting the tree of dependencies from an SCM\r\n\r\n4. `ReportsGenerator` will also throw `ScmException` and\r\n   `PomAnalysisException` if something wrong happens while getting the\r\n   tree of dependencies from `AproxConnector`\r\n\r\n5. The method that handle the '/reports/scm' endpoint will catch any\r\n   `ScmException`, or `PomAnalysisException` and show the error message\r\n   in the JSON object returned.","created_at":"2015-09-17T02:34:51Z","updated_at":"2015-09-23T03:49:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b23f76ab641fe2f8bc0a07850b7c78673c4237ce","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/133/commits","review_comments_url":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/133/comments","review_comment_url":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/comments{/number}","comments_url":"https://api.github.com/repos/project-ncl/dependency-analysis/issues/133/comments","statuses_url":"https://api.github.com/repos/project-ncl/dependency-analysis/statuses/52dac79ed69b903f161cd749efac9128ea531a73","head":{"label":"thescouser89:da-114-cartographer-magic","ref":"da-114-cartographer-magic","sha":"52dac79ed69b903f161cd749efac9128ea531a73","user":{"login":"thescouser89","id":630746,"avatar_url":"https://avatars.githubusercontent.com/u/630746?v=3","gravatar_id":"","url":"https://api.github.com/users/thescouser89","html_url":"https://github.com/thescouser89","followers_url":"https://api.github.com/users/thescouser89/followers","following_url":"https://api.github.com/users/thescouser89/following{/other_user}","gists_url":"https://api.github.com/users/thescouser89/gists{/gist_id}","starred_url":"https://api.github.com/users/thescouser89/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thescouser89/subscriptions","organizations_url":"https://api.github.com/users/thescouser89/orgs","repos_url":"https://api.github.com/users/thescouser89/repos","events_url":"https://api.github.com/users/thescouser89/events{/privacy}","received_events_url":"https://api.github.com/users/thescouser89/received_events","type":"User","site_admin":false},"repo":{"id":37862616,"name":"dependency-analysis","full_name":"thescouser89/dependency-analysis","owner":{"login":"thescouser89","id":630746,"avatar_url":"https://avatars.githubusercontent.com/u/630746?v=3","gravatar_id":"","url":"https://api.github.com/users/thescouser89","html_url":"https://github.com/thescouser89","followers_url":"https://api.github.com/users/thescouser89/followers","following_url":"https://api.github.com/users/thescouser89/following{/other_user}","gists_url":"https://api.github.com/users/thescouser89/gists{/gist_id}","starred_url":"https://api.github.com/users/thescouser89/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thescouser89/subscriptions","organizations_url":"https://api.github.com/users/thescouser89/orgs","repos_url":"https://api.github.com/users/thescouser89/repos","events_url":"https://api.github.com/users/thescouser89/events{/privacy}","received_events_url":"https://api.github.com/users/thescouser89/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/thescouser89/dependency-analysis","description":"","fork":true,"url":"https://api.github.com/repos/thescouser89/dependency-analysis","forks_url":"https://api.github.com/repos/thescouser89/dependency-analysis/forks","keys_url":"https://api.github.com/repos/thescouser89/dependency-analysis/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thescouser89/dependency-analysis/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thescouser89/dependency-analysis/teams","hooks_url":"https://api.github.com/repos/thescouser89/dependency-analysis/hooks","issue_events_url":"https://api.github.com/repos/thescouser89/dependency-analysis/issues/events{/number}","events_url":"https://api.github.com/repos/thescouser89/dependency-analysis/events","assignees_url":"https://api.github.com/repos/thescouser89/dependency-analysis/assignees{/user}","branches_url":"https://api.github.com/repos/thescouser89/dependency-analysis/branches{/branch}","tags_url":"https://api.github.com/repos/thescouser89/dependency-analysis/tags","blobs_url":"https://api.github.com/repos/thescouser89/dependency-analysis/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thescouser89/dependency-analysis/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thescouser89/dependency-analysis/git/refs{/sha}","trees_url":"https://api.github.com/repos/thescouser89/dependency-analysis/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thescouser89/dependency-analysis/statuses/{sha}","languages_url":"https://api.github.com/repos/thescouser89/dependency-analysis/languages","stargazers_url":"https://api.github.com/repos/thescouser89/dependency-analysis/stargazers","contributors_url":"https://api.github.com/repos/thescouser89/dependency-analysis/contributors","subscribers_url":"https://api.github.com/repos/thescouser89/dependency-analysis/subscribers","subscription_url":"https://api.github.com/repos/thescouser89/dependency-analysis/subscription","commits_url":"https://api.github.com/repos/thescouser89/dependency-analysis/commits{/sha}","git_commits_url":"https://api.github.com/repos/thescouser89/dependency-analysis/git/commits{/sha}","comments_url":"https://api.github.com/repos/thescouser89/dependency-analysis/comments{/number}","issue_comment_url":"https://api.github.com/repos/thescouser89/dependency-analysis/issues/comments{/number}","contents_url":"https://api.github.com/repos/thescouser89/dependency-analysis/contents/{+path}","compare_url":"https://api.github.com/repos/thescouser89/dependency-analysis/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thescouser89/dependency-analysis/merges","archive_url":"https://api.github.com/repos/thescouser89/dependency-analysis/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thescouser89/dependency-analysis/downloads","issues_url":"https://api.github.com/repos/thescouser89/dependency-analysis/issues{/number}","pulls_url":"https://api.github.com/repos/thescouser89/dependency-analysis/pulls{/number}","milestones_url":"https://api.github.com/repos/thescouser89/dependency-analysis/milestones{/number}","notifications_url":"https://api.github.com/repos/thescouser89/dependency-analysis/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thescouser89/dependency-analysis/labels{/name}","releases_url":"https://api.github.com/repos/thescouser89/dependency-analysis/releases{/id}","created_at":"2015-06-22T15:12:43Z","updated_at":"2015-07-20T18:38:50Z","pushed_at":"2015-09-22T17:24:49Z","git_url":"git://github.com/thescouser89/dependency-analysis.git","ssh_url":"git@github.com:thescouser89/dependency-analysis.git","clone_url":"https://github.com/thescouser89/dependency-analysis.git","svn_url":"https://github.com/thescouser89/dependency-analysis","homepage":null,"size":824,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"project-ncl:master","ref":"master","sha":"2a0bbd9c8137d39c70a61b253511896c049f4f05","user":{"login":"project-ncl","id":9921139,"avatar_url":"https://avatars.githubusercontent.com/u/9921139?v=3","gravatar_id":"","url":"https://api.github.com/users/project-ncl","html_url":"https://github.com/project-ncl","followers_url":"https://api.github.com/users/project-ncl/followers","following_url":"https://api.github.com/users/project-ncl/following{/other_user}","gists_url":"https://api.github.com/users/project-ncl/gists{/gist_id}","starred_url":"https://api.github.com/users/project-ncl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/project-ncl/subscriptions","organizations_url":"https://api.github.com/users/project-ncl/orgs","repos_url":"https://api.github.com/users/project-ncl/repos","events_url":"https://api.github.com/users/project-ncl/events{/privacy}","received_events_url":"https://api.github.com/users/project-ncl/received_events","type":"Organization","site_admin":false},"repo":{"id":37196945,"name":"dependency-analysis","full_name":"project-ncl/dependency-analysis","owner":{"login":"project-ncl","id":9921139,"avatar_url":"https://avatars.githubusercontent.com/u/9921139?v=3","gravatar_id":"","url":"https://api.github.com/users/project-ncl","html_url":"https://github.com/project-ncl","followers_url":"https://api.github.com/users/project-ncl/followers","following_url":"https://api.github.com/users/project-ncl/following{/other_user}","gists_url":"https://api.github.com/users/project-ncl/gists{/gist_id}","starred_url":"https://api.github.com/users/project-ncl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/project-ncl/subscriptions","organizations_url":"https://api.github.com/users/project-ncl/orgs","repos_url":"https://api.github.com/users/project-ncl/repos","events_url":"https://api.github.com/users/project-ncl/events{/privacy}","received_events_url":"https://api.github.com/users/project-ncl/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/project-ncl/dependency-analysis","description":"","fork":false,"url":"https://api.github.com/repos/project-ncl/dependency-analysis","forks_url":"https://api.github.com/repos/project-ncl/dependency-analysis/forks","keys_url":"https://api.github.com/repos/project-ncl/dependency-analysis/keys{/key_id}","collaborators_url":"https://api.github.com/repos/project-ncl/dependency-analysis/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/project-ncl/dependency-analysis/teams","hooks_url":"https://api.github.com/repos/project-ncl/dependency-analysis/hooks","issue_events_url":"https://api.github.com/repos/project-ncl/dependency-analysis/issues/events{/number}","events_url":"https://api.github.com/repos/project-ncl/dependency-analysis/events","assignees_url":"https://api.github.com/repos/project-ncl/dependency-analysis/assignees{/user}","branches_url":"https://api.github.com/repos/project-ncl/dependency-analysis/branches{/branch}","tags_url":"https://api.github.com/repos/project-ncl/dependency-analysis/tags","blobs_url":"https://api.github.com/repos/project-ncl/dependency-analysis/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/project-ncl/dependency-analysis/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/project-ncl/dependency-analysis/git/refs{/sha}","trees_url":"https://api.github.com/repos/project-ncl/dependency-analysis/git/trees{/sha}","statuses_url":"https://api.github.com/repos/project-ncl/dependency-analysis/statuses/{sha}","languages_url":"https://api.github.com/repos/project-ncl/dependency-analysis/languages","stargazers_url":"https://api.github.com/repos/project-ncl/dependency-analysis/stargazers","contributors_url":"https://api.github.com/repos/project-ncl/dependency-analysis/contributors","subscribers_url":"https://api.github.com/repos/project-ncl/dependency-analysis/subscribers","subscription_url":"https://api.github.com/repos/project-ncl/dependency-analysis/subscription","commits_url":"https://api.github.com/repos/project-ncl/dependency-analysis/commits{/sha}","git_commits_url":"https://api.github.com/repos/project-ncl/dependency-analysis/git/commits{/sha}","comments_url":"https://api.github.com/repos/project-ncl/dependency-analysis/comments{/number}","issue_comment_url":"https://api.github.com/repos/project-ncl/dependency-analysis/issues/comments{/number}","contents_url":"https://api.github.com/repos/project-ncl/dependency-analysis/contents/{+path}","compare_url":"https://api.github.com/repos/project-ncl/dependency-analysis/compare/{base}...{head}","merges_url":"https://api.github.com/repos/project-ncl/dependency-analysis/merges","archive_url":"https://api.github.com/repos/project-ncl/dependency-analysis/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/project-ncl/dependency-analysis/downloads","issues_url":"https://api.github.com/repos/project-ncl/dependency-analysis/issues{/number}","pulls_url":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls{/number}","milestones_url":"https://api.github.com/repos/project-ncl/dependency-analysis/milestones{/number}","notifications_url":"https://api.github.com/repos/project-ncl/dependency-analysis/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/project-ncl/dependency-analysis/labels{/name}","releases_url":"https://api.github.com/repos/project-ncl/dependency-analysis/releases{/id}","created_at":"2015-06-10T12:52:57Z","updated_at":"2015-08-04T14:39:03Z","pushed_at":"2015-09-22T17:25:06Z","git_url":"git://github.com/project-ncl/dependency-analysis.git","ssh_url":"git@github.com:project-ncl/dependency-analysis.git","clone_url":"https://github.com/project-ncl/dependency-analysis.git","svn_url":"https://github.com/project-ncl/dependency-analysis","homepage":null,"size":1542,"stargazers_count":2,"watchers_count":2,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":4,"forks":7,"open_issues":4,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/133"},"html":{"href":"https://github.com/project-ncl/dependency-analysis/pull/133"},"issue":{"href":"https://api.github.com/repos/project-ncl/dependency-analysis/issues/133"},"comments":{"href":"https://api.github.com/repos/project-ncl/dependency-analysis/issues/133/comments"},"review_comments":{"href":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/133/comments"},"review_comment":{"href":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/project-ncl/dependency-analysis/pulls/133/commits"},"statuses":{"href":"https://api.github.com/repos/project-ncl/dependency-analysis/statuses/52dac79ed69b903f161cd749efac9128ea531a73"}}}}