From e5ab12208faa39251d02818c3409011fd551d8c6 Mon Sep 17 00:00:00 2001 From: "Alejandro R. Mosteo" Date: Fri, 17 Aug 2018 17:22:29 +0200 Subject: [PATCH] Changes for Forbidden dependencies --- src/alire-conditional-operations.ads | 26 ++++++++++++++++++++++++++ src/alire-conditional.ads | 9 ++++++++- src/alire-conditional_trees.ads | 3 ++- src/alire-releases.adb | 17 +++++++++++++++++ src/alire-releases.ads | 15 +++++++++++++++ src/alire-types.ads | 10 ++++++---- 6 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 src/alire-conditional-operations.ads diff --git a/src/alire-conditional-operations.ads b/src/alire-conditional-operations.ads new file mode 100644 index 00000000..c26843ee --- /dev/null +++ b/src/alire-conditional-operations.ads @@ -0,0 +1,26 @@ +with Alire.Containers; +with Alire.Releases; + +package Alire.Conditional.Operations is + + function Contains (Tree : Dependencies; R : Releases.Release) return Boolean; + + function Contains_Some (Tree : Dependencies; + Map : Containers.Release_Map) return Boolean; + -- If any in Map is also in Tree + +private + + use Conditional.For_Dependencies; + + function Contains (Tree : Dependencies; + R : Releases.Release) return Boolean is + (for some I in Tree.Iterate => + Tree (I).Kind = Value and then + R.Satisfies (Tree (I).Value)); + + function Contains_Some (Tree : Dependencies; + Map : Containers.Release_Map) return Boolean is + (for some R of Map => Contains (Tree, R)); + +end Alire.Conditional.Operations; diff --git a/src/alire-conditional.ads b/src/alire-conditional.ads index c96a2ad8..b6a95f1c 100644 --- a/src/alire-conditional.ads +++ b/src/alire-conditional.ads @@ -11,11 +11,18 @@ package Alire.Conditional with Preelaborate is Dependencies.Image); subtype Dependencies is For_Dependencies.Tree; + subtype Platform_Dependencies is Conditional.Dependencies + with Dynamic_Predicate => Platform_Dependencies.Is_Unconditional; + -- A plain tree without conditions (but might have OR nodes) + + subtype Forbidden_Dependencies is Platform_Dependencies + with Dynamic_Predicate => not Forbidden_Dependencies.Contains_ORs; + -- A plain tree without conditions or alternatives + function New_Dependency (Name : Alire.Project; Versions : Semantic_Versioning.Version_Set) return Dependencies; - package For_Properties is new Conditional_Trees (Properties.Property'Class, Properties.Image_Classwide); subtype Properties is For_Properties.Tree; diff --git a/src/alire-conditional_trees.ads b/src/alire-conditional_trees.ads index 9aec0fa6..935b9850 100644 --- a/src/alire-conditional_trees.ads +++ b/src/alire-conditional_trees.ads @@ -20,6 +20,7 @@ package Alire.Conditional_Trees with Preelaborate is Iterator_Element => Tree, Constant_Indexing => Indexed_Element; -- Recursive type that stores conditions (requisites) and values/further conditions if they are met or not + -- Iteration is only over direct children, when the tree is AND/OR list function Leaf_Count (This : Tree) return Natural; @@ -149,7 +150,7 @@ package Alire.Conditional_Trees with Preelaborate is private - type Inner_Node is abstract tagged null record; + type Inner_Node is interface; function Image (Node : Inner_Node) return String is abstract; diff --git a/src/alire-releases.adb b/src/alire-releases.adb index 8e46b23a..e0d83b43 100644 --- a/src/alire-releases.adb +++ b/src/alire-releases.adb @@ -41,6 +41,19 @@ package body Alire.Releases is end return; end Extending; + ---------------- + -- Forbidding -- + ---------------- + + function Forbidding (Base : Release; + Forbidden : Conditional.Forbidden_Dependencies) + return Release is + begin + return Extended : Release := Base do + Extended.Forbidden := Forbidden; + end return; + end Forbidding; + -------------- -- Renaming -- -------------- @@ -111,6 +124,7 @@ package body Alire.Releases is Version => Base.Version, Origin => Base.Origin, Dependencies => Base.Dependencies, + Forbidden => Base.Forbidden, Properties => Base.Properties, Priv_Props => Base.Priv_Props, Available => Base.Available) @@ -165,6 +179,7 @@ package body Alire.Releases is Origin => Origin, Notes => Notes, Dependencies => Dependencies, + Forbidden => Conditional.For_Dependencies.Empty, Properties => Properties, Priv_Props => Private_Properties, Available => Available); @@ -187,6 +202,7 @@ package body Alire.Releases is Origin => Origin, Notes => "", Dependencies => Dependencies, + Forbidden => Conditional.For_Dependencies.Empty, Properties => Properties, Priv_Props => Conditional.For_Properties.Empty, Available => Requisites.Booleans.Always_True); @@ -440,6 +456,7 @@ package body Alire.Releases is Origin => R.Origin, Notes => R.Notes, Dependencies => R.Dependencies.Evaluate (P), + Forbidden => R.Forbidden.Evaluate (P), Properties => R.Properties.Evaluate (P), Priv_Props => R.Priv_Props.Evaluate (P), Available => (if R.Available.Check (P) diff --git a/src/alire-releases.ads b/src/alire-releases.ads index 7430e6e0..765b3927 100644 --- a/src/alire-releases.ads +++ b/src/alire-releases.ads @@ -80,6 +80,11 @@ package Alire.Releases with Preelaborate is Version : Semantic_Versioning.Version; Origin : Origins.Origin) return Release; -- Takes a release and replaces version and origin + + function Forbidding (Base : Release; + Forbidden : Conditional.Forbidden_Dependencies) + return Release; + -- Add forbidden dependencies to a release function Whenever (R : Release; P : Properties.Vector) return Release; -- Materialize conditions in a Release once the whatever properties are known @@ -96,6 +101,10 @@ package Alire.Releases with Preelaborate is -- The actual project name to be used during dependency resolution -- (But nowhere else) + function Forbids (R : Release; + P : Alire.Properties.Vector) + return Conditional.Dependencies; + function Is_Extension (R : Release) return Boolean; function Notes (R : Release) return Description_String; -- Specific to release @@ -202,6 +211,7 @@ private Origin : Origins.Origin; Notes : Description_String (1 .. Notes_Len); Dependencies : Conditional.Dependencies; + Forbidden : Conditional.Dependencies; Properties : Conditional.Properties; Priv_Props : Conditional.Properties; Available : Requisites.Tree; @@ -241,6 +251,11 @@ private return Conditional.Dependencies is (R.Dependencies.Evaluate (P)); + function Forbids (R : Release; + P : Alire.Properties.Vector) + return Conditional.Dependencies is + (R.Forbidden.Evaluate (P)); + function Properties (R : Release) return Conditional.Properties is (R.Properties); diff --git a/src/alire-types.ads b/src/alire-types.ads index 6787aa79..031bcd8b 100644 --- a/src/alire-types.ads +++ b/src/alire-types.ads @@ -12,13 +12,15 @@ package Alire.Types with Preelaborate is subtype Dependency is Dependencies.Dependency; -- A single dependency on a single project+versions - subtype Platform_Dependencies is Conditional.Dependencies - with Dynamic_Predicate => Platform_Dependencies.Is_Unconditional; - -- A plain tree without conditions (but might have OR nodes) - subtype Abstract_Dependencies is Conditional.Dependencies; -- Conditional dependencies as yet unmaterialized for a precise platform + subtype Platform_Dependencies is Conditional.Platform_Dependencies; + -- A plain tree without conditions (but might have OR nodes) + + subtype Forbidden_Dependencies is Conditional.Forbidden_Dependencies; + -- A plain tree without conditions or alternatives + function No_Dependencies return Conditional.Dependencies renames Conditional.For_Dependencies.Empty;