private void HandleProjectItemChange(ProjectItem projectItem, ProjectItemAction action, string oldName = null) { Argument.IsNotNull("projectItem", projectItem); if (!_isSolutionLoaded) { return; } Log.Debug("Handling action '{0}' for item '{1}'", action, projectItem.Name); var configuration = _configurationService.LoadConfigurationForCurrentSolution(); if (configuration.EnableAutoLink) { var sourceProject = projectItem.ContainingProject; var sourceProjectName = sourceProject.Name; var projectsToLink = (from projectMapping in configuration.ProjectMappings where string.Equals(projectMapping.SourceProject, sourceProjectName, StringComparison.OrdinalIgnoreCase) select _visualStudioService.GetProjectByName(projectMapping.TargetProject)).ToArray(); var linker = new Linker(sourceProject, projectsToLink, configuration); linker.RemoveMissingFiles = true; linker.HandleProjectItemChange(projectItem, action, oldName); } }
/// <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); }