Exemple #1
0
        /// <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;
        }
Exemple #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);
        }