aboutsummaryrefslogtreecommitdiffstats
path: root/Tests/Test_QtMsBuild.Build/BigSolution.cs
blob: 3bad2b76bb1793430d4d6886bdf3a1ef885549b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using QtVsTools.Core.MsBuild;

namespace QtVsTools.Test.QtMsBuild.Build
{
    public static class BigSolution
    {
        static void GenerateProject(
            StringBuilder genSolutionProjectRef,
            StringBuilder genSolutionProjectConfigs,
            string pathToTemplateDir,
            string pathToGeneratedDir,
            int projectCount,
            string projectGuid,
            string projectName,
            string projectRef,
            IEnumerable<string> projectConfigsList)
        {
            var projectFiles = Directory.GetFiles(
                Path.Combine(pathToTemplateDir, projectName),
                "*", SearchOption.TopDirectoryOnly);

            bool singleProject = false;
            for (int i = 1; !singleProject && i <= projectCount; i++) {
                var idxStr = string.Format("{0:D3}", i);
                var genProjectName = projectName.Replace("NNN", idxStr);
                if (genProjectName == projectName)
                    singleProject = true;
                var genProjectDirPath = Path.Combine(pathToGeneratedDir, genProjectName);
                var genProjectGuid = projectGuid.Replace("000", idxStr);

                Directory.CreateDirectory(genProjectDirPath);

                foreach (var projectFile in projectFiles) {
                    var genProjectFileName = Regex.Replace(
                        Path.GetFileName(projectFile), "NNN", idxStr, RegexOptions.IgnoreCase);
                    var genProjectFilePath = Path.Combine(genProjectDirPath, genProjectFileName);

                    var genProjectFileText = File.ReadAllText(projectFile);
                    genProjectFileText = Regex.Replace(genProjectFileText,
                        "NNN", idxStr, RegexOptions.IgnoreCase);
                    genProjectFileText = Regex.Replace(genProjectFileText,
                        projectGuid, genProjectGuid, RegexOptions.IgnoreCase);
                    File.WriteAllText(genProjectFilePath, genProjectFileText);
                }
                var genProjectRef = Regex.Replace(
                    Regex.Replace(projectRef, "NNN", idxStr, RegexOptions.IgnoreCase),
                    projectGuid, genProjectGuid, RegexOptions.IgnoreCase);
                genSolutionProjectRef.Append(genProjectRef);
                foreach (var projectConfig in projectConfigsList) {
                    var genProjectConfig = Regex.Replace(projectConfig,
                        projectGuid, genProjectGuid, RegexOptions.IgnoreCase);
                    genSolutionProjectConfigs.Append(genProjectConfig);
                }
            }
        }

        public static void Generate(string outputPath, string templatePath, int projectCount)
        {
            var templateFiles = Directory.GetFiles(
                templatePath, "*", SearchOption.AllDirectories);
            var solutionFilePath = templateFiles
                .Where(x => Path.GetExtension(x) == ".sln")
                .First();
            var solutionName = Path.GetFileName(solutionFilePath);
            var solutionText = File.ReadAllText(solutionFilePath);
            var projectFilePaths = templateFiles
                .Where(x => Path.GetExtension(x) == ".vcxproj");
            var genSolutionText = solutionText;
            if (Directory.Exists(outputPath))
                Directory.Delete(outputPath, true);
            foreach (var projectFilePath in projectFilePaths) {
                var genSolutionProjectRef = new StringBuilder();
                var genSolutionProjectConfigs = new StringBuilder();
                var projectText = File.ReadAllText(projectFilePath);
                var projectName = Path.GetFileNameWithoutExtension(projectFilePath);
                var projectGuidMatch = Regex.Match(projectText, @"<ProjectGuid>({[^}]+})<");
                var projectGuid = projectGuidMatch.Groups[1].Value;
                var projectRef = Regex
                    .Match(solutionText,
                        @"^Project.*" + projectGuid + @"""\r\nEndProject\r\n",
                        RegexOptions.Multiline | RegexOptions.IgnoreCase)
                    .Value;
                var projectConfigsList = Regex
                    .Matches(solutionText,
                        @"^\s+" + projectGuid + @".*\r\n",
                        RegexOptions.Multiline | RegexOptions.IgnoreCase)
                    .Cast<Match>()
                    .Select(x => x.Value);
                var projectConfigs = string.Join("", projectConfigsList);
                GenerateProject(
                    genSolutionProjectRef,
                    genSolutionProjectConfigs,
                    templatePath,
                    outputPath,
                    projectCount,
                    projectGuid,
                    projectName,
                    projectRef,
                    projectConfigsList);
                genSolutionText = genSolutionText
                    .Replace(projectRef, genSolutionProjectRef.ToString())
                    .Replace(projectConfigs, genSolutionProjectConfigs.ToString());
            }
            var genSolutionFilePath = Path.Combine(outputPath, solutionName);
            File.WriteAllText(genSolutionFilePath, genSolutionText);
        }
    }
}