diff --git a/librepomgr/buildactions/buildactionmeta.cpp b/librepomgr/buildactions/buildactionmeta.cpp index 660ab99..ff88b55 100644 --- a/librepomgr/buildactions/buildactionmeta.cpp +++ b/librepomgr/buildactions/buildactionmeta.cpp @@ -104,7 +104,13 @@ BuildActionMetaInfo::BuildActionMetaInfo() .param = "skip-dependencies", }, }, - .settings = {}, + .settings = { + BuildActionSettingMetaInfo{ + .name = "Package exclude regex", + .desc = "Regular expression to match package names against; matching packages will be excluded.", + .param = "pkg-exclude-regex", + }, + }, .directory = false, .sourceDb = false, .destinationDb = true, diff --git a/librepomgr/buildactions/buildactionmeta.h b/librepomgr/buildactions/buildactionmeta.h index b560094..bfb7ecf 100644 --- a/librepomgr/buildactions/buildactionmeta.h +++ b/librepomgr/buildactions/buildactionmeta.h @@ -83,6 +83,7 @@ enum class CleanRepositoryFlags : BuildActionFlagType { None, DryRun = (1 << 0), }; +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 }; diff --git a/librepomgr/buildactions/reloadlibrarydependencies.cpp b/librepomgr/buildactions/reloadlibrarydependencies.cpp index f215944..aa83efc 100644 --- a/librepomgr/buildactions/reloadlibrarydependencies.cpp +++ b/librepomgr/buildactions/reloadlibrarydependencies.cpp @@ -9,6 +9,7 @@ #include +#include #include using namespace std; @@ -24,10 +25,27 @@ ReloadLibraryDependencies::ReloadLibraryDependencies(ServiceSetup &setup, const void ReloadLibraryDependencies::run() { - // initialize + // read configuration const auto flags = static_cast(m_buildAction->flags); const auto force = flags & ReloadLibraryDependenciesFlags::ForceReload; const auto skipDependencies = flags & ReloadLibraryDependenciesFlags::SkipDependencies; + auto &metaInfo = m_setup.building.metaInfo; + auto metaInfoLock = metaInfo.lockToRead(); + const auto &typeInfo = metaInfo.typeInfoForId(BuildActionType::ReloadLibraryDependencies); + const auto packageExcludeRegexSetting = typeInfo.settings[static_cast(ReloadLibraryDependenciesSettings::PackageExcludeRegex)].param; + metaInfoLock.unlock(); + const auto &packageExcludeRegexValue = findSetting(packageExcludeRegexSetting); + auto packageExcludeRegex = std::regex(); + if (!packageExcludeRegexValue.empty()) { + try { + packageExcludeRegex = std::regex(packageExcludeRegexValue); + } catch (const std::regex_error &e) { + reportError(argsToString("configured package exclude regex is invalid: ", e.what())); + return; + } + } + + // initialize m_remainingPackages = 0; auto configReadLock = init(BuildActionAccess::ReadConfig, RequiredDatabases::MaybeDestination, RequiredParameters::None); if (holds_alternative(configReadLock)) { @@ -88,6 +106,11 @@ void ReloadLibraryDependencies::run() if (reportAbortedIfAborted()) { return; } + // skip if package should be excluded + if (!packageExcludeRegexValue.empty() && std::regex_match(package->name, packageExcludeRegex)) { + m_messages.notes.emplace_back(db->name % '/' % packageName + ": matches exclude regex"); + continue; + } // skip if the package info is missing (we need the binary package's file name here) const auto &packageInfo = package->packageInfo; if (!packageInfo) {