diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2024-06-06 19:22:10 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2024-06-07 11:57:49 +0300 |
commit | c8a08cc0ce55b309ef30cf367a625eb86457a0e2 (patch) | |
tree | dd7da2bf1a425cb2ba5bd914c51ec16260f3f875 | |
parent | dfc89ec51c26d6226d767b79fe42e64af55e2b89 (diff) |
Allow to combine [*-]builds overrides with --{target,build,package}-config and --interactive bdep-ci options (GH issue #384)
-rw-r--r-- | bdep/ci.cli | 10 | ||||
-rw-r--r-- | bdep/ci.cxx | 67 | ||||
-rw-r--r-- | tests/ci.testscript | 40 |
3 files changed, 100 insertions, 17 deletions
diff --git a/bdep/ci.cli b/bdep/ci.cli index 65ae252..99b7834 100644 --- a/bdep/ci.cli +++ b/bdep/ci.cli @@ -237,10 +237,13 @@ namespace bdep "<pc>/<tc>[/<tg>]", "Shortcut for the following options sequence: - \c{\b{--override\ }<pc>\b{-builds:all}}\n + [\c{\b{--override\ }<pc>\b{-builds:all}}]\n \c{\b{--override\ }<pc>\b{-build-include:}<tc>[\b{/}<tg>]}\n \c{\b{--override\ }<pc>\b{-build-exclude:**}} + The first override is omitted from the above sequence if the + \c{<pc>\b{-builds}} override is specified on the command line. + Repeat this option to specify multiple build configurations." } @@ -249,10 +252,13 @@ namespace bdep "<tc>[/<tg>]", "Shortcut for the following options sequence: - \c{\b{--override\ builds:all}}\n + [\c{\b{--override\ builds:all}}]\n \c{\b{--override\ build-include:}<tc>[\b{/}<tg>]}\n \c{\b{--override\ build-exclude:**}} + The first override is omitted from the above sequence if the + \cb{builds} override is specified on the command line. + Repeat this option to specify multiple build target configurations." } diff --git a/bdep/ci.cxx b/bdep/ci.cxx index dbe07bf..0b26b35 100644 --- a/bdep/ci.cxx +++ b/bdep/ci.cxx @@ -228,6 +228,30 @@ namespace bdep bool build_email_ovr (false); bool aux_ovr (false); + // Return true, if the [*-]builds override is specified. + // + auto builds_override = [&overrides] (const string& config = empty_string) + { + if (config.empty ()) + { + return find_if (overrides.begin (), overrides.end (), + [] (const manifest_name_value& v) + { + return v.name == "builds"; + }) != overrides.end (); + } + else + { + string n (config + "-builds"); + + return find_if (overrides.begin (), overrides.end (), + [&n] (const manifest_name_value& v) + { + return v.name == n; + }) != overrides.end (); + } + }; + if (o.overrides_specified ()) { const char* co (o.target_config_specified () ? "--target-config" : @@ -240,11 +264,15 @@ namespace bdep { const string& n (nv.name); + // True if the name is *-builds. + // + bool cbso ( + n.size () > 7 && n.compare (n.size () - 7, 7, "-builds") == 0); + // True if the name is one of {*-builds, *-build-{include,exclude}} // and update the pkg_config_ovr flag accordingly if that's the case. // - bool cbo ((n.size () > 7 && - n.compare (n.size () - 7, 7, "-builds") == 0) || + bool cbo (cbso || (n.size () > 14 && n.compare (n.size () - 14, 14, "-build-include") == 0) || (n.size () > 14 && @@ -253,9 +281,12 @@ namespace bdep if (cbo) pkg_config_ovr = true; + // Fail if --{target,build,package}-config or --interactive is + // combined with a [*-]build-{include,exclude} override (but not with + // [*-]builds). + // if (co != nullptr && - (cbo || - n == "builds" || + ((cbo && !cbso) || n == "build-include" || n == "build-exclude")) { @@ -339,7 +370,10 @@ namespace bdep if (o.interactive_specified ()) fail << "--target-config specified together with --interactive|-i"; - override ("builds", "all", origin::target_config); + // Add "builds: all", unless the builds value is already overridden. + // + if (!builds_override ()) + override ("builds", "all", origin::target_config); for (const string& c: o.target_config ()) override ("build-include", c, origin::target_config); @@ -594,7 +628,11 @@ namespace bdep bool first (find (package_configs.begin (), package_configs.end (), pc) == package_configs.end ()); - if (first) + // For the specific <pc> add "<pc>-builds: all" when the first + // --build-config <pc>/... option is encountered, unless the + // "<pc>-builds" value is already overridden. + // + if (first && !builds_override (pc)) override (pc + "-builds", "all", origin::build_config); override (pc + "-build-include", @@ -627,6 +665,14 @@ namespace bdep fail << "package configuration " << pc << " is specified using " << "both --package-config and --build-config"; + // If for the specific <pc> the "<pc>-builds" value is already + // overridden, then skip the --package-config <pc> option, assuming + // that the former override has already selected the <pc> + // configuration for the CI task. + // + if (builds_override (pc)) + continue; + using bpkg::build_package_config; using bpkg::build_class_expr; using bpkg::build_constraint; @@ -801,13 +847,20 @@ namespace bdep fail << "invalid --interactive|-i option value '" << s << "': target configuration name is empty"; + // For the specific <pc> add "<pc>-builds: all", unless the + // "<pc>-builds" value is already overridden. + // + bool bo (builds_override (pc)); + if (!pc.empty ()) pc += '-'; if (!tg.empty ()) tg = '/' + tg; - override (pc + "builds", "all", origin::interactive); + if (!bo) + override (pc + "builds", "all", origin::interactive); + override (pc + "build-include", tc + tg, origin::interactive); override (pc + "build-exclude", "**", origin::interactive); diff --git a/tests/ci.testscript b/tests/ci.testscript index 4f1a883..7f3e538 100644 --- a/tests/ci.testscript +++ b/tests/ci.testscript @@ -608,9 +608,21 @@ windows = ($cxx.target.class == 'windows') { $clone_prj; - $* --target-config 'linux_debian_8-gcc_4.9' --builds '&gcc' 2>>EOE != 0 - error: invalid --builds option value: 'builds' override specified together with --target-config - info: override: builds: &gcc + $* --target-config 'linux_debian_8-gcc_4.9' \ + --override 'build-include: linux_debian_12-gcc_13' 2>>EOE != 0 + error: invalid --override option value: 'build-include' override specified together with --target-config + info: override: build-include: linux_debian_12-gcc_13 + EOE + } + + : builds-overrides + : + { + $clone_prj; + + $* --target-config 'linux_debian_8-gcc_4.9' --builds '&gcc' 2>>~%EOE% + %CI request is queued.*% + %reference: .+% EOE } @@ -733,8 +745,8 @@ windows = ($cxx.target.class == 'windows') $clone_prj; $* --build-config 'default/linux_debian_8-gcc_4.9' --builds '&gcc' 2>>EOE != 0 - error: invalid --builds option value: 'builds' override specified together with --build-config - info: override: builds: &gcc + error: invalid --build-config option value: 'default-builds' override specified together with 'builds' override + info: override: default-builds: all EOE } @@ -856,9 +868,21 @@ windows = ($cxx.target.class == 'windows') { $clone_prj; - $* --interactive 'linux_debian_8-gcc_4.9' --builds '&gcc' 2>>EOE != 0 - error: invalid --builds option value: 'builds' override specified together with --interactive|-i - info: override: builds: &gcc + $* --interactive 'linux_debian_8-gcc_4.9' \ + --override 'build-include: linux_debian_12-gcc_13' 2>>EOE != 0 + error: invalid --override option value: 'build-include' override specified together with --interactive|-i + info: override: build-include: linux_debian_12-gcc_13 + EOE + } + + : overrides-builds + : + { + $clone_prj; + + $* --interactive 'linux_debian_8-gcc_4.9' --builds '&gcc' 2>>~%EOE% + %CI request is queued.*% + %reference: .+% EOE } } |