{"action":"created","comment":{"url":"https://api.github.com/repos/eclipse/n4js/pulls/comments/183429879","pull_request_review_id":114426202,"id":183429879,"diff_hunk":"@@ -0,0 +1,312 @@\n+/**\n+ * Copyright (c) 2018 NumberFour AG.\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * which accompanies this distribution, and is available at\n+ * http://www.eclipse.org/legal/epl-v10.html\n+ *\n+ * Contributors:\n+ *   NumberFour AG - Initial API and implementation\n+ */\n+package org.eclipse.n4js.ui.external;\n+\n+import static org.eclipse.core.runtime.SubMonitor.convert;\n+\n+import java.util.Collection;\n+import java.util.Collections;\n+import java.util.HashSet;\n+import java.util.Set;\n+import java.util.SortedSet;\n+import java.util.TreeSet;\n+\n+import org.eclipse.core.resources.IMarker;\n+import org.eclipse.core.resources.IProject;\n+import org.eclipse.core.resources.IResource;\n+import org.eclipse.core.runtime.CoreException;\n+import org.eclipse.core.runtime.IProgressMonitor;\n+import org.eclipse.core.runtime.SubMonitor;\n+import org.eclipse.emf.common.util.URI;\n+import org.eclipse.n4js.external.ExternalIndexSynchronizer;\n+import org.eclipse.n4js.external.ExternalLibraryWorkspace;\n+import org.eclipse.n4js.external.ExternalLibraryWorkspace.RegisterResult;\n+import org.eclipse.n4js.external.LibraryChange;\n+import org.eclipse.n4js.external.N4JSExternalProject;\n+import org.eclipse.n4js.external.NpmLogger;\n+import org.eclipse.n4js.projectModel.IN4JSCore;\n+import org.eclipse.n4js.projectModel.IN4JSProject;\n+import org.eclipse.n4js.ui.internal.N4JSEclipseProject;\n+import org.eclipse.n4js.utils.URIUtils;\n+import org.eclipse.n4js.utils.resources.ExternalProject;\n+import org.eclipse.xtext.ui.editor.validation.MarkerCreator;\n+import org.eclipse.xtext.validation.Issue;\n+\n+import com.google.inject.Inject;\n+import com.google.inject.Singleton;\n+\n+/**\n+ * The {@link EclipseExternalIndexSynchronizer} must be used to synchronize the Xtext index with all projects that are\n+ * located in external workspace locations, such as the {@code node_modules} folder for npm projects.\n+ */\n+@Singleton\n+public class EclipseExternalIndexSynchronizer extends ExternalIndexSynchronizer {\n+\t/** Marker code for error when folder node_modules and N4JS index are out of sync */\n+\tpublic static final String NODE_MODULES_OUT_OF_SYNC = \"NODE_MODULES_OUT_OF_SYNC\";\n+\n+\t@Inject\n+\tprivate IN4JSCore core;\n+\n+\t@Inject\n+\tprivate ExternalLibraryWorkspace externalLibraryWorkspace;\n+\n+\t@Inject\n+\tprivate NpmLogger logger;\n+\n+\t/**\n+\t * Call this method to synchronize the information in the Xtext index with all external projects in the external\n+\t * library folders.\n+\t */\n+\t@Override\n+\tpublic void synchronizeNpms(IProgressMonitor monitor) {\n+\t\tsynchronizeNpms(monitor, Collections.emptyList());\n+\t}\n+\n+\t/**\n+\t * Call this method to synchronize the information in the Xtext index with all external projects in the external\n+\t * library folders.\n+\t */\n+\t@Override\n+\tpublic void synchronizeNpms(IProgressMonitor monitor, Collection<LibraryChange> forcedChangeSet) {\n+\t\tSubMonitor subMonitor = convert(monitor, 1);\n+\n+\t\ttry {\n+\t\t\tCollection<LibraryChange> changeSet = identifyChangeSet(forcedChangeSet);\n+\t\t\tRegisterResult cleanResults = cleanOutdatedIndex(subMonitor, changeSet);\n+\n+\t\t\t// Updates available projects in: IN4JSCore, ExternalLibraryWorkspace, N4JSModel, ExternalProjectProvider\n+\t\t\texternalLibraryWorkspace.updateState();\n+\n+\t\t\tsynchronizeIndex(subMonitor, changeSet, cleanResults);\n+\n+\t\t\t// clean error markers 'out-of-sync'\n+\t\t\tsetOutOfSyncMarkers(false);\n+\n+\t\t} catch (Throwable t) {\n+\t\t\tcheckAndSetOutOfSyncMarkers();\n+\t\t\tthrow t;\n+\t\t} finally {\n+\t\t\tsubMonitor.done();\n+\t\t}\n+\t}\n+\n+\t/**\n+\t * Call this method when the content of the {@code node_modules} folder changed. It must be called before\n+\t * {@link ExternalLibraryWorkspace#updateState()} adapted these changes. Otherwise the clean operation is not\n+\t * possible anymore, since the projects to clean will be removed from the {@link ExternalLibraryWorkspace} instance.\n+\t */\n+\tprivate RegisterResult cleanOutdatedIndex(IProgressMonitor monitor, Collection<LibraryChange> changeSet) {\n+\t\ttry {\n+\t\t\tmonitor.setTaskName(\"Cleaning new projects...\");\n+\t\t\tSet<URI> toBeRemovedProjects = getToBeRemovedProjects(changeSet);\n+\t\t\tRegisterResult cleanResults = externalLibraryWorkspace.deregisterProjects(monitor, toBeRemovedProjects);\n+\t\t\tprintRegisterResults(cleanResults, \"cleaned\");\n+\n+\t\t\treturn cleanResults;\n+\t\t} finally {\n+\t\t\tmonitor.done();\n+\t\t}\n+\t}\n+\n+\t/**\n+\t * Call this method after the {@link ExternalLibraryWorkspace#updateState()} adapted the changes of the\n+\t * {@code node_modules} folder. Due to this adaption, new folders are already represented as external projects and\n+\t * can be build and added to the index.\n+\t */\n+\tprivate void synchronizeIndex(IProgressMonitor monitor, Collection<LibraryChange> changeSet,\n+\t\t\tRegisterResult cleanResults) {\n+\t\ttry {\n+\n+\t\t\tSet<URI> toBeUpdated = getToBeBuildProjects(changeSet);\n+\t\t\tfor (URI cleanedPrjLoc : cleanResults.externalProjectsDone) {\n+\t\t\t\tExternalProject project = externalLibraryWorkspace.getProject(cleanedPrjLoc);\n+\t\t\t\tif (project != null) {\n+\t\t\t\t\ttoBeUpdated.add(cleanedPrjLoc);\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tmonitor.setTaskName(\"Building new projects...\");\n+\t\t\tRegisterResult buildResult = externalLibraryWorkspace.registerProjects(monitor, toBeUpdated);\n+\t\t\tprintRegisterResults(buildResult, \"built\");\n+\n+\t\t\tSet<URI> toBeScheduled = new HashSet<>();\n+\t\t\ttoBeScheduled.addAll(cleanResults.affectedWorkspaceProjects);\n+\t\t\ttoBeScheduled.addAll(buildResult.affectedWorkspaceProjects);\n+\t\t\texternalLibraryWorkspace.scheduleWorkspaceProjects(monitor, toBeScheduled);\n+\n+\t\t} finally {\n+\t\t\tmonitor.done();\n+\t\t}\n+\t}\n+\n+\t/**\n+\t * Call this method to re-index all external libraries. This means: All external libraries are cleaned and re-build.\n+\t */\n+\t@Override\n+\tpublic void reindexAllExternalProjects(IProgressMonitor monitor) {\n+\t\ttry {\n+\t\t\tSubMonitor subMonitor = SubMonitor.convert(monitor, 2);\n+\n+\t\t\tmonitor.setTaskName(\"Cleaning all projects...\");\n+\t\t\tRegisterResult cleanResult = externalLibraryWorkspace.deregisterAllProjects(monitor);\n+\t\t\tprintRegisterResults(cleanResult, \"clean\");\n+\t\t\tsubMonitor.worked(1);\n+\n+\t\t\t// Updates available projects in: IN4JSCore, ExternalLibraryWorkspace, N4JSModel, ExternalProjectProvider\n+\t\t\texternalLibraryWorkspace.updateState();\n+\n+\t\t\tSet<URI> toBeReindexed = new HashSet<>();\n+\t\t\tfor (N4JSExternalProject n4ExtProject : externalLibraryWorkspace.getProjects()) {\n+\t\t\t\tURI uri = URIUtils.toFileUri(n4ExtProject.getLocationURI());\n+\t\t\t\ttoBeReindexed.add(uri);\n+\t\t\t}\n+\n+\t\t\tmonitor.setTaskName(\"Building new projects...\");\n+\t\t\tRegisterResult buildResult = externalLibraryWorkspace.registerProjects(monitor, toBeReindexed);\n+\t\t\tprintRegisterResults(buildResult, \"built\");\n+\t\t\tsubMonitor.worked(1);\n+\n+\t\t\tSet<URI> toBeScheduled = new HashSet<>();\n+\t\t\ttoBeScheduled.addAll(cleanResult.affectedWorkspaceProjects);\n+\t\t\ttoBeScheduled.addAll(buildResult.affectedWorkspaceProjects);\n+\t\t\texternalLibraryWorkspace.scheduleWorkspaceProjects(monitor, toBeScheduled);\n+\n+\t\t\t// clean error markers 'out-of-sync'\n+\t\t\tsetOutOfSyncMarkers(false);\n+\n+\t\t} catch (Throwable t) {\n+\t\t\tcheckAndSetOutOfSyncMarkers();\n+\t\t\tthrow t;\n+\t\t} finally {\n+\t\t\tmonitor.done();\n+\t\t}\n+\t}\n+\n+\tprivate Set<URI> getToBeRemovedProjects(Collection<LibraryChange> changeSet) {\n+\t\tSet<URI> toBeDeleted = new HashSet<>();\n+\t\tfor (LibraryChange change : changeSet) {\n+\n+\t\t\tswitch (change.type) {\n+\t\t\tcase Added:\n+\t\t\t\tExternalProject project = externalLibraryWorkspace.getProject(change.name);\n+\t\t\t\tif (project != null) {\n+\t\t\t\t\t// The added project will shadow an existing project.\n+\t\t\t\t\t// Hence, the existing project must be cleaned.\n+\t\t\t\t\ttoBeDeleted.add(change.location);\n+\t\t\t\t}\n+\t\t\t\tbreak;\n+\n+\t\t\tcase Updated:\n+\t\t\tcase Removed:\n+\t\t\t\ttoBeDeleted.add(change.location);\n+\t\t\t\tbreak;\n+\n+\t\t\tcase Install:\n+\t\t\tcase Uninstall:\n+\t\t\t\t// nothing to do\n+\t\t\t}\n+\t\t}\n+\t\treturn toBeDeleted;\n+\t}\n+\n+\tprivate Set<URI> getToBeBuildProjects(Collection<LibraryChange> changeSet) {","path":"plugins/org.eclipse.n4js.ui/src/org/eclipse/n4js/ui/external/EclipseExternalIndexSynchronizer.java","position":219,"original_position":220,"commit_id":"442ba7cded3614e8ebfc7ca1f323e17f1d3d1984","original_commit_id":"d10c130876950e76c3a5d08f922a167c95449be1","user":{"login":"mmews-n4","id":20560257,"avatar_url":"https://avatars3.githubusercontent.com/u/20560257?v=4","gravatar_id":"","url":"https://api.github.com/users/mmews-n4","html_url":"https://github.com/mmews-n4","followers_url":"https://api.github.com/users/mmews-n4/followers","following_url":"https://api.github.com/users/mmews-n4/following{/other_user}","gists_url":"https://api.github.com/users/mmews-n4/gists{/gist_id}","starred_url":"https://api.github.com/users/mmews-n4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mmews-n4/subscriptions","organizations_url":"https://api.github.com/users/mmews-n4/orgs","repos_url":"https://api.github.com/users/mmews-n4/repos","events_url":"https://api.github.com/users/mmews-n4/events{/privacy}","received_events_url":"https://api.github.com/users/mmews-n4/received_events","type":"User","site_admin":false},"body":"thanks, but yeah...","created_at":"2018-04-23T15:07:33Z","updated_at":"2018-04-23T15:07:33Z","html_url":"https://github.com/eclipse/n4js/pull/703#discussion_r183429879","pull_request_url":"https://api.github.com/repos/eclipse/n4js/pulls/703","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/eclipse/n4js/pulls/comments/183429879"},"html":{"href":"https://github.com/eclipse/n4js/pull/703#discussion_r183429879"},"pull_request":{"href":"https://api.github.com/repos/eclipse/n4js/pulls/703"}},"in_reply_to_id":179782925},"pull_request":{"url":"https://api.github.com/repos/eclipse/n4js/pulls/703","id":177469507,"html_url":"https://github.com/eclipse/n4js/pull/703","diff_url":"https://github.com/eclipse/n4js/pull/703.diff","patch_url":"https://github.com/eclipse/n4js/pull/703.patch","issue_url":"https://api.github.com/repos/eclipse/n4js/issues/703","number":703,"state":"closed","locked":false,"title":"GH-653b: As a user I need better error reporting for external libraries and first changes to support user access on node_modules folder ","user":{"login":"mmews-n4","id":20560257,"avatar_url":"https://avatars3.githubusercontent.com/u/20560257?v=4","gravatar_id":"","url":"https://api.github.com/users/mmews-n4","html_url":"https://github.com/mmews-n4","followers_url":"https://api.github.com/users/mmews-n4/followers","following_url":"https://api.github.com/users/mmews-n4/following{/other_user}","gists_url":"https://api.github.com/users/mmews-n4/gists{/gist_id}","starred_url":"https://api.github.com/users/mmews-n4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mmews-n4/subscriptions","organizations_url":"https://api.github.com/users/mmews-n4/orgs","repos_url":"https://api.github.com/users/mmews-n4/repos","events_url":"https://api.github.com/users/mmews-n4/events{/privacy}","received_events_url":"https://api.github.com/users/mmews-n4/received_events","type":"User","site_admin":false},"body":"follow-up of: #673\r\n\r\n**changes**\r\n* changed library manager to detect out-of-sync folder and index\r\n  * synchronization after install/uninstall npms\r\n  * synchronization detects change set\r\n  * update of versions supported\r\n  * \"reload libraries\" now reloads all external project from scratch and wipes them off the Xtext index first\r\n  * factored out NPM commands\r\n* fixed all package.json files regarding `author` and `repository` information\r\n* made library manger actions cancelable\r\n* added/improved dialogs that show more information about occurred errors\r\n* adjusted dependency management between shared and language (N4JS)\r\n  * introduced delegation to N4JS-language injector\r\n* added fast fail when Guice fails on startup: N4JSGracefulActivator\r\n* library manager supports no-network when uninstalling or installing from cache\r\n* org.eclipse.emf.common.util.URI does not implement `equals()` --> use `URIUtils.equals()`\r\n* Refresh (F5) in the project explorer will check if node_modules is out of sync","created_at":"2018-03-26T14:44:44Z","updated_at":"2018-04-23T15:07:33Z","closed_at":"2018-04-10T10:02:38Z","merged_at":"2018-04-10T10:02:38Z","merge_commit_sha":"61c458523e97c38ba070c66e6b8bf125e3eb77f6","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":645469115,"url":"https://api.github.com/repos/eclipse/n4js/labels/in%20progress","name":"in progress","color":"0052cc","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/eclipse/n4js/pulls/703/commits","review_comments_url":"https://api.github.com/repos/eclipse/n4js/pulls/703/comments","review_comment_url":"https://api.github.com/repos/eclipse/n4js/pulls/comments{/number}","comments_url":"https://api.github.com/repos/eclipse/n4js/issues/703/comments","statuses_url":"https://api.github.com/repos/eclipse/n4js/statuses/442ba7cded3614e8ebfc7ca1f323e17f1d3d1984","head":{"label":"eclipse:GH-653b","ref":"GH-653b","sha":"442ba7cded3614e8ebfc7ca1f323e17f1d3d1984","user":{"login":"eclipse","id":56974,"avatar_url":"https://avatars1.githubusercontent.com/u/56974?v=4","gravatar_id":"","url":"https://api.github.com/users/eclipse","html_url":"https://github.com/eclipse","followers_url":"https://api.github.com/users/eclipse/followers","following_url":"https://api.github.com/users/eclipse/following{/other_user}","gists_url":"https://api.github.com/users/eclipse/gists{/gist_id}","starred_url":"https://api.github.com/users/eclipse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eclipse/subscriptions","organizations_url":"https://api.github.com/users/eclipse/orgs","repos_url":"https://api.github.com/users/eclipse/repos","events_url":"https://api.github.com/users/eclipse/events{/privacy}","received_events_url":"https://api.github.com/users/eclipse/received_events","type":"Organization","site_admin":false},"repo":{"id":87847606,"name":"n4js","full_name":"eclipse/n4js","owner":{"login":"eclipse","id":56974,"avatar_url":"https://avatars1.githubusercontent.com/u/56974?v=4","gravatar_id":"","url":"https://api.github.com/users/eclipse","html_url":"https://github.com/eclipse","followers_url":"https://api.github.com/users/eclipse/followers","following_url":"https://api.github.com/users/eclipse/following{/other_user}","gists_url":"https://api.github.com/users/eclipse/gists{/gist_id}","starred_url":"https://api.github.com/users/eclipse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eclipse/subscriptions","organizations_url":"https://api.github.com/users/eclipse/orgs","repos_url":"https://api.github.com/users/eclipse/repos","events_url":"https://api.github.com/users/eclipse/events{/privacy}","received_events_url":"https://api.github.com/users/eclipse/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/eclipse/n4js","description":null,"fork":false,"url":"https://api.github.com/repos/eclipse/n4js","forks_url":"https://api.github.com/repos/eclipse/n4js/forks","keys_url":"https://api.github.com/repos/eclipse/n4js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/eclipse/n4js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/eclipse/n4js/teams","hooks_url":"https://api.github.com/repos/eclipse/n4js/hooks","issue_events_url":"https://api.github.com/repos/eclipse/n4js/issues/events{/number}","events_url":"https://api.github.com/repos/eclipse/n4js/events","assignees_url":"https://api.github.com/repos/eclipse/n4js/assignees{/user}","branches_url":"https://api.github.com/repos/eclipse/n4js/branches{/branch}","tags_url":"https://api.github.com/repos/eclipse/n4js/tags","blobs_url":"https://api.github.com/repos/eclipse/n4js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/eclipse/n4js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/eclipse/n4js/git/refs{/sha}","trees_url":"https://api.github.com/repos/eclipse/n4js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/eclipse/n4js/statuses/{sha}","languages_url":"https://api.github.com/repos/eclipse/n4js/languages","stargazers_url":"https://api.github.com/repos/eclipse/n4js/stargazers","contributors_url":"https://api.github.com/repos/eclipse/n4js/contributors","subscribers_url":"https://api.github.com/repos/eclipse/n4js/subscribers","subscription_url":"https://api.github.com/repos/eclipse/n4js/subscription","commits_url":"https://api.github.com/repos/eclipse/n4js/commits{/sha}","git_commits_url":"https://api.github.com/repos/eclipse/n4js/git/commits{/sha}","comments_url":"https://api.github.com/repos/eclipse/n4js/comments{/number}","issue_comment_url":"https://api.github.com/repos/eclipse/n4js/issues/comments{/number}","contents_url":"https://api.github.com/repos/eclipse/n4js/contents/{+path}","compare_url":"https://api.github.com/repos/eclipse/n4js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/eclipse/n4js/merges","archive_url":"https://api.github.com/repos/eclipse/n4js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/eclipse/n4js/downloads","issues_url":"https://api.github.com/repos/eclipse/n4js/issues{/number}","pulls_url":"https://api.github.com/repos/eclipse/n4js/pulls{/number}","milestones_url":"https://api.github.com/repos/eclipse/n4js/milestones{/number}","notifications_url":"https://api.github.com/repos/eclipse/n4js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/eclipse/n4js/labels{/name}","releases_url":"https://api.github.com/repos/eclipse/n4js/releases{/id}","deployments_url":"https://api.github.com/repos/eclipse/n4js/deployments","created_at":"2017-04-10T19:05:37Z","updated_at":"2018-04-23T15:01:45Z","pushed_at":"2018-04-23T15:01:46Z","git_url":"git://github.com/eclipse/n4js.git","ssh_url":"git@github.com:eclipse/n4js.git","clone_url":"https://github.com/eclipse/n4js.git","svn_url":"https://github.com/eclipse/n4js","homepage":null,"size":47200,"stargazers_count":7,"watchers_count":7,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":191,"license":{"key":"epl-1.0","name":"Eclipse Public License 1.0","spdx_id":"EPL-1.0","url":"https://api.github.com/licenses/epl-1.0"},"forks":6,"open_issues":191,"watchers":7,"default_branch":"master"}},"base":{"label":"eclipse:master","ref":"master","sha":"b885e3c1e0872a60cc71ce557cc201a4663c4619","user":{"login":"eclipse","id":56974,"avatar_url":"https://avatars1.githubusercontent.com/u/56974?v=4","gravatar_id":"","url":"https://api.github.com/users/eclipse","html_url":"https://github.com/eclipse","followers_url":"https://api.github.com/users/eclipse/followers","following_url":"https://api.github.com/users/eclipse/following{/other_user}","gists_url":"https://api.github.com/users/eclipse/gists{/gist_id}","starred_url":"https://api.github.com/users/eclipse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eclipse/subscriptions","organizations_url":"https://api.github.com/users/eclipse/orgs","repos_url":"https://api.github.com/users/eclipse/repos","events_url":"https://api.github.com/users/eclipse/events{/privacy}","received_events_url":"https://api.github.com/users/eclipse/received_events","type":"Organization","site_admin":false},"repo":{"id":87847606,"name":"n4js","full_name":"eclipse/n4js","owner":{"login":"eclipse","id":56974,"avatar_url":"https://avatars1.githubusercontent.com/u/56974?v=4","gravatar_id":"","url":"https://api.github.com/users/eclipse","html_url":"https://github.com/eclipse","followers_url":"https://api.github.com/users/eclipse/followers","following_url":"https://api.github.com/users/eclipse/following{/other_user}","gists_url":"https://api.github.com/users/eclipse/gists{/gist_id}","starred_url":"https://api.github.com/users/eclipse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eclipse/subscriptions","organizations_url":"https://api.github.com/users/eclipse/orgs","repos_url":"https://api.github.com/users/eclipse/repos","events_url":"https://api.github.com/users/eclipse/events{/privacy}","received_events_url":"https://api.github.com/users/eclipse/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/eclipse/n4js","description":null,"fork":false,"url":"https://api.github.com/repos/eclipse/n4js","forks_url":"https://api.github.com/repos/eclipse/n4js/forks","keys_url":"https://api.github.com/repos/eclipse/n4js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/eclipse/n4js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/eclipse/n4js/teams","hooks_url":"https://api.github.com/repos/eclipse/n4js/hooks","issue_events_url":"https://api.github.com/repos/eclipse/n4js/issues/events{/number}","events_url":"https://api.github.com/repos/eclipse/n4js/events","assignees_url":"https://api.github.com/repos/eclipse/n4js/assignees{/user}","branches_url":"https://api.github.com/repos/eclipse/n4js/branches{/branch}","tags_url":"https://api.github.com/repos/eclipse/n4js/tags","blobs_url":"https://api.github.com/repos/eclipse/n4js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/eclipse/n4js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/eclipse/n4js/git/refs{/sha}","trees_url":"https://api.github.com/repos/eclipse/n4js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/eclipse/n4js/statuses/{sha}","languages_url":"https://api.github.com/repos/eclipse/n4js/languages","stargazers_url":"https://api.github.com/repos/eclipse/n4js/stargazers","contributors_url":"https://api.github.com/repos/eclipse/n4js/contributors","subscribers_url":"https://api.github.com/repos/eclipse/n4js/subscribers","subscription_url":"https://api.github.com/repos/eclipse/n4js/subscription","commits_url":"https://api.github.com/repos/eclipse/n4js/commits{/sha}","git_commits_url":"https://api.github.com/repos/eclipse/n4js/git/commits{/sha}","comments_url":"https://api.github.com/repos/eclipse/n4js/comments{/number}","issue_comment_url":"https://api.github.com/repos/eclipse/n4js/issues/comments{/number}","contents_url":"https://api.github.com/repos/eclipse/n4js/contents/{+path}","compare_url":"https://api.github.com/repos/eclipse/n4js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/eclipse/n4js/merges","archive_url":"https://api.github.com/repos/eclipse/n4js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/eclipse/n4js/downloads","issues_url":"https://api.github.com/repos/eclipse/n4js/issues{/number}","pulls_url":"https://api.github.com/repos/eclipse/n4js/pulls{/number}","milestones_url":"https://api.github.com/repos/eclipse/n4js/milestones{/number}","notifications_url":"https://api.github.com/repos/eclipse/n4js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/eclipse/n4js/labels{/name}","releases_url":"https://api.github.com/repos/eclipse/n4js/releases{/id}","deployments_url":"https://api.github.com/repos/eclipse/n4js/deployments","created_at":"2017-04-10T19:05:37Z","updated_at":"2018-04-23T15:01:45Z","pushed_at":"2018-04-23T15:01:46Z","git_url":"git://github.com/eclipse/n4js.git","ssh_url":"git@github.com:eclipse/n4js.git","clone_url":"https://github.com/eclipse/n4js.git","svn_url":"https://github.com/eclipse/n4js","homepage":null,"size":47200,"stargazers_count":7,"watchers_count":7,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":191,"license":{"key":"epl-1.0","name":"Eclipse Public License 1.0","spdx_id":"EPL-1.0","url":"https://api.github.com/licenses/epl-1.0"},"forks":6,"open_issues":191,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/eclipse/n4js/pulls/703"},"html":{"href":"https://github.com/eclipse/n4js/pull/703"},"issue":{"href":"https://api.github.com/repos/eclipse/n4js/issues/703"},"comments":{"href":"https://api.github.com/repos/eclipse/n4js/issues/703/comments"},"review_comments":{"href":"https://api.github.com/repos/eclipse/n4js/pulls/703/comments"},"review_comment":{"href":"https://api.github.com/repos/eclipse/n4js/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/eclipse/n4js/pulls/703/commits"},"statuses":{"href":"https://api.github.com/repos/eclipse/n4js/statuses/442ba7cded3614e8ebfc7ca1f323e17f1d3d1984"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"mmews-n4"}}