From ec00e07e79b99ff060e40ef7f8d25f0ff7e287d5 Mon Sep 17 00:00:00 2001 From: Jano at Zelda Date: Fri, 16 Feb 2018 19:58:27 +0100 Subject: [PATCH] Miscellaneous refactoring --- src/alire-containers.ads | 22 +++++----- src/alire-dependencies-vectors.ads | 36 +++++++++++++++++ src/alire-dependencies.ads | 42 +++++++++++++++++++ src/alire-depends.ads | 28 ------------- src/alire-index.adb | 8 ++-- src/alire-index.ads | 49 +++++++++++----------- src/alire-milestones.ads | 36 +++++++++++++++++ src/alire-properties-versions.ads | 10 ----- src/alire-query.adb | 26 +++++++----- src/alire-query.ads | 4 +- src/alire-releases.ads | 12 +++--- src/alire-requisites-versions.ads | 34 ---------------- src/alire.ads | 65 +----------------------------- 13 files changed, 183 insertions(+), 189 deletions(-) create mode 100644 src/alire-dependencies-vectors.ads create mode 100644 src/alire-dependencies.ads delete mode 100644 src/alire-depends.ads create mode 100644 src/alire-milestones.ads delete mode 100644 src/alire-properties-versions.ads delete mode 100644 src/alire-requisites-versions.ads diff --git a/src/alire-containers.ads b/src/alire-containers.ads index 24bbf72e..1aceecae 100644 --- a/src/alire-containers.ads +++ b/src/alire-containers.ads @@ -4,27 +4,29 @@ with Ada.Containers.Indefinite_Ordered_Sets; with Alire.Releases; -package Alire.Containers with Preelaborate is - +with Semantic_Versioning; + +package Alire.Containers with Preelaborate is + package Release_Sets is new Ada.Containers.Indefinite_Ordered_Sets (Releases.Release, Releases."<", - Releases."="); + Releases."="); subtype Release_Set is Release_Sets.Set; - + package Release_Holders is new Ada.Containers.Indefinite_Holders (Releases.Release, Releases."="); subtype Release_H is Release_Holders.Holder; - - + + package Project_Version_Maps is new Ada.Containers.Indefinite_Ordered_Maps (Project_Name, Semantic_Versioning.Version, "<", Semantic_Versioning."<"); - subtype Version_Map is Project_Version_Maps.Map; - - + subtype Version_Map is Project_Version_Maps.Map; + + package Project_Release_Maps is new Ada.Containers.Indefinite_Ordered_Maps (Project_Name, Releases.Release, "<", Releases."="); subtype Release_Map is Project_Release_Maps.Map; - + function To_Map (R : Releases.Release) return Release_Map; end Alire.Containers; diff --git a/src/alire-dependencies-vectors.ads b/src/alire-dependencies-vectors.ads new file mode 100644 index 00000000..de63f8dd --- /dev/null +++ b/src/alire-dependencies-vectors.ads @@ -0,0 +1,36 @@ +with Ada.Containers.Indefinite_Vectors; + +package Alire.Dependencies.Vectors with Preelaborate is + + -- Dependencies are a plain list (vector) of individual dependencies + -- There's nothing preventing giving version sets on the same project as distinct dependencies + + package Dependency_Vectors is new Ada.Containers.Indefinite_Vectors (Positive, Dependency); + + type Vector is new Dependency_Vectors.Vector with private; + + function No_Dependencies return Vector; + + -- Creation of dependency vectors + + function New_Dependency (Name : Project_Name; + Versions : Semantic_Versioning.Version_Set) return Vector; + + function "and" (Dep1, Dep2 : Vector) return Vector is (Dep1 & Dep2); + +private + + type Vector is new Dependency_Vectors.Vector with null record; + -- New type so the "and" function is primitive + + function No_Dependencies return Vector is (Dependency_Vectors.Empty_Vector with null record); + + -------------------- + -- New_Dependency -- + -------------------- + + function New_Dependency (Name : Project_Name; + Versions : Semantic_Versioning.Version_Set) return Vector is + (To_Vector ((Name'Length, Name, To_Holder (Versions)), 1)); + +end Alire.Dependencies.Vectors; diff --git a/src/alire-dependencies.ads b/src/alire-dependencies.ads new file mode 100644 index 00000000..93685e40 --- /dev/null +++ b/src/alire-dependencies.ads @@ -0,0 +1,42 @@ +private with Ada.Containers.Indefinite_Holders; + +with Semantic_Versioning; + +package Alire.Dependencies with Preelaborate is + + -- A single dependency is a project name plus a version set + + type Dependency (<>) is tagged private; + + function New_Dependency (Name : Project_Name; + Versions : Semantic_Versioning.Version_Set) return Dependency; + + function Project (Dep : Dependency) return Project_Name; + + function Versions (Dep : Dependency) return Semantic_Versioning.Version_Set; + + +private + + use all type Semantic_Versioning.Version; + + package Version_Holders is new Ada.Containers.Indefinite_Holders + (Semantic_Versioning.Version_Set, Semantic_Versioning."="); + + type Version_Set_Holder is new Version_Holders.Holder with null record; + + type Dependency (Name_Len : Positive) is tagged record + Project : Project_Name (1 .. Name_Len); + Versions_H : Version_Set_holder; + end record; + + function New_Dependency (Name : Project_Name; + Versions : Semantic_Versioning.Version_Set) return Dependency + is ((Name'Length, Name, To_Holder (Versions))); + + function Project (Dep : Dependency) return Project_Name is (Dep.Project); + + function Versions (Dep : Dependency) return Semantic_Versioning.Version_Set is + (Dep.Versions_H.Element); + +end Alire.Dependencies; diff --git a/src/alire-depends.ads b/src/alire-depends.ads deleted file mode 100644 index 29375c87..00000000 --- a/src/alire-depends.ads +++ /dev/null @@ -1,28 +0,0 @@ -with Ada.Containers.Indefinite_Vectors; - -package Alire.Depends with Preelaborate is - - package Dependency_Vectors is new Ada.Containers.Indefinite_Vectors - (Positive, Dependency); - type Dependencies is new Dependency_Vectors.Vector with null record ; - - function Nothing return Dependencies is (Dependency_Vectors.Empty_Vector with null record); - - function New_Dependency (Name : Project_Name; - Versions : Semantic_Versioning.Version_Set) return Dependencies; - function Depends_On (Name : Project_Name; - Versions : Semantic_Versioning.Version_Set) return Dependencies renames New_Dependency; - function On (Name : Project_Name; - Versions : Semantic_Versioning.Version_Set) return Dependencies renames New_Dependency; - - function "and" (Dep1, Dep2 : Dependencies) return Dependencies; - -private - - function New_Dependency (Name : Project_Name; - Versions : Semantic_Versioning.Version_Set) return Dependencies - is (To_Vector ((Name'Length, Name, To_Holder (Versions)), 1)); - - function "and" (Dep1, Dep2 : Dependencies) return Dependencies is (Dep1 & Dep2); - -end Alire.Depends; diff --git a/src/alire-index.adb b/src/alire-index.adb index 1c7c40b3..37229ac5 100644 --- a/src/alire-index.adb +++ b/src/alire-index.adb @@ -14,10 +14,10 @@ package body Alire.Index is Description : Project_Description; Hosting : Repositories.Repository'Class; Id : Repositories.Release_Id; - Depends_On : Dependencies := Depends.Nothing; - Properties : Alire.Properties.Vector := Alire.Properties.Vectors.Empty_Vector; - Requisites : Alire.Requisites.Tree := Alire.Requisites.No_Requisites; - Available_When : Alire.Requisites.Tree := Alire.Requisites.No_Requisites; + Depends_On : Dependencies := No_Dependencies; + Properties : Alire.Properties.Vector := No_Properties; + Requisites : Alire.Requisites.Tree := No_Requisites; + Available_When : Alire.Requisites.Tree := No_Requisites; Native : Boolean := False) return Release is begin diff --git a/src/alire-index.ads b/src/alire-index.ads index e8d6e264..ce3ec59a 100644 --- a/src/alire-index.ads +++ b/src/alire-index.ads @@ -2,7 +2,7 @@ private with Alire_Early_Elaboration; pragma Unreferenced (Alire_Early_Elaborati with Alire.Containers; with Alire.Compilers; -with Alire.Depends; +with Alire.Dependencies.Vectors; with Alire.Operating_Systems; with Alire.Properties; with Alire.Releases; @@ -16,8 +16,11 @@ package Alire.Index is Releases : Containers.Release_Set; - subtype Dependencies is Depends.Dependencies; - use all type Dependencies; + subtype Dependencies is Alire.Dependencies.Vectors.Vector; + + No_Dependencies : constant Dependencies := Alire.Dependencies.Vectors.No_Dependencies; + No_Properties : constant Properties.Vector := Properties.Vectors.Empty_Vector; + No_Requisites : constant Requisites.Tree := Requisites.Trees.Empty_Tree; subtype Release is Alire.Releases.Release; @@ -28,10 +31,10 @@ package Alire.Index is Hosting : Repositories.Repository'Class; Id : Repositories.Release_Id; -- Optional - Depends_On : Dependencies := Depends.Nothing; - Properties : Alire.Properties.Vector := Alire.Properties.Vectors.Empty_Vector; - Requisites : Alire.Requisites.Tree := Alire.Requisites.No_Requisites; - Available_When : Alire.Requisites.Tree := Alire.Requisites.No_Requisites; + Depends_On : Dependencies := No_Dependencies; + Properties : Alire.Properties.Vector := No_Properties; + Requisites : Alire.Requisites.Tree := No_Requisites; + Available_When : Alire.Requisites.Tree := No_Requisites; Native : Boolean := False) return Release; -- Properties are of the Release; currently not used but could support License or other attributes. -- Requisites are properties that dependencies have to fulfill, again not used yet. @@ -43,9 +46,9 @@ package Alire.Index is Hosting : URL; Commit : Repositories.Git.Commit_ID; -- Optional - Properties : Alire.Properties.Vector := Alire.Properties.Vectors.Empty_Vector; - Requisites : Alire.Requisites.Tree := Alire.Requisites.No_Requisites; - Depends_On : Dependencies := Depends.Nothing) return Release; + Properties : Alire.Properties.Vector := No_Properties; + Requisites : Alire.Requisites.Tree := No_Requisites; + Depends_On : Dependencies := No_Dependencies) return Release; -- Shortcuts to give dependencies: @@ -81,8 +84,7 @@ package Alire.Index is use all type Requisites.Requisite'Class; use all type Requisites.Tree; -- for logical operators - Default_Properties : constant Properties.Vector := Properties.Vectors.Empty_Vector; - No_Requisites : constant Requisites.Tree := Requisites.No_Requisites; + Default_Properties : constant Properties.Vector := No_Properties; function Verifies (P : Properties.Property'Class) return Properties.Vector; function "+" (P : Properties.Property'Class) return Properties.Vector renames Verifies; @@ -105,9 +107,9 @@ private Description : Project_Description; Hosting : URL; Commit : Repositories.Git.Commit_ID; - Properties : Alire.Properties.Vector := Alire.Properties.Vectors.Empty_Vector; - Requisites : Alire.Requisites.Tree := Alire.Requisites.No_Requisites; - Depends_On : Dependencies := Depends.Nothing) return Release + Properties : Alire.Properties.Vector := No_Properties; + Requisites : Alire.Requisites.Tree := No_Requisites; + Depends_On : Dependencies := No_Dependencies) return Release is (Register (Project, Version, Description, @@ -118,8 +120,9 @@ private Requisites => Requisites, Native => False)); - use Depends; use Semantic_Versioning; + + use all type Dependencies; function At_Least_Within_Major (R : Release) return Dependencies is (New_Dependency (R.Project, At_Least_Within_Major (R.Version))); @@ -144,25 +147,25 @@ private function At_Least_Within_Major (P : Project_Name; V : Version) return Dependencies is - (Depends_On (P, At_Least_Within_Major (V))); + (New_Dependency (P, At_Least_Within_Major (V))); function At_Least (P : Project_Name; V : Version) return Dependencies is - (Depends_On (P, At_Least (V))); + (New_Dependency (P, At_Least (V))); function At_Most (P : Project_Name; V : Version) return Dependencies is - (Depends_On (P, At_Most (V))); + (New_Dependency (P, At_Most (V))); function Less_Than (P : Project_Name; V : Version) return Dependencies is - (Depends_On (P, Less_Than (V))); + (New_Dependency (P, Less_Than (V))); function More_Than (P : Project_Name; V : Version) return Dependencies is - (Depends_On (P, More_Than (V))); + (New_Dependency (P, More_Than (V))); function Exactly (P : Project_Name; V : Version) return Dependencies is - (Depends_On (P, Exactly (V))); + (New_Dependency (P, Exactly (V))); function Except (P : Project_Name; V : Version) return Dependencies is - (Depends_On (P, Except (V))); + (New_Dependency (P, Except (V))); function Verifies (P : Properties.Property'Class) return Properties.Vector is diff --git a/src/alire-milestones.ads b/src/alire-milestones.ads new file mode 100644 index 00000000..4323a5d9 --- /dev/null +++ b/src/alire-milestones.ads @@ -0,0 +1,36 @@ +with Semantic_Versioning; + +package Alire.Milestones with Preelaborate is + + type Milestone (<>) is tagged private; + + function "<" (L, R : Milestone) return Boolean; + + function New_Milestone (Name : Project_Name; + Version : Semantic_Versioning.Version) return Milestone; + + function Project (M : Milestone) return Project_Name; + + function Version (M : Milestone) return Semantic_Versioning.Version; + +private + + type Milestone (Name_Len : Positive) is tagged record + Name : Project_Name (1 .. Name_Len); + Version : Semantic_Versioning.Version; + end record; + + use all type Semantic_Versioning.Version; + + function "<" (L, R : Milestone) return Boolean is + (L.Name < R.Name or else (L.Name = R.Name and then L.Version < R.Version)); + + function New_Milestone (Name : Project_Name; + Version : Semantic_Versioning.Version) return Milestone is + (Name'Length, Name, Version); + + function Project (M : Milestone) return Project_Name is (M.Name); + + function Version (M : Milestone) return Semantic_Versioning.Version is (M.Version); + +end Alire.Milestones; diff --git a/src/alire-properties-versions.ads b/src/alire-properties-versions.ads deleted file mode 100644 index a5a6d9d0..00000000 --- a/src/alire-properties-versions.ads +++ /dev/null @@ -1,10 +0,0 @@ -package Alire.Properties.Versions with Preelaborate is - - -- Internally we manage versions as a tree of conditions, so arbitrary logical expressions can be used - - package Values is new Properties.values (Semantic_Versioning.Version); - - function New_Version (V : Semantic_Versioning.Version) return Property'Class is - (Values.New_Property (V)); - -end Alire.Properties.Versions; diff --git a/src/alire-query.adb b/src/alire-query.adb index 5c5864a4..a33fe96b 100644 --- a/src/alire-query.adb +++ b/src/alire-query.adb @@ -1,5 +1,11 @@ +with Alire.Dependencies; + +with Semantic_Versioning; + package body Alire.Query is + package Semver renames Semantic_Versioning; + ------------ -- Exists -- ------------ @@ -37,20 +43,20 @@ package body Alire.Query is -- Resolve -- ------------- - function Resolve (Unresolved : Dependencies; - Frozen : Instance; + function Resolve (Unresolved : Index.Dependencies; + Frozen : Instance; Success : out Boolean) return Instance is -- FIXME: since this is depth-first, Frozen can be passed in-out and updated on the spot, -- thus saving copies. Probably the same applies to Unresolved. - Dep : constant Dependency := Unresolved.First_Element; - Remain : Dependencies := Unresolved; + Dep : constant Alire.Dependencies.Dependency := Unresolved.First_Element; + Remain : Index.Dependencies := Unresolved; --------------- -- Go_Deeper -- --------------- - function Go_Deeper (Unresolved : Dependencies; + function Go_Deeper (Unresolved : Index.Dependencies; Frozen : Instance) return Instance is begin @@ -68,7 +74,7 @@ package body Alire.Query is Remain.Delete_First; if Frozen.Contains (Dep.Project) then - if Satisfies (Frozen.Element (Dep.Project).Version, Dep.Versions) then + if Semver.Satisfies (Frozen.Element (Dep.Project).Version, Dep.Versions) then -- Dependency already met, simply go down... return Go_Deeper (Remain, Frozen); else @@ -79,10 +85,10 @@ package body Alire.Query is -- Need to check all versions for the first one... -- FIXME: complexity can be improved not visiting blindly all releases to match by project for R of reverse Index.Releases loop - if Dep.Project = R.Project and then Satisfies (R.Version, Dep.Versions) then + if Dep.Project = R.Project and then Semver.Satisfies (R.Version, Dep.Versions) then declare - New_Frozen : Instance := Frozen; - New_Remain : Dependencies := Remain; + New_Frozen : Instance := Frozen; + New_Remain : Index.Dependencies := Remain; Solution : Instance; begin @@ -108,7 +114,7 @@ package body Alire.Query is -- Resolve -- ------------- - function Resolve (Deps : Dependencies; + function Resolve (Deps : Index.Dependencies; Success : out Boolean) return Instance is begin Success := False; diff --git a/src/alire-query.ads b/src/alire-query.ads index ce4f7bb2..c9a0764b 100644 --- a/src/alire-query.ads +++ b/src/alire-query.ads @@ -10,8 +10,8 @@ package Alire.Query is function Exists (Project : Project_Name) return Boolean; - function Resolve (Deps : Dependencies; - Success : out Boolean) return Instance; + function Resolve (Deps : Index.Dependencies; + Success : out Boolean) return Instance; procedure Print_Solution (I : Instance); diff --git a/src/alire-releases.ads b/src/alire-releases.ads index 967796cc..f52e7437 100644 --- a/src/alire-releases.ads +++ b/src/alire-releases.ads @@ -1,13 +1,13 @@ -with Alire.Depends; +with Alire.Dependencies.Vectors; with Alire.Properties; with Alire.Repositories; with Alire.Requisites; -package Alire.Releases -with Preelaborate -is +with Semantic_Versioning; - subtype Dependencies is Depends.Dependencies; +package Alire.Releases with Preelaborate is + + subtype Dependencies is Alire.Dependencies.Vectors.Vector; type Release (<>) is tagged private; @@ -76,6 +76,8 @@ private Properties, Requisites, Native); + + use all type Semantic_Versioning.Version; function "<" (L, R : Release) return Boolean is (L.Project < R.Project or else diff --git a/src/alire-requisites-versions.ads b/src/alire-requisites-versions.ads deleted file mode 100644 index 004f251b..00000000 --- a/src/alire-requisites-versions.ads +++ /dev/null @@ -1,34 +0,0 @@ -with Alire.Properties.Versions; - -package Alire.Requisites.Versions with Preelaborate is - - package Semver renames Semantic_Versioning; - - function Exactly (V : Semver.Version) return Requisite'Class; - -private - - package Props renames Alire.Properties.Versions; - - package Version_Requisites is new Typed_Requisites (Props.Values.Property'Class); - - type Version_Requisite is new Version_Requisites.Requisite with record - Set : Semver.Version_Set; - end record; - - ------------------ - -- Is_Satisfied -- - ------------------ - - overriding function Is_Satisfied (R : Version_Requisite; - P : Props.Values.Property'Class) return Boolean is - (Semver.Is_In (V => P.Element, VS => R.Set)); - - ------------- - -- Exactly -- - ------------- - - function Exactly (V : Semver.Version) return Requisite'Class is - (Version_Requisite'(Set => Semver.Exactly (V))); - -end Alire.Requisites.Versions; diff --git a/src/alire.ads b/src/alire.ads index 6e63b3b9..ab6a5882 100644 --- a/src/alire.ads +++ b/src/alire.ads @@ -1,20 +1,16 @@ -private with Ada.Containers.Indefinite_Holders; - -with Semantic_Versioning; - with Simple_Logging; package Alire with Preelaborate is File_Error : exception; - type URL is new String; - Max_Name_Length : constant := 72; -- Github maximum is 100 and bitbucket 128, but since Description is 72... Max_Description_Length : constant := 72; -- Git line recommendation (although it's 50 for subject line) + -- Basics of projects: Name and Description + -- Rest of properties are grouped in the Index subtype Project_Name is String with Dynamic_Predicate => Project_Name'Length >= 3 and then @@ -22,30 +18,9 @@ package Alire with Preelaborate is Project_Name (Project_Name'First) /= '_' and then (for all C of Project_Name => C in 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_'); - subtype Project_Description is String with Dynamic_Predicate => Project_Description'Length <= Max_Description_Length; - - type Dependency (<>) is tagged private; - - function Project (Dep : Dependency) return Project_Name; - - function Versions (Dep : Dependency) return Semantic_Versioning.Version_Set; - - - - type Milestone (<>) is tagged private; - - function "<" (L, R : Milestone) return Boolean; - - function New_Milestone (Name : Project_Name; - Version : Semantic_Versioning.Version) return Milestone; - - function Project (M : Milestone) return Project_Name; - - function Version (M : Milestone) return Semantic_Versioning.Version; - --------------- -- LOGGING -- --------------- @@ -58,40 +33,4 @@ package Alire with Preelaborate is procedure Log (S : String; Level : Simple_Logging.Levels := Info) renames Simple_Logging.Log; -private - - use all type Semantic_Versioning.Version; - - package Version_Holders is new Ada.Containers.Indefinite_Holders - (Semantic_Versioning.Version_Set, Semantic_Versioning."="); - - type Version_Set_Holder is new Version_Holders.Holder with null record; - - type Dependency (Name_Len : Positive) is tagged record - Project : Project_Name (1 .. Name_Len); - Versions_H : Version_Set_holder; - end record; - - function Project (Dep : Dependency) return Project_Name is (Dep.Project); - - function Versions (Dep : Dependency) return Semantic_Versioning.Version_Set is - (Dep.Versions_H.Element); - - - type Milestone (Name_Len : Positive) is tagged record - Name : Project_Name (1 .. Name_Len); - Version : Semantic_Versioning.Version; - end record; - - function "<" (L, R : Milestone) return Boolean is - (L.Name < R.Name or else (L.Name = R.Name and then L.Version < R.Version)); - - function New_Milestone (Name : Project_Name; - Version : Semantic_Versioning.Version) return Milestone is - (Name'Length, Name, Version); - - function Project (M : Milestone) return Project_Name is (M.Name); - - function Version (M : Milestone) return Semantic_Versioning.Version is (M.Version); - end Alire;