/// <summary> /// Execute an ItemGroup element, including each child item expression /// </summary> /// <param name="lookup">The lookup used for evaluation and as a destination for these items.</param> internal override void ExecuteTask(Lookup lookup) { foreach (ProjectItemGroupTaskItemInstance child in _taskInstance.Items) { List <ItemBucket> buckets = null; try { List <string> parameterValues = new List <string>(); GetBatchableValuesFromBuildItemGroupChild(parameterValues, child); buckets = BatchingEngine.PrepareBatchingBuckets(parameterValues, lookup, child.ItemType, _taskInstance.Location); // "Execute" each bucket foreach (ItemBucket bucket in buckets) { bool condition = ConditionEvaluator.EvaluateCondition ( child.Condition, ParserOptions.AllowAll, bucket.Expander, ExpanderOptions.ExpandAll, Project.Directory, child.ConditionLocation, LoggingContext.LoggingService, LoggingContext.BuildEventContext, FileSystems.Default); if (condition) { HashSet <string> keepMetadata = null; HashSet <string> removeMetadata = null; HashSet <string> matchOnMetadata = null; MatchOnMetadataOptions matchOnMetadataOptions = MatchOnMetadataConstants.MatchOnMetadataOptionsDefaultValue; if (!String.IsNullOrEmpty(child.KeepMetadata)) { var keepMetadataEvaluated = bucket.Expander.ExpandIntoStringListLeaveEscaped(child.KeepMetadata, ExpanderOptions.ExpandAll, child.KeepMetadataLocation).ToList(); if (keepMetadataEvaluated.Count > 0) { keepMetadata = new HashSet <string>(keepMetadataEvaluated); } } if (!String.IsNullOrEmpty(child.RemoveMetadata)) { var removeMetadataEvaluated = bucket.Expander.ExpandIntoStringListLeaveEscaped(child.RemoveMetadata, ExpanderOptions.ExpandAll, child.RemoveMetadataLocation).ToList(); if (removeMetadataEvaluated.Count > 0) { removeMetadata = new HashSet <string>(removeMetadataEvaluated); } } if (!String.IsNullOrEmpty(child.MatchOnMetadata)) { var matchOnMetadataEvaluated = bucket.Expander.ExpandIntoStringListLeaveEscaped(child.MatchOnMetadata, ExpanderOptions.ExpandAll, child.MatchOnMetadataLocation).ToList(); if (matchOnMetadataEvaluated.Count > 0) { matchOnMetadata = new HashSet <string>(matchOnMetadataEvaluated); } Enum.TryParse(child.MatchOnMetadataOptions, out matchOnMetadataOptions); } if ((child.Include.Length != 0) || (child.Exclude.Length != 0)) { // It's an item -- we're "adding" items to the world ExecuteAdd(child, bucket, keepMetadata, removeMetadata); } else if (child.Remove.Length != 0) { // It's a remove -- we're "removing" items from the world ExecuteRemove(child, bucket, matchOnMetadata, matchOnMetadataOptions); } else { // It's a modify -- changing existing items ExecuteModify(child, bucket, keepMetadata, removeMetadata); } } } } finally { if (buckets != null) { // Propagate the item changes to the bucket above foreach (ItemBucket bucket in buckets) { bucket.LeaveScope(); } } } } }
/// <summary> /// Returns true if <paramref name="itemToMatch" /> matches any ReferencedItems based on <paramref name="metadata" /> and <paramref name="options" />. /// </summary> public virtual bool IsMatchOnMetadata(IItem itemToMatch, IEnumerable <string> metadata, MatchOnMetadataOptions options) { return(false); }
/// <summary> /// Remove items from the world. Removes to items that are part of the project manifest are backed up, so /// they can be reverted when the project is reset after the end of the build. /// </summary> /// <param name="child">The item specification to evaluate and remove.</param> /// <param name="bucket">The batching bucket.</param> /// <param name="matchOnMetadata">Metadata matching.</param> /// <param name="matchingOptions">Options matching.</param> private void ExecuteRemove(ProjectItemGroupTaskItemInstance child, ItemBucket bucket, HashSet <string> matchOnMetadata, MatchOnMetadataOptions matchingOptions) { ICollection <ProjectItemInstance> group = bucket.Lookup.GetItems(child.ItemType); if (group == null) { // No items of this type to remove return; } List <ProjectItemInstance> itemsToRemove; if (matchOnMetadata == null) { itemsToRemove = FindItemsMatchingSpecification(group, child.Remove, child.RemoveLocation, bucket.Expander); } else { itemsToRemove = FindItemsUsingMatchOnMetadata(group, child, bucket, matchOnMetadata, matchingOptions); } if (itemsToRemove != null) { if (LogTaskInputs && !LoggingContext.LoggingService.OnlyLogCriticalEvents && itemsToRemove.Count > 0) { var itemGroupText = ItemGroupLoggingHelper.GetParameterText( ItemGroupLoggingHelper.ItemGroupRemoveLogMessage, child.ItemType, itemsToRemove, logItemMetadata: true); LoggingContext.LogCommentFromText(MessageImportance.Low, itemGroupText); } bucket.Lookup.RemoveItems(itemsToRemove); } }