{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/52806562","id":52806562,"diff_hunk":"@@ -0,0 +1,298 @@\n+﻿// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.\n+\n+using System;\n+using System.Collections.Concurrent;\n+using System.Collections.Generic;\n+using System.Composition;\n+using System.Diagnostics;\n+using System.Linq;\n+using System.Threading;\n+using System.Threading.Tasks;\n+using Microsoft.CodeAnalysis;\n+using Microsoft.CodeAnalysis.Editor.Shared.Utilities;\n+using Microsoft.CodeAnalysis.Host;\n+using Microsoft.CodeAnalysis.Host.Mef;\n+using Microsoft.CodeAnalysis.Packaging;\n+using Microsoft.CodeAnalysis.Shared.Utilities;\n+using Microsoft.VisualStudio.ComponentModelHost;\n+using Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem;\n+using Microsoft.VisualStudio.Shell.Interop;\n+using NuGet.VisualStudio;\n+using Roslyn.Utilities;\n+\n+namespace Microsoft.VisualStudio.LanguageServices.Packaging\n+{\n+    [ExportWorkspaceServiceFactory(typeof(IPackageInstallerService)), Shared]\n+    internal class PackageInstallerServiceFactory : IWorkspaceServiceFactory\n+    {\n+        public IWorkspaceService CreateService(HostWorkspaceServices workspaceServices)\n+        {\n+            return new PackageInstallerService();\n+        }\n+    }\n+\n+    internal class PackageInstallerService : ForegroundThreadAffinitizedObject, IPackageInstallerService\n+    {\n+        private readonly object _gate = new object();\n+\n+        private VisualStudioWorkspaceImpl _workspace;\n+        private IVsPackageInstallerServices _packageInstallerServices;\n+        private IVsPackageInstaller _packageInstaller;\n+\n+        private CancellationTokenSource _tokenSource = new CancellationTokenSource();\n+        private bool _solutionChanged;\n+        private HashSet<ProjectId> _changedProjects = new HashSet<ProjectId>();\n+\n+        private readonly ConcurrentDictionary<ProjectId, Dictionary<string, string>> _projectToInstalledPackageAndVersion =\n+            new ConcurrentDictionary<ProjectId, Dictionary<string, string>>();\n+\n+        public bool TryInstallPackage(Workspace workspace, ProjectId projectId, string packageName, string versionOpt)\n+        {\n+            this.AssertIsForeground();\n+\n+            if (workspace == _workspace && _workspace != null && _packageInstallerServices != null)\n+            {\n+                var dte = _workspace.GetVsService<SDTE, EnvDTE.DTE>();\n+                var dteProject = _workspace.TryGetDTEProject(projectId);\n+                if (dteProject != null)\n+                {\n+                    try\n+                    {\n+                        if (!_packageInstallerServices.IsPackageInstalled(dteProject, packageName))\n+                        {\n+                            dte.StatusBar.Text = string.Format(ServicesVSResources.Installing_package_0, packageName);\n+                            _packageInstaller.InstallPackage(source: null, project: dteProject, packageId: packageName, version: versionOpt, ignoreDependencies: false);\n+                            dte.StatusBar.Text = string.Format(ServicesVSResources.Installing_package_0_completed, packageName);\n+                        }\n+\n+                        return true;\n+                    }\n+                    catch\n+                    {\n+                        dte.StatusBar.Text = string.Format(ServicesVSResources.Installing_package_0_failed, packageName);\n+                    }\n+                }\n+            }\n+\n+            return false;\n+        }\n+\n+        internal void Connect(VisualStudioWorkspaceImpl workspace)\n+        {\n+            this.AssertIsForeground();\n+\n+            _workspace = workspace;\n+\n+            var componentModel = workspace.GetVsService<SComponentModel, IComponentModel>();\n+            _packageInstallerServices = componentModel.GetService<IVsPackageInstallerServices>();\n+            _packageInstaller = componentModel.GetService<IVsPackageInstaller>();\n+\n+            _workspace.WorkspaceChanged += OnWorkspaceChanged;\n+        }\n+\n+        internal void Disconnect(VisualStudioWorkspaceImpl workspace)\n+        {\n+            this.AssertIsForeground();\n+\n+            Debug.Assert(workspace == _workspace);\n+            _workspace.WorkspaceChanged -= OnWorkspaceChanged;\n+            _workspace = null;\n+        }\n+\n+        private void OnWorkspaceChanged(object sender, WorkspaceChangeEventArgs e)\n+        {\n+            // Can be called on any thread.\n+            bool localSolutionChanged = false;\n+            ProjectId localChangedProject = null;\n+            switch (e.Kind)\n+            {\n+                default:\n+                    // Nothing to do for any other events.\n+                    return;\n+                case WorkspaceChangeKind.ProjectAdded:\n+                case WorkspaceChangeKind.ProjectChanged:\n+                case WorkspaceChangeKind.ProjectReloaded:\n+                case WorkspaceChangeKind.ProjectRemoved:\n+                    localChangedProject = e.ProjectId;\n+                    break;\n+\n+                case WorkspaceChangeKind.SolutionAdded:\n+                case WorkspaceChangeKind.SolutionChanged:\n+                case WorkspaceChangeKind.SolutionCleared:\n+                case WorkspaceChangeKind.SolutionReloaded:\n+                case WorkspaceChangeKind.SolutionRemoved:\n+                    localSolutionChanged = true;\n+                    break;\n+            }\n+\n+            lock (_gate)\n+            {\n+                // Cancel any existing update task.\n+                _tokenSource.Cancel();\n+                _tokenSource = new CancellationTokenSource();\n+\n+                _solutionChanged |= localSolutionChanged;\n+                if (localChangedProject != null)\n+                {\n+                    _changedProjects.Add(localChangedProject);\n+                }\n+\n+                // Because we may get a lot of events, we attempt to throttle things so that\n+                // we only update our nuget information once a second has passed.\n+                var cancellationToken = _tokenSource.Token;\n+                Task.Delay(TimeSpan.FromSeconds(1), cancellationToken)\n+                    .ContinueWith(_ => OnWorkspaceChangedOnForeground(cancellationToken), cancellationToken, TaskContinuationOptions.OnlyOnRanToCompletion, this.ForegroundTaskScheduler);\n+            }\n+        }\n+\n+        private void OnWorkspaceChangedOnForeground(CancellationToken cancellationToken)\n+        {\n+            this.AssertIsForeground();\n+            if (cancellationToken.IsCancellationRequested)\n+            {\n+                return;\n+            }\n+\n+            if (_workspace == null || _packageInstallerServices == null)\n+            {\n+                return;\n+            }\n+\n+            var solution = _workspace.CurrentSolution;\n+            ProjectId projectId;\n+            bool clearAllData;\n+            DequeueNextProject(solution, out projectId, out clearAllData);\n+\n+            if (clearAllData)\n+            {\n+                // Just clear out everything we have and start over in the case of a solution change.\n+                _projectToInstalledPackageAndVersion.Clear();\n+            }\n+\n+            if (projectId == null)\n+            {\n+                // No project to process, nothing to do.\n+                return;\n+            }\n+\n+            // Process this single project.\n+            ProcessProjectChange(solution, projectId);\n+\n+            // After processing this single project, yield so the foreground thread\n+            // can do more work.  Then go and loop again so we can process the \n+            // rest of the projects.\n+            Task.Factory.SafeStartNew(\n+                () => OnWorkspaceChangedOnForeground(cancellationToken), cancellationToken, ForegroundTaskScheduler);\n+        }\n+\n+        private void DequeueNextProject(Solution solution, out ProjectId projectId, out bool clearAllData)\n+        {\n+            this.AssertIsForeground();\n+\n+            lock (_gate)\n+            {\n+                // If we detected a solution change, then add all projects to the list of projects\n+                // to process.\n+                clearAllData = _solutionChanged;\n+                if (_solutionChanged)\n+                {\n+                    _changedProjects.AddRange(solution.ProjectIds);\n+                }\n+\n+                _solutionChanged = false;\n+\n+                // Remove and return the first project in the list.\n+                projectId = _changedProjects.FirstOrDefault();\n+                _changedProjects.Remove(projectId);\n+            }\n+        }\n+\n+        private void ProcessProjectChange(Solution solution, ProjectId projectId)\n+        {\n+            this.AssertIsForeground();\n+\n+            // Remove anything we have associated with this project.\n+            Dictionary<string, string> installedPackages;\n+            _projectToInstalledPackageAndVersion.TryRemove(projectId, out installedPackages);","path":"src/VisualStudio/Core/Def/Packaging/PackageInstallerServiceFactory.cs","position":216,"original_position":216,"commit_id":"d35b2e9645aa6e04352d019e08f8d579aebd285e","original_commit_id":"72f2e064bc975039d384dc29aff92eb5312ef901","user":{"login":"dpoeschl","id":235241,"avatar_url":"https://avatars.githubusercontent.com/u/235241?v=3","gravatar_id":"","url":"https://api.github.com/users/dpoeschl","html_url":"https://github.com/dpoeschl","followers_url":"https://api.github.com/users/dpoeschl/followers","following_url":"https://api.github.com/users/dpoeschl/following{/other_user}","gists_url":"https://api.github.com/users/dpoeschl/gists{/gist_id}","starred_url":"https://api.github.com/users/dpoeschl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dpoeschl/subscriptions","organizations_url":"https://api.github.com/users/dpoeschl/orgs","repos_url":"https://api.github.com/users/dpoeschl/repos","events_url":"https://api.github.com/users/dpoeschl/events{/privacy}","received_events_url":"https://api.github.com/users/dpoeschl/received_events","type":"User","site_admin":false},"body":"Can't you just do `.Remove(projectId)`? and not have the used `installedPackages` return value?","created_at":"2016-02-12T22:21:38Z","updated_at":"2016-02-12T22:21:38Z","html_url":"https://github.com/dotnet/roslyn/pull/8471#discussion_r52806562","pull_request_url":"https://api.github.com/repos/dotnet/roslyn/pulls/8471","_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/52806562"},"html":{"href":"https://github.com/dotnet/roslyn/pull/8471#discussion_r52806562"},"pull_request":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/8471"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/8471","id":58681293,"html_url":"https://github.com/dotnet/roslyn/pull/8471","diff_url":"https://github.com/dotnet/roslyn/pull/8471.diff","patch_url":"https://github.com/dotnet/roslyn/pull/8471.patch","issue_url":"https://api.github.com/repos/dotnet/roslyn/issues/8471","number":8471,"state":"open","locked":false,"title":"Add support for adding NuGet references through add-using.","user":{"login":"CyrusNajmabadi","id":4564579,"avatar_url":"https://avatars.githubusercontent.com/u/4564579?v=3","gravatar_id":"","url":"https://api.github.com/users/CyrusNajmabadi","html_url":"https://github.com/CyrusNajmabadi","followers_url":"https://api.github.com/users/CyrusNajmabadi/followers","following_url":"https://api.github.com/users/CyrusNajmabadi/following{/other_user}","gists_url":"https://api.github.com/users/CyrusNajmabadi/gists{/gist_id}","starred_url":"https://api.github.com/users/CyrusNajmabadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CyrusNajmabadi/subscriptions","organizations_url":"https://api.github.com/users/CyrusNajmabadi/orgs","repos_url":"https://api.github.com/users/CyrusNajmabadi/repos","events_url":"https://api.github.com/users/CyrusNajmabadi/events{/privacy}","received_events_url":"https://api.github.com/users/CyrusNajmabadi/received_events","type":"User","site_admin":false},"body":"I recommend reading this change one commit at a time.\r\n\r\nThis change implements the 'Add NuGet reference' feature augmentation to Add-Using.  There are several components to this:\r\n\r\n1. A local DB called 'Elfie' which is used to store information about types from nuget that we can query locally.\r\n2. A patching process that keeps this local database up to date.\r\n3. New usage of the NuGet.VisualStudio package to query about the current solution state as well as install NuGet packages.\r\n4. Augmentation of the Add-Using feature to query the database and offer to install packages which may resolve the current issue.\r\n5. An opt-in dialog to allow the user to state that they want to search NuGet package for ones that might have the type reference we're trying to fix.\r\n\r\nNote: this change was a massive rebasing of an original 100+ commit slog.  I've tried to break things up into nice, reasonably contained, pieces.  However, it may be the case that some changes may be slightly spread over multiple commits.  Hopefully this is not too difficult to understand.","created_at":"2016-02-08T23:04:46Z","updated_at":"2016-02-12T22:21:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e87179af71780df8ba73d8a32e4a209e2c7ff1ce","assignee":{"login":"jmarolf","id":9797472,"avatar_url":"https://avatars.githubusercontent.com/u/9797472?v=3","gravatar_id":"","url":"https://api.github.com/users/jmarolf","html_url":"https://github.com/jmarolf","followers_url":"https://api.github.com/users/jmarolf/followers","following_url":"https://api.github.com/users/jmarolf/following{/other_user}","gists_url":"https://api.github.com/users/jmarolf/gists{/gist_id}","starred_url":"https://api.github.com/users/jmarolf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmarolf/subscriptions","organizations_url":"https://api.github.com/users/jmarolf/orgs","repos_url":"https://api.github.com/users/jmarolf/repos","events_url":"https://api.github.com/users/jmarolf/events{/privacy}","received_events_url":"https://api.github.com/users/jmarolf/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/roslyn/pulls/8471/commits","review_comments_url":"https://api.github.com/repos/dotnet/roslyn/pulls/8471/comments","review_comment_url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/roslyn/issues/8471/comments","statuses_url":"https://api.github.com/repos/dotnet/roslyn/statuses/d35b2e9645aa6e04352d019e08f8d579aebd285e","head":{"label":"CyrusNajmabadi:nugetWork2","ref":"nugetWork2","sha":"d35b2e9645aa6e04352d019e08f8d579aebd285e","user":{"login":"CyrusNajmabadi","id":4564579,"avatar_url":"https://avatars.githubusercontent.com/u/4564579?v=3","gravatar_id":"","url":"https://api.github.com/users/CyrusNajmabadi","html_url":"https://github.com/CyrusNajmabadi","followers_url":"https://api.github.com/users/CyrusNajmabadi/followers","following_url":"https://api.github.com/users/CyrusNajmabadi/following{/other_user}","gists_url":"https://api.github.com/users/CyrusNajmabadi/gists{/gist_id}","starred_url":"https://api.github.com/users/CyrusNajmabadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CyrusNajmabadi/subscriptions","organizations_url":"https://api.github.com/users/CyrusNajmabadi/orgs","repos_url":"https://api.github.com/users/CyrusNajmabadi/repos","events_url":"https://api.github.com/users/CyrusNajmabadi/events{/privacy}","received_events_url":"https://api.github.com/users/CyrusNajmabadi/received_events","type":"User","site_admin":false},"repo":{"id":30565155,"name":"roslyn","full_name":"CyrusNajmabadi/roslyn","owner":{"login":"CyrusNajmabadi","id":4564579,"avatar_url":"https://avatars.githubusercontent.com/u/4564579?v=3","gravatar_id":"","url":"https://api.github.com/users/CyrusNajmabadi","html_url":"https://github.com/CyrusNajmabadi","followers_url":"https://api.github.com/users/CyrusNajmabadi/followers","following_url":"https://api.github.com/users/CyrusNajmabadi/following{/other_user}","gists_url":"https://api.github.com/users/CyrusNajmabadi/gists{/gist_id}","starred_url":"https://api.github.com/users/CyrusNajmabadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CyrusNajmabadi/subscriptions","organizations_url":"https://api.github.com/users/CyrusNajmabadi/orgs","repos_url":"https://api.github.com/users/CyrusNajmabadi/repos","events_url":"https://api.github.com/users/CyrusNajmabadi/events{/privacy}","received_events_url":"https://api.github.com/users/CyrusNajmabadi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/CyrusNajmabadi/roslyn","description":"The .NET Compiler Platform (\"Roslyn\") provides open-source C# and Visual Basic compilers with rich code analysis APIs.","fork":true,"url":"https://api.github.com/repos/CyrusNajmabadi/roslyn","forks_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/forks","keys_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/teams","hooks_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/hooks","issue_events_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/issues/events{/number}","events_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/events","assignees_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/assignees{/user}","branches_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/branches{/branch}","tags_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/tags","blobs_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/refs{/sha}","trees_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/statuses/{sha}","languages_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/languages","stargazers_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/stargazers","contributors_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/contributors","subscribers_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/subscribers","subscription_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/subscription","commits_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/commits{/sha}","git_commits_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/commits{/sha}","comments_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/comments{/number}","issue_comment_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/issues/comments{/number}","contents_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/contents/{+path}","compare_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/merges","archive_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/downloads","issues_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/issues{/number}","pulls_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/pulls{/number}","milestones_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/milestones{/number}","notifications_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/labels{/name}","releases_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/releases{/id}","deployments_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/deployments","created_at":"2015-02-09T23:45:22Z","updated_at":"2016-01-11T20:46:56Z","pushed_at":"2016-02-12T22:07:16Z","git_url":"git://github.com/CyrusNajmabadi/roslyn.git","ssh_url":"git@github.com:CyrusNajmabadi/roslyn.git","clone_url":"https://github.com/CyrusNajmabadi/roslyn.git","svn_url":"https://github.com/CyrusNajmabadi/roslyn","homepage":"","size":130378,"stargazers_count":0,"watchers_count":0,"language":"C#","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":"dotnet:master","ref":"master","sha":"ac53ab13233dda3c6dda10d951b7cf4636301470","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":29078997,"name":"roslyn","full_name":"dotnet/roslyn","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/roslyn","description":"The .NET Compiler Platform (\"Roslyn\") provides open-source C# and Visual Basic compilers with rich code analysis APIs.","fork":false,"url":"https://api.github.com/repos/dotnet/roslyn","forks_url":"https://api.github.com/repos/dotnet/roslyn/forks","keys_url":"https://api.github.com/repos/dotnet/roslyn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/roslyn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/roslyn/teams","hooks_url":"https://api.github.com/repos/dotnet/roslyn/hooks","issue_events_url":"https://api.github.com/repos/dotnet/roslyn/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/roslyn/events","assignees_url":"https://api.github.com/repos/dotnet/roslyn/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/roslyn/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/roslyn/tags","blobs_url":"https://api.github.com/repos/dotnet/roslyn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/roslyn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/roslyn/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/roslyn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/roslyn/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/roslyn/languages","stargazers_url":"https://api.github.com/repos/dotnet/roslyn/stargazers","contributors_url":"https://api.github.com/repos/dotnet/roslyn/contributors","subscribers_url":"https://api.github.com/repos/dotnet/roslyn/subscribers","subscription_url":"https://api.github.com/repos/dotnet/roslyn/subscription","commits_url":"https://api.github.com/repos/dotnet/roslyn/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/roslyn/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/roslyn/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/roslyn/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/roslyn/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/roslyn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/roslyn/merges","archive_url":"https://api.github.com/repos/dotnet/roslyn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/roslyn/downloads","issues_url":"https://api.github.com/repos/dotnet/roslyn/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/roslyn/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/roslyn/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/roslyn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/roslyn/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/roslyn/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/roslyn/deployments","created_at":"2015-01-11T02:39:03Z","updated_at":"2016-02-12T19:11:22Z","pushed_at":"2016-02-12T22:07:17Z","git_url":"git://github.com/dotnet/roslyn.git","ssh_url":"git@github.com:dotnet/roslyn.git","clone_url":"https://github.com/dotnet/roslyn.git","svn_url":"https://github.com/dotnet/roslyn","homepage":"","size":157509,"stargazers_count":4411,"watchers_count":4411,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1088,"mirror_url":null,"open_issues_count":2088,"forks":1088,"open_issues":2088,"watchers":4411,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/8471"},"html":{"href":"https://github.com/dotnet/roslyn/pull/8471"},"issue":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/8471"},"comments":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/8471/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/8471/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/8471/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/roslyn/statuses/d35b2e9645aa6e04352d019e08f8d579aebd285e"}}}}