payload: {"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/designs/pulls/comments/265194365","pull_request_review_id":214037879,"id":265194365,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2NTE5NDM2NQ==","diff_hunk":"@@ -0,0 +1,227 @@\n+# Install location search for .NET Core\n+\n+.NET Core has several cases where it needs to search for the install location of the runtime and SDKs. This document described the proposed algorithm for how this search will be done on all the supported platforms.\n+\n+## .NET Core install layout\n+The content of a .NET Core install location always follows the same layout. The directory structure is the same on all platforms, file names may differ to conform with the platform specific requirements. (Below sample uses file names for Windows):\n+* `./dotnet.exe` - the \"muxer\" which is used to execute apps and issue dotnet CLI commands.\n+* `./host/fxr/<version>/hostfxr.dll` - this library contains all the logic to resolve framework references and select SDK. Regardless of application, the latest available version is used.\n+* `./shared` - contains shared frameworks.\n+  * `./Microsoft.NETCore.App/<version>` - the root framework which contains the .NET Core runtime. This framework contains `hostpolicy.dll` which is the entry point called by the `hostfxr` to run the app. Applications can choose which version to use.\n+  * `./<FrameworkName>/<version>` - any other shared framework. Applications can choose which version to use.\n+* `./sdk/<version>` - only installed when .NET Core SDK is installed - contains the SDK tools. Users can choose which version to use.\n+\n+\n+## Installation types\n+.NET Core can be installed in several ways, each provides a different location and expected behavior. Each such location will contain the .NET Core install layout described above.\n+\n+### Global install to default location\n+This is the most common case where an installer installs the runtime (and potentially SDK) to a global default location accessible to everything on the system (and by all users).\n+* Windows\n+  * 32-bit on 64-bit OS - `%ProgramFiles(x86)%\\dotnet`\n+  * Otherwise - `%ProgramFiles%\\dotnet`\n+* Linux - the host searches in `/usr/share/dotnet` as a fallback, but the installer may pick a different default based on the requirements of the specific distro/configuration. In such case the install is effectively just like the global install to custom location described below. If correctly registered the host will search the custom location first.\n+* macOS - `/usr/local/share/dotnet`\n+\n+*This type of install is supported by .NET Core 2.2 and earlier.*\n+\n+### Global install to custom location\n+.NET Core is installed globally for the machine but into a non-default (custom) location. The location of the install is stored in platform specific configuration so that it can be found by everything on the system (and by all users).\n+\n+This type of install should effectively behave the same as install to the default location. Can be used to put .NET Core on a different drive to save space on the system drive, or to serve other purposes.\n+\n+*This type of install will for sure be supported by .NET Core 3.0 on Windows, other cases are not yet committed.*\n+\n+### Per-user install\n+.NET Core installation which is per-user, thus doesn't require admin/root access to the machine. Otherwise it should behave just like a global install, but only accessible to the user which installed it.\n+\n+There should be a default location specific for each platform - up for discussion.\n+\n+There would also be a platform specific way to store this location in some kind of configuration so that it can be found by all apps for the given user.\n+\n+*This type of install is not yet planned for any specific .NET Core release.*\n+\n+### Private install (also called x-copy install)\n+.NET Core is \"installed\" by simply creating the right layout on the disk with the right files, there's no system registration mechanism attached to it (typically called x-copy deployment).\n+\n+This can be used for\n+* Project-local .NET Core SDK/runtime (for example most dotnet repos use this)\n+* Experimentation\n+\n+As such it's actually desirable that creating such installation doesn't affect anything which didn't opt into using it.\n+\n+*This type of install is supported by .NET Core 2.2 and earlier.*\n+\n+### Self-contained apps\n+Technically speaking self-contained apps also \"install\" a private copy of the runtime, but they don't use the same layout and such installation is only usable by the app itself. So for the purposes of this document, self-contained apps are largely out of scope.\n+\n+\n+## Components\n+These are the components of .NET Core which must be aware of the install location:\n+* The host (muxer (`dotnet`), `apphost`, `comhost`, ...) - the host needs to be able to find the location to search for\n+  * Latest version of `hostfxr` to use.\n+  * Shared frameworks\n+  * SDKs\n+* Installer - the installer needs to put the files into the right layout and register the install location with the system configuration (if applicable)\n+* Applications\n+  * If the application is using the muxer (`dotnet`) it needs to be able to find it. This applies to tools like MSBuild or VS as well.\n+  * Certain tools (installers, development tools) may need to determine if .NET Core is installed and which versions are available.\n+\n+\n+## Servicing considerations\n+The algorithm which determines where to search, is to some degree contained in all the components mentioned above. Changes to the algorithm (for example introduction of a new default location or new install type) need to be applied to all of these components.\n+\n+Unfortunately some of these components are hard to service:\n+* The muxer relies on the caller to locate it, then it's shared by all versions installed in any given location. Updating it is troublesome as it typically require a system reboot (may be in use by running applications).\n+* The `hostfxr` is relatively easy to service since the installer places a newer version side-by-side and relies on the host to pick the latest available version. The complexity comes from the fact that it has to work with all versions of the runtime/sdk.\n+* App-contained hosts (`apphost`, `comhost`, `ijwhost`, `nethost`) these are libraries which are shipped with the apps and thus fully owned/serviced by the app. They need to know how to find install locations to locate shared frameworks.\n+\n+The biggest problem is with the app-contained hosts which we can't service in any way. So introducing new install types or changing the default location can be breaking for apps using old hosts.\n+\n+The problem already exists since the `apphost` has been shipped in .NET Core 2.1 with support for framework dependent apps. Fortunately this feature is not widely used yet.\n+\n+In .NET Core 3.0 the situation will be very different. Framework dependent `apphost` is the default for apps. Scenarios requiring the other hosts are also likely to be relatively common (COM, IJW, native hosting). So the hosts which we ship with .NET Core 3.0 will be spread across all machines running .NET Core (not just development but production as well) without any ability to service them directly.\n+\n+This means that .NET Core 3.0 is the last chance to get the algorithms for install locations modified in \"breaking ways\". Future release will very likely have to be 100% backward compatible in this regard.\n+\n+\n+## Proposal for 3.0\n+\n+### Globally registered install location :new:\n+This is by far the most common case and in 3.0 we want to provide a way to globally install to a custom location. The typical case will still be to install into the default location, but custom location should be possible. Either location should behave the same.\n+\n+To achieve this the install location must be recorded in some system-wide configuration in a fixed location which is well-known.\n+\n+* Windows - the installer will store the install location in 32-bit registry (for both 32-bit and 64-bit installations):\n+  * `HKLM\\SOFTWARE\\dotnet\\Setup\\InstalledVersions\\<arch>\\InstallLocation` - where `<arch>` is one of the `x86`, `x64`, `arm` or `arm64`.\n+  Note that this registry key is \"redirected\" that means that 32-bit processes see different copy of the key then 64bit processes. So it's important that both installers and the host access only the 32-bit view of the registry.\n+* Linux and macOS - the installer will store the install location in a text file\n+  * `/etc/dotnet/install_location` - the file will contain a single line which is the path.\n+\n+The muxer (`dotnet.exe`) is registered on the system-wide `PATH` environment variable.\n+\n+### Per-user registered install location :new:\n+This will allow installs to per-user directories (no need for admin/root access). It's to be decided if we will actually create an installer which does this. Once installed the per-user install should take precedence over the global one, but otherwise should be available to all processes running under the respective user.\n+\n+To achieve this the install location must be recorded in some per-user configuration in a fixed location which is well-known.\n+\n+* Windows - the installer will store the install location in registry:\n+  * `HKCU\\SOFTWARE\\dotnet\\Setup\\InstalledVersions\\<arch>\\InstallLocation` - where `<arch>` is one of the `x86`, `x64`, `arm` or `arm64`.\n+  Note that this key is \"shared\" meaning both 32-bit and 64-bit processes see the same values.\n+* Linux and macOS - the installer will store the install location in a text file\n+  * `$HOME/.dotnet/install_location` - the file will contain a single line which is the path.\n+\n+The muxer (`dotnet`) is registered on the per-user `PATH` environment variable and in such a way that it wins over any globally installed one.\n+\n+### Private install location\n+This allows users to install private copy of .NET Core into any directory. This copy should not be used by anything unless explicitly asked for.\n+\n+There is not installer for this scenario, these installs are produced by simply copying the right directory structure into a custom location.\n+\n+*This mechanism already exists in .NET Core 2.2.*\n+\n+If the muxer (`dotnet`) is used then it must be invoked directly from the private install location (it's not registered on `PATH` in any way).  \n+If other hosts are used then the private install location must be specified in environment variable:\n+* `DOTNET_ROOT`\n+* `DOTNET_ROOT(x86)` for 32-bit process running on 64-bit Windows.\n+\n+\n+## Host behavior for 3.0\n+\n+### `hostfxr` search\n+`dotnet` only looks right next to itself.\n+\n+All other hosts will search for the first location which exists in this order:\n+* the directory where the host resides (this is important mostly for `apphost` as self-contained apps will have the `hostfxr` in the same directory).\n+* `DOTNET_ROOT` (or `DOTNET_ROOT(x86)`) environment variable, in the `host/fxr/<version>` subdirectory.\n+* :new: per-user registered install location, in the `/host/fxr/<version>` subdirectory\n+  * Windows - `HKCU\\SOFTWARE\\dotnet\\Setup\\InstalledVersions\\<arch>\\InstallLocation`\n+  * Linux/macOS - `$HOME/.dotnet/install_location`\n+* :new: global registered install location, in the `/host/fxr/<version>` subdirectory  \n+  **We've committed to support this on Windows for .NET Core 3.0**\n+  * Windows - `HKLM\\SOFTWARE\\dotnet\\Setup\\InstalledVersions\\<arch>\\InstallLocation` (32-bit view)  \n+  * Linux/macOS - `/etc/dotnet/install_location`  \n+* default global location, in the `/host/fxr/<version>` subdirectory\n+  * Windows (32-bit process on 64-bit Windows) - `%ProgramFiles(x86)%\\dotnet`\n+  * Windows (everything else) - `%ProgramFiles%\\dotnet`\n+  * Linux - `/usr/share/dotnet`\n+  * macOS - `/usr/local/share/dotnet`\n+\n+In each case with the `<version>` subdirectory, the latest available version as per SemVer 2.0 rules will be selected. Note that the algorithm picks the first location which exists, and only then looks for the `/host/fxr/<version>` subdirectory, and if that doesn't exist, or the library is missing it will fail.\n+\n+### Framework and SDK search\n+All hosts use the same logic.\n+\n+Both framework and SDK search uses the same logic, the only difference is that frameworks are in the `share` subdirectory, while SDKs are in the `sdk` subdirectory of the install location.\n+In both cases all locations listed below are searched and the complete list of all available SDKs/Frameworks is combined before making a choice which one will be used (based on version requirements).\n+\n+Search locations:\n+* the location of the `hostfxr` used. See the `hostfxr` search algorithm above. This means that `DOTNET_ROOT` has effect on framework and SDK search as well.\n+* If multi-level lookup is enabled (by default it is, can be disabled via `DOTNET_MULTILEVEL_LOOKUP=0` environment variable)\n+  * :new: per-user registered install location","path":"accepted/install-locations.md","position":161,"original_position":161,"commit_id":"3de7e8824482470cc9cc7114743d0374c7f714f3","original_commit_id":"3de7e8824482470cc9cc7114743d0374c7f714f3","user":{"login":"jkotas","id":6668460,"node_id":"MDQ6VXNlcjY2Njg0NjA=","avatar_url":"https://avatars2.githubusercontent.com/u/6668460?v=4","gravatar_id":"","url":"https://api.github.com/users/jkotas","html_url":"https://github.com/jkotas","followers_url":"https://api.github.com/users/jkotas/followers","following_url":"https://api.github.com/users/jkotas/following{/other_user}","gists_url":"https://api.github.com/users/jkotas/gists{/gist_id}","starred_url":"https://api.github.com/users/jkotas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jkotas/subscriptions","organizations_url":"https://api.github.com/users/jkotas/orgs","repos_url":"https://api.github.com/users/jkotas/repos","events_url":"https://api.github.com/users/jkotas/events{/privacy}","received_events_url":"https://api.github.com/users/jkotas/received_events","type":"User","site_admin":false},"body":"This may be a security problem: It is not generally ok to run global \"admin\" installed programs against user-installed runtime because of it allows users to alter the behavior.","created_at":"2019-03-13T15:42:26Z","updated_at":"2019-03-13T15:42:26Z","html_url":"https://github.com/dotnet/designs/pull/58#discussion_r265194365","pull_request_url":"https://api.github.com/repos/dotnet/designs/pulls/58","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/dotnet/designs/pulls/comments/265194365"},"html":{"href":"https://github.com/dotnet/designs/pull/58#discussion_r265194365"},"pull_request":{"href":"https://api.github.com/repos/dotnet/designs/pulls/58"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/designs/pulls/58","id":260762670,"node_id":"MDExOlB1bGxSZXF1ZXN0MjYwNzYyNjcw","html_url":"https://github.com/dotnet/designs/pull/58","diff_url":"https://github.com/dotnet/designs/pull/58.diff","patch_url":"https://github.com/dotnet/designs/pull/58.patch","issue_url":"https://api.github.com/repos/dotnet/designs/issues/58","number":58,"state":"open","locked":false,"title":".NET Core installation types for 3.0","user":{"login":"vitek-karas","id":10670590,"node_id":"MDQ6VXNlcjEwNjcwNTkw","avatar_url":"https://avatars2.githubusercontent.com/u/10670590?v=4","gravatar_id":"","url":"https://api.github.com/users/vitek-karas","html_url":"https://github.com/vitek-karas","followers_url":"https://api.github.com/users/vitek-karas/followers","following_url":"https://api.github.com/users/vitek-karas/following{/other_user}","gists_url":"https://api.github.com/users/vitek-karas/gists{/gist_id}","starred_url":"https://api.github.com/users/vitek-karas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vitek-karas/subscriptions","organizations_url":"https://api.github.com/users/vitek-karas/orgs","repos_url":"https://api.github.com/users/vitek-karas/repos","events_url":"https://api.github.com/users/vitek-karas/events{/privacy}","received_events_url":"https://api.github.com/users/vitek-karas/received_events","type":"User","site_admin":false},"body":"Description of various supported installation types (and locations) for .NET Core 3.0 runtime and SDK. Proposals for 3.0 behavior to create consistency between platforms.\r\nImportant for 3.0 as we're shipping new hosts which don't have a servicing solution.","created_at":"2019-03-13T13:19:53Z","updated_at":"2019-03-13T15:42:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e90f0afad3ed28d5c9d7e47245866e6fdd52071b","assignee":{"login":"vitek-karas","id":10670590,"node_id":"MDQ6VXNlcjEwNjcwNTkw","avatar_url":"https://avatars2.githubusercontent.com/u/10670590?v=4","gravatar_id":"","url":"https://api.github.com/users/vitek-karas","html_url":"https://github.com/vitek-karas","followers_url":"https://api.github.com/users/vitek-karas/followers","following_url":"https://api.github.com/users/vitek-karas/following{/other_user}","gists_url":"https://api.github.com/users/vitek-karas/gists{/gist_id}","starred_url":"https://api.github.com/users/vitek-karas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vitek-karas/subscriptions","organizations_url":"https://api.github.com/users/vitek-karas/orgs","repos_url":"https://api.github.com/users/vitek-karas/repos","events_url":"https://api.github.com/users/vitek-karas/events{/privacy}","received_events_url":"https://api.github.com/users/vitek-karas/received_events","type":"User","site_admin":false},"assignees":[{"login":"vitek-karas","id":10670590,"node_id":"MDQ6VXNlcjEwNjcwNTkw","avatar_url":"https://avatars2.githubusercontent.com/u/10670590?v=4","gravatar_id":"","url":"https://api.github.com/users/vitek-karas","html_url":"https://github.com/vitek-karas","followers_url":"https://api.github.com/users/vitek-karas/followers","following_url":"https://api.github.com/users/vitek-karas/following{/other_user}","gists_url":"https://api.github.com/users/vitek-karas/gists{/gist_id}","starred_url":"https://api.github.com/users/vitek-karas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vitek-karas/subscriptions","organizations_url":"https://api.github.com/users/vitek-karas/orgs","repos_url":"https://api.github.com/users/vitek-karas/repos","events_url":"https://api.github.com/users/vitek-karas/events{/privacy}","received_events_url":"https://api.github.com/users/vitek-karas/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"leecow","id":2212879,"node_id":"MDQ6VXNlcjIyMTI4Nzk=","avatar_url":"https://avatars3.githubusercontent.com/u/2212879?v=4","gravatar_id":"","url":"https://api.github.com/users/leecow","html_url":"https://github.com/leecow","followers_url":"https://api.github.com/users/leecow/followers","following_url":"https://api.github.com/users/leecow/following{/other_user}","gists_url":"https://api.github.com/users/leecow/gists{/gist_id}","starred_url":"https://api.github.com/users/leecow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/leecow/subscriptions","organizations_url":"https://api.github.com/users/leecow/orgs","repos_url":"https://api.github.com/users/leecow/repos","events_url":"https://api.github.com/users/leecow/events{/privacy}","received_events_url":"https://api.github.com/users/leecow/received_events","type":"User","site_admin":false},{"login":"richlander","id":2608468,"node_id":"MDQ6VXNlcjI2MDg0Njg=","avatar_url":"https://avatars3.githubusercontent.com/u/2608468?v=4","gravatar_id":"","url":"https://api.github.com/users/richlander","html_url":"https://github.com/richlander","followers_url":"https://api.github.com/users/richlander/followers","following_url":"https://api.github.com/users/richlander/following{/other_user}","gists_url":"https://api.github.com/users/richlander/gists{/gist_id}","starred_url":"https://api.github.com/users/richlander/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/richlander/subscriptions","organizations_url":"https://api.github.com/users/richlander/orgs","repos_url":"https://api.github.com/users/richlander/repos","events_url":"https://api.github.com/users/richlander/events{/privacy}","received_events_url":"https://api.github.com/users/richlander/received_events","type":"User","site_admin":false},{"login":"KathleenDollard","id":5844318,"node_id":"MDQ6VXNlcjU4NDQzMTg=","avatar_url":"https://avatars2.githubusercontent.com/u/5844318?v=4","gravatar_id":"","url":"https://api.github.com/users/KathleenDollard","html_url":"https://github.com/KathleenDollard","followers_url":"https://api.github.com/users/KathleenDollard/followers","following_url":"https://api.github.com/users/KathleenDollard/following{/other_user}","gists_url":"https://api.github.com/users/KathleenDollard/gists{/gist_id}","starred_url":"https://api.github.com/users/KathleenDollard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KathleenDollard/subscriptions","organizations_url":"https://api.github.com/users/KathleenDollard/orgs","repos_url":"https://api.github.com/users/KathleenDollard/repos","events_url":"https://api.github.com/users/KathleenDollard/events{/privacy}","received_events_url":"https://api.github.com/users/KathleenDollard/received_events","type":"User","site_admin":false},{"login":"johnbeisner","id":24683167,"node_id":"MDQ6VXNlcjI0NjgzMTY3","avatar_url":"https://avatars0.githubusercontent.com/u/24683167?v=4","gravatar_id":"","url":"https://api.github.com/users/johnbeisner","html_url":"https://github.com/johnbeisner","followers_url":"https://api.github.com/users/johnbeisner/followers","following_url":"https://api.github.com/users/johnbeisner/following{/other_user}","gists_url":"https://api.github.com/users/johnbeisner/gists{/gist_id}","starred_url":"https://api.github.com/users/johnbeisner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/johnbeisner/subscriptions","organizations_url":"https://api.github.com/users/johnbeisner/orgs","repos_url":"https://api.github.com/users/johnbeisner/repos","events_url":"https://api.github.com/users/johnbeisner/events{/privacy}","received_events_url":"https://api.github.com/users/johnbeisner/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":597268318,"node_id":"MDU6TGFiZWw1OTcyNjgzMTg=","url":"https://api.github.com/repos/dotnet/designs/labels/proposal","name":"proposal","color":"fbca04","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/designs/pulls/58/commits","review_comments_url":"https://api.github.com/repos/dotnet/designs/pulls/58/comments","review_comment_url":"https://api.github.com/repos/dotnet/designs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/designs/issues/58/comments","statuses_url":"https://api.github.com/repos/dotnet/designs/statuses/3de7e8824482470cc9cc7114743d0374c7f714f3","head":{"label":"vitek-karas:InstallLocations","ref":"InstallLocations","sha":"3de7e8824482470cc9cc7114743d0374c7f714f3","user":{"login":"vitek-karas","id":10670590,"node_id":"MDQ6VXNlcjEwNjcwNTkw","avatar_url":"https://avatars2.githubusercontent.com/u/10670590?v=4","gravatar_id":"","url":"https://api.github.com/users/vitek-karas","html_url":"https://github.com/vitek-karas","followers_url":"https://api.github.com/users/vitek-karas/followers","following_url":"https://api.github.com/users/vitek-karas/following{/other_user}","gists_url":"https://api.github.com/users/vitek-karas/gists{/gist_id}","starred_url":"https://api.github.com/users/vitek-karas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vitek-karas/subscriptions","organizations_url":"https://api.github.com/users/vitek-karas/orgs","repos_url":"https://api.github.com/users/vitek-karas/repos","events_url":"https://api.github.com/users/vitek-karas/events{/privacy}","received_events_url":"https://api.github.com/users/vitek-karas/received_events","type":"User","site_admin":false},"repo":{"id":150551054,"node_id":"MDEwOlJlcG9zaXRvcnkxNTA1NTEwNTQ=","name":"designs","full_name":"vitek-karas/designs","private":false,"owner":{"login":"vitek-karas","id":10670590,"node_id":"MDQ6VXNlcjEwNjcwNTkw","avatar_url":"https://avatars2.githubusercontent.com/u/10670590?v=4","gravatar_id":"","url":"https://api.github.com/users/vitek-karas","html_url":"https://github.com/vitek-karas","followers_url":"https://api.github.com/users/vitek-karas/followers","following_url":"https://api.github.com/users/vitek-karas/following{/other_user}","gists_url":"https://api.github.com/users/vitek-karas/gists{/gist_id}","starred_url":"https://api.github.com/users/vitek-karas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vitek-karas/subscriptions","organizations_url":"https://api.github.com/users/vitek-karas/orgs","repos_url":"https://api.github.com/users/vitek-karas/repos","events_url":"https://api.github.com/users/vitek-karas/events{/privacy}","received_events_url":"https://api.github.com/users/vitek-karas/received_events","type":"User","site_admin":false},"html_url":"https://github.com/vitek-karas/designs","description":"This repo is used for reviewing new .NET designs.","fork":true,"url":"https://api.github.com/repos/vitek-karas/designs","forks_url":"https://api.github.com/repos/vitek-karas/designs/forks","keys_url":"https://api.github.com/repos/vitek-karas/designs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/vitek-karas/designs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/vitek-karas/designs/teams","hooks_url":"https://api.github.com/repos/vitek-karas/designs/hooks","issue_events_url":"https://api.github.com/repos/vitek-karas/designs/issues/events{/number}","events_url":"https://api.github.com/repos/vitek-karas/designs/events","assignees_url":"https://api.github.com/repos/vitek-karas/designs/assignees{/user}","branches_url":"https://api.github.com/repos/vitek-karas/designs/branches{/branch}","tags_url":"https://api.github.com/repos/vitek-karas/designs/tags","blobs_url":"https://api.github.com/repos/vitek-karas/designs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/vitek-karas/designs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/vitek-karas/designs/git/refs{/sha}","trees_url":"https://api.github.com/repos/vitek-karas/designs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/vitek-karas/designs/statuses/{sha}","languages_url":"https://api.github.com/repos/vitek-karas/designs/languages","stargazers_url":"https://api.github.com/repos/vitek-karas/designs/stargazers","contributors_url":"https://api.github.com/repos/vitek-karas/designs/contributors","subscribers_url":"https://api.github.com/repos/vitek-karas/designs/subscribers","subscription_url":"https://api.github.com/repos/vitek-karas/designs/subscription","commits_url":"https://api.github.com/repos/vitek-karas/designs/commits{/sha}","git_commits_url":"https://api.github.com/repos/vitek-karas/designs/git/commits{/sha}","comments_url":"https://api.github.com/repos/vitek-karas/designs/comments{/number}","issue_comment_url":"https://api.github.com/repos/vitek-karas/designs/issues/comments{/number}","contents_url":"https://api.github.com/repos/vitek-karas/designs/contents/{+path}","compare_url":"https://api.github.com/repos/vitek-karas/designs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/vitek-karas/designs/merges","archive_url":"https://api.github.com/repos/vitek-karas/designs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/vitek-karas/designs/downloads","issues_url":"https://api.github.com/repos/vitek-karas/designs/issues{/number}","pulls_url":"https://api.github.com/repos/vitek-karas/designs/pulls{/number}","milestones_url":"https://api.github.com/repos/vitek-karas/designs/milestones{/number}","notifications_url":"https://api.github.com/repos/vitek-karas/designs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/vitek-karas/designs/labels{/name}","releases_url":"https://api.github.com/repos/vitek-karas/designs/releases{/id}","deployments_url":"https://api.github.com/repos/vitek-karas/designs/deployments","created_at":"2018-09-27T08:02:38Z","updated_at":"2019-03-13T13:13:45Z","pushed_at":"2019-03-13T13:17:56Z","git_url":"git://github.com/vitek-karas/designs.git","ssh_url":"git@github.com:vitek-karas/designs.git","clone_url":"https://github.com/vitek-karas/designs.git","svn_url":"https://github.com/vitek-karas/designs","homepage":null,"size":1323,"stargazers_count":0,"watchers_count":0,"language":null,"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":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"39cdfa8fbab3133c28c85ebad7dbb8f6353b1355","user":{"login":"dotnet","id":9141961,"node_id":"MDEyOk9yZ2FuaXphdGlvbjkxNDE5NjE=","avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","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":87844614,"node_id":"MDEwOlJlcG9zaXRvcnk4Nzg0NDYxNA==","name":"designs","full_name":"dotnet/designs","private":false,"owner":{"login":"dotnet","id":9141961,"node_id":"MDEyOk9yZ2FuaXphdGlvbjkxNDE5NjE=","avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","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},"html_url":"https://github.com/dotnet/designs","description":"This repo is used for reviewing new .NET designs.","fork":false,"url":"https://api.github.com/repos/dotnet/designs","forks_url":"https://api.github.com/repos/dotnet/designs/forks","keys_url":"https://api.github.com/repos/dotnet/designs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/designs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/designs/teams","hooks_url":"https://api.github.com/repos/dotnet/designs/hooks","issue_events_url":"https://api.github.com/repos/dotnet/designs/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/designs/events","assignees_url":"https://api.github.com/repos/dotnet/designs/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/designs/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/designs/tags","blobs_url":"https://api.github.com/repos/dotnet/designs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/designs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/designs/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/designs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/designs/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/designs/languages","stargazers_url":"https://api.github.com/repos/dotnet/designs/stargazers","contributors_url":"https://api.github.com/repos/dotnet/designs/contributors","subscribers_url":"https://api.github.com/repos/dotnet/designs/subscribers","subscription_url":"https://api.github.com/repos/dotnet/designs/subscription","commits_url":"https://api.github.com/repos/dotnet/designs/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/designs/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/designs/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/designs/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/designs/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/designs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/designs/merges","archive_url":"https://api.github.com/repos/dotnet/designs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/designs/downloads","issues_url":"https://api.github.com/repos/dotnet/designs/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/designs/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/designs/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/designs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/designs/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/designs/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/designs/deployments","created_at":"2017-04-10T18:33:49Z","updated_at":"2019-03-11T22:18:55Z","pushed_at":"2019-03-13T13:19:54Z","git_url":"git://github.com/dotnet/designs.git","ssh_url":"git@github.com:dotnet/designs.git","clone_url":"https://github.com/dotnet/designs.git","svn_url":"https://github.com/dotnet/designs","homepage":null,"size":1319,"stargazers_count":240,"watchers_count":240,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"archived":false,"open_issues_count":16,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":36,"open_issues":16,"watchers":240,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/designs/pulls/58"},"html":{"href":"https://github.com/dotnet/designs/pull/58"},"issue":{"href":"https://api.github.com/repos/dotnet/designs/issues/58"},"comments":{"href":"https://api.github.com/repos/dotnet/designs/issues/58/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/designs/pulls/58/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/designs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/designs/pulls/58/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/designs/statuses/3de7e8824482470cc9cc7114743d0374c7f714f3"}},"author_association":"MEMBER"}}
other: {"actor":{"display_login":"jkotas"}}