refactor: remove DotEnv
This commit is contained in:
parent
aba38b949f
commit
3af83dd9f2
7 changed files with 0 additions and 212 deletions
|
|
@ -12,7 +12,6 @@
|
||||||
#include "common/I18N.h"
|
#include "common/I18N.h"
|
||||||
#include "common/UrlConstants.h"
|
#include "common/UrlConstants.h"
|
||||||
#include "gui/Diagnostic.h"
|
#include "gui/Diagnostic.h"
|
||||||
#include "gui/DotEnv.h"
|
|
||||||
#include "gui/Logger.h"
|
#include "gui/Logger.h"
|
||||||
#include "gui/MainWindow.h"
|
#include "gui/MainWindow.h"
|
||||||
#include "gui/Messages.h"
|
#include "gui/Messages.h"
|
||||||
|
|
@ -132,8 +131,6 @@ int main(int argc, char *argv[])
|
||||||
qInstallMessageHandler(deskflow::gui::messages::messageHandler);
|
qInstallMessageHandler(deskflow::gui::messages::messageHandler);
|
||||||
qInfo("%s v%s", kAppName, kDisplayVersion);
|
qInfo("%s v%s", kAppName, kDisplayVersion);
|
||||||
|
|
||||||
dotenv();
|
|
||||||
|
|
||||||
#if defined(Q_OS_MAC)
|
#if defined(Q_OS_MAC)
|
||||||
|
|
||||||
if (app.applicationDirPath().startsWith("/Volumes/")) {
|
if (app.applicationDirPath().startsWith("/Volumes/")) {
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,6 @@ add_library(${target} STATIC
|
||||||
Action.h
|
Action.h
|
||||||
Diagnostic.cpp
|
Diagnostic.cpp
|
||||||
Diagnostic.h
|
Diagnostic.h
|
||||||
DotEnv.cpp
|
|
||||||
DotEnv.h
|
|
||||||
FileTail.cpp
|
FileTail.cpp
|
||||||
FileTail.h
|
FileTail.h
|
||||||
Hotkey.cpp
|
Hotkey.cpp
|
||||||
|
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
||||||
/*
|
|
||||||
* Deskflow -- mouse and keyboard sharing utility
|
|
||||||
* SPDX-FileCopyrightText: (C) 2024 Symless Ltd.
|
|
||||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "DotEnv.h"
|
|
||||||
|
|
||||||
#include "common/Settings.h"
|
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QProcess>
|
|
||||||
#include <QProcessEnvironment>
|
|
||||||
#include <QStandardPaths>
|
|
||||||
#include <QString>
|
|
||||||
#include <QTextStream>
|
|
||||||
|
|
||||||
namespace deskflow::gui {
|
|
||||||
|
|
||||||
QPair<QString, QString> getPair(const QString &line);
|
|
||||||
|
|
||||||
bool open(QFile &file, const QString &filePath)
|
|
||||||
{
|
|
||||||
file.setFileName(filePath);
|
|
||||||
return file.open(QIODevice::ReadOnly | QIODevice::Text);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief A _very_ basic Qt .env file parser.
|
|
||||||
*
|
|
||||||
* This function re-invents the wheel to save adding a library dependency.
|
|
||||||
* It does not support many things that a proper .env parser would, such as
|
|
||||||
* trailing comments, escaping characters, multiline values, etc.
|
|
||||||
*
|
|
||||||
* If this function is not sufficient, replace it with a library such as:
|
|
||||||
* https://github.com/adeharo9/cpp-dotenv
|
|
||||||
*/
|
|
||||||
void dotenv(const QString &filename)
|
|
||||||
{
|
|
||||||
QString filePath = filename;
|
|
||||||
QFile file;
|
|
||||||
if (!open(file, filePath)) {
|
|
||||||
QFileInfo fileInfo(filePath);
|
|
||||||
qInfo("no %s file in dir: %s", qPrintable(filename), qPrintable(fileInfo.absolutePath()));
|
|
||||||
|
|
||||||
// if nothing in current dir, then try the config dir.
|
|
||||||
// this makes it a bit easier for engineers in the field to have an easily
|
|
||||||
// predictable location for the .env file.
|
|
||||||
const auto orgDir = QDir(Settings::settingsPath());
|
|
||||||
|
|
||||||
filePath = orgDir.filePath(filename);
|
|
||||||
if (!open(file, filePath)) {
|
|
||||||
qInfo("no %s file in app config dir: %s", qPrintable(filename), qPrintable(orgDir.absolutePath()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qInfo("loading env vars from: %s", qPrintable(filePath));
|
|
||||||
|
|
||||||
QTextStream in(&file);
|
|
||||||
while (!in.atEnd()) {
|
|
||||||
QString line = in.readLine().trimmed();
|
|
||||||
if (line.startsWith('#'))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto [key, value] = getPair(line);
|
|
||||||
if (key.isEmpty() || value.isEmpty())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const auto keyBytes = key.toUtf8();
|
|
||||||
const auto valueBytes = value.toUtf8();
|
|
||||||
|
|
||||||
const auto &key_c = keyBytes.constData();
|
|
||||||
const auto &value_c = valueBytes.constData();
|
|
||||||
|
|
||||||
qDebug("%s=%s", key_c, value_c);
|
|
||||||
qputenv(keyBytes, valueBytes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString stripQuotes(const QString &value)
|
|
||||||
{
|
|
||||||
QString result = value;
|
|
||||||
if (result.startsWith('"') && result.endsWith('"')) {
|
|
||||||
result = result.mid(1, result.length() - 2);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPair<QString, QString> getPair(const QString &line)
|
|
||||||
{
|
|
||||||
auto pos = line.indexOf('=');
|
|
||||||
if (pos == -1) {
|
|
||||||
return QPair<QString, QString>("", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString key = line.left(pos);
|
|
||||||
QString value = line.mid(pos + 1);
|
|
||||||
|
|
||||||
return QPair<QString, QString>(key.trimmed(), stripQuotes(value.trimmed()));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace deskflow::gui
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* Deskflow -- mouse and keyboard sharing utility
|
|
||||||
* SPDX-FileCopyrightText: (C) 2024 Symless Ltd.
|
|
||||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
namespace deskflow::gui {
|
|
||||||
|
|
||||||
const QString kDefaultEnvFilename = ".env";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Loads environment variables from a .env file.
|
|
||||||
*
|
|
||||||
* First checks current dir for .env, then looks in the app dir.
|
|
||||||
*/
|
|
||||||
void dotenv(const QString &filename = kDefaultEnvFilename);
|
|
||||||
|
|
||||||
} // namespace deskflow::gui
|
|
||||||
|
|
@ -4,13 +4,6 @@
|
||||||
add_subdirectory(config)
|
add_subdirectory(config)
|
||||||
add_subdirectory(core)
|
add_subdirectory(core)
|
||||||
|
|
||||||
create_test(
|
|
||||||
NAME DotEnvTests
|
|
||||||
DEPENDS gui
|
|
||||||
SOURCE DotEnvTests.cpp
|
|
||||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/src/lib/gui"
|
|
||||||
)
|
|
||||||
|
|
||||||
create_test(
|
create_test(
|
||||||
NAME LoggerTests
|
NAME LoggerTests
|
||||||
DEPENDS gui
|
DEPENDS gui
|
||||||
|
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
/*
|
|
||||||
* Deskflow -- mouse and keyboard sharing utility
|
|
||||||
* SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello <sithlord48@gmail.com>
|
|
||||||
* SPDX-FileCopyrightText: (C) 2024 Symless Ltd.
|
|
||||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "DotEnvTests.h"
|
|
||||||
|
|
||||||
#include "gui/DotEnv.h"
|
|
||||||
|
|
||||||
void DotEnvTests::initTestCase()
|
|
||||||
{
|
|
||||||
QDir dir;
|
|
||||||
QVERIFY(dir.mkpath("tmp/test"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void DotEnvTests::invalidFile()
|
|
||||||
{
|
|
||||||
deskflow::gui::dotenv(m_envFile);
|
|
||||||
|
|
||||||
const QString actualValue = qEnvironmentVariable("TEST_ENV_VAR");
|
|
||||||
|
|
||||||
QVERIFY(actualValue.isEmpty());
|
|
||||||
QCOMPARE(actualValue, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
void DotEnvTests::validFile()
|
|
||||||
{
|
|
||||||
QFile file(m_envFile);
|
|
||||||
QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
|
|
||||||
|
|
||||||
const QString key = "TEST_ENV_VAR";
|
|
||||||
const QString value = R"("test value")";
|
|
||||||
const QString entry = key + " = " + value;
|
|
||||||
|
|
||||||
QTextStream out(&file);
|
|
||||||
out << " # Comment" << Qt::endl;
|
|
||||||
out << "FOOBAR" << Qt::endl;
|
|
||||||
out << entry << Qt::endl;
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
deskflow::gui::dotenv(m_envFile);
|
|
||||||
|
|
||||||
const QString actualValue = qEnvironmentVariable(qPrintable(key));
|
|
||||||
|
|
||||||
QCOMPARE(actualValue.toStdString(), "test value");
|
|
||||||
|
|
||||||
QVERIFY(QFile::remove(m_envFile));
|
|
||||||
}
|
|
||||||
|
|
||||||
QTEST_MAIN(DotEnvTests)
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
/*
|
|
||||||
* Deskflow -- mouse and keyboard sharing utility
|
|
||||||
* SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello <sithlord48@gmail.com>
|
|
||||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <QTest>
|
|
||||||
|
|
||||||
class DotEnvTests : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
private Q_SLOTS:
|
|
||||||
// Test are run in order top to bottom
|
|
||||||
void initTestCase();
|
|
||||||
void invalidFile();
|
|
||||||
void validFile();
|
|
||||||
|
|
||||||
private:
|
|
||||||
inline static const QString m_envFile = QStringLiteral("tmp/test/.env");
|
|
||||||
};
|
|
||||||
Loading…
Reference in a new issue