diff --git a/librepomgr/buildactions/buildactionmeta.cpp b/librepomgr/buildactions/buildactionmeta.cpp index 1f4a1cd..848c6d4 100644 --- a/librepomgr/buildactions/buildactionmeta.cpp +++ b/librepomgr/buildactions/buildactionmeta.cpp @@ -254,7 +254,13 @@ BuildActionMetaInfo::BuildActionMetaInfo() .name = "Make license info", .type = "make-license-info", .flags = {}, - .settings = {}, + .settings = { + BuildActionSettingMetaInfo{ + .name = "Output file path", + .desc = "The path of the output file", + .param = "output-file-path", + }, + }, .directory = true, .sourceDb = false, .destinationDb = false, diff --git a/librepomgr/buildactions/buildactionmeta.h b/librepomgr/buildactions/buildactionmeta.h index 94078bf..72b5156 100644 --- a/librepomgr/buildactions/buildactionmeta.h +++ b/librepomgr/buildactions/buildactionmeta.h @@ -96,6 +96,7 @@ enum class ReloadLibraryDependenciesSettings : std::size_t { PackageExcludeRegex enum class CheckForProblemsSettings : std::size_t { IgnoreDeps, IgnoreLibDeps }; enum class PrepareBuildSettings : std::size_t { PKGBUILDsDirs }; enum class ConductBuildSettings : std::size_t { ChrootDir, ChrootDefaultUser, CCacheDir, PackageCacheDir, TestFilesDir, GpgKey }; +enum class MakeLicenseInfoSettings : std::size_t { OutputFilePath }; enum class CustomCommandSettings : std::size_t { Command, SharedLocks, ExclusiveLocks }; struct LIBREPOMGR_EXPORT BuildActionFlagMetaInfo : public ReflectiveRapidJSON::JsonSerializable { diff --git a/librepomgr/buildactions/makelicenseinfo.cpp b/librepomgr/buildactions/makelicenseinfo.cpp index fded904..b3f60b0 100644 --- a/librepomgr/buildactions/makelicenseinfo.cpp +++ b/librepomgr/buildactions/makelicenseinfo.cpp @@ -4,6 +4,7 @@ #include #include +#include using namespace CppUtilities; @@ -17,13 +18,22 @@ MakeLicenseInfo::MakeLicenseInfo(ServiceSetup &setup, const std::shared_ptrdirectory.empty()) { - reportError("Unable to create working directory: no directory name specified"); + auto &metaInfo = m_setup.building.metaInfo; + auto metaInfoLock = metaInfo.lockToRead(); + const auto &typeInfo = metaInfo.typeInfoForId(BuildActionType::MakeLicenseInfo); + const auto outputFilePathSetting = typeInfo.settings[static_cast(MakeLicenseInfoSettings::OutputFilePath)].param; + metaInfoLock.unlock(); + auto outputFilePath = findSetting(outputFilePathSetting); + auto outputDir = std::string(); + if (!outputFilePath.empty()) { + outputDir = directory(outputFilePath); + } else if (!m_buildAction->directory.empty()) { + const auto setupReadLock = m_setup.lockToRead(); + outputDir = m_setup.building.workingDirectory % "/license-info/" + m_buildAction->directory; + } else { + reportError("Unable to create working directory: no directory name or output file path 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 auto configReadLock = init(BuildActionAccess::ReadConfig, RequiredDatabases::None, RequiredParameters::Packages); @@ -34,7 +44,9 @@ void MakeLicenseInfo::run() auto result = m_setup.config.computeLicenseInfo(m_buildAction->packageNames); std::get>(configReadLock).unlock(); auto wroteOutputFile = false; - auto outputFilePath = outputDir % '/' % m_buildAction->id + "-summary.md"; + if (outputFilePath.empty()) { + outputFilePath = outputDir % '/' % m_buildAction->id + "-summary.md"; + } try { std::filesystem::create_directories(outputDir); writeFile(outputFilePath, result.licenseSummary);