Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 2 additions & 64 deletions apps/ll-builder/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,62 +38,6 @@

namespace {

QStringList projectBuildConfigPaths()
{
QStringList result{};

auto pwd = QDir::current();

do {
auto configPath =
QStringList{ pwd.absolutePath(), ".ll-builder", "config.yaml" }.join(QDir::separator());
result << configPath;
} while (pwd.cdUp());

return result;
}

QStringList nonProjectBuildConfigPaths()
{
QStringList result{};

auto configLocations = QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation);
configLocations.append(SYSCONFDIR);

for (const auto &configLocation : std::as_const(configLocations)) {
result << QStringList{ configLocation, "linglong", "builder", "config.yaml" }.join(
QDir::separator());
}

result << QStringList{ DATADIR, "linglong", "builder", "config.yaml" }.join(QDir::separator());

return result;
}

void initDefaultBuildConfig()
{
// ~/.cache
QDir cacheLocation = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation);
// ~/.config/
QDir configLocations = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
if (!QDir().mkpath(configLocations.filePath("linglong/builder"))) {
qWarning() << "init BuildConfig directory failed."
<< configLocations.filePath("linglong/builder");
}
QString configFilePath = configLocations.filePath("linglong/builder/config.yaml");
if (QFile::exists(configFilePath)) {
return;
}
linglong::api::types::v1::BuilderConfig config;
config.version = 1;
config.repo = cacheLocation.filePath("linglong-builder").toStdString();
auto ret = linglong::builder::saveConfig(config, configFilePath);
if (!ret) {
qCritical() << "failed to save default build config file" << configFilePath << ":"
<< ret.error();
}
}

