17 for (
auto &name : binNames) {
18 if (binPathCache.contains(name)) {
19 return binPathCache.value(name);
22 auto dotWakaTime = QStringLiteral(
"%1/.wakatime").arg(QDir::homePath());
24 static const auto pathSeparator = QStringLiteral(
":");
25 static const auto kDefaultPath =
26 QStringLiteral(
"/usr/bin:/usr/local/bin:/opt/bin:/opt/local/bin");
28 static const auto pathSeparator = QStringLiteral(
";");
29 static const auto kDefaultPath = QStringLiteral(
"C:\\Windows\\System32;C:\\Windows");
31 const auto path = qEnvironmentVariable(
"PATH", kDefaultPath);
32 auto paths = path.split(pathSeparator, Qt::SkipEmptyParts);
33 paths.insert(0, dotWakaTime);
34 for (
auto path : paths) {
35 for (
auto &name : binNames) {
36 auto lookFor = path + QDir::separator() + name;
37 auto fi = QFileInfo(lookFor);
38 if (fi.exists(lookFor) && fi.isExecutable()) {
39 binPathCache[name] = lookFor;
48 QDir currentDirectory(fileInfo.canonicalPath());
49 static QStringList filters;
50 static const auto gitStr = QStringLiteral(
".git");
51 static const auto svnStr = QStringLiteral(
".svn");
52 filters << gitStr << svnStr;
53 bool vcDirFound =
false;
55 if (!currentDirectory.canonicalPath().compare(kStringLiteralSlash)) {
59 currentDirectory.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Hidden);
60 for (
const auto &entry : entries) {
61 auto name = entry.fileName();
62 if ((name == gitStr || name == svnStr) && entry.isDir()) {
64 return currentDirectory.dirName();
67 currentDirectory.cdUp();
79#ifdef Q_PROCESSOR_X86_64
80 auto wakatimeCliPath =
getBinPath({QStringLiteral(
"wakatime-cli-windows-amd64.exe"),
81 QStringLiteral(
"wakatime-cli.exe"),
82 QStringLiteral(
"wakatime.exe")});
83#elif defined(Q_PROCESSOR_ARM)
84 auto wakatimeCliPath =
getBinPath({QStringLiteral(
"wakatime-cli-windows-arm64.exe"),
85 QStringLiteral(
"wakatime-cli.exe"),
86 QStringLiteral(
"wakatime.exe")});
88 auto wakatimeCliPath =
getBinPath({QStringLiteral(
"wakatime-cli-windows-386.exe"),
89 QStringLiteral(
"wakatime-cli.exe"),
90 QStringLiteral(
"wakatime.exe")});
92#elif defined(Q_OS_APPLE)
93 auto wakatimeCliPath =
getBinPath({QStringLiteral(
"wakatime-cli-darwin-arm64"),
94 QStringLiteral(
"wakatime-cli-darwin-amd64"),
96 QStringLiteral(
"wakatime")});
98 auto wakatimeCliPath =
getBinPath({kWakaTimeCli, QStringLiteral(
"wakatime")});
100 if (wakatimeCliPath.isEmpty()) {
101 qCWarning(gLogWakaTime) <<
"wakatime-cli not found in PATH.";
105 if (filePath.isEmpty()) {
106 qCDebug(gLogWakaTime) <<
"Nothing to send about";
109 QStringList arguments;
110 const QFileInfo fileInfo(filePath);
112 auto canonicalFilePath = fileInfo.canonicalFilePath();
113 qCDebug(gLogWakaTime) <<
"File path:" << canonicalFilePath;
115 const auto currentMs = QDateTime::currentMSecsSinceEpoch();
116 const auto deltaMs = currentMs - lastTimeSent.toMSecsSinceEpoch();
117 static const auto intervalMs = 120000;
122 if (hasSent && deltaMs <= intervalMs && lastFileSent == canonicalFilePath) {
123 qCDebug(gLogWakaTime) <<
"Not enough time has passed since last send";
124 qCDebug(gLogWakaTime) <<
"Delta:" << deltaMs / 1000 / 60 <<
"/ 2 minutes";
128 arguments << QStringLiteral(
"--entity") << canonicalFilePath;
129 arguments << QStringLiteral(
"--plugin")
130 << QStringLiteral(
"ktexteditor-wakatime/%1").arg(VERSION);
132 if (!projectName.isEmpty()) {
133 arguments << QStringLiteral(
"--alternate-project") << projectName;
136 qCDebug(gLogWakaTime) <<
"Warning: No project name found";
140 arguments << QStringLiteral(
"--write");
142 if (!mode.isEmpty()) {
143 arguments << QStringLiteral(
"--language") << mode;
145 arguments << QStringLiteral(
"--lineno") << QString::number(lineNumber);
146 arguments << QStringLiteral(
"--cursorpos") << QString::number(cursorPosition);
147 arguments << QStringLiteral(
"--lines-in-file") << QString::number(linesInFile);
148 qCDebug(gLogWakaTime) <<
"Running:" << wakatimeCliPath << arguments.join(QStringLiteral(
" "));
149 auto ret = QProcess::execute(wakatimeCliPath, arguments);
151 qCWarning(gLogWakaTime) <<
"wakatime-cli returned error code" << ret;
154 lastTimeSent = QDateTime::currentDateTime();
155 lastFileSent = canonicalFilePath;
WakaTime::State send(const QString &filePath, const QString &mode, int lineNumber, int cursorPosition, int linesInFile, bool isWrite)