public static bool IsUpToDate(Task hostTask, UpToDateCheckType upToDateCheckType, ITaskItem[] readTLogNames, ITaskItem[] writeTLogNames) { bool isUpToDate; // Read the input graph (missing inputs are infinitely new - i.e. outputs are out of date) FlatTrackingData inputs = new FlatTrackingData(hostTask, readTLogNames, DateTime.MaxValue); // Read the output graph (missing outputs are infinitely old - i.e. outputs are out of date) FlatTrackingData outputs = new FlatTrackingData(hostTask, writeTLogNames, DateTime.MinValue); // Find out if we are up to date isUpToDate = IsUpToDate(hostTask.Log, upToDateCheckType, inputs, outputs); // We're going to execute, so clear out the tlogs so // the new execution will correctly populate the tlogs a-new if (!isUpToDate) { // Remove all from inputs tlog inputs.DependencyTable.Clear(); inputs.SaveTlog(); // Remove all from outputs tlog outputs.DependencyTable.Clear(); outputs.SaveTlog(); } return(isUpToDate); }
public static bool IsUpToDate(Task hostTask, UpToDateCheckType upToDateCheckType, ITaskItem[] readTLogNames, ITaskItem[] writeTLogNames) { FlatTrackingData inputs = new FlatTrackingData(hostTask, readTLogNames, DateTime.MaxValue); FlatTrackingData outputs = new FlatTrackingData(hostTask, writeTLogNames, DateTime.MinValue); bool flag = IsUpToDate(hostTask.Log, upToDateCheckType, inputs, outputs); if (!flag) { inputs.DependencyTable.Clear(); inputs.SaveTlog(); outputs.DependencyTable.Clear(); outputs.SaveTlog(); } return(flag); }
public static bool IsUpToDate(Task hostTask, UpToDateCheckType upToDateCheckType, ITaskItem[] readTLogNames, ITaskItem[] writeTLogNames) { FlatTrackingData inputs = new FlatTrackingData(hostTask, readTLogNames, DateTime.MaxValue); FlatTrackingData outputs = new FlatTrackingData(hostTask, writeTLogNames, DateTime.MinValue); bool flag = IsUpToDate(hostTask.Log, upToDateCheckType, inputs, outputs); if (!flag) { inputs.DependencyTable.Clear(); inputs.SaveTlog(); outputs.DependencyTable.Clear(); outputs.SaveTlog(); } return flag; }
public static void FinalizeTLogs(bool trackedOperationsSucceeded, ITaskItem[] readTLogNames, ITaskItem[] writeTLogNames, ITaskItem[] trackedFilesToRemoveFromTLogs) { FlatTrackingData data = new FlatTrackingData(readTLogNames, true); FlatTrackingData data2 = new FlatTrackingData(writeTLogNames, true); if (!trackedOperationsSucceeded) { data.DependencyTable.Clear(); data.SaveTlog(); data2.DependencyTable.Clear(); data2.SaveTlog(); } else if ((trackedFilesToRemoveFromTLogs != null) && (trackedFilesToRemoveFromTLogs.Length > 0)) { IDictionary<string, ITaskItem> trackedFilesToRemove = new Dictionary<string, ITaskItem>(StringComparer.OrdinalIgnoreCase); foreach (ITaskItem item in trackedFilesToRemoveFromTLogs) { trackedFilesToRemove.Add(FileUtilities.NormalizePath(item.ItemSpec), item); } data2.SaveTlog(fullTrackedPath => !trackedFilesToRemove.ContainsKey(fullTrackedPath)); data.SaveTlog(fullTrackedPath => !trackedFilesToRemove.ContainsKey(fullTrackedPath)); } else { data2.SaveTlog(); data.SaveTlog(); } }
public void FlatTrackingDataInputNewerThanTrackingNoOutput() { Console.WriteLine("Test: FlatTrackingDataInputNewerThanTrackingNoOutput"); // Prepare files DependencyTestHelper.WriteAll("TestFiles\\one1.h", ""); DependencyTestHelper.WriteAll("TestFiles\\one2.h", ""); DependencyTestHelper.WriteAll("TestFiles\\one3.h", ""); DependencyTestHelper.WriteAll("TestFiles\\one.cpp", ""); Thread.Sleep(sleepTimeMilliseconds); File.WriteAllLines("TestFiles\\one.read.tlog", new string[] { "#Command some-command", "^" + Path.GetFullPath("TestFiles\\one.cpp"), Path.GetFullPath("TestFiles\\one1.h"), Path.GetFullPath("TestFiles\\one2.h"), Path.GetFullPath("TestFiles\\one3.h"), }); FlatTrackingData outputs = new FlatTrackingData(DependencyTestHelper.MockTask, DependencyTestHelper.ItemArray(new TaskItem("TestFiles\\*-one.write.?.tlog")), false); // Compact the read tlog FlatTrackingData inputs = new FlatTrackingData(DependencyTestHelper.MockTask, DependencyTestHelper.ItemArray(new TaskItem("TestFiles\\one.read.tlog")), false); inputs.SaveTlog(); outputs.SaveTlog(); outputs = new FlatTrackingData(DependencyTestHelper.MockTask, DependencyTestHelper.ItemArray(new TaskItem("TestFiles\\*-one.write.?.tlog")), false); // Compact the read tlog inputs = new FlatTrackingData(DependencyTestHelper.MockTask, DependencyTestHelper.ItemArray(new TaskItem("TestFiles\\one.read.tlog")), false); Assert.Equal(true, FlatTrackingData.IsUpToDate(DependencyTestHelper.MockTask.Log, UpToDateCheckType.InputNewerThanTracking, inputs, outputs)); }
public static void FinalizeTLogs(bool trackedOperationsSucceeded, ITaskItem[] readTLogNames, ITaskItem[] writeTLogNames, ITaskItem[] trackedFilesToRemoveFromTLogs) { // Read the input table, skipping missing files FlatTrackingData inputs = new FlatTrackingData(readTLogNames, true); // Read the output table, skipping missing files FlatTrackingData outputs = new FlatTrackingData(writeTLogNames, true); // If we failed we need to clean the Tlogs if (!trackedOperationsSucceeded) { // If the tool errors in some way, we assume that any and all inputs and outputs it wrote during // execution are wrong. So we compact the read and write tlogs to remove the entries for the // set of sources being compiled - the next incremental build will find no entries // and correctly cause the sources to be compiled // Remove all from inputs tlog inputs.DependencyTable.Clear(); inputs.SaveTlog(); // Remove all from outputs tlog outputs.DependencyTable.Clear(); outputs.SaveTlog(); } else { // If all went well with the tool execution, then compact the tlogs // to remove any files that are no longer on disk. // This removes any temporary files from the dependency graph // In addition to temporary file removal, an optional set of files to remove may be been supplied if (trackedFilesToRemoveFromTLogs != null && trackedFilesToRemoveFromTLogs.Length > 0) { IDictionary<string, ITaskItem> trackedFilesToRemove = new Dictionary<string, ITaskItem>(StringComparer.OrdinalIgnoreCase); foreach (ITaskItem removeFile in trackedFilesToRemoveFromTLogs) { trackedFilesToRemove.Add(FileUtilities.NormalizePath(removeFile.ItemSpec), removeFile); } // UNDONE: If necessary we could have two independent sets of "ignore" files, one for inputs and one for outputs // Use an anonymous method to encapsulate the contains check for the output tlogs outputs.SaveTlog(delegate (string fullTrackedPath) { // We need to answer the question "should fullTrackedPath be included in the TLog?" return (!trackedFilesToRemove.ContainsKey(fullTrackedPath)); } ); // Use an anonymous method to encapsulate the contains check for the input tlogs inputs.SaveTlog(delegate (string fullTrackedPath) { // We need to answer the question "should fullTrackedPath be included in the TLog?" return (!trackedFilesToRemove.ContainsKey(fullTrackedPath)); } ); } else { // Compact the write tlog outputs.SaveTlog(); // Compact the read tlog inputs.SaveTlog(); } } }
public static bool IsUpToDate(Task hostTask, UpToDateCheckType upToDateCheckType, ITaskItem[] readTLogNames, ITaskItem[] writeTLogNames) { bool isUpToDate; // Read the input graph (missing inputs are infinitely new - i.e. outputs are out of date) FlatTrackingData inputs = new FlatTrackingData(hostTask, readTLogNames, DateTime.MaxValue); // Read the output graph (missing outputs are infinitely old - i.e. outputs are out of date) FlatTrackingData outputs = new FlatTrackingData(hostTask, writeTLogNames, DateTime.MinValue); // Find out if we are up to date isUpToDate = IsUpToDate(hostTask.Log, upToDateCheckType, inputs, outputs); // We're going to execute, so clear out the tlogs so // the new execution will correctly populate the tlogs a-new if (!isUpToDate) { // Remove all from inputs tlog inputs.DependencyTable.Clear(); inputs.SaveTlog(); // Remove all from outputs tlog outputs.DependencyTable.Clear(); outputs.SaveTlog(); } return isUpToDate; }
public static void FinalizeTLogs(bool trackedOperationsSucceeded, ITaskItem[] readTLogNames, ITaskItem[] writeTLogNames, ITaskItem[] trackedFilesToRemoveFromTLogs) { // Read the input table, skipping missing files FlatTrackingData inputs = new FlatTrackingData(readTLogNames, true); // Read the output table, skipping missing files FlatTrackingData outputs = new FlatTrackingData(writeTLogNames, true); // If we failed we need to clean the Tlogs if (!trackedOperationsSucceeded) { // If the tool errors in some way, we assume that any and all inputs and outputs it wrote during // execution are wrong. So we compact the read and write tlogs to remove the entries for the // set of sources being compiled - the next incremental build will find no entries // and correctly cause the sources to be compiled // Remove all from inputs tlog inputs.DependencyTable.Clear(); inputs.SaveTlog(); // Remove all from outputs tlog outputs.DependencyTable.Clear(); outputs.SaveTlog(); } else { // If all went well with the tool execution, then compact the tlogs // to remove any files that are no longer on disk. // This removes any temporary files from the dependency graph // In addition to temporary file removal, an optional set of files to remove may be been supplied if (trackedFilesToRemoveFromTLogs != null && trackedFilesToRemoveFromTLogs.Length > 0) { IDictionary <string, ITaskItem> trackedFilesToRemove = new Dictionary <string, ITaskItem>(StringComparer.OrdinalIgnoreCase); foreach (ITaskItem removeFile in trackedFilesToRemoveFromTLogs) { trackedFilesToRemove.Add(FileUtilities.NormalizePath(removeFile.ItemSpec), removeFile); } // UNDONE: If necessary we could have two independent sets of "ignore" files, one for inputs and one for outputs // Use an anonymous method to encapsulate the contains check for the output tlogs outputs.SaveTlog(delegate(string fullTrackedPath) { // We need to answer the question "should fullTrackedPath be included in the TLog?" return(!trackedFilesToRemove.ContainsKey(fullTrackedPath)); } ); // Use an anonymous method to encapsulate the contains check for the input tlogs inputs.SaveTlog(delegate(string fullTrackedPath) { // We need to answer the question "should fullTrackedPath be included in the TLog?" return(!trackedFilesToRemove.ContainsKey(fullTrackedPath)); } ); } else { // Compact the write tlog outputs.SaveTlog(); // Compact the read tlog inputs.SaveTlog(); } } }