/// <summary> /// Determines whether the specified <paramref name="item" /> matches the specified rule. /// </summary> /// <param name="item">The item.</param> /// <param name="rootProjectConfiguration">The root project configuration.</param> /// <param name="ruleType">Type of the rule.</param> /// <param name="targetProjectType">Type of the target project.</param> /// <returns><c>true</c> if the item matches the rule; otherwise <c>false</c>.</returns> /// <exception cref="ArgumentNullException">The <paramref name="item" /> is <c>null</c>.</exception> /// <exception cref="ArgumentNullException">The <paramref name="rootProjectConfiguration" /> is <c>null</c>.</exception> private bool MatchesRule(ProjectItem item, RootProject rootProjectConfiguration, RuleType ruleType, ProjectType targetProjectType) { Argument.IsNotNull("item", item); Argument.IsNotNull("rootProjectConfiguration", rootProjectConfiguration); foreach (var rule in rootProjectConfiguration.Rules) { if (rule.Type == ruleType) { if (string.Compare(rule.Name, item.GetNameRelativeToRoot()) == 0) { foreach (var ruledProjectType in rule.ProjectTypes) { if (ruledProjectType == targetProjectType) { return true; } } } } } return false; }
/// <summary> /// Handles the change of a project item. /// </summary> /// <param name="projectItem">The project item.</param> /// <param name="action">The action that happened to the project item.</param> /// <param name="oldName">The old name in case of a rename, can be <c>null</c>.</param> /// <exception cref="System.ArgumentOutOfRangeException">action</exception> /// <exception cref="ArgumentNullException">The <paramref name="projectItem" /> is <c>null</c>.</exception> /// <exception cref="InvalidOperationException">The root project file does not exist.</exception> /// <exception cref="ArgumentException">The <paramref name="oldName" /> is <c>null</c> or whitespace but the action is <see cref="ProjectItemAction.Rename" />.</exception> public void HandleProjectItemChange(ProjectItem projectItem, ProjectItemAction action, string oldName = null) { Argument.IsNotNull("projectItem", projectItem); if (action == ProjectItemAction.Rename) { Argument.IsNotNullOrWhitespace("oldName", oldName); } Log.Debug("Linking {0} projects to {1}", TargetProjects.Length, RootProject.Name); var sourceProjectItems = projectItem.Collection; var fileFilter = new List<string>(new[] { projectItem.GetNameRelativeToRoot() }); if (!string.IsNullOrWhiteSpace(oldName)) { // Handle delete of old item var relativeName = projectItem.GetNameRelativeToRoot(); var relativeNameWithoutFile = relativeName.Substring(0, relativeName.Length - projectItem.Name.Length); var oldRelativeName = Path.Combine(relativeNameWithoutFile, oldName); fileFilter.Add(oldRelativeName); } foreach (var targetProject in TargetProjects) { Log.Debug("Linking project {0}", targetProject.Name); var targetProjectItems = GetTargetProjectItems(sourceProjectItems, targetProject); switch (action) { case ProjectItemAction.Add: AddFilesAndFolders(sourceProjectItems, targetProjectItems, targetProject.GetProjectType(), 1, fileFilter); break; case ProjectItemAction.Rename: RemoveFilesAndFolders(sourceProjectItems, targetProjectItems, targetProject.GetProjectType(), 1, fileFilter); AddFilesAndFolders(sourceProjectItems, targetProjectItems, targetProject.GetProjectType(), 1, fileFilter); break; case ProjectItemAction.Remove: RemoveFilesAndFolders(sourceProjectItems, targetProjectItems, targetProject.GetProjectType(), 1, fileFilter); break; default: throw new ArgumentOutOfRangeException("action"); } Log.Debug("Linked project"); } Log.Debug("Linked {0} projects", TargetProjects.Length); }