{"action":"created","comment":{"url":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/comments/77263861","id":77263861,"diff_hunk":"@@ -0,0 +1,331 @@\n+﻿// Copyright (c) Microsoft. All rights reserved.\n+// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n+\n+using System;\n+using System.Collections.Generic;\n+using System.IO;\n+using System.Linq;\n+using System.Resources;\n+using Microsoft.CodeAnalysis.Sarif.Driver;\n+using Microsoft.CodeAnalysis.Sarif.Readers;\n+using Microsoft.Json.Pointer;\n+using Newtonsoft.Json;\n+using Newtonsoft.Json.Linq;\n+\n+namespace Microsoft.CodeAnalysis.Sarif.Cli.Rules\n+{\n+    public abstract class SarifValidationSkimmerBase : SkimmerBase<SarifValidationContext>\n+    {\n+        private const string SarifSpecUri =\n+            \"https://rawgit.com/sarif-standard/sarif-spec/master/Static%20Analysis%20Results%20Interchange%20Format%20(SARIF).html\";\n+\n+        private readonly Uri _defaultHelpUri = new Uri(SarifSpecUri);\n+        private JToken _rootToken;\n+\n+        public override Uri HelpUri => _defaultHelpUri;\n+\n+        protected SarifValidationContext Context { get; private set; }\n+\n+        protected override sealed ResourceManager ResourceManager => RuleResources.ResourceManager;\n+\n+        public override sealed void Analyze(SarifValidationContext context)\n+        {\n+            Context = context;\n+\n+            string logContents = File.ReadAllText(context.TargetUri.LocalPath);\n+            _rootToken = JToken.Parse(logContents);\n+\n+            JsonSerializerSettings settings = new JsonSerializerSettings\n+            {\n+                ContractResolver = SarifContractResolver.Instance\n+            };\n+\n+            SarifLog log = JsonConvert.DeserializeObject<SarifLog>(logContents, settings);\n+            string logPointer = string.Empty;\n+\n+            Visit(log, logPointer);\n+        }\n+\n+        private void Visit(SarifLog log, string logPointer)\n+        {\n+            if (log.Runs != null)\n+            {\n+                Run[] runs = log.Runs.ToArray();\n+                string runsPointer = logPointer.AtProperty(SarifPropertyName.Runs);\n+\n+                for (int iRun = 0; iRun < runs.Length; ++iRun)\n+                {\n+                    Run run = runs[iRun];\n+                    string runPointer = runsPointer.AtIndex(iRun);\n+\n+                    Visit(run, runPointer);\n+                }\n+            }\n+        }\n+\n+        private void Visit(AnnotatedCodeLocation annotatedCodeLocation, string annotatedCodeLocationPointer)\n+        {\n+            if (annotatedCodeLocation.PhysicalLocation != null)\n+            {\n+                string physicalLocationPointer = annotatedCodeLocationPointer.AtProperty(SarifPropertyName.PhysicalLocation);\n+                Visit(annotatedCodeLocation.PhysicalLocation, physicalLocationPointer);\n+            }\n+        }\n+\n+        private void Visit(CodeFlow codeFlow, string codeFlowPointer)\n+        {\n+            if (codeFlow.Locations != null)\n+            {\n+                AnnotatedCodeLocation[] annotatedCodeLocations = codeFlow.Locations.ToArray();\n+                string annotatedCodeLocationsPointer = codeFlowPointer.AtProperty(SarifPropertyName.Locations);\n+\n+                for (int iAnnotatedCodeLocation = 0; iAnnotatedCodeLocation < annotatedCodeLocations.Length; ++iAnnotatedCodeLocation)\n+                {\n+                    AnnotatedCodeLocation annotatedCodeLocation = annotatedCodeLocations[iAnnotatedCodeLocation];\n+                    string annotatedCodeLocationPointer = annotatedCodeLocationsPointer.AtIndex(iAnnotatedCodeLocation);\n+\n+                    Visit(annotatedCodeLocation, annotatedCodeLocationPointer);\n+                }\n+            }\n+        }\n+\n+        private void Visit(FileData fileData, string fileKey, string filePointer)\n+        {\n+            Analyze(fileData, fileKey, filePointer);\n+        }\n+\n+        private void Visit(Location location, string locationPointer)\n+        {\n+            if (location.AnalysisTarget != null)\n+            {\n+                string analysisTargetPointer = locationPointer.AtProperty(SarifPropertyName.AnalysisTarget);\n+                Visit(location.AnalysisTarget, analysisTargetPointer);\n+            }\n+\n+            if (location.ResultFile != null)\n+            {\n+                string resultFilePointer = locationPointer.AtProperty(SarifPropertyName.ResultFile);\n+                Visit(location.ResultFile, resultFilePointer);\n+            }\n+        }\n+\n+        private void Visit(Notification notification, string notificationPointer)\n+        {\n+            if (notification.PhysicalLocation != null)\n+            {\n+                string physicalLocationPointer = notificationPointer.AtProperty(SarifPropertyName.PhysicalLocation);\n+\n+                Visit(notification.PhysicalLocation, physicalLocationPointer);\n+            }\n+        }\n+\n+        private void Visit(PhysicalLocation physicalLocation, string physicalLocationPointer)\n+        {\n+            Analyze(physicalLocation, physicalLocationPointer);\n+        }\n+\n+        private void Visit(Result result, string resultPointer)\n+        {\n+            if (result.Locations != null)\n+            {\n+                Location[] locations = result.Locations.ToArray();\n+                string locationsPointer = resultPointer.AtProperty(SarifPropertyName.Locations);\n+\n+                for (int iLocation = 0; iLocation < locations.Length; ++iLocation)\n+                {\n+                    Location location = locations[iLocation];\n+                    string locationPointer = locationsPointer.AtIndex(iLocation);\n+\n+                    Visit(location, locationPointer);\n+                }\n+            }\n+\n+            if (result.CodeFlows != null)\n+            {\n+                CodeFlow[] codeFlows = result.CodeFlows.ToArray();\n+                string codeFlowsPointer = resultPointer.AtProperty(SarifPropertyName.CodeFlows);\n+\n+                for (int iCodeFlow = 0; iCodeFlow < codeFlows.Length; ++iCodeFlow)\n+                {\n+                    CodeFlow codeFlow = codeFlows[iCodeFlow];\n+                    string codeFlowPointer = codeFlowsPointer.AtIndex(iCodeFlow);\n+\n+                    Visit(codeFlow, codeFlowPointer);\n+                }\n+            }\n+\n+            if (result.Stacks != null)\n+            {\n+                Stack[] stacks = result.Stacks.ToArray();\n+                string stacksPointer = resultPointer.AtProperty(SarifPropertyName.Stacks);\n+\n+                for (int iStack = 0; iStack < stacks.Length; ++iStack)\n+                {\n+                    Stack stack = stacks[iStack];\n+                    string stackPointer = stacksPointer.AtIndex(iStack);\n+\n+                    Visit(stack, stackPointer);\n+                }\n+            }\n+\n+            if (result.RelatedLocations != null)\n+            {\n+                AnnotatedCodeLocation[] relatedLocations = result.RelatedLocations.ToArray();\n+                string relatedLocationsPointer = resultPointer.AtProperty(SarifPropertyName.RelatedLocations);\n+\n+                for (int iRelatedLocation = 0; iRelatedLocation < relatedLocations.Length; ++iRelatedLocation)\n+                {\n+                    AnnotatedCodeLocation relatedLocation = relatedLocations[iRelatedLocation];\n+                    string relatedLocationPointer = relatedLocationsPointer.AtIndex(iRelatedLocation);\n+\n+                    Visit(relatedLocation, relatedLocationPointer);\n+                }\n+            }\n+        }\n+\n+        private void Visit(Run run, string runPointer)\n+        {\n+            if (run.Results != null)\n+            {\n+                Result[] results = run.Results.ToArray();\n+                string resultsPointer = runPointer.AtProperty(SarifPropertyName.Results);\n+\n+                for (int iResult = 0; iResult < results.Length; ++iResult)\n+                {\n+                    Result result = results[iResult];\n+                    string resultPointer = resultsPointer.AtIndex(iResult);\n+\n+                    Visit(result, resultPointer);\n+                }\n+            }\n+\n+            if (run.Files != null)\n+            {\n+                IDictionary<string, FileData> files = run.Files;\n+                string filesPointer = runPointer.AtProperty(SarifPropertyName.Files);\n+\n+                foreach (string fileKey in files.Keys)\n+                {\n+                    string filePointer = filesPointer.AtProperty(fileKey);\n+\n+                    Visit(files[fileKey], fileKey, filePointer);\n+                }\n+            }\n+\n+            if (run.Rules != null)\n+            {\n+                Rule[] rules = run.Rules.Values.ToArray();\n+                string rulesPointer = runPointer.AtProperty(SarifPropertyName.Rules);\n+\n+                for (int iRule = 0; iRule < rules.Length; ++iRule)\n+                {\n+                    Rule rule = rules[iRule];\n+                    if (rule.Id != null)\n+                    {\n+                        string rulePointer = rulesPointer.AtProperty(rule.Id);\n+                        Analyze(rule, rulePointer);\n+                    }\n+                }\n+            }\n+\n+            if (run.ToolNotifications != null)\n+            {\n+                Notification[] toolNotifications = run.ToolNotifications.ToArray();\n+                string toolNotificationsPointer = runPointer.AtProperty(SarifPropertyName.ToolNotifications);\n+\n+                for (int iToolNotification = 0; iToolNotification < toolNotifications.Length; ++iToolNotification)\n+                {\n+                    Notification toolNotification = toolNotifications[iToolNotification];\n+                    string toolNotificationPointer = toolNotificationsPointer.AtIndex(iToolNotification);\n+\n+                    Visit(toolNotification, toolNotificationPointer);\n+                }\n+            }\n+\n+            if (run.ConfigurationNotifications != null)\n+            {\n+                Notification[] configurationNotifications = run.ConfigurationNotifications.ToArray();\n+                string configurationNotificationsPointer = runPointer.AtProperty(SarifPropertyName.ConfigurationNotifications);\n+\n+                for (int iConfigurationNotification = 0; iConfigurationNotification < configurationNotifications.Length; ++iConfigurationNotification)\n+                {\n+                    Notification configurationNotification = configurationNotifications[iConfigurationNotification];\n+                    string configurationNotificationPointer = configurationNotificationsPointer.AtIndex(iConfigurationNotification);\n+\n+                    Visit(configurationNotification, configurationNotificationPointer);\n+                }\n+            }\n+        }\n+\n+        private void Visit(Stack stack, string stackPointer)\n+        {\n+            if (stack.Frames != null)\n+            {\n+                StackFrame[] frames = stack.Frames.ToArray();\n+                string framesPointer = stackPointer.AtProperty(SarifPropertyName.Frames);\n+\n+                for (int iFrame = 0; iFrame < frames.Length; ++iFrame)\n+                {\n+                    StackFrame frame = frames[iFrame];\n+                    string framePointer = framesPointer.AtIndex(iFrame);\n+\n+                    Visit(frame, framePointer);\n+                }\n+            }\n+        }\n+\n+        private void Visit(StackFrame frame, string framePointer)\n+        {\n+            Analyze(frame, framePointer);\n+        }\n+\n+        protected virtual void Analyze(FileData fileData, string fileKey, string filePointer)\n+        {\n+        }\n+\n+        protected virtual void Analyze(PhysicalLocation physicalLocation, string physicalLocationPointer)\n+        {\n+        }\n+\n+        protected virtual void Analyze(Rule rule, string rulePointer)\n+        {\n+        }\n+\n+        protected virtual void Analyze(StackFrame frame, string framePointer)\n+        {\n+        }\n+\n+        protected void LogResult(ResultLevel level, string jPointer, string formatId, params string[] args)\n+        {\n+            Region region = GetRegionFromJPointer(jPointer);\n+\n+            // All messages start with \"In {file}, at {jPointer}, ...\". Prepend the jPointer to the args.","path":"src/SarifCli/Rules/SarifValidationSkimmerBase.cs","position":null,"original_position":302,"commit_id":"e6f60299d3beefa94b861aeff5fa4b37b41cf4a5","original_commit_id":"eb59c47ab064707fa73cc6eea409b82a55e8ee63","user":{"login":"lgolding","id":11762653,"avatar_url":"https://avatars.githubusercontent.com/u/11762653?v=3","gravatar_id":"","url":"https://api.github.com/users/lgolding","html_url":"https://github.com/lgolding","followers_url":"https://api.github.com/users/lgolding/followers","following_url":"https://api.github.com/users/lgolding/following{/other_user}","gists_url":"https://api.github.com/users/lgolding/gists{/gist_id}","starred_url":"https://api.github.com/users/lgolding/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lgolding/subscriptions","organizations_url":"https://api.github.com/users/lgolding/orgs","repos_url":"https://api.github.com/users/lgolding/repos","events_url":"https://api.github.com/users/lgolding/events{/privacy}","received_events_url":"https://api.github.com/users/lgolding/received_events","type":"User","site_admin":false},"body":"I'm going to fix the framework so it doesn't automatically prepend the file name. I'll upgrade to the new framework, and modify my messages so they all start with \"{jPointer}: ...\". Then, since I _do_ in fact use the framework's logging facilities, which _do_ use the VS formatting helper, the messages will end up looking like this:\r\n\r\nC:\\Path\\To\\log.sarif(12,25): /runs/0/results/0/locations/0/analysisTarget/uri: Something is dreadfully wrong with the uri \"foobles\".\r\n\r\nThis will continue to work with the VS error list window (as it does today).\r\n\r\n---\r\nIn reply to: [77240384](https://github.com/Microsoft/sarif-sdk/pull/501#discussion_r77240384) [](ancestors = 77240384)","created_at":"2016-09-01T22:14:35Z","updated_at":"2016-09-01T22:14:35Z","html_url":"https://github.com/Microsoft/sarif-sdk/pull/501#discussion_r77263861","pull_request_url":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/501","_links":{"self":{"href":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/comments/77263861"},"html":{"href":"https://github.com/Microsoft/sarif-sdk/pull/501#discussion_r77263861"},"pull_request":{"href":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/501"}}},"pull_request":{"url":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/501","id":82458428,"html_url":"https://github.com/Microsoft/sarif-sdk/pull/501","diff_url":"https://github.com/Microsoft/sarif-sdk/pull/501.diff","patch_url":"https://github.com/Microsoft/sarif-sdk/pull/501.patch","issue_url":"https://api.github.com/repos/Microsoft/sarif-sdk/issues/501","number":501,"state":"closed","locked":false,"title":"Implement smart validation in SarifCli tool","user":{"login":"lgolding","id":11762653,"avatar_url":"https://avatars.githubusercontent.com/u/11762653?v=3","gravatar_id":"","url":"https://api.github.com/users/lgolding","html_url":"https://github.com/lgolding","followers_url":"https://api.github.com/users/lgolding/followers","following_url":"https://api.github.com/users/lgolding/following{/other_user}","gists_url":"https://api.github.com/users/lgolding/gists{/gist_id}","starred_url":"https://api.github.com/users/lgolding/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lgolding/subscriptions","organizations_url":"https://api.github.com/users/lgolding/orgs","repos_url":"https://api.github.com/users/lgolding/repos","events_url":"https://api.github.com/users/lgolding/events{/privacy}","received_events_url":"https://api.github.com/users/lgolding/received_events","type":"User","site_admin":false},"body":"We implement the framework for the validator and its functional tests, and we implement the following rules:\r\n\r\n* `AnnotatedCodeLocationEssentialIsObsolete`\r\n* `AnnotatedCodeLocationIdIsObsolete`\r\n* `DoNotUseFriendlyNameAsRuleId`\r\n* `EndColumnMustNotBeLessThanStartColumn`\r\n* `EndLineMustNotBeLessThanStartLine`\r\n* `EndTimeMustBeAfterStartTime`\r\n* `HashAlgorithmsMustBeUnique`\r\n* `ImportanceMustAppearOnlyInCodeFlowLocations`\r\n* `MessagesShouldEndWithPeriod`\r\n* `StepMustAppearOnlyInCodeFlowLocations`\r\n* `StepValuesMustFormOneBasedSequence`\r\n* `UrisMustBeValid`\r\n* `UseAbsolutePathsForNestedUriFragments`\r\n\r\nSubsequent PRs will implement more rules.\r\n\r\nThe validator is built on the `Sarif.Driver` framework. The validator performs schema validation in addition to the \"smart validation\" rules.\r\n\r\nThe smart validation rules get their location information as follows:\r\n\r\n1. Construct a JSON pointer (such as `\"/runs/0/rules/SV0001\"`) to represent the logical location of the result.\r\n2. Evaluate that pointer against a `JToken` that represents the entire document, producing a `JToken` that represents the element specified by the pointer.\r\n3. Extract the location information from the `JToken`.\r\n\r\nWe use the JSON Pointer implementation from `Microsoft.Json.Pointer`, which is obtained from NuGet along with `Microsoft.Json.Schema`. This is the first use of the JSON Pointer implementation.\r\n\r\nAlthough a skeleton project for the validator already existed, you should read this as completely new code.\r\n\r\nNOTE 1: I ran into the circular dependency thing we've seen before, where a project in sarif-sdk (in this case, the new `SarifCli` and `SarifCli.FunctionalTest` projects) depends on JSchema, which in turn depends on a different version of sarif-sdk. The comments on commit bf4b015 explain how I fixed it.\r\n\r\nNOTE 2: I also took the opportunity to fix our dependency on the foreign checked in binary Microsoft.Json.Schema.dll in the `src\\References` directory. Commits 046c98f, d6de920, and c1e2261 removed the FCIB dependencies, replaced them with  NuGet dependencies on Microsoft.Json.Schema and Microsoft.Json.Pointer, and removed the `src\\References` directory.\r\n\r\nNOTE 3: I took the opportunity to upgrade our dependency on Microsoft.Json.Schema.ToDotNet from version 0.42.0 to the latest 0.45.0 (commit 00a6e30). As a result, all the files in the `Autogenerated` directory were modified (the version specified in their `GeneratedCode` attributes changed from `0.42.0` to `0.45.0`.","created_at":"2016-08-23T23:27:00Z","updated_at":"2016-09-01T22:14:35Z","closed_at":"2016-09-01T19:56:35Z","merged_at":"2016-09-01T19:56:35Z","merge_commit_sha":"d43c42e820fe12031c2dfc0abbee357902aa05d4","assignee":{"login":"michaelcfanning","id":13526455,"avatar_url":"https://avatars.githubusercontent.com/u/13526455?v=3","gravatar_id":"","url":"https://api.github.com/users/michaelcfanning","html_url":"https://github.com/michaelcfanning","followers_url":"https://api.github.com/users/michaelcfanning/followers","following_url":"https://api.github.com/users/michaelcfanning/following{/other_user}","gists_url":"https://api.github.com/users/michaelcfanning/gists{/gist_id}","starred_url":"https://api.github.com/users/michaelcfanning/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaelcfanning/subscriptions","organizations_url":"https://api.github.com/users/michaelcfanning/orgs","repos_url":"https://api.github.com/users/michaelcfanning/repos","events_url":"https://api.github.com/users/michaelcfanning/events{/privacy}","received_events_url":"https://api.github.com/users/michaelcfanning/received_events","type":"User","site_admin":false},"assignees":[{"login":"michaelcfanning","id":13526455,"avatar_url":"https://avatars.githubusercontent.com/u/13526455?v=3","gravatar_id":"","url":"https://api.github.com/users/michaelcfanning","html_url":"https://github.com/michaelcfanning","followers_url":"https://api.github.com/users/michaelcfanning/followers","following_url":"https://api.github.com/users/michaelcfanning/following{/other_user}","gists_url":"https://api.github.com/users/michaelcfanning/gists{/gist_id}","starred_url":"https://api.github.com/users/michaelcfanning/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaelcfanning/subscriptions","organizations_url":"https://api.github.com/users/michaelcfanning/orgs","repos_url":"https://api.github.com/users/michaelcfanning/repos","events_url":"https://api.github.com/users/michaelcfanning/events{/privacy}","received_events_url":"https://api.github.com/users/michaelcfanning/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/501/commits","review_comments_url":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/501/comments","review_comment_url":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Microsoft/sarif-sdk/issues/501/comments","statuses_url":"https://api.github.com/repos/Microsoft/sarif-sdk/statuses/e6f60299d3beefa94b861aeff5fa4b37b41cf4a5","head":{"label":"lgolding:smart-validator","ref":"smart-validator","sha":"e6f60299d3beefa94b861aeff5fa4b37b41cf4a5","user":{"login":"lgolding","id":11762653,"avatar_url":"https://avatars.githubusercontent.com/u/11762653?v=3","gravatar_id":"","url":"https://api.github.com/users/lgolding","html_url":"https://github.com/lgolding","followers_url":"https://api.github.com/users/lgolding/followers","following_url":"https://api.github.com/users/lgolding/following{/other_user}","gists_url":"https://api.github.com/users/lgolding/gists{/gist_id}","starred_url":"https://api.github.com/users/lgolding/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lgolding/subscriptions","organizations_url":"https://api.github.com/users/lgolding/orgs","repos_url":"https://api.github.com/users/lgolding/repos","events_url":"https://api.github.com/users/lgolding/events{/privacy}","received_events_url":"https://api.github.com/users/lgolding/received_events","type":"User","site_admin":false},"repo":{"id":54408927,"name":"sarif-sdk","full_name":"lgolding/sarif-sdk","owner":{"login":"lgolding","id":11762653,"avatar_url":"https://avatars.githubusercontent.com/u/11762653?v=3","gravatar_id":"","url":"https://api.github.com/users/lgolding","html_url":"https://github.com/lgolding","followers_url":"https://api.github.com/users/lgolding/followers","following_url":"https://api.github.com/users/lgolding/following{/other_user}","gists_url":"https://api.github.com/users/lgolding/gists{/gist_id}","starred_url":"https://api.github.com/users/lgolding/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lgolding/subscriptions","organizations_url":"https://api.github.com/users/lgolding/orgs","repos_url":"https://api.github.com/users/lgolding/repos","events_url":"https://api.github.com/users/lgolding/events{/privacy}","received_events_url":"https://api.github.com/users/lgolding/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/lgolding/sarif-sdk","description":".NET code and supporting files for working with the 'Static Analysis Results Interchange Format' (SARIF, see https://github.com/sarif-standard/sarif-spec)","fork":true,"url":"https://api.github.com/repos/lgolding/sarif-sdk","forks_url":"https://api.github.com/repos/lgolding/sarif-sdk/forks","keys_url":"https://api.github.com/repos/lgolding/sarif-sdk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lgolding/sarif-sdk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lgolding/sarif-sdk/teams","hooks_url":"https://api.github.com/repos/lgolding/sarif-sdk/hooks","issue_events_url":"https://api.github.com/repos/lgolding/sarif-sdk/issues/events{/number}","events_url":"https://api.github.com/repos/lgolding/sarif-sdk/events","assignees_url":"https://api.github.com/repos/lgolding/sarif-sdk/assignees{/user}","branches_url":"https://api.github.com/repos/lgolding/sarif-sdk/branches{/branch}","tags_url":"https://api.github.com/repos/lgolding/sarif-sdk/tags","blobs_url":"https://api.github.com/repos/lgolding/sarif-sdk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lgolding/sarif-sdk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lgolding/sarif-sdk/git/refs{/sha}","trees_url":"https://api.github.com/repos/lgolding/sarif-sdk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lgolding/sarif-sdk/statuses/{sha}","languages_url":"https://api.github.com/repos/lgolding/sarif-sdk/languages","stargazers_url":"https://api.github.com/repos/lgolding/sarif-sdk/stargazers","contributors_url":"https://api.github.com/repos/lgolding/sarif-sdk/contributors","subscribers_url":"https://api.github.com/repos/lgolding/sarif-sdk/subscribers","subscription_url":"https://api.github.com/repos/lgolding/sarif-sdk/subscription","commits_url":"https://api.github.com/repos/lgolding/sarif-sdk/commits{/sha}","git_commits_url":"https://api.github.com/repos/lgolding/sarif-sdk/git/commits{/sha}","comments_url":"https://api.github.com/repos/lgolding/sarif-sdk/comments{/number}","issue_comment_url":"https://api.github.com/repos/lgolding/sarif-sdk/issues/comments{/number}","contents_url":"https://api.github.com/repos/lgolding/sarif-sdk/contents/{+path}","compare_url":"https://api.github.com/repos/lgolding/sarif-sdk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lgolding/sarif-sdk/merges","archive_url":"https://api.github.com/repos/lgolding/sarif-sdk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lgolding/sarif-sdk/downloads","issues_url":"https://api.github.com/repos/lgolding/sarif-sdk/issues{/number}","pulls_url":"https://api.github.com/repos/lgolding/sarif-sdk/pulls{/number}","milestones_url":"https://api.github.com/repos/lgolding/sarif-sdk/milestones{/number}","notifications_url":"https://api.github.com/repos/lgolding/sarif-sdk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lgolding/sarif-sdk/labels{/name}","releases_url":"https://api.github.com/repos/lgolding/sarif-sdk/releases{/id}","deployments_url":"https://api.github.com/repos/lgolding/sarif-sdk/deployments","created_at":"2016-03-21T17:27:00Z","updated_at":"2016-03-21T17:27:04Z","pushed_at":"2016-09-01T22:02:35Z","git_url":"git://github.com/lgolding/sarif-sdk.git","ssh_url":"git@github.com:lgolding/sarif-sdk.git","clone_url":"https://github.com/lgolding/sarif-sdk.git","svn_url":"https://github.com/lgolding/sarif-sdk","homepage":"","size":58971,"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":"Microsoft:master","ref":"master","sha":"b335dc92c1e878c92c8be6b41270c3c42a957cd5","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":45640472,"name":"sarif-sdk","full_name":"Microsoft/sarif-sdk","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/sarif-sdk","description":".NET code and supporting files for working with the 'Static Analysis Results Interchange Format' (SARIF, see https://github.com/sarif-standard/sarif-spec)","fork":false,"url":"https://api.github.com/repos/Microsoft/sarif-sdk","forks_url":"https://api.github.com/repos/Microsoft/sarif-sdk/forks","keys_url":"https://api.github.com/repos/Microsoft/sarif-sdk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/sarif-sdk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/sarif-sdk/teams","hooks_url":"https://api.github.com/repos/Microsoft/sarif-sdk/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/sarif-sdk/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/sarif-sdk/events","assignees_url":"https://api.github.com/repos/Microsoft/sarif-sdk/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/sarif-sdk/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/sarif-sdk/tags","blobs_url":"https://api.github.com/repos/Microsoft/sarif-sdk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/sarif-sdk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/sarif-sdk/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/sarif-sdk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/sarif-sdk/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/sarif-sdk/languages","stargazers_url":"https://api.github.com/repos/Microsoft/sarif-sdk/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/sarif-sdk/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/sarif-sdk/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/sarif-sdk/subscription","commits_url":"https://api.github.com/repos/Microsoft/sarif-sdk/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/sarif-sdk/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/sarif-sdk/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/sarif-sdk/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/sarif-sdk/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/sarif-sdk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/sarif-sdk/merges","archive_url":"https://api.github.com/repos/Microsoft/sarif-sdk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/sarif-sdk/downloads","issues_url":"https://api.github.com/repos/Microsoft/sarif-sdk/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/sarif-sdk/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/sarif-sdk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/sarif-sdk/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/sarif-sdk/releases{/id}","deployments_url":"https://api.github.com/repos/Microsoft/sarif-sdk/deployments","created_at":"2015-11-05T21:26:46Z","updated_at":"2016-06-18T23:26:38Z","pushed_at":"2016-09-01T22:08:58Z","git_url":"git://github.com/Microsoft/sarif-sdk.git","ssh_url":"git@github.com:Microsoft/sarif-sdk.git","clone_url":"https://github.com/Microsoft/sarif-sdk.git","svn_url":"https://github.com/Microsoft/sarif-sdk","homepage":"","size":78634,"stargazers_count":8,"watchers_count":8,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":14,"mirror_url":null,"open_issues_count":64,"forks":14,"open_issues":64,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/501"},"html":{"href":"https://github.com/Microsoft/sarif-sdk/pull/501"},"issue":{"href":"https://api.github.com/repos/Microsoft/sarif-sdk/issues/501"},"comments":{"href":"https://api.github.com/repos/Microsoft/sarif-sdk/issues/501/comments"},"review_comments":{"href":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/501/comments"},"review_comment":{"href":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Microsoft/sarif-sdk/pulls/501/commits"},"statuses":{"href":"https://api.github.com/repos/Microsoft/sarif-sdk/statuses/e6f60299d3beefa94b861aeff5fa4b37b41cf4a5"}}}}
{"actor":{"display_login":"lgolding"}}