示例#1
0
        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);
        }
示例#2
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);
                }
            }
        }