public void RunWithLimitedConcurrency() { Configuration.Sandbox.VmConcurrencyLimit = 1; const int PipCount = 5; FileArtifact shared = CreateOutputFileArtifact(); for (int i = 0; i < PipCount; ++i) { ProcessBuilder builder = CreatePipBuilder(new[] { Operation.ReadFile(CreateSourceFile()), Operation.WriteFile(CreateOutputFileArtifact()), Operation.WriteFile(shared, "#", doNotInfer: true) }); builder.Options |= Process.Options.RequiresAdmin; builder.AddUntrackedFile(shared); SchedulePipBuilder(builder); } RunScheduler( verifySchedulerPostRun: ts => { XAssert.AreEqual(1, ts.MaxExternalProcessesRan); }).AssertSuccess(); string sharedFileContent = File.ReadAllText(ArtifactToString(shared)); XAssert.AreEqual(new string('#', PipCount), sharedFileContent); }
/// <summary> /// Augments the processBuilder with the OS dependencies /// </summary> public bool ProcessDefaults(ProcessBuilder processBuilder) { if ((processBuilder.Options & Process.Options.DependsOnCurrentOs) != 0) { var defaultSourceSealDirs = m_lazySourceSealDirectories.Value; if (!defaultSourceSealDirs.IsValid) { return(false); } foreach (var inputDirectory in defaultSourceSealDirs.Directories) { processBuilder.AddInputDirectory(inputDirectory); } foreach (var untrackedFile in m_untrackedFiles) { processBuilder.AddUntrackedFile(untrackedFile); } foreach (var untrackedDirectory in m_untrackedDirectories) { processBuilder.AddUntrackedDirectoryScope(untrackedDirectory); } } return(true); }
/// <summary> /// Augments the processBuilder with the OS dependencies /// </summary> public void ProcessDefaults(ProcessBuilder processBuilder) { if ((processBuilder.Options & Process.Options.DependsOnCurrentOs) != 0) { foreach (var inputFile in m_inputFiles) { processBuilder.AddInputFile(inputFile); } foreach (var inputDirectory in m_inputDirectories) { processBuilder.AddInputDirectory(inputDirectory); } foreach (var untrackedFile in m_untrackedFiles) { processBuilder.AddUntrackedFile(untrackedFile); } foreach (var untrackedDirectory in m_untrackedDirectories) { processBuilder.AddUntrackedDirectoryScope(untrackedDirectory); } } }
private void SetUntrackedFilesAndDirectories(ProcessBuilder processBuilder) { // On some machines, the current user and public user desktop.ini are read by Powershell.exe. // Ignore accesses to the user profile and Public common user profile. processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(PathTable, SpecialFolderUtilities.GetFolderPath(Environment.SpecialFolder.UserProfile))); if (Engine.TryGetBuildParameter("PUBLIC", m_frontEndName, out string publicDir)) { processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(AbsolutePath.Create(PathTable, publicDir))); } PipConstructionUtilities.UntrackUserConfigurableArtifacts(processBuilder, m_resolverSettings); // Git accesses should be ignored if .git directory is there var gitDirectory = Root.Combine(PathTable, ".git"); if (Engine.DirectoryExists(gitDirectory)) { processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(gitDirectory)); processBuilder.AddUntrackedFile(FileArtifact.CreateSourceFile(Root.Combine(PathTable, ".gitattributes"))); processBuilder.AddUntrackedFile(FileArtifact.CreateSourceFile(Root.Combine(PathTable, ".gitignore"))); } }
private void UntrackFilesAndDirectories(ProcessBuilder processBuilder) { processBuilder.AddUntrackedWindowsDirectories(); processBuilder.AddUntrackedProgramDataDirectories(); processBuilder.AddUntrackedAppDataDirectories(); if (m_untrackingSettings != null) { PipConstructionUtilities.UntrackUserConfigurableArtifacts(processBuilder, m_untrackingSettings); } var programFilesDirectoryArtifact = DirectoryArtifact.CreateWithZeroPartialSealId(AbsolutePath.Create(m_context.PathTable, Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles))); var programFilesX86DirectoryArtifact = DirectoryArtifact.CreateWithZeroPartialSealId(AbsolutePath.Create(m_context.PathTable, Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86))); processBuilder.AddUntrackedDirectoryScope(programFilesDirectoryArtifact); processBuilder.AddUntrackedDirectoryScope(programFilesX86DirectoryArtifact); processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(AbsolutePath.Create(m_context.PathTable, @"C:\PROGRA~1\"))); // TODO: This but better processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(AbsolutePath.Create(m_context.PathTable, @"C:\PROGRA~2\"))); // TODO: This but better // TODO: This is just here because the cloud build requires manually dropping the necessary executables and libraries, and should be removed // when that issue is resolved. string toolsDir = m_manuallyDroppedDependenciesPath.Value.ToString(m_context.PathTable); processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(AbsolutePath.Create(m_context.PathTable, toolsDir))); // Git accesses should be ignored if .git directory is there var gitDirectory = m_projectRoot.Combine(m_context.PathTable, ".git"); if (m_frontEndHost.Engine.DirectoryExists(gitDirectory)) { processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(gitDirectory)); processBuilder.AddUntrackedFile(FileArtifact.CreateSourceFile(m_projectRoot.Combine(m_context.PathTable, ".gitattributes"))); processBuilder.AddUntrackedFile(FileArtifact.CreateSourceFile(m_projectRoot.Combine(m_context.PathTable, ".gitignore"))); } }
protected void AddUntrackedWindowsDirectories(ProcessBuilder processBuilder) { if (OperatingSystemHelper.IsUnixOS) { processBuilder.EnableTempDirectory(); foreach (var dir in new[] { Private, SystemLibrary, Usr, Dev, Var, AppleInternal, Bin, Etc, Proc, TmpDir }) { processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(Context.PathTable, dir)); } string userTextEncodingFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".CFUserTextEncoding"); processBuilder.AddUntrackedFile(AbsolutePath.Create(Context.PathTable, userTextEncodingFile)); } else { processBuilder.AddUntrackedWindowsDirectories(); } }
/// <summary> /// Augments the processBuilder with the OS dependencies. /// </summary> /// <param name="processBuilder">builder to use</param> /// <param name="untrackInsteadSourceSeal">when true, directories that are meant to be source sealed are untracked instead</param> public bool ProcessDefaults(ProcessBuilder processBuilder, bool untrackInsteadSourceSeal = false) { if (processBuilder.Options.HasFlag(Process.Options.DependsOnCurrentOs)) { // process source seal directories: either source seal them or untrack them, depending on 'untrackInsteadSourceSeal' if (untrackInsteadSourceSeal) { foreach (var sourceSealDirPath in m_sourceSealDirectoryPaths) { processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(sourceSealDirPath)); } } else { var defaultSourceSealDirs = m_lazySourceSealDirectories.Value; if (!defaultSourceSealDirs.IsValid) { return(false); } foreach (var inputDirectory in defaultSourceSealDirs.Directories) { processBuilder.AddInputDirectory(inputDirectory); } } // add untracked files foreach (var untrackedFile in m_untrackedFiles) { processBuilder.AddUntrackedFile(untrackedFile); } // add untracked directories foreach (var untrackedDirectory in m_untrackedDirectories) { processBuilder.AddUntrackedDirectoryScope(untrackedDirectory); } } return(true); }
/// <summary> /// Some FrontEnds allow configurable untracking of files, directories and directory scopes /// This method applies that configuration to the process builder /// </summary> public static void UntrackUserConfigurableArtifacts(ProcessBuilder processBuilder, IUntrackingSettings settings) { Contract.Assert(settings != null); if (settings.UntrackedDirectoryScopes != null) { foreach (var untrackedDirectoryScope in settings.UntrackedDirectoryScopes) { if (!untrackedDirectoryScope.IsValid) { continue; } processBuilder.AddUntrackedDirectoryScope(untrackedDirectoryScope); } } if (settings.UntrackedDirectories != null) { foreach (var untrackedDirectory in settings.UntrackedDirectories) { if (!untrackedDirectory.IsValid) { continue; } processBuilder.AddUntrackedDirectoryScope(untrackedDirectory); } } if (settings.UntrackedFiles != null) { foreach (var untrackedFile in settings.UntrackedFiles) { if (!untrackedFile.IsValid) { continue; } processBuilder.AddUntrackedFile(untrackedFile); } } }
/// <summary> /// Some FrontEnds allow configurable untracking of files, directories and directory scopes /// This method applies that configuration to the process builder /// </summary> public static void UntrackUserConfigurableArtifacts(PathTable pathTable, AbsolutePath currentProjectRoot, IEnumerable <AbsolutePath> allProjectRoots, ProcessBuilder processBuilder, IUntrackingSettings settings) { Contract.AssertNotNull(settings); Contract.Assert(currentProjectRoot.IsValid); Contract.AssertNotNull(allProjectRoots); Contract.AssertNotNull(processBuilder); Contract.AssertNotNull(settings); if (settings.UntrackedDirectoryScopes != null) { foreach (var untrackedDirectoryScopeUnion in settings.UntrackedDirectoryScopes) { DirectoryArtifact untrackedDirectoryScope = ResolveAbsoluteOrRelativeDirectory(pathTable, untrackedDirectoryScopeUnion, currentProjectRoot); if (!untrackedDirectoryScope.IsValid) { continue; } processBuilder.AddUntrackedDirectoryScope(untrackedDirectoryScope); } } if (settings.UntrackedDirectories != null) { foreach (var untrackedDirectoryUnion in settings.UntrackedDirectories) { DirectoryArtifact untrackedDirectory = ResolveAbsoluteOrRelativeDirectory(pathTable, untrackedDirectoryUnion, currentProjectRoot); if (!untrackedDirectory.IsValid) { continue; } processBuilder.AddUntrackedDirectoryScope(untrackedDirectory); } } if (settings.UntrackedFiles != null) { foreach (var untrackedFile in settings.UntrackedFiles) { if (!untrackedFile.IsValid) { continue; } processBuilder.AddUntrackedFile(untrackedFile); } } if (settings.UntrackedGlobalDirectoryScopes != null) { foreach (var relativeDirectory in settings.UntrackedGlobalDirectoryScopes) { if (!relativeDirectory.IsValid) { continue; } foreach (var projectRoot in allProjectRoots) { processBuilder.AddUntrackedDirectoryScope(DirectoryArtifact.CreateWithZeroPartialSealId(projectRoot.Combine(pathTable, relativeDirectory))); } } } if (settings.ChildProcessesToBreakawayFromSandbox != null) { processBuilder.ChildProcessesToBreakawayFromSandbox = settings.ChildProcessesToBreakawayFromSandbox.Where(processName => processName.IsValid).ToReadOnlyArray(); } }