public int Run(FileWorkItemsOptions options, IFileSystem fileSystem) { if (!ValidateOptions(options, fileSystem)) { return(FAILURE); } // For unit tests: allow us to just validate the options and return. if (s_validateOptionsOnly) { return(SUCCESS); } string projectName = options.ProjectUri.GetProjectName(); string logFileContents = fileSystem.ReadAllText(options.InputFilePath); EnsureValidSarifLogFile(logFileContents, options.InputFilePath); FilingTarget filingTarget = FilingTargetFactory.CreateFilingTarget(options.ProjectUriString); var filer = new WorkItemFiler(filingTarget); SarifLog sarifLog = JsonConvert.DeserializeObject <SarifLog>(logFileContents); if (options.DataToRemove != null) { var dataRemovingVisitor = new RemoveOptionalDataVisitor(options.DataToRemove.ToFlags()); dataRemovingVisitor.Visit(sarifLog); } for (int runIndex = 0; runIndex < sarifLog.Runs.Count; ++runIndex) { if (sarifLog.Runs[runIndex]?.Results?.Count > 0) { IList <SarifLog> logsToProcess = new List <SarifLog>(new SarifLog[] { sarifLog }); if (options.GroupingStrategy != GroupingStrategy.PerRun) { SplittingVisitor visitor = (options.GroupingStrategy == GroupingStrategy.PerRunPerRule ? (SplittingVisitor) new PerRunPerRuleSplittingVisitor() : new PerRunPerTargetPerRuleSplittingVisitor()); visitor.VisitRun(sarifLog.Runs[runIndex]); logsToProcess = visitor.SplitSarifLogs; } IList <WorkItemFilingMetadata> workItemMetadata = new List <WorkItemFilingMetadata>(logsToProcess.Count); for (int splitFileIndex = 0; splitFileIndex < logsToProcess.Count; splitFileIndex++) { SarifLog splitLog = logsToProcess[splitFileIndex]; workItemMetadata.Add(splitLog.CreateWorkItemFilingMetadata(projectName, options.TemplateFilePath)); } try { IEnumerable <WorkItemFilingMetadata> filedWorkItems = filer.FileWorkItems(options.ProjectUri, workItemMetadata, options.PersonalAccessToken).Result; Console.WriteLine($"Created {filedWorkItems.Count()} work items for run {runIndex}."); } catch (Exception ex) { Console.Error.WriteLine(ex); } } } Console.WriteLine($"Writing log with work item Ids to {options.OutputFilePath}."); WriteSarifFile <SarifLog>(fileSystem, sarifLog, options.OutputFilePath, (options.PrettyPrint ? Formatting.Indented : Formatting.None)); return(SUCCESS); }
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); } } }