From dc46eb61582d0ab82bdfdba089809f6c2b7058f7 Mon Sep 17 00:00:00 2001 From: Alejandro R Mosteo Date: Mon, 4 Mar 2024 11:41:15 +0100 Subject: [PATCH] Override distro via config key (#1610) --- src/alire/alire-config-builtins.ads | 16 ++++++++- src/alire/alire-config-checks.adb | 20 +++++++++++ src/alire/alire-config-checks.ads | 9 +++++ src/alire/alire-platforms-current.ads | 36 ++++++++++++++++--- src/alire/alire-warnings.adb | 14 ++++++++ src/alire/alire-warnings.ads | 9 +++++ .../tests/config/distro-override/test.py | 23 ++++++++++++ .../tests/config/distro-override/test.yaml | 3 ++ 8 files changed, 124 insertions(+), 6 deletions(-) create mode 100644 src/alire/alire-config-checks.adb create mode 100644 src/alire/alire-config-checks.ads create mode 100644 testsuite/tests/config/distro-override/test.py create mode 100644 testsuite/tests/config/distro-override/test.yaml diff --git a/src/alire/alire-config-builtins.ads b/src/alire/alire-config-builtins.ads index b77adaab..745d0573 100644 --- a/src/alire/alire-config-builtins.ads +++ b/src/alire/alire-config-builtins.ads @@ -1,3 +1,5 @@ +with Alire.Config.Checks; + package Alire.Config.Builtins is subtype Builtin is Builtin_Option; @@ -32,12 +34,24 @@ package Alire.Config.Builtins is & "location inside the global cache. When false, " & "dependencies are sandboxed in each workspace."); + -- DISTRIBUTION + Distribution_Disable_Detection : constant Builtin := New_Builtin (Key => "distribution.disable_detection", Def => False, Help => "If true, Alire will report an unknown distribution and will not" - & " attempt to use the system package manager."); + & " attempt to use the system package manager. Takes precedence over " + & " distribution.override."); + + Distribution_Override : constant Builtin := New_Builtin + (Key => "distribution.override", + Kind => Cfg_String, + Check => Checks.Valid_Distro'Access, + Def => "", + Help => + "Distribution name to be used instead of autodetection. No effect if " + & "distribution.disable_detection is True."); -- EDITOR diff --git a/src/alire/alire-config-checks.adb b/src/alire/alire-config-checks.adb new file mode 100644 index 00000000..b86edbfd --- /dev/null +++ b/src/alire/alire-config-checks.adb @@ -0,0 +1,20 @@ +with AAA.Enum_Tools; + +with Alire.Platforms; + +package body Alire.Config.Checks is + + function Is_Valid is + new AAA.Enum_Tools.Is_Valid (Alire.Platforms.Known_Distributions); + + ------------------ + -- Valid_Distro -- + ------------------ + + function Valid_Distro (Key : CLIC.Config.Config_Key; + Value : TOML.TOML_Value) + return Boolean + is (Value.Kind in TOML.TOML_String + and then Is_Valid (Value.As_String)); + +end Alire.Config.Checks; diff --git a/src/alire/alire-config-checks.ads b/src/alire/alire-config-checks.ads new file mode 100644 index 00000000..a5f971ec --- /dev/null +++ b/src/alire/alire-config-checks.ads @@ -0,0 +1,9 @@ +with TOML; + +package Alire.Config.Checks is + + function Valid_Distro (Key : CLIC.Config.Config_Key; + Value : TOML.TOML_Value) + return Boolean; + +end Alire.Config.Checks; diff --git a/src/alire/alire-platforms-current.ads b/src/alire/alire-platforms-current.ads index 897f93d3..1327c369 100644 --- a/src/alire/alire-platforms-current.ads +++ b/src/alire/alire-platforms-current.ads @@ -1,8 +1,12 @@ +private with AAA.Enum_Tools; + +private with Alire.Config.Builtins; limited with Alire.Environment; private with Alire.OS_Lib.Subprocess; private with Alire.Platforms.Common; with Alire.Properties; private with Alire.Properties.Platform; +private with Alire.Warnings; private with System; @@ -50,8 +54,9 @@ package Alire.Platforms.Current is Disable_Distribution_Detection : Boolean := False with Atomic; function Distribution return Platforms.Distributions; - -- Cooked distribution that may return Unknown if detection was disabled - -- via config. + -- Cooked distribution that may return Unknown if detection was + -- disabled via config, or a different distribution if config key + -- distribution.override is set. function Distribution_Is_Known return Boolean is (Platforms."/=" (Distribution, Platforms.Distribution_Unknown)); @@ -70,14 +75,35 @@ package Alire.Platforms.Current is private + function Is_Valid_Distro is + new AAA.Enum_Tools.Is_Valid (Platforms.Known_Distributions); + + function Return_With_Warning is + new Warnings.Warn_With_Result (Platforms.Distributions); + ------------------ -- Distribution -- ------------------ function Distribution return Platforms.Distributions - is (if Disable_Distribution_Detection - then Platforms.Distribution_Unknown - else Detected_Distribution); + is ( + -- Disabled detection + if Disable_Distribution_Detection then + Platforms.Distribution_Unknown + + -- Overridden detection + elsif Config.Builtins.Distribution_Override.Get /= "" then + (if Is_Valid_Distro (Config.Builtins.Distribution_Override.Get) then + Distributions'Value (Config.Builtins.Distribution_Override.Get) + else + Return_With_Warning + ("Invalid distribution override: " + & Config.Builtins.Distribution_Override.Get, + Result => Platforms.Distribution_Unknown)) + + -- Regular detection + else + Detected_Distribution); ----------------------- -- Host_Architecture -- diff --git a/src/alire/alire-warnings.adb b/src/alire/alire-warnings.adb index 63209d40..e203bc41 100644 --- a/src/alire/alire-warnings.adb +++ b/src/alire/alire-warnings.adb @@ -26,4 +26,18 @@ package body Alire.Warnings is function Already_Warned (Id : Warning_Id) return Boolean is (Already_Emitted.Contains (String (Id))); + ---------------------- + -- Warn_With_Result -- + ---------------------- + + function Warn_With_Result (Text : String; + Result : Returned; + Level : Trace.Levels := Trace.Warning) + return Returned + is + begin + Trace.Log (Text, Level); + return Result; + end Warn_With_Result; + end Alire.Warnings; diff --git a/src/alire/alire-warnings.ads b/src/alire/alire-warnings.ads index 9b9b5779..904665ce 100644 --- a/src/alire/alire-warnings.ads +++ b/src/alire/alire-warnings.ads @@ -14,6 +14,15 @@ package Alire.Warnings with Preelaborate is function Already_Warned (Id : Warning_Id) return Boolean; -- Says if a warning has been already emitted in the current run + generic + type Returned (<>) is private; + function Warn_With_Result (Text : String; + Result : Returned; + Level : Trace.Levels := Trace.Warning) + return Returned; + -- Return Result after printing Text; for use in expressions. See instances + -- in Alire.Warnings.Typed. + ------------------ -- Defined Ids -- ------------------ diff --git a/testsuite/tests/config/distro-override/test.py b/testsuite/tests/config/distro-override/test.py new file mode 100644 index 00000000..30be498c --- /dev/null +++ b/testsuite/tests/config/distro-override/test.py @@ -0,0 +1,23 @@ +""" +Verify that distro overridding works as intended +""" + +from drivers.alr import run_alr, distro_is_known +from drivers.asserts import assert_match + +# Overriding distro detection. We force Debian as our tests run in Ubuntu and +# many other distros so it is only giving a false positive on Debian. +run_alr("config", "--global", + "--set", "distribution.override", "debian") + +assert_match(".*distribution:[^\n]*DEBIAN", + run_alr("version").out) + +# Disabling distro detection takes precedence +run_alr("config", "--global", + "--set", "distribution.disable_detection", "true") + +assert_match(".*distribution:[^\n]*DISTRIBUTION_UNKNOWN", + run_alr("version").out) + +print('SUCCESS') diff --git a/testsuite/tests/config/distro-override/test.yaml b/testsuite/tests/config/distro-override/test.yaml new file mode 100644 index 00000000..872fc127 --- /dev/null +++ b/testsuite/tests/config/distro-override/test.yaml @@ -0,0 +1,3 @@ +driver: python-script +indexes: + basic_index: {} -- 2.39.5