Exemple #1
0
        /// <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));
        }
Exemple #2
0
        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");
        }
Exemple #3
0
        /// <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()));
        }
Exemple #6
0
        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);
            }
        }
Exemple #7
0
 /// <nodoc />
 public static FileArtifactWithAttributes Create(FileArtifact artifact, FileExistence fileExistence)
 {
     return(new FileArtifactWithAttributes(artifact.Path, artifact.RewriteCount, fileExistence));
 }
Exemple #8
0
        /// <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));
        }
Exemple #9
0
        /// <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));
        }
Exemple #10
0
 /// <nodoc />
 public static FileArtifactWithAttributes Create(FileArtifact artifact, FileExistence fileExistence, bool isUndeclaredFileRewrite = false)
 {
     return(new FileArtifactWithAttributes(artifact.Path, artifact.RewriteCount, fileExistence, isUndeclaredFileRewrite));
 }
Exemple #11
0
        /// <nodoc />
        public void AddOutputFile(FileArtifact file, FileExistence attribute)
        {
            Contract.Requires(file.IsValid);

            m_outputFiles.Instance.Add(new FileArtifactWithAttributes(file, file.RewriteCount + 1, attribute));
        }
Exemple #12
0
        /// <nodoc />
        public void AddOutputFile(AbsolutePath file, FileExistence attribute)
        {
            Contract.Requires(file.IsValid);

            m_outputFiles.Instance.Add(new FileArtifactWithAttributes(file, 1, attribute));
        }
Exemple #13
0
 /// <nodoc />
 public static void AddOutputFile(this ProcessBuilder builder, PathTable pathTable, string file, FileExistence fileExistence = FileExistence.Required)
 {
     builder.AddOutputFile(AbsolutePath.Create(pathTable, file), fileExistence);
 }
Exemple #14
0
 /// <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));
 }
Exemple #15
0
 /// <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));
 }