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);
        }
Esempio n. 2
0
            /// <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);
            }
Esempio n. 3
0
            /// <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);
                    }
                }
            }
Esempio n. 4
0
        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")));
            }
        }
Esempio n. 5
0
        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")));
            }
        }
Esempio n. 6
0
        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();
            }
        }
Esempio n. 7
0
            /// <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);
            }
Esempio n. 8
0
        /// <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);
                }
            }
        }
Esempio n. 9
0
        /// <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();
            }
        }