{"action":"created","comment":{"url":"https://api.github.com/repos/mono/linker/pulls/comments/156241555","pull_request_review_id":82677131,"id":156241555,"diff_hunk":"@@ -0,0 +1,231 @@\n+<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n+\n+  <PropertyGroup>\n+    <CrossGenDuringPublish Condition=\" '$(CrossGenDuringPublish)' == '' And '$(RuntimeIdentifier)' != '' \">true</CrossGenDuringPublish>\n+  </PropertyGroup>\n+\n+  <PropertyGroup>\n+    <IntermediateOptimizedDirName Condition=\" '$(IntermediateOptimizedDirName)' == '' \">optimized</IntermediateOptimizedDirName>\n+    <IntermediateOptimizedDir Condition=\" '$(IntermediateOptimizedDir)' == '' \">$(IntermediateOutputPath)$(IntermediateOptimizedDirName)</IntermediateOptimizedDir>\n+    <IntermediateCrossGenDirName Condition=\" '$(IntermediateCrossGenDirName)' == '' \">crossgen</IntermediateCrossGenDirName>\n+    <IntermediateCrossGenDir Condition=\" '$(IntermediateCrossGenDir)' == '' \">$(IntermediateOutputPath)$(IntermediateCrossGenDirName)</IntermediateCrossGenDir>\n+  </PropertyGroup>\n+\n+  <PropertyGroup>\n+    <ComputeCrossGenFilesToPublishAfter Condition=\" '$(LinkDuringPublish)' == 'true' \">ComputeLinkedFilesToPublish</ComputeCrossGenFilesToPublishAfter>\n+    <ComputeCrossGenFilesToPublishBefore Condition=\" '$(LinkDuringPublish)' != 'true' \">ComputeFilesToPublish</ComputeCrossGenFilesToPublishBefore>\n+  </PropertyGroup>\n+\n+  <!-- Rewrite inputs to ComputeFilesToPublish, so that crossgen'd\n+       files get published instead of the pre-crossgen assemblies. -->\n+  <Target Name=\"ComputeCrossGenFilesToPublish\"\n+          BeforeTargets=\"$(ComputeCrossGenFilesToPublishBefore)\"\n+          AfterTargets=\"$(ComputeCrossGenFilesToPublishAfter)\"\n+          Condition=\" '$(CrossGenDuringPublish)' == 'true' \"\n+          DependsOnTargets=\"_CrossGenForPublish\">\n+\n+    <!-- Rewrite ResolvedAssembliesToPublish, preserving metadata. -->\n+    <ItemGroup>\n+      <__CrossGenResolvedAssembliesToPublish Include=\"@(ResolvedAssembliesToPublish->'$(IntermediateOptimizedDir)/%(Filename)%(Extension)')\" />\n+      <_CrossGenResolvedAssembliesToPublish Include=\"@(__CrossGenResolvedAssembliesToPublish)\" Condition=\"Exists('%(Identity)')\" />\n+      <!-- FilesToCrossGen doesn't contain System.Private.CoreLib, so\n+           it will still be published. -->\n+      <ResolvedAssembliesToPublish Remove=\"@(FilesToCrossGen)\" />\n+      <ResolvedAssembliesToPublish Include=\"@(_CrossGenResolvedAssembliesToPublish)\" />\n+    </ItemGroup>\n+\n+    <!-- Rewrite IntermediateAssembly, preserving metadata. -->\n+    <ItemGroup>\n+      <__CrossGenIntermediateAssembly Include=\"@(IntermediateAssembly->'$(IntermediateOptimizedDir)/%(Filename)%(Extension)')\" />\n+      <_CrossGenIntermediateAssembly Include=\"@(__CrossGenIntermediateAssembly)\" Condition=\"Exists('%(Identity)')\" />\n+      <IntermediateAssembly Remove=\"@(FilesToCrossGen)\" />\n+      <IntermediateAssembly Include=\"@(_CrossGenIntermediateAssembly)\" />\n+    </ItemGroup>\n+\n+  </Target>\n+\n+  <!-- The target that runs crossgen on all input assemblies. We could\n+       probably also reuse _RunCrossgen, but this gets its inputs from\n+       ResolvedFileToPublish, so we would need to run crossgen after\n+       ComputeFilesToPublish. -->\n+  <Target Name=\"_CrossGenForPublish\"\n+          DependsOnTargets=\"PrepOptimizer;_ComputeCrossGenInputs\">\n+\n+    <MakeDir Directories=\"$(IntermediateOptimizedDir)\" />\n+\n+    <PropertyGroup>\n+      <_CrossGenPlatformAssemblies>@(_CrossGenPlatformAssemblies)</_CrossGenPlatformAssemblies>\n+    </PropertyGroup>\n+\n+    <ItemGroup>\n+      <CrossGenInvocations Include=\"$(MSBuildProjectFullPath)\">\n+        <Properties>\n+          CrossGenExe=$(Crossgen);\n+          CrossGenInput=%(FilesToCrossGen.FullPath);\n+          CrossGenOutput=$(IntermediateOptimizedDir)/%(Filename)%(Extension);\n+          CrossGenPlatformAssemblies=$(_CrossGenPlatformAssemblies)\n+        </Properties>\n+      </CrossGenInvocations>\n+    </ItemGroup>\n+\n+    <MSBuild Projects=\"@(CrossGenInvocations)\"\n+             Targets=\"RunCrossGenForPublish\" />\n+\n+  </Target>\n+\n+  <!-- Workarounds for SDK issues around the interdependency between\n+       ComposeStore targets and CrossGen targets. These let us reuse\n+       PrepOptimizer from the SDK to obtain a crossgen executable for\n+       the target RID. -->\n+\n+  <!-- _RestoreCrossgen (a dependency of PrepOptimizer) requires _TFM\n+       to be set, but it is only set in an unrelated target called\n+       during ComposeStore (PrepareForComposeStore). -->\n+  <Target Name=\"_SetTFMForCrossGenRestore\"\n+          BeforeTargets=\"_RestoreCrossgen\"\n+          Condition=\" '$(CrossGenDuringPublish)' == 'true' \">\n+    <PropertyGroup>\n+      <_TFM Condition=\" '$(_TFM)' == '' \">$(TargetFramework)</_TFM>\n+    </PropertyGroup>\n+  </Target>\n+\n+  <!-- _RestoreCrossgen also requires _CrossProjAssetsFile to be\n+       set. This path is computed from ComposeWorkingDir in the target\n+       _GetCrossgenProps, but ComposeWorkingDir is set only in\n+       store-related targets. We hook into _GetCrossgenProps to\n+       specify where to restore crossgen. -->\n+  <Target Name=\"_SetComposeWorkingDirForCrossGenRestore\"\n+          AfterTargets=\"_GetCrossgenProps\"\n+          Condition=\" '$(CrossGenDuringPublish)' == 'true' \">\n+    <PropertyGroup>\n+      <_CrossProjFileDir>$([System.IO.Path]::GetFullPath($(IntermediateCrossGenDir)))</_CrossProjFileDir>\n+      <_NetCoreRefDir>$([System.IO.Path]::Combine($(_CrossProjFileDir), \"netcoreapp\"))</_NetCoreRefDir>\n+      <_CrossProjAssetsFile>$([System.IO.Path]::Combine($(_CrossProjFileDir),  project.assets.json))</_CrossProjAssetsFile>\n+    </PropertyGroup>\n+    <MakeDir Directories=\"$(_CrossProjFileDir)\" />\n+  </Target>\n+\n+  <!-- PrepforRestoreForComposeStore (a dependency of\n+       _RestoreCrossgen) sets BaseIntermediateOutputPath and\n+       ProjectAssetsFile to the compose working directory. We don't\n+       want this because we are not composing a package store, so we\n+       save and restore these properties. -->\n+  <Target Name=\"_SavePropsModifiedByPrepforRestoreForComposeStore\"\n+          BeforeTargets=\"PrepforRestoreForComposeStore\"\n+          Condition=\" '$(CrossGenDuringPublish)' == 'true' \">\n+    <PropertyGroup>\n+      <_SavedBaseIntermediateOutputPath>$(BaseIntermediateOutputPath)</_SavedBaseIntermediateOutputPath>\n+      <_SavedProjectAssetsFile>$(ProjectAssetsFile)</_SavedProjectAssetsFile>\n+    </PropertyGroup>\n+  </Target>\n+  <Target Name=\"_RestorePropsModifiedByPrepforRestoreForComposeStore\"\n+          AfterTargets=\"PrepforRestoreForComposeStore\">\n+    <PropertyGroup>\n+      <BaseIntermediateOutputPath>$(_SavedBaseIntermediateOutputPath)</BaseIntermediateOutputPath>\n+      <ProjectAssetsFile>$(_SavedProjectAssetsFile)</ProjectAssetsFile>\n+    </PropertyGroup>\n+  </Target>\n+\n+  <!-- Run crossgen on a single input assembly. -->\n+  <Target Name=\"RunCrossGenForPublish\"\n+          Inputs=\"$(CrossGenInput);$(CrossGenPlatformAssemblies)\"\n+          Outputs=\"$(CrossGenOutput)\">\n+\n+    <!-- The property CrossGenPlatformAssemblies must be\n+         semicolon-delimited for incremental build to work correctly,\n+         but the directory paths have to be passed with\n+         platform-specific path separators in the crossgen command.\n+         -->\n+    <ItemGroup>\n+      <_CrossGenPlatformAssemblies Include=\"$(CrossGenPlatformAssemblies)\" />\n+      <__CrossGenPlatformAssembliesPaths Include=\"@(_CrossGenPlatformAssemblies->'%(RootDir)%(Directory)')\" />\n+      <_CrossGenPlatformAssembliesPaths Include=\"@(__CrossGenPlatformAssembliesPaths->Distinct())\" />\n+    </ItemGroup>\n+\n+    <PropertyGroup>\n+      <_PathSeparator>$([System.IO.Path]::PathSeparator)</_PathSeparator>\n+      <_CrossGenPlatformAssembliesPaths>@(_CrossGenPlatformAssembliesPaths, '$(_PathSeparator)')</_CrossGenPlatformAssembliesPaths>\n+    </PropertyGroup>\n+\n+    <PropertyGroup>\n+      <CrossGenCommand>$(CrossGenExe) -readytorun -in $(CrossGenInput) -out $(CrossGenOutput) -platform_assemblies_paths $(_CrossGenPlatformAssembliesPaths)</CrossGenCommand>\n+    </PropertyGroup>\n+\n+    <Message Text=\"$(CrossGenCommand)\" />\n+    <Exec Command=\"$(CrossGenCommand)\" />\n+\n+  </Target>\n+\n+  <Target Name=\"_ComputeCrossGenInputs\"\n+          DependsOnTargets=\"_ComputeCrossGenPlatformAssemblies;_ComputeFilesToCrossGen\" />\n+\n+  <!-- Compute the platform assembly paths, a parameter to crossgen\n+       that lets it find dependencies of the input file. This needs to\n+       include the path to the input file and its dependency closure,\n+       including System.Private.CoreLib. -->\n+  <Target Name=\"_ComputeCrossGenPlatformAssemblies\"\n+          DependsOnTargets=\"_ComputeManagedResolvedAssembliesForCrossGen\">\n+\n+    <ItemGroup>\n+      <_CrossGenPlatformAssemblies Include=\"@(_ManagedResolvedAssembliesForCrossGen)\" />\n+      <_CrossGenPlatformAssemblies Include=\"@(IntermediateAssembly)\" />\n+    </ItemGroup>\n+\n+  </Target>\n+\n+  <!-- _ManagedResolvedAssembliesForCrossGen includes the app's\n+       managed dependency closure, including System.Private.CoreLib,\n+       but not the app itself or resource assemblies. -->\n+  <Target Name=\"_ComputeManagedResolvedAssembliesForCrossGen\">\n+    <ComputeManagedAssemblies Assemblies=\"@(ResolvedAssembliesToPublish)\">\n+      <Output TaskParameter=\"ManagedAssemblies\" ItemName=\"_ManagedResolvedAssembliesForCrossGen\" />\n+    </ComputeManagedAssemblies>\n+\n+    <ItemGroup>\n+      <_ManagedResolvedAssembliesForCrossGen Remove=\"@(_ManagedResolvedAssembliesForCrossGen->WithMetadataValue('AssetType', 'resources'))\" />\n+    </ItemGroup>\n+  </Target>\n+\n+  <UsingTask TaskName=\"FilterByMetadata\" AssemblyFile=\"$(LinkTaskDllPath)\" />\n+  <!-- This computes the default set of files that we want to be\n+       crossgen'd. Some of these may already be R2R images, and these\n+       will not be crossgen'd again. The default is to crossgen the\n+       app and platform libraries. Defaults will be used only if\n+       FilesToCrossGen hasn't been set elsewhere, allowing users and\n+       other props/targets to select what will be crossgen'd. -->","path":"corebuild/integration/ILLink.Tasks/ILLink.CrossGen.targets","position":195,"original_position":195,"commit_id":"0050a5785fd718772191262ca1d0c9d89024309d","original_commit_id":"0050a5785fd718772191262ca1d0c9d89024309d","user":{"login":"erozenfeld","id":10624223,"avatar_url":"https://avatars2.githubusercontent.com/u/10624223?v=4","gravatar_id":"","url":"https://api.github.com/users/erozenfeld","html_url":"https://github.com/erozenfeld","followers_url":"https://api.github.com/users/erozenfeld/followers","following_url":"https://api.github.com/users/erozenfeld/following{/other_user}","gists_url":"https://api.github.com/users/erozenfeld/gists{/gist_id}","starred_url":"https://api.github.com/users/erozenfeld/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/erozenfeld/subscriptions","organizations_url":"https://api.github.com/users/erozenfeld/orgs","repos_url":"https://api.github.com/users/erozenfeld/repos","events_url":"https://api.github.com/users/erozenfeld/events{/privacy}","received_events_url":"https://api.github.com/users/erozenfeld/received_events","type":"User","site_admin":false},"body":"We need to ensure that when the linker part of the publish step, we crossgen  those and only those assemblies that were  crossgen-ed before linking. I don't think that default ensures that.","created_at":"2017-12-12T00:28:18Z","updated_at":"2017-12-12T00:29:06Z","html_url":"https://github.com/mono/linker/pull/192#discussion_r156241555","pull_request_url":"https://api.github.com/repos/mono/linker/pulls/192","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/mono/linker/pulls/comments/156241555"},"html":{"href":"https://github.com/mono/linker/pull/192#discussion_r156241555"},"pull_request":{"href":"https://api.github.com/repos/mono/linker/pulls/192"}}},"pull_request":{"url":"https://api.github.com/repos/mono/linker/pulls/192","id":157355114,"html_url":"https://github.com/mono/linker/pull/192","diff_url":"https://github.com/mono/linker/pull/192.diff","patch_url":"https://github.com/mono/linker/pull/192.patch","issue_url":"https://api.github.com/repos/mono/linker/issues/192","number":192,"state":"open","locked":false,"title":"Add crossgen targets","user":{"login":"sbomer","id":787361,"avatar_url":"https://avatars3.githubusercontent.com/u/787361?v=4","gravatar_id":"","url":"https://api.github.com/users/sbomer","html_url":"https://github.com/sbomer","followers_url":"https://api.github.com/users/sbomer/followers","following_url":"https://api.github.com/users/sbomer/following{/other_user}","gists_url":"https://api.github.com/users/sbomer/gists{/gist_id}","starred_url":"https://api.github.com/users/sbomer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbomer/subscriptions","organizations_url":"https://api.github.com/users/sbomer/orgs","repos_url":"https://api.github.com/users/sbomer/repos","events_url":"https://api.github.com/users/sbomer/events{/privacy}","received_events_url":"https://api.github.com/users/sbomer/received_events","type":"User","site_admin":false},"body":"This change adds an optional (on by default) phase to the publish pipeline that runs crossgen on a specified set of assemblies. The default is to crossgen the platform assemblies, but the default can be overridden from other targets. Files that are already R2R will not be crossgen'd again, and support is included for incremental build. The new tasks and targets will be part of ILLink.Tasks. They could potentially be separated out into a new task if the crossgen functionality is desirable on its own.\r\n\r\nThe logic uses SDK targets from [Microsoft.NET.CrossGen.targets](https://github.com/dotnet/sdk/blob/cb20a5fb09b3ea65193a098ba5e770cc8b34ec1b/src/Tasks/Microsoft.NET.Build.Tasks/build/Microsoft.NET.CrossGen.targets) to restore crossgen. The SDK targets have some interdependency with the ComposeStore targets, so this change includes a few workarounds that enable us to reuse the SDK targets for restore. The SDK also has a target that runs crossgen, but I found this target too difficult to adapt for our use case.\r\n\r\nCaveats: this only supports cases in which the target platform is the same as the host platform.\r\n\r\n@erozenfeld, @swaroop-sridhar, please review. /cc @russellhadley","created_at":"2017-12-08T23:25:53Z","updated_at":"2017-12-12T00:29:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5dfa12b69e33e715a7a75f39fc678898f71f5a0b","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/mono/linker/pulls/192/commits","review_comments_url":"https://api.github.com/repos/mono/linker/pulls/192/comments","review_comment_url":"https://api.github.com/repos/mono/linker/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mono/linker/issues/192/comments","statuses_url":"https://api.github.com/repos/mono/linker/statuses/0050a5785fd718772191262ca1d0c9d89024309d","head":{"label":"sbomer:crossgen","ref":"crossgen","sha":"0050a5785fd718772191262ca1d0c9d89024309d","user":{"login":"sbomer","id":787361,"avatar_url":"https://avatars3.githubusercontent.com/u/787361?v=4","gravatar_id":"","url":"https://api.github.com/users/sbomer","html_url":"https://github.com/sbomer","followers_url":"https://api.github.com/users/sbomer/followers","following_url":"https://api.github.com/users/sbomer/following{/other_user}","gists_url":"https://api.github.com/users/sbomer/gists{/gist_id}","starred_url":"https://api.github.com/users/sbomer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbomer/subscriptions","organizations_url":"https://api.github.com/users/sbomer/orgs","repos_url":"https://api.github.com/users/sbomer/repos","events_url":"https://api.github.com/users/sbomer/events{/privacy}","received_events_url":"https://api.github.com/users/sbomer/received_events","type":"User","site_admin":false},"repo":{"id":74619808,"name":"linker","full_name":"sbomer/linker","owner":{"login":"sbomer","id":787361,"avatar_url":"https://avatars3.githubusercontent.com/u/787361?v=4","gravatar_id":"","url":"https://api.github.com/users/sbomer","html_url":"https://github.com/sbomer","followers_url":"https://api.github.com/users/sbomer/followers","following_url":"https://api.github.com/users/sbomer/following{/other_user}","gists_url":"https://api.github.com/users/sbomer/gists{/gist_id}","starred_url":"https://api.github.com/users/sbomer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbomer/subscriptions","organizations_url":"https://api.github.com/users/sbomer/orgs","repos_url":"https://api.github.com/users/sbomer/repos","events_url":"https://api.github.com/users/sbomer/events{/privacy}","received_events_url":"https://api.github.com/users/sbomer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sbomer/linker","description":null,"fork":true,"url":"https://api.github.com/repos/sbomer/linker","forks_url":"https://api.github.com/repos/sbomer/linker/forks","keys_url":"https://api.github.com/repos/sbomer/linker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sbomer/linker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sbomer/linker/teams","hooks_url":"https://api.github.com/repos/sbomer/linker/hooks","issue_events_url":"https://api.github.com/repos/sbomer/linker/issues/events{/number}","events_url":"https://api.github.com/repos/sbomer/linker/events","assignees_url":"https://api.github.com/repos/sbomer/linker/assignees{/user}","branches_url":"https://api.github.com/repos/sbomer/linker/branches{/branch}","tags_url":"https://api.github.com/repos/sbomer/linker/tags","blobs_url":"https://api.github.com/repos/sbomer/linker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sbomer/linker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sbomer/linker/git/refs{/sha}","trees_url":"https://api.github.com/repos/sbomer/linker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sbomer/linker/statuses/{sha}","languages_url":"https://api.github.com/repos/sbomer/linker/languages","stargazers_url":"https://api.github.com/repos/sbomer/linker/stargazers","contributors_url":"https://api.github.com/repos/sbomer/linker/contributors","subscribers_url":"https://api.github.com/repos/sbomer/linker/subscribers","subscription_url":"https://api.github.com/repos/sbomer/linker/subscription","commits_url":"https://api.github.com/repos/sbomer/linker/commits{/sha}","git_commits_url":"https://api.github.com/repos/sbomer/linker/git/commits{/sha}","comments_url":"https://api.github.com/repos/sbomer/linker/comments{/number}","issue_comment_url":"https://api.github.com/repos/sbomer/linker/issues/comments{/number}","contents_url":"https://api.github.com/repos/sbomer/linker/contents/{+path}","compare_url":"https://api.github.com/repos/sbomer/linker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sbomer/linker/merges","archive_url":"https://api.github.com/repos/sbomer/linker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sbomer/linker/downloads","issues_url":"https://api.github.com/repos/sbomer/linker/issues{/number}","pulls_url":"https://api.github.com/repos/sbomer/linker/pulls{/number}","milestones_url":"https://api.github.com/repos/sbomer/linker/milestones{/number}","notifications_url":"https://api.github.com/repos/sbomer/linker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sbomer/linker/labels{/name}","releases_url":"https://api.github.com/repos/sbomer/linker/releases{/id}","deployments_url":"https://api.github.com/repos/sbomer/linker/deployments","created_at":"2016-11-23T22:46:31Z","updated_at":"2016-11-23T22:46:33Z","pushed_at":"2017-12-11T23:02:45Z","git_url":"git://github.com/sbomer/linker.git","ssh_url":"git@github.com:sbomer/linker.git","clone_url":"https://github.com/sbomer/linker.git","svn_url":"https://github.com/sbomer/linker","homepage":null,"size":1305,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mono:master","ref":"master","sha":"17dd786d336127a2a9ad9519619082e6ba72bf42","user":{"login":"mono","id":53395,"avatar_url":"https://avatars3.githubusercontent.com/u/53395?v=4","gravatar_id":"","url":"https://api.github.com/users/mono","html_url":"https://github.com/mono","followers_url":"https://api.github.com/users/mono/followers","following_url":"https://api.github.com/users/mono/following{/other_user}","gists_url":"https://api.github.com/users/mono/gists{/gist_id}","starred_url":"https://api.github.com/users/mono/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mono/subscriptions","organizations_url":"https://api.github.com/users/mono/orgs","repos_url":"https://api.github.com/users/mono/repos","events_url":"https://api.github.com/users/mono/events{/privacy}","received_events_url":"https://api.github.com/users/mono/received_events","type":"Organization","site_admin":false},"repo":{"id":72579311,"name":"linker","full_name":"mono/linker","owner":{"login":"mono","id":53395,"avatar_url":"https://avatars3.githubusercontent.com/u/53395?v=4","gravatar_id":"","url":"https://api.github.com/users/mono","html_url":"https://github.com/mono","followers_url":"https://api.github.com/users/mono/followers","following_url":"https://api.github.com/users/mono/following{/other_user}","gists_url":"https://api.github.com/users/mono/gists{/gist_id}","starred_url":"https://api.github.com/users/mono/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mono/subscriptions","organizations_url":"https://api.github.com/users/mono/orgs","repos_url":"https://api.github.com/users/mono/repos","events_url":"https://api.github.com/users/mono/events{/privacy}","received_events_url":"https://api.github.com/users/mono/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mono/linker","description":null,"fork":false,"url":"https://api.github.com/repos/mono/linker","forks_url":"https://api.github.com/repos/mono/linker/forks","keys_url":"https://api.github.com/repos/mono/linker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mono/linker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mono/linker/teams","hooks_url":"https://api.github.com/repos/mono/linker/hooks","issue_events_url":"https://api.github.com/repos/mono/linker/issues/events{/number}","events_url":"https://api.github.com/repos/mono/linker/events","assignees_url":"https://api.github.com/repos/mono/linker/assignees{/user}","branches_url":"https://api.github.com/repos/mono/linker/branches{/branch}","tags_url":"https://api.github.com/repos/mono/linker/tags","blobs_url":"https://api.github.com/repos/mono/linker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mono/linker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mono/linker/git/refs{/sha}","trees_url":"https://api.github.com/repos/mono/linker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mono/linker/statuses/{sha}","languages_url":"https://api.github.com/repos/mono/linker/languages","stargazers_url":"https://api.github.com/repos/mono/linker/stargazers","contributors_url":"https://api.github.com/repos/mono/linker/contributors","subscribers_url":"https://api.github.com/repos/mono/linker/subscribers","subscription_url":"https://api.github.com/repos/mono/linker/subscription","commits_url":"https://api.github.com/repos/mono/linker/commits{/sha}","git_commits_url":"https://api.github.com/repos/mono/linker/git/commits{/sha}","comments_url":"https://api.github.com/repos/mono/linker/comments{/number}","issue_comment_url":"https://api.github.com/repos/mono/linker/issues/comments{/number}","contents_url":"https://api.github.com/repos/mono/linker/contents/{+path}","compare_url":"https://api.github.com/repos/mono/linker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mono/linker/merges","archive_url":"https://api.github.com/repos/mono/linker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mono/linker/downloads","issues_url":"https://api.github.com/repos/mono/linker/issues{/number}","pulls_url":"https://api.github.com/repos/mono/linker/pulls{/number}","milestones_url":"https://api.github.com/repos/mono/linker/milestones{/number}","notifications_url":"https://api.github.com/repos/mono/linker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mono/linker/labels{/name}","releases_url":"https://api.github.com/repos/mono/linker/releases{/id}","deployments_url":"https://api.github.com/repos/mono/linker/deployments","created_at":"2016-11-01T21:43:39Z","updated_at":"2017-11-30T00:51:22Z","pushed_at":"2017-12-11T23:02:48Z","git_url":"git://github.com/mono/linker.git","ssh_url":"git@github.com:mono/linker.git","clone_url":"https://github.com/mono/linker.git","svn_url":"https://github.com/mono/linker","homepage":null,"size":1218,"stargazers_count":77,"watchers_count":77,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":21,"mirror_url":null,"archived":false,"open_issues_count":11,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":21,"open_issues":11,"watchers":77,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mono/linker/pulls/192"},"html":{"href":"https://github.com/mono/linker/pull/192"},"issue":{"href":"https://api.github.com/repos/mono/linker/issues/192"},"comments":{"href":"https://api.github.com/repos/mono/linker/issues/192/comments"},"review_comments":{"href":"https://api.github.com/repos/mono/linker/pulls/192/comments"},"review_comment":{"href":"https://api.github.com/repos/mono/linker/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mono/linker/pulls/192/commits"},"statuses":{"href":"https://api.github.com/repos/mono/linker/statuses/0050a5785fd718772191262ca1d0c9d89024309d"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"erozenfeld"}}