private bool ValidateOptions(TransformOptions transformOptions) { bool valid = true; if (transformOptions.SarifOutputVersion != SarifVersion.OneZeroZero && transformOptions.SarifOutputVersion != SarifVersion.Current) { Console.WriteLine(MultitoolResources.ErrorInvalidTransformTargetVersion); valid = false; } valid &= transformOptions.ValidateOutputOptions(); valid &= DriverUtilities.ReportWhetherOutputFileCanBeCreated(transformOptions.OutputFilePath, transformOptions.Force, _fileSystem); return(valid); }
public static int Run(TransformOptions transformOptions) { try { if (transformOptions.Version < 1 || transformOptions.Version > 2) { Console.WriteLine(MultitoolResources.ErrorInvalidTransformTargetVersion); return(1); } OptionallyEmittedData dataToInsert = OptionallyEmittedData.None; Array.ForEach(transformOptions.DataToInsert, data => dataToInsert |= data); // NOTE: we don't actually utilize the dataToInsert command-line data yet... string fileName = CommandUtilities.GetTransformedOutputFileName(transformOptions); var formatting = transformOptions.PrettyPrint ? Formatting.Indented : Formatting.None; // Assume the input log is the "other" version if (transformOptions.Version == 2) { SarifLogVersionOne actualLog = MultitoolFileHelpers.ReadSarifFile <SarifLogVersionOne>(transformOptions.InputFilePath, SarifContractResolverVersionOne.Instance); var visitor = new SarifVersionOneToCurrentVisitor(); visitor.VisitSarifLogVersionOne(actualLog); MultitoolFileHelpers.WriteSarifFile(visitor.SarifLog, fileName, formatting); } else { SarifLog actualLog = MultitoolFileHelpers.ReadSarifFile <SarifLog>(transformOptions.InputFilePath); var visitor = new SarifCurrentToVersionOneVisitor(); visitor.VisitSarifLog(actualLog); MultitoolFileHelpers.WriteSarifFile(visitor.SarifLogVersionOne, fileName, formatting); } } catch (Exception ex) { Console.WriteLine(ex); return(1); } return(0); }
private static (string transformedContents, int returnCode) RunTransformationCore( string logFileContents, SarifVersion targetVersion, TransformOptions options = null) { const string LogFilePath = @"c:\logs\mylog.sarif"; options ??= new TransformOptions { Inline = true, SarifOutputVersion = targetVersion, InputFilePath = LogFilePath }; if (options.SarifOutputVersion == SarifVersion.Unknown) { options.SarifOutputVersion = targetVersion; } if (options.InputFilePath == null) { options.Inline = true; options.InputFilePath = LogFilePath; } var transformedContents = new StringBuilder(); // Complex: TransformCommand has code paths that use Create and OpenRead, but also ReadAllText and WriteAllText. var mockFileSystem = new Mock <IFileSystem>(); mockFileSystem.Setup(x => x.FileReadAllText(options.InputFilePath)).Returns(logFileContents); mockFileSystem.Setup(x => x.FileOpenRead(options.InputFilePath)).Returns(() => new MemoryStream(Encoding.UTF8.GetBytes(logFileContents))); mockFileSystem.Setup(x => x.FileCreate(options.InputFilePath)).Returns(() => new MemoryStreamToStringBuilder(transformedContents)); mockFileSystem.Setup(x => x.FileWriteAllText(options.InputFilePath, It.IsAny <string>())).Callback <string, string>((path, contents) => { transformedContents.Append(contents); }); var transformCommand = new TransformCommand(mockFileSystem.Object); int returnCode = transformCommand.Run(options); return(transformedContents.ToString(), returnCode); }
public int Run(TransformOptions transformOptions) { try { if (transformOptions.TargetVersion != SarifVersion.OneZeroZero && transformOptions.TargetVersion != SarifVersion.Current) { Console.WriteLine(MultitoolResources.ErrorInvalidTransformTargetVersion); return(1); } OptionallyEmittedData dataToInsert = transformOptions.DataToInsert.ToFlags(); // NOTE: we don't actually utilize the dataToInsert command-line data yet... string fileName = CommandUtilities.GetTransformedOutputFileName(transformOptions); var formatting = transformOptions.PrettyPrint ? Formatting.Indented : Formatting.None; string inputFilePath = transformOptions.InputFilePath; string inputVersion = SniffVersion(inputFilePath); // If the user wants to transform to current v2, we check to see whether the input // file is v2 or pre-release v2. We upgrade both formats to current v2. // // Correspondingly, if the input file is v2 of any kind, we first ensure that it is // current v2, then drop it down to v1. // // We do not support transforming to any obsoleted pre-release v2 formats. if (transformOptions.TargetVersion == SarifVersion.Current) { if (inputVersion == "1.0.0") { SarifLogVersionOne actualLog = FileHelpers.ReadSarifFile <SarifLogVersionOne>(_fileSystem, transformOptions.InputFilePath, SarifContractResolverVersionOne.Instance); var visitor = new SarifVersionOneToCurrentVisitor(); visitor.VisitSarifLogVersionOne(actualLog); FileHelpers.WriteSarifFile(_fileSystem, visitor.SarifLog, fileName, formatting); } else { // We have a pre-release v2 file that we should upgrade to current. PrereleaseCompatibilityTransformer.UpdateToCurrentVersion( _fileSystem.ReadAllText(inputFilePath), formatting: formatting, out string sarifText); _fileSystem.WriteAllText(fileName, sarifText); } } else { if (inputVersion == "1.0.0") { _fileSystem.WriteAllText(fileName, _fileSystem.ReadAllText(inputFilePath)); } else { string currentSarifVersion = SarifUtilities.SemanticVersion; string sarifText = _fileSystem.ReadAllText(inputFilePath); SarifLog actualLog = null; if (inputVersion != currentSarifVersion) { // Note that we don't provide formatting here. It is not required to indent the v2 SARIF - it // will be transformed to v1 later, where we should apply the indentation settings. actualLog = PrereleaseCompatibilityTransformer.UpdateToCurrentVersion( sarifText, formatting: Formatting.None, out sarifText); } else { actualLog = JsonConvert.DeserializeObject <SarifLog>(sarifText); } var visitor = new SarifCurrentToVersionOneVisitor(); visitor.VisitSarifLog(actualLog); FileHelpers.WriteSarifFile(_fileSystem, visitor.SarifLogVersionOne, fileName, formatting, SarifContractResolverVersionOne.Instance); } } } catch (Exception ex) { Console.WriteLine(ex); return(1); } return(0); }
public int Run(TransformOptions transformOptions) { try { // Only set --output-file if --inline isn't specified. ValidateOptions will check // to make sure that exactly one of those two options is set. if (!transformOptions.Inline) { transformOptions.OutputFilePath = CommandUtilities.GetTransformedOutputFileName(transformOptions); } bool valid = ValidateOptions(transformOptions); if (!valid) { return(FAILURE); } // NOTE: we don't actually utilize the dataToInsert command-line data yet... OptionallyEmittedData dataToInsert = transformOptions.DataToInsert.ToFlags(); string inputFilePath = transformOptions.InputFilePath; string inputVersion = SniffVersion(inputFilePath); // If the user wants to transform to current v2, we check to see whether the input // file is v2 or pre-release v2. We upgrade both formats to current v2. // // Correspondingly, if the input file is v2 of any kind, we first ensure that it is // current v2, then drop it down to v1. // // We do not support transforming to any obsoleted pre-release v2 formats. if (transformOptions.SarifOutputVersion == SarifVersion.Current) { if (inputVersion == "1.0.0") { SarifLogVersionOne actualLog = ReadSarifFile <SarifLogVersionOne>(_fileSystem, transformOptions.InputFilePath, SarifContractResolverVersionOne.Instance); var visitor = new SarifVersionOneToCurrentVisitor(); visitor.VisitSarifLogVersionOne(actualLog); WriteSarifFile(_fileSystem, visitor.SarifLog, transformOptions.OutputFilePath, transformOptions.Formatting); } else { // We have a pre-release v2 file that we should upgrade to current. PrereleaseCompatibilityTransformer.UpdateToCurrentVersion( _fileSystem.ReadAllText(inputFilePath), formatting: transformOptions.Formatting, out string sarifText); _fileSystem.WriteAllText(transformOptions.OutputFilePath, sarifText); } } else { if (inputVersion == "1.0.0") { SarifLogVersionOne logV1 = ReadSarifFile <SarifLogVersionOne>(_fileSystem, transformOptions.InputFilePath, SarifContractResolverVersionOne.Instance); logV1.SchemaUri = SarifVersion.OneZeroZero.ConvertToSchemaUri(); WriteSarifFile(_fileSystem, logV1, transformOptions.OutputFilePath, transformOptions.Formatting, SarifContractResolverVersionOne.Instance); } else { string currentSarifVersion = SarifUtilities.StableSarifVersion; string sarifText = _fileSystem.ReadAllText(inputFilePath); SarifLog actualLog = null; if (inputVersion != currentSarifVersion) { // Note that we don't provide formatting here. It is not required to indent the v2 SARIF - it // will be transformed to v1 later, where we should apply the indentation settings. actualLog = PrereleaseCompatibilityTransformer.UpdateToCurrentVersion( sarifText, formatting: Formatting.None, out sarifText); } else { actualLog = JsonConvert.DeserializeObject <SarifLog>(sarifText); } var visitor = new SarifCurrentToVersionOneVisitor(); visitor.VisitSarifLog(actualLog); WriteSarifFile(_fileSystem, visitor.SarifLogVersionOne, transformOptions.OutputFilePath, transformOptions.Formatting, SarifContractResolverVersionOne.Instance); } } } catch (Exception ex) { Console.WriteLine(ex); return(FAILURE); } return(SUCCESS); }