arch-repo-manager/librepomgr/buildactions/makelicenseinfo.cpp

57 lines
2.0 KiB
C++
Raw Normal View History

2021-01-25 00:24:31 +01:00
#include "./buildactionprivate.h"
#include "../serversetup.h"
2022-03-15 01:10:15 +01:00
#include <c++utilities/conversion/stringbuilder.h>
#include <c++utilities/io/misc.h>
using namespace CppUtilities;
2021-01-25 00:24:31 +01:00
namespace LibRepoMgr {
MakeLicenseInfo::MakeLicenseInfo(ServiceSetup &setup, const std::shared_ptr<BuildAction> &buildAction)
: InternalBuildAction(setup, buildAction)
{
}
void MakeLicenseInfo::run()
{
2022-03-15 01:10:15 +01:00
// determine output file path
if (m_buildAction->directory.empty()) {
reportError("Unable to create working directory: no directory name specified");
return;
}
auto setupReadLock = m_setup.lockToRead();
auto outputDir = m_setup.building.workingDirectory % "/license-info/" + m_buildAction->directory;
setupReadLock.unlock();
// validate params and acquire read lock
2021-01-25 00:24:31 +01:00
auto configReadLock = init(BuildActionAccess::ReadConfig, RequiredDatabases::None, RequiredParameters::Packages);
if (std::holds_alternative<std::monostate>(configReadLock)) {
return;
}
auto result = m_setup.config.computeLicenseInfo(m_buildAction->packageNames);
std::get<std::shared_lock<std::shared_mutex>>(configReadLock).unlock();
2022-03-15 01:10:15 +01:00
auto wroteOutputFile = false;
auto outputFilePath = outputDir % '/' % m_buildAction->id + "-summary.md";
try {
std::filesystem::create_directories(outputDir);
writeFile(outputFilePath, result.licenseSummary);
result.licenseSummary = std::move(outputFilePath);
wroteOutputFile = true;
} catch (const std::exception &e) {
result.notes.emplace_back("Unable to write output file \"" % outputFilePath % "\": " + e.what());
result.success = false;
}
2021-01-25 00:24:31 +01:00
const auto buildActionWriteLock = m_setup.building.lockToWrite();
2022-03-15 01:10:15 +01:00
if (wroteOutputFile) {
m_buildAction->artefacts.emplace_back(result.licenseSummary);
}
2021-01-25 00:24:31 +01:00
m_buildAction->resultData = std::move(result);
reportResult(result.success ? BuildActionResult::Success : BuildActionResult::Failure);
}
} // namespace LibRepoMgr