예제 #1
0
        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);
            }
        }
예제 #2
0
        /// <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);
        }