1// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#include "wordcountanalyse.h"
6#include "common/common.h"
7
8namespace {
9const QString wordcount{"wordcount"};
10}
11WordCountAnalyse::WordCountAnalyse(QObject *parent)
12 : QProcess (parent)
13{
14 auto procEnv = env::lang::get(env::lang::User, env::lang::Python, 3);
15 for (auto val : procEnv.keys()) {
16 qInfo()<< val << procEnv.value(val);
17 }
18 setProcessEnvironment(procEnv);
19 auto env = processEnvironment().systemEnvironment();
20 for (auto val : env.keys()) {
21 qInfo() << val << env.value(val);
22 }
23 QObject::connect(this, &QProcess::errorOccurred,
24 this, &WordCountAnalyse::errorOccurred);
25 QObject::connect(this, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
26 this, &WordCountAnalyse::finished);
27// QObject::connect(this, &QProcess::readAllStandardOutput,
28// this, &QDebug::redirectErr);
29// QObject::connect(this, &QProcess::readAllStandardError,
30// this, &WordCountAnalyse::redirectErr);
31 setWorkingDirectory(CustomPaths::global(CustomPaths::Scripts)+ QDir::separator() + "action-analysis");
32}
33
34void WordCountAnalyse::setArgs(const ActionAnalyseArgs &args)
35{
36 this->processArgs = args;
37}
38
39ActionAnalyseArgs WordCountAnalyse::args() const
40{
41 return this->processArgs;
42}
43
44void WordCountAnalyse::setStorage(const QString &storage)
45{
46 processArgs.storage = storage;
47}
48
49QString WordCountAnalyse::getStorage() const
50{
51 return processArgs.storage;
52}
53
54void WordCountAnalyse::setWorkspace(const QString &workspace)
55{
56 processArgs.workspace = workspace;
57}
58
59QString WordCountAnalyse::getWorkspace() const
60{
61 return processArgs.workspace;
62}
63
64void WordCountAnalyse::setLanguage(const QString &language)
65{
66 processArgs.language = language;
67}
68
69QString WordCountAnalyse::getLanguage() const
70{
71 return processArgs.language;
72}
73
74void WordCountAnalyse::start()
75{
76 qInfo() << workingDirectory();
77 setProcessChannelMode(QProcess::ForwardedChannels);
78 setProgram(getPythonVersion());
79 QStringList args;
80 args << "./main.py";
81 args << "-w" << processArgs.workspace;
82 args << "-s" << processArgs.storage;
83 args << "-l" << processArgs.language;
84 setArguments(args);
85 QProcess::start();
86}
87
88QString WordCountAnalyse::getPythonVersion()
89{
90 if (pythonVersion.isEmpty()) {
91 QDir dir("/usr/bin");
92 QStringList filter {"Python*.*"};
93 QStringList pythonList = dir.entryList(filter);
94
95 QRegExp reg("((\\d)|(\\d.\\d))($|\\s)");
96 reg.setMinimal(true);
97 int position = 0;
98 QList<QString> versions;
99 while (position >= 0) {
100 position = reg.indexIn(pythonList.join(" "), position);
101 if (position < 0)
102 break;
103 versions << reg.cap(1);
104 position += reg.matchedLength();
105 }
106
107 double newVersion = 0;
108 for (auto version : versions) {
109 double v = version.toDouble();
110 if (v > newVersion) {
111 newVersion = v;
112 }
113 }
114 pythonVersion = "python" + QString::number(newVersion);
115 }
116 return pythonVersion;
117}
118
119ActionAnalyseArgs::ActionAnalyseArgs()
120{
121
122}
123
124ActionAnalyseArgs::ActionAnalyseArgs(const QString &workspace,
125 const QString &language,
126 const QString &storage)
127 : workspace(workspace)
128 , language(language)
129 , storage(storage)
130{
131
132}
133
134ActionAnalyseArgs::ActionAnalyseArgs(const ActionAnalyseArgs &as)
135 : workspace(as.workspace)
136 , language(as.language)
137 , storage(as.storage)
138{
139
140}
141
142ActionAnalyseArgs &ActionAnalyseArgs::operator=(const ActionAnalyseArgs &as)
143{
144 workspace = as.workspace;
145 language = as.language;
146 storage = as.storage;
147 return *this;
148}
149
150void WordCountAnalyse::errorOccurred(QProcess::ProcessError err)
151{
152 qCritical() << exitCode() << exitStatus() << err << readAllStandardError();
153}
154
155void WordCountAnalyse::finished(int exitCode, QProcess::ExitStatus status)
156{
157 qCritical() << exitCode << status << readAllStandardOutput();
158 if (exitCode == 0)
159 analyseDone(true);
160 else
161 analyseDone(false);
162}
163