/// <summary> /// Returns a unique redirected directory (located under the process unique redirected directory root) that is stable across builds /// </summary> private AbsolutePath GetUniqueRedirectedDirectory(Process process, ref ReserveFoldersResolver reserveFoldersResolver, AbsolutePath originalDirectory) { var name = originalDirectory.GetName(m_pathTable); var count = reserveFoldersResolver.GetNextId(name); var stringTable = m_pathTable.StringTable; var pathAtom = count == 0 ? name : PathAtom.Create(stringTable, $"{name.ToString(stringTable)}_{count}"); var redirectedDirectory = process.UniqueRedirectedDirectoryRoot.Combine(m_pathTable, pathAtom); return(redirectedDirectory); }
private void CreateMappingForOutputs(Process process, out MultiValueDictionary <AbsolutePath, ExpandedAbsolutePath> originalDirectories, out MultiValueDictionary <ExpandedAbsolutePath, ExpandedAbsolutePath> redirectedDirectories) { // Collect all predicted outputs (directories and files) for the given process var directories = CollectAllOutputDirectories(m_pathTable, process); // In order to keep the filter configuration to its minimum, let's remove directories that are nested within each other var dedupDirectories = AbsolutePathUtilities.CollapseDirectories(directories, m_pathTable, out var originalToCollapsedMapping); var stringTable = m_pathTable.StringTable; var reserveFoldersResolver = new ReserveFoldersResolver(new object()); originalDirectories = new MultiValueDictionary <AbsolutePath, ExpandedAbsolutePath>(originalToCollapsedMapping.Count); redirectedDirectories = new MultiValueDictionary <ExpandedAbsolutePath, ExpandedAbsolutePath>(dedupDirectories.Count, ExpandedAbsolutePathEqualityComparer.Instance); // Map from original dedup directories to unique redirected directories var uniqueRedirectedDirectories = new Dictionary <AbsolutePath, ExpandedAbsolutePath>(dedupDirectories.Count); foreach (var kvp in originalToCollapsedMapping) { AbsolutePath originalDirectory = kvp.Key; AbsolutePath originalCollapsedDirectory = kvp.Value; if (!uniqueRedirectedDirectories.TryGetValue(originalCollapsedDirectory, out var uniqueRedirectedDirectory)) { uniqueRedirectedDirectory = GetUniqueRedirectedDirectory(process, ref reserveFoldersResolver, originalCollapsedDirectory).Expand(m_pathTable); uniqueRedirectedDirectories.Add(originalCollapsedDirectory, uniqueRedirectedDirectory); redirectedDirectories.Add(uniqueRedirectedDirectory, originalCollapsedDirectory.Expand(m_pathTable)); } // Let's reconstruct the redirected directory var redirectedDirectory = originalDirectory.Relocate(m_pathTable, originalCollapsedDirectory, uniqueRedirectedDirectory.Path); originalDirectories.Add(originalDirectory, redirectedDirectory.Expand(m_pathTable)); } }