From 941431119def4ec2269c5e4cae30cf944f8387de Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20S=C3=A1enz?= Date: Fri, 9 May 2025 11:04:31 +0200 Subject: [PATCH] fix: `alr toolchain`: validate duplicated release args (#1947) * `alr toolchain`: validate duplicated release args * Revert changes Alire.Meta * `alr toolchain`: fix validate duplicated release args * Alire.Utils: Transform defaults to null --- src/alire/alire-utils.adb | 26 ++++++++++++++++++++++++ src/alire/alire-utils.ads | 5 +++++ src/alr/alr-commands-toolchain.adb | 15 +++++++++++++- testsuite/tests/toolchain/select/test.py | 5 +++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/alire/alire-utils.adb b/src/alire/alire-utils.adb index fae78c29..c681a00e 100644 --- a/src/alire/alire-utils.adb +++ b/src/alire/alire-utils.adb @@ -268,4 +268,30 @@ package body Alire.Utils is Last_Chance_Handler (E); end Finalize_Exception; + -------------------- + -- Has_Duplicates -- + -------------------- + + function Has_Duplicates + (V : AAA.Strings.Vector; + Transform : access function (S : String) return String := null) + return Boolean is + Seen : AAA.Strings.Set := AAA.Strings.Empty_Set; + begin + for Elt of V loop + declare + Transformed : constant String := (if Transform /= null + then Transform (Elt) + else Elt); + begin + if Seen.Contains (Transformed) then + return True; + else + Seen.Insert (Transformed); + end if; + end; + end loop; + return False; + end Has_Duplicates; + end Alire.Utils; diff --git a/src/alire/alire-utils.ads b/src/alire/alire-utils.ads index 4cf70f10..30b09c91 100644 --- a/src/alire/alire-utils.ads +++ b/src/alire/alire-utils.ads @@ -105,6 +105,11 @@ package Alire.Utils with Preelaborate is -- Alire.Utils.Finalize_Exception (E); -- end Finalize; + function Has_Duplicates + (V : AAA.Strings.Vector; + Transform : access function (S : String) return String := null) + return Boolean; + private function Quote (S : String) return String diff --git a/src/alr/alr-commands-toolchain.adb b/src/alr/alr-commands-toolchain.adb index 20504074..62032b39 100644 --- a/src/alr/alr-commands-toolchain.adb +++ b/src/alr/alr-commands-toolchain.adb @@ -8,6 +8,7 @@ with Alire.Origins.Deployers; with Alire.Releases.Containers; with Alire.Solver; with Alire.Toolchains; +with Alire.Utils; with Alire.Utils.Tables; with Alire.Utils.TTY; with Alire.Warnings; @@ -351,7 +352,6 @@ package body Alr.Commands.Toolchain is -- We do not want tools that are later in the command-line to be taken -- into account prematurely for compatibility of origins. We store here -- crates still to be dealt with. - begin -- Validation @@ -366,6 +366,19 @@ package body Alr.Commands.Toolchain is ("--local requires --select or --disable-assistant"); end if; + declare + function As_Crate (S : String) return String is + (Alire.Dependencies.From_String (S).Crate.As_String); + begin + if Cmd.S_Select + and then + Alire.Utils.Has_Duplicates (Args, As_Crate'Access) + then + Reportaise_Wrong_Arguments + ("Release arguments contain duplicated crates"); + end if; + end; + -- Dispatch to subcommands if Cmd.Disable then diff --git a/testsuite/tests/toolchain/select/test.py b/testsuite/tests/toolchain/select/test.py index 07a309af..286053f9 100644 --- a/testsuite/tests/toolchain/select/test.py +++ b/testsuite/tests/toolchain/select/test.py @@ -12,6 +12,11 @@ from drivers.asserts import assert_eq, assert_match p = run_alr("index") print(p.out) +# Validation duplicated release arguments +p = run_alr("toolchain", "--select", "gnat_native=1.2.3", "gnat_native=4.5.6", + complain_on_error=False) +assert_match(".*Release arguments contain duplicated crates", p.out) + # Activate the default compiler p = run_alr("toolchain", "--select") -- 2.39.5