/// <summary> /// Creates a new PipDetails from a pip /// </summary> public static PipDetails DetailsFromPip(Pip pip, PathTable pathTable, PipEnvironment pipEnvironment) { Contract.Requires(pip != null); Contract.Requires(pathTable != null); var resultingPipDetails = new PipDetails(); SetCommonPipDetails(pip, resultingPipDetails); // Details specific to pip type switch (pip.PipType) { case PipType.WriteFile: SetWriteFilePipDetails((WriteFile)pip, resultingPipDetails, pathTable); break; case PipType.CopyFile: SetCopyFilePipDetails((CopyFile)pip, resultingPipDetails, pathTable); break; case PipType.Process: SetProcessPipDetails((Process)pip, resultingPipDetails, pathTable, pipEnvironment); break; case PipType.HashSourceFile: // Not an interesting pip break; case PipType.SealDirectory: SetSealDirectoryPipDetails((SealDirectory)pip, resultingPipDetails, pathTable); break; case PipType.Value: SetValuePipDetails((ValuePip)pip, resultingPipDetails, pathTable); break; case PipType.SpecFile: SetSpecFilePipDetails((SpecFilePip)pip, resultingPipDetails, pathTable); break; case PipType.Module: SetModulePipDetails((ModulePip)pip, resultingPipDetails, pathTable); break; case PipType.Ipc: SetIpcPipDetails((IpcPip)pip, resultingPipDetails, pathTable); break; default: Contract.Assume(false); break; } return(resultingPipDetails); }
private void SetupEnvironment(StreamWriter writer, Process pip, string outputFile) { var pipEnviornment = new PipEnvironment(LoggingContext); var environment = pipEnviornment.GetEffectiveEnvironmentVariables(PathTable, pip).ToDictionary(); writer.WriteLine($"{CommentPrefix} Environment Variables"); if (string.IsNullOrEmpty(JsonEnvironmentScript)) { writer.WriteLine($"{CommentPrefix} Clear Existing Environment Variables"); #if PLATFORM_WIN writer.WriteLine(@"for /f ""tokens=1* delims=="" %%a in ('set') do ("); writer.WriteLine(" set %%a="); writer.WriteLine(")"); #else writer.WriteLine(@"for c in $(set | cut -d '=' -f 1); do unset $c 2> /dev/null; done"); #endif writer.WriteLine(); writer.WriteLine($"{CommentPrefix} Setting PIP Environment Variables"); foreach (var environmentVariable in environment) { writer.WriteLine($"{ScriptVariableExportKeyword} {SanitizeEnvironmentVariableValue(environmentVariable.Key)}={SanitizeEnvironmentVariableValue(environmentVariable.Value)}"); } } else { FileUtilities.CreateDirectory(Path.GetDirectoryName(outputFile)); using (var jsonFile = File.Create($"{outputFile}.env.json")) using (var jsonStream = new StreamWriter(jsonFile)) using (var json = new JsonTextWriter(jsonStream)) { json.WriteStartObject(); foreach (var environmentVariable in environment) { json.WritePropertyName(environmentVariable.Key); json.WriteValue(environmentVariable.Value); } json.WriteEndObject(); } writer.WriteLine($"{ExecuteScriptCommand} {JsonEnvironmentScript} {outputFile}.env.json"); } writer.WriteLine(); }
/// <summary> /// Class constructor /// </summary> public PipExecutionState( IConfiguration configuration, LoggingContext loggingContext, PipTwoPhaseCache cache, FileAccessWhitelist fileAccessWhitelist, IDirectoryMembershipFingerprinter directoryMembershipFingerprinter, SemanticPathExpander pathExpander, IExecutionLogTarget executionLog, DirectoryMembershipFingerprinterRuleSet directoryMembershipFinterprinterRuleSet, FileContentManager fileContentManager, IUnsafeSandboxConfiguration unsafeConfiguration, PreserveOutputsInfo preserveOutputsSalt, FileSystemView fileSystemView, bool lazyDeletionOfSharedOpaqueOutputsEnabled, ServiceManager serviceManager = null) { Contract.Requires(fileContentManager != null); Contract.Requires(directoryMembershipFingerprinter != null); Contract.Requires(pathExpander != null); Cache = cache; m_fileAccessWhitelist = fileAccessWhitelist; DirectoryMembershipFingerprinter = directoryMembershipFingerprinter; ResourceManager = new ProcessResourceManager(loggingContext); m_pathExpander = new FileContentManagerSemanticPathExpander(fileContentManager, pathExpander); ExecutionLog = executionLog; m_rootModuleConfiguration = configuration; m_directoryMembershipFingerprinterRuleSet = directoryMembershipFinterprinterRuleSet; PathExistenceCache = new ConcurrentBigMap <AbsolutePath, PathExistence>(); FileContentManager = fileContentManager; ServiceManager = serviceManager ?? ServiceManager.Default; PipEnvironment = new PipEnvironment(loggingContext); FileSystemView = fileSystemView; m_unsafeConfiguration = unsafeConfiguration; m_preserveOutputsSalt = preserveOutputsSalt; LazyDeletionOfSharedOpaqueOutputsEnabled = lazyDeletionOfSharedOpaqueOutputsEnabled; if (fileSystemView != null) { fileContentManager.SetLocalDiskFileSystemExistenceView(fileSystemView); } }
private void SetupEnvironment(StreamWriter writer, Process pip, string outputFile) { var pipEnviornment = new PipEnvironment(); var environment = pipEnviornment.GetEffectiveEnvironmentVariables(PathTable, pip).ToDictionary(); writer.WriteLine(":::: Environment Variables"); if (string.IsNullOrEmpty(JsonEnvironmentScript)) { writer.WriteLine(":: Clear Existing Environment Variables"); writer.WriteLine(@"for /f ""tokens=1* delims=="" %%a in ('set') do ("); writer.WriteLine(" set %%a="); writer.WriteLine(")"); writer.WriteLine(); writer.WriteLine(":: Setting PIP Environment Variables"); foreach (var environmentVariable in environment) { writer.WriteLine("set {0}={1}", SanitizeEnvironmentVariableValue(environmentVariable.Key), SanitizeEnvironmentVariableValue(environmentVariable.Value)); } } else { FileUtilities.CreateDirectory(Path.GetDirectoryName(outputFile)); using (var jsonFile = File.Create($"{outputFile}.env.json")) using (var jsonStream = new StreamWriter(jsonFile)) using (var json = new JsonTextWriter(jsonStream)) { json.WriteStartObject(); foreach (var environmentVariable in environment) { json.WritePropertyName(environmentVariable.Key); json.WriteValue(environmentVariable.Value); } json.WriteEndObject(); } writer.WriteLine($"call {JsonEnvironmentScript} {outputFile}.env.json"); } writer.WriteLine(); }
private static void SetProcessPipDetails(Process pip, PipDetails result, PathTable pathTable, PipEnvironment pipEnvironment) { var args = new List <string>(); args.Add(pip.Executable.Path.ToString(pathTable)); args.AddRange(ConvertArgumentsToStringArray(pip.Arguments, pathTable)); result.Executable = new ToolReference() { Id = pip.Executable.Path.Value.Value, Path = pip.Executable.Path.ToString(pathTable) }; result.CommandLineFragments = args; result.CommandLine = GetPipCommandLine(pip, pathTable); result.WarningTimeout = pip.WarningTimeout; result.Timeout = pip.Timeout; bool includeDefaultOutputs = result.State == PipState.Failed; result.StandardInput = pip.StandardInput.IsFile ? StandardInput.CreateFromFile(FileReference.FromAbsolutePath(pathTable, pip.StandardInput.File.Path)) : pip.StandardInput.IsData ? StandardInput.CreateFromData( pip.StandardInput.Data.ToString(pathTable).Split(new[] { Environment.NewLine }, StringSplitOptions.None)) : StandardInput.Invalid; result.StandardOutput = GetStdFilePath(pip, SandboxedProcessFile.StandardOutput, pathTable, includeDefaultOutputs); result.StandardError = GetStdFilePath(pip, SandboxedProcessFile.StandardError, pathTable, includeDefaultOutputs); result.StandardDirectory = pip.StandardDirectory.IsValid ? pip.StandardDirectory.ToString(pathTable) : null; result.Dependencies = pip.Dependencies.Select(d => FileArtifactToFileDetails(d, pathTable)).OrderBy(d => d).ToList(); result.DirectoryDependencies = pip.DirectoryDependencies.Select(d => d.Path.ToString(pathTable)).OrderBy(d => d).ToList(); result.AdditionalTempDirectories = pip.AdditionalTempDirectories.Select(d => d.ToString(pathTable)).OrderBy(d => d).ToList(); result.UntrackedPaths = pip.UntrackedPaths.Select(f => f.ToString(pathTable)).OrderBy(f => f).ToList(); result.UntrackedScopes = pip.UntrackedScopes.Select(f => f.ToString(pathTable)).OrderBy(f => f).ToList(); result.Outputs = pip.FileOutputs.Select(f => FileArtifactToFileDetails(f.ToFileArtifact(), pathTable)).OrderBy(f => f).ToList(); result.WorkingDirectory = pip.WorkingDirectory.ToString(pathTable); if (!result.WorkingDirectory.EndsWith(@"\", StringComparison.Ordinal)) { result.WorkingDirectory += @"\"; } if (pip.ResponseFile.IsValid) { result.ResponseFile = FileArtifactToFileDetails(pip.ResponseFile, pathTable); } var vars = new List <Tuple <string, string> >(); foreach (var env in pipEnvironment.GetEffectiveEnvironmentVariables(pathTable, pip).ToDictionary().OrderBy(kvp => kvp.Key, StringComparer.OrdinalIgnoreCase)) { vars.Add(new Tuple <string, string>(env.Key, env.Value)); } vars.Sort((first, second) => string.Compare(first.Item1, second.Item1, StringComparison.OrdinalIgnoreCase)); result.EnvironmentVariables = vars; }