/// <summary> /// Clone and override select properties. /// </summary> public Process Override( FileArtifact?executable = null, AbsolutePath?workingDirectory = null, PipData?arguments = null, FileArtifact?responseFile = null, PipData?responseFileData = null, ReadOnlyArray <EnvironmentVariable>?environmentVariables = null, StandardInput?standardInput = null, FileArtifact?standardOutput = null, FileArtifact?standardError = null, AbsolutePath?standardDirectory = null, TimeSpan?warningTimeout = null, TimeSpan?timeout = null, ReadOnlyArray <FileArtifact>?dependencies = null, ReadOnlyArray <FileArtifactWithAttributes>?fileOutputs = null, ReadOnlyArray <DirectoryArtifact>?directoryDependencies = null, ReadOnlyArray <DirectoryArtifact>?directoryOutputs = null, ReadOnlyArray <PipId>?orderDependencies = null, ReadOnlyArray <AbsolutePath>?untrackedPaths = null, ReadOnlyArray <AbsolutePath>?untrackedScopes = null, ReadOnlyArray <StringId>?tags = null, ReadOnlyArray <int>?successExitCodes = null, ReadOnlyArray <ProcessSemaphoreInfo>?semaphores = null, PipProvenance provenance = null, StringId?toolDescription = null, ReadOnlyArray <AbsolutePath>?additionalTempDirectories = null, RegexDescriptor?warningRegex = null, RegexDescriptor?errorRegex = null, AbsolutePath?uniqueOutputDirectory = null, AbsolutePath?redirectedDirectoryRoot = null, AbsolutePath?tempDirectory = null, Options?options = null, bool?testRetries = null, ServiceInfo serviceInfo = null, ReadOnlyArray <int>?retryExitCodes = null, ReadOnlyArray <PathAtom>?allowedSurvivingChildProcessNames = null, TimeSpan?nestedProcessTerminationTimeout = null, AbsentPathProbeInUndeclaredOpaquesMode absentPathProbeMode = AbsentPathProbeInUndeclaredOpaquesMode.Unsafe, DoubleWritePolicy doubleWritePolicy = DoubleWritePolicy.DoubleWritesAreErrors, ContainerIsolationLevel containerIsolationLevel = ContainerIsolationLevel.None, int?weight = null, int?priority = null, ReadOnlyArray <AbsolutePath>?preserveOutputWhitelist = null) { return(new Process( executable ?? Executable, workingDirectory ?? WorkingDirectory, arguments ?? Arguments, responseFile ?? ResponseFile, responseFileData ?? ResponseFileData, environmentVariables ?? EnvironmentVariables, standardInput ?? StandardInput, standardOutput ?? StandardOutput, standardError ?? StandardError, standardDirectory ?? StandardDirectory, warningTimeout ?? WarningTimeout, timeout ?? Timeout, dependencies ?? Dependencies, fileOutputs ?? FileOutputs, directoryDependencies ?? DirectoryDependencies, directoryOutputs ?? DirectoryOutputs, orderDependencies ?? OrderDependencies, untrackedPaths ?? UntrackedPaths, untrackedScopes ?? UntrackedScopes, tags ?? Tags, successExitCodes ?? SuccessExitCodes, semaphores ?? Semaphores, provenance ?? Provenance, toolDescription ?? ToolDescription, additionalTempDirectories ?? AdditionalTempDirectories, warningRegex ?? WarningRegex, errorRegex ?? ErrorRegex, uniqueOutputDirectory ?? UniqueOutputDirectory, redirectedDirectoryRoot ?? UniqueRedirectedDirectoryRoot, tempDirectory ?? TempDirectory, options ?? ProcessOptions, testRetries ?? TestRetries, serviceInfo ?? ServiceInfo, retryExitCodes ?? RetryExitCodes, allowedSurvivingChildProcessNames, nestedProcessTerminationTimeout, absentPathProbeMode, doubleWritePolicy, containerIsolationLevel, weight, priority, preserveOutputWhitelist ?? PreserveOutputWhitelist)); }
/// <summary> /// Class constructor /// </summary> public Process( FileArtifact executable, AbsolutePath workingDirectory, PipData arguments, FileArtifact responseFile, PipData responseFileData, ReadOnlyArray <EnvironmentVariable> environmentVariables, StandardInput standardInput, FileArtifact standardOutput, FileArtifact standardError, AbsolutePath standardDirectory, TimeSpan?warningTimeout, TimeSpan?timeout, ReadOnlyArray <FileArtifact> dependencies, ReadOnlyArray <FileArtifactWithAttributes> outputs, ReadOnlyArray <DirectoryArtifact> directoryDependencies, ReadOnlyArray <DirectoryArtifact> directoryOutputs, ReadOnlyArray <PipId> orderDependencies, ReadOnlyArray <AbsolutePath> untrackedPaths, ReadOnlyArray <AbsolutePath> untrackedScopes, ReadOnlyArray <StringId> tags, ReadOnlyArray <int> successExitCodes, ReadOnlyArray <ProcessSemaphoreInfo> semaphores, PipProvenance provenance, StringId toolDescription, ReadOnlyArray <AbsolutePath> additionalTempDirectories, RegexDescriptor warningRegex = default, RegexDescriptor errorRegex = default, AbsolutePath uniqueOutputDirectory = default, AbsolutePath uniqueRedirectedDirectoryRoot = default, AbsolutePath tempDirectory = default, Options options = default, bool testRetries = false, ServiceInfo serviceInfo = null, ReadOnlyArray <int>?retryExitCodes = null, ReadOnlyArray <PathAtom>?allowedSurvivingChildProcessNames = null, TimeSpan?nestedProcessTerminationTimeout = null, AbsentPathProbeInUndeclaredOpaquesMode absentPathProbeMode = AbsentPathProbeInUndeclaredOpaquesMode.Unsafe, DoubleWritePolicy doubleWritePolicy = DoubleWritePolicy.DoubleWritesAreErrors, ContainerIsolationLevel containerIsolationLevel = ContainerIsolationLevel.None, int?weight = null, int?priority = null, ReadOnlyArray <AbsolutePath>?preserveOutputWhitelist = null) { Contract.Requires(executable.IsValid); Contract.Requires(workingDirectory.IsValid); Contract.Requires(arguments.IsValid); Contract.RequiresForAll(environmentVariables, environmentVariable => environmentVariable.Name.IsValid); Contract.RequiresForAll(environmentVariables, environmentVariable => environmentVariable.Value.IsValid ^ environmentVariable.IsPassThrough); Contract.Requires(dependencies.IsValid); Contract.RequiresForAll(dependencies, dependency => dependency.IsValid); Contract.Requires(directoryDependencies.IsValid); Contract.RequiresForAll(directoryDependencies, directoryDependency => directoryDependency.IsValid); Contract.Requires(outputs.IsValid); Contract.RequiresForAll(outputs, output => output.IsValid); Contract.Requires(directoryOutputs.IsValid); Contract.RequiresForAll(outputs, output => !output.IsSourceFile); Contract.RequiresForAll(directoryOutputs, directoryOutput => directoryOutput.IsValid); Contract.Requires(orderDependencies.IsValid); Contract.RequiresForAll(orderDependencies, dependency => dependency != PipId.Invalid); Contract.Requires(untrackedPaths.IsValid); Contract.RequiresForAll(untrackedPaths, path => path.IsValid); Contract.Requires(untrackedScopes.IsValid); Contract.RequiresForAll(untrackedScopes, scope => scope.IsValid); Contract.Requires(!timeout.HasValue || timeout.Value <= MaxTimeout); Contract.Requires(standardDirectory.IsValid || (standardOutput.IsValid && standardError.IsValid)); Contract.Requires(provenance != null); Contract.Requires(additionalTempDirectories.IsValid); Contract.RequiresForAll(additionalTempDirectories, path => path.IsValid); Contract.Requires(tags.IsValid); // If the process needs to run in a container, the redirected directory has to be set Contract.Requires((options & Options.NeedsToRunInContainer) == Options.None || uniqueRedirectedDirectoryRoot.IsValid); #if DEBUG // a little too expensive for release builds Contract.Requires(Contract.Exists(dependencies, d => d == executable), "The executable must be declared as a dependency"); Contract.Requires( !standardInput.IsFile || Contract.Exists(dependencies, d => d == standardInput.File), "If provided, the standard-input artifact must be declared as a dependency"); Contract.Requires( !standardOutput.IsValid || Contract.Exists(outputs, o => o.ToFileArtifact() == standardOutput), "If provided, the standard-error artifact must be declared as an expected output"); Contract.Requires( !standardError.IsValid || Contract.Exists(outputs, o => o.ToFileArtifact() == standardError), "If provided, the standard-error artifact must be declared as an expected output"); Contract.Requires( !responseFile.IsValid ^ responseFileData.IsValid, "If provided, the response-file artifact must have a corresponding ResponseFileData"); Contract.Requires(outputs.Length == outputs.Distinct().Count()); Contract.Requires(directoryOutputs.Length == directoryOutputs.Distinct().Count()); Contract.Requires(dependencies.Length == dependencies.Distinct().Count()); Contract.Requires(directoryDependencies.Length == directoryDependencies.Distinct().Count()); Contract.Requires(untrackedPaths.Length == untrackedPaths.Distinct().Count()); Contract.Requires(untrackedScopes.Length == untrackedScopes.Distinct().Count()); Contract.Requires(additionalTempDirectories.Length == additionalTempDirectories.Distinct().Count()); Contract.RequiresForAll(semaphores, s => s.IsValid); Contract.Requires(semaphores.Length == semaphores.Distinct().Count()); #endif Provenance = provenance; Tags = tags; Executable = executable; ToolDescription = toolDescription; WorkingDirectory = workingDirectory; Arguments = arguments; ResponseFile = responseFile; ResponseFileData = responseFileData; StandardOutput = standardOutput; StandardError = standardError; StandardInput = standardInput; StandardDirectory = standardDirectory; WarningTimeout = warningTimeout; Timeout = timeout; // We allow any IEnumerable for these fields, but perform a copy up-front. // See the remarks of RemoveDuplicateFileArtifacts for why it is used on the input / output lists. Dependencies = dependencies; DirectoryDependencies = directoryDependencies; FileOutputs = outputs; DirectoryOutputs = directoryOutputs; OrderDependencies = orderDependencies; UntrackedPaths = untrackedPaths; UntrackedScopes = untrackedScopes; EnvironmentVariables = environmentVariables; SuccessExitCodes = successExitCodes; RetryExitCodes = retryExitCodes ?? ReadOnlyArray <int> .Empty; WarningRegex = warningRegex; ErrorRegex = errorRegex; UniqueOutputDirectory = uniqueOutputDirectory; UniqueRedirectedDirectoryRoot = uniqueRedirectedDirectoryRoot; Semaphores = semaphores; TempDirectory = tempDirectory; TestRetries = testRetries; ServiceInfo = serviceInfo; AdditionalTempDirectories = additionalTempDirectories; AllowedSurvivingChildProcessNames = allowedSurvivingChildProcessNames ?? ReadOnlyArray <PathAtom> .Empty; NestedProcessTerminationTimeout = nestedProcessTerminationTimeout; ProcessAbsentPathProbeInUndeclaredOpaquesMode = absentPathProbeMode; DoubleWritePolicy = doubleWritePolicy; ContainerIsolationLevel = containerIsolationLevel; Weight = weight.HasValue && weight.Value >= MinWeight ? weight.Value : MinWeight; Priority = priority.HasValue && priority.Value >= MinPriority ? (priority <= MaxPriority ? priority.Value : MaxPriority) : MinPriority; PreserveOutputWhitelist = preserveOutputWhitelist ?? ReadOnlyArray <AbsolutePath> .Empty; if (PreserveOutputWhitelist.Length != 0) { options |= Options.HasPreserveOutputWhitelist; } ProcessOptions = options; }