private static EvaluationResult SealDirectoryHelper(Context context, ModuleLiteral env, EvaluationStackFrame args, SealDirectoryKind sealDirectoryKind) { AbsolutePath path = Args.AsPath(args, 0, false); ArrayLiteral contents = Args.AsArrayLiteral(args, 1); var tags = Args.AsStringArrayOptional(args, 2); var description = Args.AsStringOptional(args, 3); // Only do scrub for fully seal directory var scrub = sealDirectoryKind.IsFull() ? Args.AsBoolOptional(args, 4) : false; var fileContents = new FileArtifact[contents.Length]; for (int i = 0; i < contents.Length; ++i) { fileContents[i] = Converter.ExpectFile(contents[i], strict: false, context: new ConversionContext(pos: i, objectCtx: contents)); } var sortedFileContents = SortedReadOnlyArray <FileArtifact, OrdinalFileArtifactComparer> .CloneAndSort(fileContents, OrdinalFileArtifactComparer.Instance); DirectoryArtifact sealedDirectoryArtifact; if (!context.GetPipConstructionHelper().TrySealDirectory(path, sortedFileContents, sealDirectoryKind, tags, description, null, out sealedDirectoryArtifact, scrub)) { // Error has been logged return(EvaluationResult.Error); } var result = new StaticDirectory(sealedDirectoryArtifact, sealDirectoryKind, sortedFileContents.WithCompatibleComparer(OrdinalPathOnlyFileArtifactComparer.Instance)); return(new EvaluationResult(result)); }
private static RuntimeTypeId GetRuntimeTypeForStaticDirectory(StaticDirectory staticDirectory) { Contract.Requires(staticDirectory != null); switch (staticDirectory.SealDirectoryKind) { case SealDirectoryKind.Full: return(RuntimeTypeId.FullStaticContentDirectory); case SealDirectoryKind.Partial: return(RuntimeTypeId.PartialStaticContentDirectory); case SealDirectoryKind.Opaque: return(RuntimeTypeId.ExclusiveOpaqueDirectory); case SealDirectoryKind.SharedOpaque: return(RuntimeTypeId.SharedOpaqueDirectory); case SealDirectoryKind.SourceAllDirectories: return(RuntimeTypeId.SourceAllDirectory); case SealDirectoryKind.SourceTopDirectoryOnly: return(RuntimeTypeId.SourceTopDirectory); default: throw Contract.AssertFailure(I($"Unexpected runtime kind '{staticDirectory.SealDirectoryKind}' encountered.")); } }
private EvaluationResult SealSourceDirectory(Context context, ModuleLiteral env, EvaluationStackFrame args) { AbsolutePath path; SealDirectoryKind sealDirectoryKind; string[] tags; string description; string[] patterns; if (args.Length > 0 && args[0].Value is ObjectLiteral) { var obj = Args.AsObjectLiteral(args, 0); var directory = Converter.ExtractDirectory(obj, m_sealRoot, allowUndefined: false); path = directory.Path; var include = Converter.ExtractStringLiteral(obj, m_sealInclude, s_includeMap.Keys, allowUndefined: true); sealDirectoryKind = include != null ? s_includeMap[include] : SealDirectoryKind.SourceTopDirectoryOnly; tags = Converter.ExtractStringArray(obj, m_sealTags, allowUndefined: true); description = Converter.ExtractString(obj, m_sealDescription, allowUndefined: true); patterns = Converter.ExtractStringArray(obj, m_sealPatterns, allowUndefined: true); } else { path = Args.AsPath(args, 0, false); var optionAsEnumValue = Args.AsNumberOrEnumValueOptional(args, 1); var option = optionAsEnumValue.HasValue ? (SealSourceDirectoryOption)optionAsEnumValue.Value : SealSourceDirectoryOption.TopDirectoryOnly; sealDirectoryKind = option == SealSourceDirectoryOption.AllDirectories ? SealDirectoryKind.SourceAllDirectories : SealDirectoryKind.SourceTopDirectoryOnly; tags = Args.AsStringArrayOptional(args, 2); description = Args.AsStringOptional(args, 3); patterns = Args.AsStringArrayOptional(args, 4); } DirectoryArtifact sealedDirectoryArtifact; if (!context.GetPipConstructionHelper().TrySealDirectory( directoryRoot: path, contents: s_emptySealContents, outputDirectorycontents: s_emptyOutputDirectoryContents, kind: sealDirectoryKind, tags: tags, description: description, patterns: patterns, sealedDirectory: out sealedDirectoryArtifact)) { // Error has been logged return(EvaluationResult.Error); } var result = new StaticDirectory(sealedDirectoryArtifact, sealDirectoryKind, s_emptySealContents.WithCompatibleComparer(OrdinalPathOnlyFileArtifactComparer.Instance)); return(new EvaluationResult(result)); }
private EvaluationResult ComposeSharedOpaqueDirectories(Context context, ModuleLiteral env, EvaluationStackFrame args) { AbsolutePath root; ArrayLiteral contents; SealDirectoryContentFilter?contentFilter; if (args.Length > 0 && args[0].Value is ObjectLiteral) { var obj = Args.AsObjectLiteral(args, 0); var directory = Converter.ExtractDirectory(obj, m_sealRoot, allowUndefined: false); root = directory.Path; contents = Converter.ExtractArrayLiteral(obj, m_sealDirectories, allowUndefined: false); var filterObj = Converter.ExtractObjectLiteral(obj, m_sealDirectoryContentFilter, allowUndefined: true); extractContentFilter(filterObj, out contentFilter); } else { root = Args.AsPath(args, 0, false); contents = Args.AsArrayLiteral(args, 1); var filterObj = Args.AsObjectLiteralOptional(args, 2); extractContentFilter(filterObj, out contentFilter); } var directories = new DirectoryArtifact[contents.Length]; for (int i = 0; i < contents.Length; ++i) { directories[i] = Converter.ExpectSharedOpaqueDirectory(contents[i], context: new ConversionContext(pos: i, objectCtx: contents)).Root; } if (!context.GetPipConstructionHelper().TryComposeSharedOpaqueDirectory(root, directories, contentFilter, description: null, tags: null, out var compositeSharedOpaque)) { // Error should have been logged return(EvaluationResult.Error); } var result = new StaticDirectory(compositeSharedOpaque, SealDirectoryKind.SharedOpaque, s_emptySealContents.WithCompatibleComparer(OrdinalPathOnlyFileArtifactComparer.Instance)); return(new EvaluationResult(result)); void extractContentFilter(ObjectLiteral obj, out SealDirectoryContentFilter?filter) { filter = null; if (obj != null) { var regex = Converter.ExtractRegex(obj, m_sealDirectoryContentFilterRegex, allowUndefined: false); var kindAsString = Converter.ExtractString(obj, m_sealDirectoryContentFilterKind, allowUndefined: false); filter = new SealDirectoryContentFilter( (SealDirectoryContentFilter.ContentFilterKind)Enum.Parse(typeof(SealDirectoryContentFilter.ContentFilterKind), kindAsString), regex.ToString()); } } }
private EvaluationResult SealDirectoryHelper(Context context, ModuleLiteral env, EvaluationStackFrame args, SealDirectoryKind sealDirectoryKind) { AbsolutePath path; ArrayLiteral contents; string[] tags; string description; bool scrub; if (args.Length > 0 && args[0].Value is ObjectLiteral) { var obj = Args.AsObjectLiteral(args, 0); var directory = Converter.ExtractDirectory(obj, m_sealRoot, allowUndefined: false); path = directory.Path; contents = Converter.ExtractArrayLiteral(obj, m_sealFiles, allowUndefined: false); tags = Converter.ExtractStringArray(obj, m_sealTags, allowUndefined: true); description = Converter.ExtractString(obj, m_sealDescription, allowUndefined: true); scrub = sealDirectoryKind.IsFull() ? Converter.ExtractOptionalBoolean(obj, m_sealScrub) ?? false : false; } else { path = Args.AsPath(args, 0, false); contents = Args.AsArrayLiteral(args, 1); tags = Args.AsStringArrayOptional(args, 2); description = Args.AsStringOptional(args, 3); // Only do scrub for fully seal directory scrub = sealDirectoryKind.IsFull() ? Args.AsBoolOptional(args, 4) : false; } var fileContents = new FileArtifact[contents.Length]; for (int i = 0; i < contents.Length; ++i) { fileContents[i] = Converter.ExpectFile(contents[i], strict: false, context: new ConversionContext(pos: i, objectCtx: contents)); } var sortedFileContents = SortedReadOnlyArray <FileArtifact, OrdinalFileArtifactComparer> .CloneAndSort(fileContents, OrdinalFileArtifactComparer.Instance); DirectoryArtifact sealedDirectoryArtifact; if (!context.GetPipConstructionHelper().TrySealDirectory(path, sortedFileContents, sealDirectoryKind, tags, description, null, out sealedDirectoryArtifact, scrub)) { // Error has been logged return(EvaluationResult.Error); } var result = new StaticDirectory(sealedDirectoryArtifact, sealDirectoryKind, sortedFileContents.WithCompatibleComparer(OrdinalPathOnlyFileArtifactComparer.Instance)); return(new EvaluationResult(result)); }
private EvaluationResult GetSharedOpaqueSubDirectory(Context context, ModuleLiteral env, EvaluationStackFrame args) { var directory = Converter.ExpectSharedOpaqueDirectory(args[0]).Root; AbsolutePath subDirectoryPath = Args.AsPath(args, 1, false); var optionalFilterObj = Args.AsObjectLiteralOptional(args, 2); SealDirectoryContentFilter?contentFilter = GetContentFilterHelper(optionalFilterObj); if (!context.GetPipConstructionHelper().TryComposeSharedOpaqueDirectory(subDirectoryPath, new[] { directory }, SealDirectoryCompositionActionKind.NarrowDirectoryCone, contentFilter, description: null, tags: null, out var compositeSharedOpaque)) { // Error should have been logged return(EvaluationResult.Error); } var result = new StaticDirectory(root: compositeSharedOpaque, kind: SealDirectoryKind.SharedOpaque, s_emptySealContents.WithCompatibleComparer(OrdinalPathOnlyFileArtifactComparer.Instance)); return(new EvaluationResult(result)); }
private static bool TryHashStaticDirectoryArtifact(StaticDirectory staticDirValue, HashingHelper helper) { helper.Add((int)staticDirValue.SealDirectoryKind); if (!TryHashDirectoryArtifact(staticDirValue.Root, helper)) { return(false); } helper.Add(staticDirValue.Contents.Length); foreach (var content in staticDirValue.Contents) { helper.Add(content); } return(true); }
private EvaluationResult SealDirectory(PipConstructionHelper pipConstructionHelper, DownloadData downloadData, DirectoryArtifact directory, SortedReadOnlyArray <FileArtifact, OrdinalFileArtifactComparer> files) { if (!pipConstructionHelper.TrySealDirectory( directory, files, Pips.Operations.SealDirectoryKind.Partial, null, null, null, out var directoryArtifact) ) { return(EvaluationResult.Error); } var staticDirectory = new StaticDirectory(directoryArtifact, Pips.Operations.SealDirectoryKind.Partial, files.WithCompatibleComparer(OrdinalPathOnlyFileArtifactComparer.Instance)); return(new EvaluationResult(staticDirectory)); }
private static EvaluationResult SealSourceDirectory(Context context, ModuleLiteral env, EvaluationStackFrame args) { AbsolutePath path = Args.AsPath(args, 0, false); var optionAsEnumValue = Args.AsNumberOrEnumValueOptional(args, 1); var option = optionAsEnumValue.HasValue ? (SealSourceDirectoryOption)optionAsEnumValue.Value : SealSourceDirectoryOption.TopDirectoryOnly; var tags = Args.AsStringArrayOptional(args, 2); var description = Args.AsStringOptional(args, 3); var patterns = Args.AsStringArrayOptional(args, 4); var sealDirectoryKind = option == SealSourceDirectoryOption.AllDirectories ? SealDirectoryKind.SourceAllDirectories : SealDirectoryKind.SourceTopDirectoryOnly; DirectoryArtifact sealedDirectoryArtifact; if (!context.GetPipConstructionHelper().TrySealDirectory(path, s_emptySealContents, sealDirectoryKind, tags, description, patterns, out sealedDirectoryArtifact)) { // Error has been logged return(EvaluationResult.Error); } var result = new StaticDirectory(sealedDirectoryArtifact, sealDirectoryKind, s_emptySealContents.WithCompatibleComparer(OrdinalPathOnlyFileArtifactComparer.Instance)); return(new EvaluationResult(result)); }
private static EvaluationResult ComposeSharedOpaqueDirectories(Context context, ModuleLiteral env, EvaluationStackFrame args) { AbsolutePath root = Args.AsPath(args, 0, false); ArrayLiteral contents = Args.AsArrayLiteral(args, 1); var tags = Args.AsStringArrayOptional(args, 2); var description = Args.AsStringOptional(args, 3); var directories = new DirectoryArtifact[contents.Length]; for (int i = 0; i < contents.Length; ++i) { directories[i] = Converter.ExpectSharedOpaqueDirectory(contents[i], context: new ConversionContext(pos: i, objectCtx: contents)).Root; } if (!context.GetPipConstructionHelper().TryComposeSharedOpaqueDirectory(root, directories, description, tags, out var compositeSharedOpaque)) { // Error should have been logged return(EvaluationResult.Error); } var result = new StaticDirectory(compositeSharedOpaque, SealDirectoryKind.SharedOpaque, s_emptySealContents.WithCompatibleComparer(OrdinalPathOnlyFileArtifactComparer.Instance)); return(new EvaluationResult(result)); }
/// <nodoc /> public bool TryGetOutputDirectory(AbsolutePath path, out StaticDirectory staticDirectory) { return(m_outputDirectoryMap.TryGetValue(path, out staticDirectory)); }