public virtual PipData ReadPipData() { Start <PipData>(); PipData value = PipData.Deserialize(this); End(); return(value); }
/// <summary> /// Creates an environment variable definition. /// </summary> public EnvironmentVariable(StringId name, PipData value, bool isPassThrough = false) { Contract.Requires(name.IsValid); Contract.Requires(value.IsValid ^ isPassThrough); Name = name; Value = value; IsPassThrough = isPassThrough; }
/// <nodoc /> internal static EnvironmentVariable Deserialize(PipReader reader) { Contract.Requires(reader != null); StringId name = reader.ReadStringId(); if (name.IsValid) { PipData value = reader.ReadPipData(); bool isPassThrough = reader.ReadBoolean(); Contract.Assume(value.IsValid ^ isPassThrough); return(new EnvironmentVariable(name, value, isPassThrough)); } else { return(default(EnvironmentVariable)); } }
/// <summary> /// Class constructor. /// </summary> public PipProvenance( long semiStableHash, ModuleId moduleId, StringId moduleName, FullSymbol outputValueSymbol, LocationData token, QualifierId qualifierId, PipData usage) { SemiStableHash = semiStableHash; ModuleId = moduleId; ModuleName = moduleName; OutputValueSymbol = outputValueSymbol; Token = token; QualifierId = qualifierId; Usage = usage; }
/// <summary> /// Constructs a WriteFile /// </summary> public WriteFile( FileArtifact destination, PipData contents, WriteFileEncoding encoding, ReadOnlyArray <StringId> tags, PipProvenance provenance) { Contract.Requires(destination.IsValid); Contract.Requires(contents.IsValid); Contract.Requires(tags.IsValid); Contract.Requires(provenance != null); Provenance = provenance; Tags = tags; Destination = destination; Contents = contents; Encoding = encoding; }
internal static PipProvenance Deserialize(PipReader reader) { Contract.Requires(reader != null); long semiStableHash = reader.ReadInt64(); ModuleId moduleId = reader.ReadModuleId(); StringId moduleName = reader.ReadStringId(); FullSymbol outputValueName = reader.ReadFullSymbol(); LocationData token = reader.ReadLocationData(); QualifierId qualifierId = new QualifierId(reader.ReadInt32Compact()); PipData usage = reader.ReadPipData(); return(new PipProvenance( semiStableHash, moduleId, moduleName, outputValueName, token, qualifierId, usage)); }
/// <nodoc /> public IpcPip( IpcClientInfo ipcInfo, PipData arguments, FileArtifact outputFile, ReadOnlyArray <PipId> servicePipDependencies, ReadOnlyArray <FileArtifact> fileDependencies, ReadOnlyArray <DirectoryArtifact> directoryDependencies, ReadOnlyArray <FileOrDirectoryArtifact> skipMaterializationFor, ReadOnlyArray <StringId> tags, bool isServiceFinalization, bool mustRunOnMaster, PipProvenance provenance) { Contract.Requires(ipcInfo != null); Contract.Requires(arguments.IsValid); Contract.Requires(outputFile.IsValid); Contract.Requires(servicePipDependencies.IsValid); Contract.Requires(fileDependencies.IsValid); Contract.Requires(directoryDependencies.IsValid); Contract.Requires(skipMaterializationFor.IsValid); Contract.RequiresForAll(servicePipDependencies, dependency => dependency.IsValid); Contract.RequiresForAll(fileDependencies, dependency => dependency.IsValid); Contract.RequiresForAll(directoryDependencies, dependency => dependency.IsValid); IpcInfo = ipcInfo; MessageBody = arguments; OutputFile = outputFile; ServicePipDependencies = servicePipDependencies; FileDependencies = fileDependencies; LazilyMaterializedDependencies = skipMaterializationFor; Tags = tags; IsServiceFinalization = isServiceFinalization; MustRunOnMaster = mustRunOnMaster; Provenance = provenance; DirectoryDependencies = directoryDependencies; }
/// <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) { 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; ProcessOptions = options; AdditionalTempDirectories = additionalTempDirectories; AllowedSurvivingChildProcessNames = allowedSurvivingChildProcessNames ?? ReadOnlyArray <PathAtom> .Empty; NestedProcessTerminationTimeout = nestedProcessTerminationTimeout; ProcessAbsentPathProbeInUndeclaredOpaquesMode = absentPathProbeMode; DoubleWritePolicy = doubleWritePolicy; ContainerIsolationLevel = containerIsolationLevel; }
/// <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 tempDirectory = default, Options options = default, UnsafeOptions unsafeOptions = default, bool testRetries = false, ReadOnlyArray <int>?retryExitCodes = null, ReadOnlyArray <PathAtom>?allowedSurvivingChildProcessNames = null, TimeSpan?nestedProcessTerminationTimeout = 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 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. Transformer implementations // may be calling this constructor, and we should exhaust their computation up front (yield, // LINQ, custom collections, etc. are all valid). // 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; Semaphores = semaphores; TempDirectory = tempDirectory; TestRetries = testRetries; ProcessOptions = options; ProcessUnsafeOptions = unsafeOptions; AdditionalTempDirectories = additionalTempDirectories; AllowedSurvivingChildProcessNames = allowedSurvivingChildProcessNames ?? ReadOnlyArray <PathAtom> .Empty; NestedProcessTerminationTimeout = nestedProcessTerminationTimeout; }