std::string validateNonEmptyString(const std::string &parameter)
{
if (parameter.empty()) {
Expand Down Expand Up @@ -1056,15 +1000,9 @@ You can report bugs to the linyaps team under this project: https://github.com/O
}

// following command need repo
QStringList configPaths = {};
// 初始化 build config
initDefaultBuildConfig();
configPaths << projectBuildConfigPaths();
configPaths << nonProjectBuildConfigPaths();

auto builderCfg = linglong::builder::loadConfig(configPaths);
auto builderCfg = linglong::builder::loadConfig();
if (!builderCfg) {
qCritical() << builderCfg.error();
LogE("failed to load build config {}", builderCfg.error());
return -1;
}

Expand Down
86 changes: 61 additions & 25 deletions libs/linglong/src/linglong/builder/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,61 @@
* SPDX-License-Identifier: LGPL-3.0-or-later
*/

#include "linglong/builder/config.h"

Check warning on line 7 in libs/linglong/src/linglong/builder/config.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: "linglong/builder/config.h" not found.

#include "linglong/api/types/v1/BuilderConfig.hpp"

Check warning on line 9 in libs/linglong/src/linglong/builder/config.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: "linglong/api/types/v1/BuilderConfig.hpp" not found.
#include "linglong/common/dir.h"

Check warning on line 10 in libs/linglong/src/linglong/builder/config.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: "linglong/utils/error/error.h" not found.
#include "linglong/common/xdg.h"

Check warning on line 11 in libs/linglong/src/linglong/builder/config.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: "linglong/utils/serialize/yaml.h" not found.
#include "linglong/utils/error/error.h"
#include "linglong/utils/log/log.h"

Check warning on line 13 in libs/linglong/src/linglong/builder/config.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <fmt/format.h> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include "linglong/utils/serialize/yaml.h"

Check warning on line 15 in libs/linglong/src/linglong/builder/config.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <fstream> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <fmt/format.h>

#include <fstream>

namespace linglong::builder {

auto loadConfig(const QString &file) noexcept -> utils::error::Result<api::types::v1::BuilderConfig>
utils::error::Result<api::types::v1::BuilderConfig>
initDefaultBuildConfig(const std::filesystem::path &path)
{
LINGLONG_TRACE(fmt::format("load build config from {}", file.toStdString()));
LINGLONG_TRACE("init default build config");

auto cacheLocation = common::xdg::getXDGCacheHomeDir();
if (cacheLocation.empty()) {
return LINGLONG_ERR("failed to get cache dir, neither XDG_CACHE_HOME nor HOME is set");
}

std::error_code ec;
std::filesystem::create_directories(path.parent_path(), ec);
if (ec) {
return LINGLONG_ERR("failed to create config dir", ec);
}

linglong::api::types::v1::BuilderConfig config;
config.version = 1;
config.repo = cacheLocation / "linglong-builder";
auto ret = linglong::builder::saveConfig(config, path);
if (!ret) {
return LINGLONG_ERR("failed to save default build config file", ret.error());
}

return config;
}

auto loadConfig(const std::filesystem::path &path) noexcept
-> utils::error::Result<api::types::v1::BuilderConfig>
{
LINGLONG_TRACE(fmt::format("load build config from {}", path));

try {
QFile f(file);
qDebug() << "read build config file" << file;
if (!f.open(QIODevice::ReadOnly)) {
return LINGLONG_ERR("read build config file", f);
}
auto data = f.readAll().toStdString();
auto config = utils::serialize::LoadYAML<api::types::v1::BuilderConfig>(data);
auto config = utils::serialize::LoadYAMLFile<api::types::v1::BuilderConfig>(path);
if (!config) {
return LINGLONG_ERR("parse build config", config);
}
if (config->version != 1) {
return LINGLONG_ERR(
QString("wrong configuration file version %1").arg(config->version));
fmt::format("wrong configuration file version {}", config->version));
}

return config;
Expand All @@ -42,32 +67,42 @@
}
}

auto loadConfig(const QStringList &files) noexcept
-> utils::error::Result<api::types::v1::BuilderConfig>
auto loadConfig() noexcept -> utils::error::Result<api::types::v1::BuilderConfig>
{
LINGLONG_TRACE(fmt::format("load build config from {}", files.join(" ").toStdString()));
LINGLONG_TRACE("load build config");

std::filesystem::path builderConfigPath = "builder/config.yaml";
auto configDir = common::dir::getUserRuntimeConfigDir();
if (configDir.empty()) {
return LINGLONG_ERR("failed to get config dir");
}

for (const auto &file : files) {
auto config = loadConfig(file);
if (!config.has_value()) {
qDebug() << "Failed to load build config from" << file << ":" << config.error();
continue;
std::error_code ec;
auto path = configDir / builderConfigPath;
if (!std::filesystem::exists(path, ec)) {
if (ec) {
return LINGLONG_ERR(fmt::format("failed to check build config file {}", path), ec);
}

qDebug() << "Load build config from" << file;
return config;
return initDefaultBuildConfig(path);
}

auto config = loadConfig(path);
if (!config) {
return LINGLONG_ERR(config);
}

return LINGLONG_ERR("all failed");
LogD("Load build config from {}", path);
return config;
}

auto saveConfig(const api::types::v1::BuilderConfig &cfg, const QString &path) noexcept
-> utils::error::Result<void>
auto saveConfig(const api::types::v1::BuilderConfig &cfg,
const std::filesystem::path &path) noexcept -> utils::error::Result<void>
{
LINGLONG_TRACE(fmt::format("save config to {}", path.toStdString()));
LINGLONG_TRACE(fmt::format("save config to {}", path));

try {
auto ofs = std::ofstream(path.toLocal8Bit());
auto ofs = std::ofstream(path);
if (!ofs.is_open()) {
return LINGLONG_ERR("open failed");
}
Expand All @@ -80,4 +115,5 @@
return LINGLONG_ERR(e);
}
}

} // namespace linglong::builder
13 changes: 7 additions & 6 deletions libs/linglong/src/linglong/builder/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@
#include "linglong/api/types/v1/BuilderConfig.hpp"
#include "linglong/utils/error/error.h"

#include <QString>
#include <filesystem>

namespace linglong::builder {

auto loadConfig(const QString &file) noexcept
utils::error::Result<api::types::v1::BuilderConfig>
initDefaultBuildConfig(const std::filesystem::path &path);
auto loadConfig(const std::filesystem::path &file) noexcept
-> utils::error::Result<api::types::v1::BuilderConfig>;
auto loadConfig(const QStringList &files) noexcept
-> utils::error::Result<api::types::v1::BuilderConfig>;
auto saveConfig(const api::types::v1::BuilderConfig &cfg, const QString &path) noexcept
-> utils::error::Result<void>;
auto loadConfig() noexcept -> utils::error::Result<api::types::v1::BuilderConfig>;
auto saveConfig(const api::types::v1::BuilderConfig &cfg,
const std::filesystem::path &path) noexcept -> utils::error::Result<void>;

} // namespace linglong::builder
1 change: 1 addition & 0 deletions libs/linglong/tests/ll-tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ pfl_add_executable(
SOURCES
# find -regex '\./src/.+\.[ch]\(pp\)?' -type f -printf '%P\n'| sort
src/common/tempdir.h
src/linglong/builder/config_test.cpp
src/linglong/builder/linglong_builder_test.cpp
src/linglong/builder/source_fetcher_test.cpp
src/linglong/cli/cli_test.cpp
Expand Down
Loading