diff --git a/librepomgr/buildactions/buildactionmeta.cpp b/librepomgr/buildactions/buildactionmeta.cpp index d748395..57d4a45 100644 --- a/librepomgr/buildactions/buildactionmeta.cpp +++ b/librepomgr/buildactions/buildactionmeta.cpp @@ -220,6 +220,7 @@ BuildActionMetaInfo::BuildActionMetaInfo() .sourceDb = false, .destinationDb = false, .packageNames = true, + .implyPackagesFromPrevAction = true, }, BuildActionTypeMetaInfo{ .id = BuildActionType::MakeLicenseInfo, diff --git a/librepomgr/buildactions/buildactionmeta.h b/librepomgr/buildactions/buildactionmeta.h index c13a91f..92c4be8 100644 --- a/librepomgr/buildactions/buildactionmeta.h +++ b/librepomgr/buildactions/buildactionmeta.h @@ -109,6 +109,7 @@ struct LIBREPOMGR_EXPORT BuildActionTypeMetaInfo : public ReflectiveRapidJSON::J const bool sourceDb = true; const bool destinationDb = true; const bool packageNames = true; + const bool implyPackagesFromPrevAction = false; }; struct LIBREPOMGR_EXPORT BuildActionStatusMetaInfo : public ReflectiveRapidJSON::JsonSerializable { const BuildActionStatus id = BuildActionStatus::Created; diff --git a/librepomgr/webapi/routes_buildaction.cpp b/librepomgr/webapi/routes_buildaction.cpp index 21ed13a..86f6911 100644 --- a/librepomgr/webapi/routes_buildaction.cpp +++ b/librepomgr/webapi/routes_buildaction.cpp @@ -318,7 +318,7 @@ struct SequencedBuildActions { static std::string allocateNewBuildAction(const BuildActionMetaInfo &metaInfo, const std::string &taskName, const std::vector &packageNames, const std::string &directory, const std::unordered_map &actionTemplates, SequencedBuildActions &newActionSequence, - std::vector> &allocatedActions, const std::string &actionTemplateToAllocate) + std::vector> &allocatedActions, const std::string &actionTemplateToAllocate, bool asFirstActions) { const auto actionTemplateIterator = actionTemplates.find(actionTemplateToAllocate); if (actionTemplateIterator == actionTemplates.end()) { @@ -339,7 +339,9 @@ static std::string allocateNewBuildAction(const BuildActionMetaInfo &metaInfo, c buildAction->type = buildActionType; buildAction->sourceDbs = actionTemplate.sourceDbs; buildAction->destinationDbs = actionTemplate.destinationDbs; - buildAction->packageNames = !typeInfo.packageNames || packageNames.empty() ? actionTemplate.packageNames : packageNames; + if (asFirstActions || !typeInfo.implyPackagesFromPrevAction) { + buildAction->packageNames = !typeInfo.packageNames || packageNames.empty() ? actionTemplate.packageNames : packageNames; + } buildAction->flags = actionTemplate.flags; buildAction->settings = actionTemplate.settings; return std::string(); @@ -348,18 +350,19 @@ static std::string allocateNewBuildAction(const BuildActionMetaInfo &metaInfo, c static std::string allocateNewBuildActionSequence(const BuildActionMetaInfo &metaInfo, const std::string &taskName, const std::vector &packageNames, const std::string &directory, const std::unordered_map &actionTemplates, SequencedBuildActions &newActionSequence, - std::vector> &allocatedActions, const BuildActionSequence &actionSequenceToAllocate) + std::vector> &allocatedActions, const BuildActionSequence &actionSequenceToAllocate, bool asFirstActions = true) { auto error = std::string(); newActionSequence.name = actionSequenceToAllocate.name; newActionSequence.concurrent = actionSequenceToAllocate.concurrent; for (const auto &actionNode : actionSequenceToAllocate.actions) { if (const auto *const actionTemplateName = std::get_if(&actionNode)) { - error = allocateNewBuildAction( - metaInfo, taskName, packageNames, directory, actionTemplates, newActionSequence, allocatedActions, *actionTemplateName); + error = allocateNewBuildAction(metaInfo, taskName, packageNames, directory, actionTemplates, newActionSequence, allocatedActions, + *actionTemplateName, newActionSequence.concurrent ? asFirstActions : newActionSequence.actions.empty()); } else if (const auto *const actionSequence = std::get_if(&actionNode)) { error = allocateNewBuildActionSequence(metaInfo, taskName, packageNames, directory, actionTemplates, - std::get(newActionSequence.actions.emplace_back(SequencedBuildActions())), allocatedActions, *actionSequence); + std::get(newActionSequence.actions.emplace_back(SequencedBuildActions())), allocatedActions, *actionSequence, + newActionSequence.concurrent ? asFirstActions : false); } if (!error.empty()) { return error;