Exemplo n.º 1
0
        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);
        }
Exemplo n.º 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);
                }
            }
        }