示例#1
0
        public SolutionProjectItem AddFolderProject(string name, Guid?parentProjectId)
        {
            var item = GetProject(ProjectTypeIdSolutionFolder, name);

            if (item == null)
            {
                item = new SolutionProjectItem()
                {
                    Id       = Guid.NewGuid(),
                    Type     = ProjectTypeIdSolutionFolder,
                    TypeName = GetProjectTypeName(ProjectTypeIdSolutionFolder),
                    Name     = name,
                    ParentId = parentProjectId ?? Guid.Empty,
                    Path     = name,
                };
                var match = _findProjectsDefinitionEnd.Match(SolutionData);

                var replaceSection = match.Value;

                var lastprojectend   = match.Groups["lastprojectend"]?.Value;
                var startnextsection = match.Groups["startnextsection"]?.Value;

                var projectItemDefinition = $"Project(\"{{{item.Type.ToUpper()}}}\") = \"{item.Name}\", \"{item.Path}\", \"{{{item.Id.ToUpper()}}}\"\nEndProject";
                var output = $"{lastprojectend}{projectItemDefinition}\n{startnextsection}";

                SetSolutionData(SolutionData.Replace(replaceSection, output));
            }

            AddProjectRelationships(new SolutionProjectItem[] { item }, parentProjectId);

            return(item);
        }
示例#2
0
        private SolutionProjectItem GetProject(Guid projectTypeId, string name)
        {
            var pattern = _findSolutionProjectRegexPattern
                          .Replace("%%PROJECTTYPEID%%", projectTypeId.ToString())
                          .Replace("%%PROJECTNAME%%", name);

            var findProjectRegex = new Regex(pattern, RegexOptions.IgnoreCase);

            var projectMatch = findProjectRegex.Match(SolutionData);

            if (projectMatch.Success)
            {
                var solutionProjectItem = new SolutionProjectItem()
                {
                    Type = projectTypeId,
                    Id   = new Guid(projectMatch.Groups["projectid"]?.Value ?? "00000000-0000-0000-0000-000000000000"),
                    Name = name,
                    Path = projectMatch.Groups["projectpath"]?.Value,
                };
                solutionProjectItem.TypeName = GetProjectTypeName(solutionProjectItem.Type);

                return(solutionProjectItem);
            }

            return(null);
        }
示例#3
0
        private bool HasProjectRelationship(SolutionProjectItem projectItem, Guid parentItemId)
        {
            var pattern = _findSolutionProjectRelationshipRegexPattern
                          .Replace("%%PROJECTID%%", projectItem.Id.ToUpper())
                          .Replace("%%PROJECTPARENTID%%", parentItemId.ToUpper());

            var findProjectRegex = new Regex(pattern, RegexOptions.IgnoreCase);

            var projectMatch = findProjectRegex.Match(SolutionData);

            return(projectMatch.Success);
        }
示例#4
0
        private void RemoveProjectConfiguration(SolutionProjectItem projectItem)
        {
            var pattern = _findSolutionProjectConfigPattern
                          .Replace("%%PROJECTNAME%%", projectItem.Id.ToUpper());

            var findProjectRegex = new Regex(pattern, RegexOptions.IgnoreCase);

            var projectMatch = findProjectRegex.Match(SolutionData);
            var solutionData = SolutionData;

            while (projectMatch.Success)
            {
                solutionData = solutionData.Replace($"{projectMatch.Value}\n", "");

                projectMatch = projectMatch.NextMatch();
            }
            SetSolutionData(solutionData);
        }
示例#5
0
        public void RemoveProject(SolutionProjectItem projectItem)
        {
            var pattern = _findSolutionProjectRegexPattern
                          .Replace("%%PROJECTTYPEID%%", projectItem.Type.ToUpper())
                          .Replace("%%PROJECTNAME%%", projectItem.Name);

            var findProjectRegex = new Regex(pattern, RegexOptions.IgnoreCase);

            var projectMatch = findProjectRegex.Match(SolutionData);

            if (projectMatch.Success)
            {
                SetSolutionData(SolutionData.Replace($"{projectMatch.Value}\n", ""));
            }

            RemoveProjectConfiguration(projectItem);

            RemoveProjectRelationships(projectItem);
        }
示例#6
0
        private void RemoveProjectRelationships(SolutionProjectItem projectItem)
        {
            var pattern = _findSolutionProjectRelationshipsRegexPattern
                          .Replace("%%PROJECTID%%", projectItem.Id.ToUpper());

            var findProjectRegex = new Regex(pattern, RegexOptions.IgnoreCase);

            var projectMatch = findProjectRegex.Match(SolutionData);
            var solutionData = SolutionData;

            while (projectMatch.Success)
            {
                var replacement = projectMatch.Groups["relationshipLine"]?.Value;
                solutionData = solutionData.Replace(replacement, "");

                projectMatch = projectMatch.NextMatch();
            }
            SetSolutionData(solutionData);
        }
