/// <summary> /// Creates an artifact at the given write count and existence. /// </summary> internal FileArtifactWithAttributes(AbsolutePath path, int rewriteCount, FileExistence fileExistence) { Contract.Requires(rewriteCount <= MaxRewriteCount); m_path = path; m_rewriteCountAndFileExistence = (uint)(rewriteCount | ((byte)fileExistence << RewriteCountSize)); }
public void TestPipOutputFingerprinting(FileExistence existence, FileExistence anotherExistence) { // Arrange var pathTable = m_context.PathTable; var executable = FileArtifact.CreateSourceFile(AbsolutePath.Create(pathTable, X("/x/pkgs/tool.exe"))); AbsolutePath outputPath = AbsolutePath.Create(pathTable, X("/x/obj/working/out.bin")); FileArtifactWithAttributes output = new FileArtifactWithAttributes(outputPath, rewriteCount: 1, fileExistence: existence); Process process = DefaultBuilder.WithOutputs(output).Build(); Process processSecondVersion = DefaultBuilder.WithOutputs(output.CreateNextWrittenVersion()).Build(); var outputWithDifferenceExistence = new FileArtifactWithAttributes(outputPath, rewriteCount: 1, fileExistence: anotherExistence); var processWithDifferenceExistence = DefaultBuilder.WithOutputs(outputWithDifferenceExistence).Build(); var fingerprinter = CreateFingerprinter(executable); // Act var fingerprint = fingerprinter.ComputeFingerprint(process); // Assert XAssert.AreEqual(fingerprint, fingerprinter.ComputeFingerprint(processSecondVersion), "RewriteCount should not affect the fingerprint"); XAssert.AreNotEqual(fingerprint, fingerprinter.ComputeFingerprint(processWithDifferenceExistence), "Two process with the same output path but with different attributes should produce different fingerprints"); }
/// <summary> /// Creates an artifact at the given write count and existence. /// </summary> internal FileArtifactWithAttributes(AbsolutePath path, int rewriteCount, FileExistence fileExistence, bool isUndeclaredFileRewrite = false) { Contract.Requires(rewriteCount <= MaxRewriteCount); Contract.Requires(((byte)fileExistence) <= MaxFileExistence); m_path = path; m_rewriteCountAndFileExistenceAndFileRewrite = ((uint)rewriteCount | (uint)((byte)fileExistence << RewriteCountSize) | (isUndeclaredFileRewrite ? UndeclaredFileRewriteMask : 0)); }
public void FileExistenceStaysTheSameWithCallToCreateNextWrittenVersion(FileExistence fileExistence) { var pathTable = new PathTable(); AbsolutePath filePath = AbsolutePath.Create(pathTable, A("t", "file1.txt")); var artifact = FileArtifactWithAttributes.Create(FileArtifact.CreateSourceFile(filePath), fileExistence); var anotherArtifact = artifact.CreateNextWrittenVersion(); XAssert.AreEqual(artifact.FileExistence, anotherArtifact.FileExistence, "FileExistence should be the same after call to CreateNextWrittenVersion"); }
public void TestSerialization(FileExistence fileExistence) { var pathTable = new PathTable(); var fileArtifact = FileArtifactWithAttributes.Create(FileArtifact.CreateSourceFile(AbsolutePath.Create(pathTable, A("c", "foo.txt"))), fileExistence); HasTheSamePathAndExistence(fileArtifact, CloneViaSerialization(fileArtifact)); // Write count is not affected by serialization/deserialization HasTheSamePathAndExistence(fileArtifact, CloneViaSerialization(fileArtifact.CreateNextWrittenVersion())); }
public void PipCanRewriteOptionalOutput(FileExistence rewrittenFileExistence) { using (TestEnv env = TestEnv.CreateTestEnvWithPausedScheduler()) { AbsolutePath outputPath = env.Paths.CreateAbsolutePath(A("x", "test")); var pip1 = CreatePipBuilderWithTag(env, "test"); pip1.AddOutputFile(outputPath, FileExistence.Optional); var outputs1 = env.PipConstructionHelper.AddProcess(pip1); var pip2 = CreatePipBuilderWithTag(env, "test"); outputs1.TryGetOutputFile(outputPath, out var outputFile); pip2.AddInputFile(outputFile); pip2.AddOutputFile(outputFile, rewrittenFileExistence); env.PipConstructionHelper.AddProcess(pip2); AssertSuccessGraphBuilding(env); } }
/// <nodoc /> public static FileArtifactWithAttributes Create(FileArtifact artifact, FileExistence fileExistence) { return(new FileArtifactWithAttributes(artifact.Path, artifact.RewriteCount, fileExistence)); }
/// <summary> /// Factory method that creates new instance based on specified <paramref name="fileArtifact"/>. /// </summary> public static FileArtifactWithAttributes FromFileArtifact(FileArtifact fileArtifact, FileExistence fileExistence) { if (!fileArtifact.IsValid) { return(Invalid); } return(new FileArtifactWithAttributes(fileArtifact.Path, fileArtifact.RewriteCount, fileExistence)); }
/// <summary> /// Factory method that creates new instance based on specified <paramref name="fileArtifact"/>. /// </summary> public static FileArtifactWithAttributes FromFileArtifact(FileArtifact fileArtifact, FileExistence fileExistence, bool isUndeclaredFileRewrite = false) { if (!fileArtifact.IsValid) { return(Invalid); } return(new FileArtifactWithAttributes(fileArtifact.Path, fileArtifact.RewriteCount, fileExistence, isUndeclaredFileRewrite)); }
/// <nodoc /> public static FileArtifactWithAttributes Create(FileArtifact artifact, FileExistence fileExistence, bool isUndeclaredFileRewrite = false) { return(new FileArtifactWithAttributes(artifact.Path, artifact.RewriteCount, fileExistence, isUndeclaredFileRewrite)); }
/// <nodoc /> public void AddOutputFile(FileArtifact file, FileExistence attribute) { Contract.Requires(file.IsValid); m_outputFiles.Instance.Add(new FileArtifactWithAttributes(file, file.RewriteCount + 1, attribute)); }
/// <nodoc /> public void AddOutputFile(AbsolutePath file, FileExistence attribute) { Contract.Requires(file.IsValid); m_outputFiles.Instance.Add(new FileArtifactWithAttributes(file, 1, attribute)); }
/// <nodoc /> public static void AddOutputFile(this ProcessBuilder builder, PathTable pathTable, string file, FileExistence fileExistence = FileExistence.Required) { builder.AddOutputFile(AbsolutePath.Create(pathTable, file), fileExistence); }
/// <summary> /// Constructs <see cref="FileArtifactWithAttributes"/> based on the current FileAttribute instance /// with specified <paramref name="fileExistence"/> attibute. /// </summary> public FileArtifactWithAttributes WithAttributes(FileExistence fileExistence = FileExistence.Required, bool undeclaredSourceRewrite = false) { return(FileArtifactWithAttributes.FromFileArtifact(this, fileExistence, undeclaredSourceRewrite)); }
/// <summary> /// Constructs <see cref="FileArtifactWithAttributes"/> based on the current FileAttribute instance /// with specified <paramref name="fileExistence"/> attibute. /// </summary> public FileArtifactWithAttributes WithAttributes(FileExistence fileExistence = FileExistence.Required) { return(FileArtifactWithAttributes.FromFileArtifact(this, fileExistence)); }