public static int Run(BaselineOptions baselineOptions) { try { SarifLog baselineFile = MultitoolFileHelpers.ReadSarifFile <SarifLog>(baselineOptions.BaselineFilePath); SarifLog currentFile = MultitoolFileHelpers.ReadSarifFile <SarifLog>(baselineOptions.CurrentFilePath); if (baselineFile.Runs.Count != 1 || currentFile.Runs.Count != 1) { throw new ArgumentException("Invalid sarif logs, we can only baseline logs with a single run in them."); } ISarifLogBaseliner baseliner = SarifLogBaselinerFactory.CreateSarifLogBaseliner(baselineOptions.BaselineType); Run diffedRun = baseliner.CreateBaselinedRun(baselineFile.Runs.First(), currentFile.Runs.First()); SarifLog output = currentFile.DeepClone(); output.Runs = new List <Run>(); output.Runs.Add(diffedRun); var formatting = baselineOptions.PrettyPrint ? Formatting.Indented : Formatting.None; MultitoolFileHelpers.WriteSarifFile(output, baselineOptions.OutputFilePath, formatting); } catch (Exception ex) { Console.WriteLine(ex); return(1); } return(0); }
private static void NonFunctioningEndToEndApiUsageExample() { // 1. Retrieve the current SARIF and its baseline equivalent SarifLog baselineSarif = RetrieveBaselineSarif(); SarifLog currentSarif = RetrieveCurrentSarif(); // 2. Match the SARIF files ISarifLogBaseliner resultMatcher = SarifLogBaselinerFactory.CreateSarifLogBaseliner(SarifBaselineType.Standard); SarifLog matchedLog = new SarifLog { Runs = new[] { resultMatcher.CreateBaselinedRun(baselineSarif.Runs[0], currentSarif.Runs[0]) } }; // 3. Make sure everything has a GUID and that we have a map back to each result from it var guidToMatchedResultMap = new Dictionary <string, Result>(); foreach (Result result in matchedLog.Runs[0].Results) { if (result.Guid == null) { result.Guid = Guid.NewGuid().ToString(); } guidToMatchedResultMap[result.Guid] = result; } var adoClient = new AzureDevOpsClient(); var filingTarget = new AzureDevOpsFilingTarget(adoClient); var workItemFiler = new WorkItemFiler( filingTarget, filteringStrategy: new NewResultsFilteringStrategy(), groupingStrategy: new OneResultPerWorkItemGroupingStrategy()); string logFilePath = Path.GetTempFileName(); File.WriteAllText(logFilePath, JsonConvert.SerializeObject(matchedLog)); // IMPORTANT! There's no facility defined yet for creating/configuring titles, area paths, etc. try { IEnumerable <ResultGroup> resultGroups = workItemFiler.FileWorkItems(logFilePath).Result; foreach (ResultGroup resultGroup in resultGroups) { foreach (Result result in resultGroup.Results) { bool matched = guidToMatchedResultMap.TryGetValue(result.Guid, out Result originalResult); Debug.Assert(matched); originalResult.WorkItemUris = result.WorkItemUris; } } } finally { if (File.Exists(logFilePath)) { File.Delete(logFilePath); } } }