示例#7
0
        private IEnumerable <SolutionProjectItem> GetProjects()
        {
            var projectMatches        = _findSolutionProjects.Match(SolutionData);
            var projectConfigurations = GetProjectConfigurations();

            do
            {
                var solutionProjectItem = new SolutionProjectItem()
                {
                    Type = new Guid(projectMatches.Groups["projecttypeid"]?.Value ?? "00000000-0000-0000-0000-000000000000"),
                    Id   = new Guid(projectMatches.Groups["projectid"]?.Value ?? "00000000-0000-0000-0000-000000000000"),
                    Name = projectMatches.Groups["projectname"]?.Value,
                    Path = projectMatches.Groups["projectpath"]?.Value,
                };
                solutionProjectItem.TypeName       = GetProjectTypeName(solutionProjectItem.Type);
                solutionProjectItem.Configurations = projectConfigurations.Where(c => c.Id == solutionProjectItem.Id).ToArray();

                yield return(solutionProjectItem);

                projectMatches = projectMatches.NextMatch();
            } while (projectMatches.Success);
        }
        private void UpdateSolutionWithFolderTargets(SolutionTool solutionTool, FolderTool folderTool)
        {
            var matchingTargets = GetMatchingTargets(solutionTool, folderTool, _logger);

            var relativePath = folderTool.FolderPath.RemoveCommonPrefix(solutionTool.FolderPath, System.IO.Path.DirectorySeparatorChar, StringComparison.InvariantCultureIgnoreCase);

            var subFolders = relativePath.Split(new char[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries);

            var addedProjects = new List <SolutionProjectItem>();
            SolutionProjectItem parentFolderProject = null;

            foreach (var subfolder in subFolders)
            {
                parentFolderProject = solutionTool.AddFolderProject(subfolder, parentFolderProject?.Id);
                addedProjects.Add(parentFolderProject);
                _logger.LogProgress();
            }

            solutionTool.AddProjects(matchingTargets, parentFolderProject?.Id);

            solutionTool.Save();
        }
示例#9
0
        private SolutionProjectItem AddProject(Guid projectTypeId, string name, string path, Guid?parentProjectId)
        {
            var item = GetProject(projectTypeId, name);

            if (item == null)
            {
                item = new SolutionProjectItem()
                {
                    Id       = Guid.NewGuid(),
                    Type     = projectTypeId,
                    TypeName = GetProjectTypeName(projectTypeId),
                    Name     = name,
                    ParentId = parentProjectId ?? Guid.Empty,
                    Path     = path,
                };
                var match = _findProjectsDefinitionEnd.Match(SolutionData);

                var replaceSection = match.Value;

                var lastprojectend   = match.Groups["lastprojectend"]?.Value;
                var startnextsection = match.Groups["startnextsection"]?.Value;

                var projectItemDefinition = $"Project(\"{{{item.Type.ToUpper()}}}\") = \"{item.Name}\", \"{item.Path}\", \"{{{item.Id.ToUpper()}}}\"\nEndProject";
                var output = $"{lastprojectend}{projectItemDefinition}\n{startnextsection}";

                SetSolutionData(SolutionData.Replace(replaceSection, output));
            }

            AddProjectRelationships(new SolutionProjectItem[] { item }, parentProjectId);

            if (projectTypeId == ProjectTypeIdClassLibrary || projectTypeId == ProjectTypeIdWebProject)
            {
                AddProjectConfiguration(item);
            }

            return(item);
        }
示例#10
0
        private void AddProjectConfiguration(SolutionProjectItem projectItem)
        {
            var configurations = GetProjectConfigurations();

            var existingConfigs = configurations.Where(c => c.Id == projectItem.Id);

            if (existingConfigs.Any())
            {
                return;
            }

            var match = _finsSolutionProjectConfigSections.Match(SolutionData);

            System.Diagnostics.Debug.Assert(match.Success);
            var replaceSection = match.Value;

            var indent       = match.Groups["indent"]?.Value;
            var startsection = match.Groups["startsection"]?.Value;
            var configs      = match.Groups["configs"]?.Value;
            var endsection   = match.Groups["endsection"]?.Value;

            var firstConfig         = configurations.First();
            var cloneTemplateConfig = configurations.Where(c => c.Id == firstConfig.Id);

            var configBuilder = new StringBuilder();

            foreach (var cloneConfig in cloneTemplateConfig)
            {
                configBuilder.Append($"{indent}{{{projectItem.Id.ToUpper()}}}.{cloneConfig.ProjectConfig}.{cloneConfig.ConfigItem} = {cloneConfig.Solutionconfig}\n");
            }

            var output = $"{startsection}\n{indent}{configs}{configBuilder}{endsection}";

            SetSolutionData(SolutionData.Replace(replaceSection, output));
            _didChangeFile = true;
        }