1// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#include "projectgenerate.h"
6
7#include <QFile>
8#include <QDir>
9#include <QTextStream>
10
11namespace templateMgr{
12
13class ProjectGeneratePrivate
14{
15 friend class ProjectGenerate;
16};
17
18ProjectGenerate::ProjectGenerate(QObject *parent)
19 : QObject(parent)
20 , d(new ProjectGeneratePrivate())
21{
22
23}
24
25ProjectGenerate::~ProjectGenerate()
26{
27 if (d)
28 delete d;
29}
30
31bool ProjectGenerate::copyDir(QString &retMsg, const QString &srcPath, const QString &dstPath, bool cover)
32{
33 QDir srcDir(srcPath);
34 QDir dstDir(dstPath);
35 if (!dstDir.exists()) {
36 if (!dstDir.mkdir(dstDir.absolutePath())) {
37 retMsg = tr("Create ") + dstPath + tr(" failed.");
38 return false;
39 }
40 }
41
42 QFileInfoList fileInfoList = srcDir.entryInfoList();
43 foreach(auto fileInfo, fileInfoList) {
44 if (fileInfo.fileName() == "." || fileInfo.fileName() == "..")
45 continue;
46
47 if (fileInfo.isDir()) {
48 if (!copyDir(retMsg, fileInfo.filePath(), dstDir.filePath(fileInfo.fileName()), cover))
49 return false;
50 } else {
51 if (cover && dstDir.exists(fileInfo.fileName())) {
52 dstDir.remove(fileInfo.fileName());
53 }
54
55 if (!QFile::copy(fileInfo.filePath(), dstDir.filePath(fileInfo.fileName()))) {
56 retMsg = tr("Copy file ") + fileInfo.fileName() + tr(" failed.");
57 return false;
58 }
59 }
60 }
61
62 return true;
63}
64
65bool ProjectGenerate::copyFile(QString &retMsg, const QString &srcPath, const QString &dstPath, bool cover)
66{
67 if (!QFile::exists(srcPath)) {
68 retMsg = tr("Template file ") + srcPath + tr(" is not exist.");
69 return false;
70 }
71
72 if (QFile::exists(dstPath) && cover) {
73 QFile::remove(dstPath);
74 }
75
76 QFile::copy(srcPath, dstPath);
77
78 return true;
79}
80
81bool ProjectGenerate::create(PojectGenResult &retResult, const PojectGenParam &genParam)
82{
83 if (genParam.type == Project) {
84 return genProject(retResult, genParam);
85 } else if (genParam.type == File) {
86 return genFile(retResult, genParam);
87 } else {
88 retResult.message = tr("Template type is unknown.");
89 return false;
90 }
91}
92
93bool ProjectGenerate::genProject(PojectGenResult &retResult, const PojectGenParam &genParam)
94{
95 if (genParam.templatePath.isEmpty()) {
96 retResult.message = tr("Template folder is empty!");
97 return false;
98 }
99
100 QString dstPath = genParam.settingParamMap.value(genParam.generator.destPath);
101 if (dstPath.isEmpty()) {
102 retResult.message = tr("Target path is empty!");
103 return false;
104 }
105
106 QString projectPath = dstPath + QDir::separator() +
107 genParam.settingParamMap.value(genParam.generator.rootFolder);
108
109 if (QDir(projectPath).exists()) {
110 retResult.message = projectPath + tr(" has existed, please remove it firstly.");
111 return false;
112 }
113
114 bool ret = copyDir(retResult.message, genParam.templatePath, projectPath, false);
115 if (!ret) {
116 retResult.message = tr("Create project failed!");
117 return false;
118 }
119
120 QString wiazardFile = projectPath + QDir::separator() + "wizard.json";
121 QFile::remove(wiazardFile);
122
123 ret = transform(retResult.message, genParam, projectPath);
124 if (!ret) {
125 retResult.message = tr("Transform project failed!") + retResult.message;
126 return false;
127 }
128
129 retResult.message = tr("succeed");
130 retResult.kit = genParam.kit;
131 retResult.language = genParam.language;
132 retResult.projectPath = projectPath;
133
134 return true;
135}
136
137bool ProjectGenerate::transform(QString &retMsg, const PojectGenParam &genParam, const QString &projectPath)
138{
139 auto iter = genParam.generator.operations.begin();
140 for (; iter != genParam.generator.operations.end(); ++iter) {
141 QString filePath = projectPath + QDir::separator() + iter->sourceFile;
142 if (!QFileInfo(filePath).isFile()) {
143 retMsg = filePath + tr(" is not exsit.");
144 return false;
145 }
146
147 QFile fileRead(filePath);
148 QString contentRead;
149 if(!fileRead.open(QIODevice::ReadOnly | QIODevice::Text)){
150 retMsg = tr("Open ") + filePath + tr(" failed.");
151 return false;
152 }
153 contentRead = fileRead.readAll();
154 fileRead.close();
155
156 QStringList contentList = contentRead.split("\n");
157
158 QFile fileWrite(filePath);
159 if(fileWrite.open(QIODevice::WriteOnly | QIODevice::Text)) {
160 QTextStream streamWrite(&fileWrite);
161 foreach (auto line, contentList) {
162 QString contentWrite = line;
163 foreach (auto key, iter->replaceKeys) {
164 if(contentWrite.contains(key)) {
165 contentWrite.replace(key, genParam.settingParamMap.value(key));
166 }
167 }
168 streamWrite << contentWrite << "\n";
169 }
170 }
171 fileWrite.close();
172 }
173
174 return true;
175}
176
177bool ProjectGenerate::genFile(PojectGenResult &retResult, const PojectGenParam &genParam)
178{
179 if (genParam.templatePath.isEmpty()) {
180 retResult.message = tr("Template file is empty!");
181 return false;
182 }
183
184 QString srcFilePath = genParam.templatePath + QDir::separator() + genParam.generator.templateFile;
185
186 QString dstPath = genParam.settingParamMap.value(genParam.generator.destPath);
187 if (dstPath.isEmpty()) {
188 retResult.message = tr("Target path is empty!");
189 return false;
190 }
191
192 QString suffix = QFileInfo(srcFilePath).suffix();
193 QString newFilePath = dstPath + QDir::separator()
194 + genParam.settingParamMap.value(genParam.generator.newfileName)
195 + "."
196 + suffix;
197
198 if (QFile::exists(newFilePath)) {
199 retResult.message = newFilePath + tr(" has existed, please remove it firstly.");
200 return false;
201 }
202
203 bool ret = copyFile(retResult.message, srcFilePath, newFilePath, false);
204 if (!ret) {
205 retResult.message = tr("Create File failed!");
206 return false;
207 }
208
209 retResult.message = tr("succeed");
210 retResult.language = genParam.language;
211 retResult.filePath = newFilePath;
212
213 return true;
214}
215
216} //namespace templateMgr
217