private void ExecuteModify(ProjectItemGroupTaskItemInstance child, ItemBucket bucket, ISet <string> keepMetadata, ISet <string> removeMetadata) { ICollection <ProjectItemInstance> group = bucket.Lookup.GetItems(child.ItemType); if (group == null || group.Count == 0) { // No items of this type to modify return; } // Figure out what metadata names and values we need to set var metadataToSet = new Lookup.MetadataModifications(keepMetadata != null); // Filter the metadata as appropriate if (keepMetadata != null) { foreach (var metadataName in keepMetadata) { metadataToSet[metadataName] = Lookup.MetadataModification.CreateFromNoChange(); } } else if (removeMetadata != null) { foreach (var metadataName in removeMetadata) { metadataToSet[metadataName] = Lookup.MetadataModification.CreateFromRemove(); } } foreach (ProjectItemGroupTaskMetadataInstance metadataInstance in child.Metadata) { bool condition = ConditionEvaluator.EvaluateCondition ( metadataInstance.Condition, ParserOptions.AllowAll, bucket.Expander, ExpanderOptions.ExpandAll, Project.Directory, metadataInstance.ConditionLocation, LoggingContext.LoggingService, LoggingContext.BuildEventContext, FileSystems.Default); if (condition) { string evaluatedValue = bucket.Expander.ExpandIntoStringLeaveEscaped(metadataInstance.Value, ExpanderOptions.ExpandAll, metadataInstance.Location); metadataToSet[metadataInstance.Name] = Lookup.MetadataModification.CreateFromNewValue(evaluatedValue); } } // Now apply the changes. This must be done after filtering, since explicitly set metadata overrides filters. bucket.Lookup.ModifyItems(child.ItemType, group, metadataToSet); }
public void ModifyItemThatWasAddedInSameScope() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); ItemDictionary<ProjectItemInstance> table1 = new ItemDictionary<ProjectItemInstance>(); Lookup lookup = LookupHelpers.CreateLookup(table1); Lookup.Scope enteredScope = lookup.EnterScope("x"); // Add an item with m=m1 ProjectItemInstance item1 = new ProjectItemInstance(project, "i1", "a2", project.FullPath); item1.SetMetadata("m", "m1"); lookup.AddNewItem(item1); // Change the item to be m=m2 Lookup.MetadataModifications newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: false); newMetadata.Add("m", "m2"); ICollection<ProjectItemInstance> group = new List<ProjectItemInstance>(); group.Add(item1); lookup.ModifyItems(item1.ItemType, group, newMetadata); // Now it has m=m2 group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); Assert.Equal("m2", group.First().GetMetadataValue("m")); // But the original item hasn't changed yet Assert.Equal("m1", item1.GetMetadataValue("m")); enteredScope.LeaveScope(); // It still has m=m2 group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); Assert.Equal("m2", group.First().GetMetadataValue("m")); // But now the original item has changed as well Assert.Equal("m2", item1.GetMetadataValue("m")); }
/// <summary> /// Modifies items in the world - specifically, changes their metadata. Changes 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 modify.</param> /// <param name="bucket">The batching bucket.</param> private void ExecuteModify(ProjectItemGroupTaskItemInstance child, ItemBucket bucket, ISet<string> keepMetadata, ISet<string> removeMetadata) { ICollection<ProjectItemInstance> group = bucket.Lookup.GetItems(child.ItemType); if (group == null || group.Count == 0) { // No items of this type to modify return; } // Figure out what metadata names and values we need to set var metadataToSet = new Lookup.MetadataModifications(keepMetadata != null); // Filter the metadata as appropriate if (keepMetadata != null) { foreach (var metadataName in keepMetadata) { metadataToSet[metadataName] = Lookup.MetadataModification.CreateFromNoChange(); } } else if (removeMetadata != null) { foreach (var metadataName in removeMetadata) { metadataToSet[metadataName] = Lookup.MetadataModification.CreateFromRemove(); } } foreach (ProjectItemGroupTaskMetadataInstance metadataInstance in child.Metadata) { bool condition = ConditionEvaluator.EvaluateCondition ( metadataInstance.Condition, ParserOptions.AllowAll, bucket.Expander, ExpanderOptions.ExpandAll, Project.Directory, metadataInstance.ConditionLocation, LoggingContext.LoggingService, LoggingContext.BuildEventContext ); if (condition) { string evaluatedValue = bucket.Expander.ExpandIntoStringLeaveEscaped(metadataInstance.Value, ExpanderOptions.ExpandAll, metadataInstance.Location); metadataToSet[metadataInstance.Name] = Lookup.MetadataModification.CreateFromNewValue(evaluatedValue); } } // Now apply the changes. This must be done after filtering, since explicitly set metadata overrides filters. bucket.Lookup.ModifyItems(child.ItemType, group, metadataToSet); }
public void ModifyItemTwiceInSameScope1() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); ItemDictionary<ProjectItemInstance> table1 = new ItemDictionary<ProjectItemInstance>(); Lookup lookup = LookupHelpers.CreateLookup(table1); // Add an item with m=m1 and n=n1 ProjectItemInstance item1 = new ProjectItemInstance(project, "i1", "a2", project.FullPath); item1.SetMetadata("m", "m1"); lookup.PopulateWithItem(item1); Lookup.Scope enteredScope = lookup.EnterScope("x"); // Make a modification to the item to be m=m2 Lookup.MetadataModifications newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: false); newMetadata.Add("m", "m2"); ICollection<ProjectItemInstance> group = new List<ProjectItemInstance>(); group.Add(item1); lookup.ModifyItems(item1.ItemType, group, newMetadata); // Make an unrelated modification to the item newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: false); newMetadata.Add("n", "n1"); lookup.ModifyItems(item1.ItemType, group, newMetadata); // It's now m=m2 group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); Assert.Equal("m2", group.First().GetMetadataValue("m")); }
public void ModifyItemTwiceInSameScope2() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); ItemDictionary<ProjectItemInstance> table1 = new ItemDictionary<ProjectItemInstance>(); Lookup lookup = LookupHelpers.CreateLookup(table1); // Add an item with m=m1 and n=n1 and o=o1 ProjectItemInstance item1 = new ProjectItemInstance(project, "i1", "a2", project.FullPath); item1.SetMetadata("m", "m1"); item1.SetMetadata("n", "n1"); item1.SetMetadata("o", "o1"); lookup.PopulateWithItem(item1); Lookup.Scope enteredScope = lookup.EnterScope("x"); // It's still m=m1, n=n1, o=o1 ICollection<ProjectItemInstance> group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); Assert.Equal("m1", group.First().GetMetadataValue("m")); Assert.Equal("n1", group.First().GetMetadataValue("n")); Assert.Equal("o1", group.First().GetMetadataValue("o")); // Make a modification to the item to be m=m2 and n=n2 Lookup.MetadataModifications newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: false); newMetadata.Add("m", "m2"); newMetadata.Add("n", "n2"); group = new List<ProjectItemInstance>(); group.Add(item1); lookup.ModifyItems("i1", group, newMetadata); // It's now m=m2, n=n2, o=o1 ICollection<ProjectItemInstance> foundGroup = lookup.GetItems("i1"); Assert.Equal(1, foundGroup.Count); Assert.Equal("m2", foundGroup.First().GetMetadataValue("m")); Assert.Equal("n2", foundGroup.First().GetMetadataValue("n")); Assert.Equal("o1", foundGroup.First().GetMetadataValue("o")); // Make a modification to the item to be n=n3 newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: false); newMetadata.Add("n", "n3"); lookup.ModifyItems("i1", group, newMetadata); // It's now m=m2, n=n3, o=o1 foundGroup = lookup.GetItems("i1"); Assert.Equal(1, foundGroup.Count); Assert.Equal("m2", foundGroup.First().GetMetadataValue("m")); Assert.Equal("n3", foundGroup.First().GetMetadataValue("n")); Assert.Equal("o1", foundGroup.First().GetMetadataValue("o")); // But the original item hasn't changed yet Assert.Equal("m1", item1.GetMetadataValue("m")); Assert.Equal("n1", item1.GetMetadataValue("n")); Assert.Equal("o1", item1.GetMetadataValue("o")); enteredScope.LeaveScope(); // It's still m=m2, n=n3, o=o1 foundGroup = lookup.GetItems("i1"); Assert.Equal(1, foundGroup.Count); Assert.Equal("m2", foundGroup.First().GetMetadataValue("m")); Assert.Equal("n3", foundGroup.First().GetMetadataValue("n")); Assert.Equal("o1", foundGroup.First().GetMetadataValue("o")); // And the original item has changed Assert.Equal("m2", item1.GetMetadataValue("m")); Assert.Equal("n3", item1.GetMetadataValue("n")); Assert.Equal("o1", item1.GetMetadataValue("o")); }
public void KeepMetadataOnlySpecifiedNoneSpecified() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); ItemDictionary<ProjectItemInstance> table1 = new ItemDictionary<ProjectItemInstance>(); Lookup lookup = LookupHelpers.CreateLookup(table1); Lookup.Scope enteredScope = lookup.EnterScope("x"); // Add an item with m=m1 ProjectItemInstance item1 = new ProjectItemInstance(project, "i1", "a2", project.FullPath); item1.SetMetadata("m1", "m1"); item1.SetMetadata("m2", "m2"); lookup.AddNewItem(item1); Lookup.Scope enteredScope2 = lookup.EnterScope("x"); // Test keeping only specified metadata Lookup.MetadataModifications newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: true); ICollection<ProjectItemInstance> group = lookup.GetItems(item1.ItemType); lookup.ModifyItems(item1.ItemType, group, newMetadata); group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); // m1 and m2 are gone. Assert.Equal(String.Empty, group.First().GetMetadataValue("m1")); Assert.Equal(String.Empty, group.First().GetMetadataValue("m2")); enteredScope2.LeaveScope(); group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); // m1 and m2 are gone. Assert.Equal(String.Empty, group.First().GetMetadataValue("m1")); Assert.Equal(String.Empty, group.First().GetMetadataValue("m2")); enteredScope.LeaveScope(); group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); // m1 and m2 are gone. Assert.Equal(String.Empty, group.First().GetMetadataValue("m1")); Assert.Equal(String.Empty, group.First().GetMetadataValue("m2")); }
public void KeepMetadataOnlySpecifiedPropagate4() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); ItemDictionary<ProjectItemInstance> table1 = new ItemDictionary<ProjectItemInstance>(); Lookup lookup = LookupHelpers.CreateLookup(table1); Lookup.Scope enteredScope = lookup.EnterScope("x"); // Add an item with m=m1 ProjectItemInstance item1 = new ProjectItemInstance(project, "i1", "a2", project.FullPath); item1.SetMetadata("m1", "m1"); item1.SetMetadata("m2", "m2"); lookup.AddNewItem(item1); Lookup.Scope enteredScope2 = lookup.EnterScope("x"); // Get rid of all of the metadata, then add m3 Lookup.MetadataModifications newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: true); newMetadata.Add("m3", "m3"); ICollection<ProjectItemInstance> group = lookup.GetItems(item1.ItemType); lookup.ModifyItems(item1.ItemType, group, newMetadata); group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); // m1 and m2 are gone. Assert.Equal(String.Empty, group.First().GetMetadataValue("m1")); Assert.Equal(String.Empty, group.First().GetMetadataValue("m2")); // m3 is still there. Assert.Equal("m3", group.First().GetMetadataValue("m3")); enteredScope2.LeaveScope(); // Keep m3. Lookup.MetadataModifications newMetadata2 = new Lookup.MetadataModifications(keepOnlySpecified: true); newMetadata2["m3"] = Lookup.MetadataModification.CreateFromNoChange(); group = lookup.GetItems(item1.ItemType); lookup.ModifyItems(item1.ItemType, group, newMetadata2); group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); // m1 and m2 are gone Assert.Equal(String.Empty, group.First().GetMetadataValue("m1")); Assert.Equal(String.Empty, group.First().GetMetadataValue("m2")); // m3 is still there Assert.Equal("m3", group.First().GetMetadataValue("m3")); enteredScope.LeaveScope(); group = lookup.GetItems("i1"); Assert.Equal(1, group.Count); // m1 and m2 are gone Assert.Equal(String.Empty, group.First().GetMetadataValue("m1")); Assert.Equal(String.Empty, group.First().GetMetadataValue("m2")); // m3 is still there. Assert.Equal("m3", group.First().GetMetadataValue("m3")); }
public void RemoveItemFromProjectPreviouslyModifiedAndGottenThroughGetItem() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); // Create some project state with an item with m=m1 and n=n1 ItemDictionary<ProjectItemInstance> table1 = new ItemDictionary<ProjectItemInstance>(); ProjectItemInstance item1 = new ProjectItemInstance(project, "i1", "a2", project.FullPath); item1.SetMetadata("m", "m1"); table1.Add(item1); Lookup lookup = LookupHelpers.CreateLookup(table1); Lookup.Scope enteredScope = lookup.EnterScope("x"); // Make a modification to the item to be m=m2 Lookup.MetadataModifications newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: false); newMetadata.Add("m", "m2"); List<ProjectItemInstance> group = new List<ProjectItemInstance>(); group.Add(item1); lookup.ModifyItems(item1.ItemType, group, newMetadata); // Get the item (under the covers, it cloned it in order to apply the modification) ICollection<ProjectItemInstance> group2 = lookup.GetItems(item1.ItemType); Assert.Equal(1, group2.Count); ProjectItemInstance item1b = group2.First(); // Remove the item lookup.RemoveItem(item1b); // There's now no items at all ICollection<ProjectItemInstance> group3 = lookup.GetItems(item1.ItemType); Assert.Equal(0, group3.Count); // Leave scope enteredScope.LeaveScope(); // And now none left in the project either Assert.Equal(0, table1["i1"].Count); }
public void ModifyItemInProjectPreviouslyModifiedAndGottenThroughGetItem() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); // Create some project state with an item with m=m1 and n=n1 ItemDictionary<ProjectItemInstance> table1 = new ItemDictionary<ProjectItemInstance>(); ProjectItemInstance item1 = new ProjectItemInstance(project, "i1", "a2", project.FullPath); item1.SetMetadata("m", "m1"); table1.Add(item1); Lookup lookup = LookupHelpers.CreateLookup(table1); Lookup.Scope enteredScope = lookup.EnterScope("x"); // Make a modification to the item to be m=m2 Lookup.MetadataModifications newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: false); newMetadata.Add("m", "m2"); List<ProjectItemInstance> group = new List<ProjectItemInstance>(); group.Add(item1); lookup.ModifyItems(item1.ItemType, group, newMetadata); // Get the item (under the covers, it cloned it in order to apply the modification) ICollection<ProjectItemInstance> group2 = lookup.GetItems(item1.ItemType); Assert.Equal(1, group2.Count); ProjectItemInstance item1b = group2.First(); // Modify to m=m3 Lookup.MetadataModifications newMetadata2 = new Lookup.MetadataModifications(keepOnlySpecified: false); newMetadata2.Add("m", "m3"); List<ProjectItemInstance> group3 = new List<ProjectItemInstance>(); group3.Add(item1b); lookup.ModifyItems(item1b.ItemType, group3, newMetadata2); // Modifications are visible ICollection<ProjectItemInstance> group4 = lookup.GetItems(item1b.ItemType); Assert.Equal(1, group4.Count); Assert.Equal("m3", group4.First().GetMetadataValue("m")); // Leave scope enteredScope.LeaveScope(); // Still visible ICollection<ProjectItemInstance> group5 = lookup.GetItems(item1b.ItemType); Assert.Equal(1, group5.Count); Assert.Equal("m3", group5.First().GetMetadataValue("m")); // And the one in the project is changed Assert.Equal("m3", item1.GetMetadataValue("m")); }
public void KeepMetadataOnlySpecifiedPropagate2() { ProjectInstance project = ProjectHelpers.CreateEmptyProjectInstance(); ItemDictionary<ProjectItemInstance> table1 = new ItemDictionary<ProjectItemInstance>(); Lookup lookup = LookupHelpers.CreateLookup(table1); Lookup.Scope enteredScope = lookup.EnterScope("x"); // Add an item with m=m1 ProjectItemInstance item1 = new ProjectItemInstance(project, "i1", "a2", project.FullPath); item1.SetMetadata("m1", "m1"); item1.SetMetadata("m2", "m2"); lookup.AddNewItem(item1); Lookup.Scope enteredScope2 = lookup.EnterScope("x"); // Add m3 metadata Lookup.MetadataModifications newMetadata = new Lookup.MetadataModifications(keepOnlySpecified: false); newMetadata.Add("m3", "m3"); ICollection<ProjectItemInstance> group = lookup.GetItems(item1.ItemType); lookup.ModifyItems(item1.ItemType, group, newMetadata); group = lookup.GetItems("i1"); Assert.AreEqual(1, group.Count); // All metadata are present Assert.AreEqual("m1", group.First().GetMetadataValue("m1")); Assert.AreEqual("m2", group.First().GetMetadataValue("m2")); Assert.AreEqual("m3", group.First().GetMetadataValue("m3")); enteredScope2.LeaveScope(); // Now clear metadata Lookup.MetadataModifications newMetadata2 = new Lookup.MetadataModifications(keepOnlySpecified: true); group = lookup.GetItems(item1.ItemType); lookup.ModifyItems(item1.ItemType, group, newMetadata2); group = lookup.GetItems("i1"); Assert.AreEqual(1, group.Count); // All metadata are gone Assert.AreEqual(String.Empty, group.First().GetMetadataValue("m1")); Assert.AreEqual(String.Empty, group.First().GetMetadataValue("m2")); Assert.AreEqual(String.Empty, group.First().GetMetadataValue("m3")); enteredScope.LeaveScope(); group = lookup.GetItems("i1"); Assert.AreEqual(1, group.Count); // All metadata are gone Assert.AreEqual(String.Empty, group.First().GetMetadataValue("m1")); Assert.AreEqual(String.Empty, group.First().GetMetadataValue("m2")); Assert.AreEqual(String.Empty, group.First().GetMetadataValue("m3")); }