|
1 | 1 | xquery version "3.1";
|
2 | 2 |
|
3 | 3 | (:~
|
4 |
| - : A library module for finding packages by version number criteria |
| 4 | + : A library module for finding packages by EXPath Package dependency version attributes |
| 5 | + : or eXist version |
5 | 6 | :)
|
6 | 7 |
|
7 | 8 | module namespace versions="http://exist-db.org/apps/public-repo/versions";
|
8 | 9 |
|
9 | 10 | import module namespace semver="http://exist-db.org/xquery/semver";
|
10 | 11 |
|
11 |
| -(:~ |
12 |
| - : Find all packages compatible with a specific version of eXist (or higher) |
13 |
| - :) |
14 |
| -declare function versions:find-compatible-packages( |
15 |
| - $packages as element(package)*, |
16 |
| - $exist-version-semver as xs:string |
17 |
| -) as element(package)* { |
18 |
| - versions:find-compatible-packages($packages, $exist-version-semver, (), (), (), ()) |
19 |
| -}; |
20 | 12 |
|
21 | 13 | (:~
|
22 |
| - : Find all packages compatible with a version of eXist meeting various version criteria |
23 |
| - : |
24 |
| - : TODO: find packages with version, semver, or min/max-version attributes to test those conditions - joewiz |
| 14 | + : Get all packages satisfying EXPath Package dependency version attributes |
25 | 15 | :)
|
26 |
| -declare function versions:find-compatible-packages( |
| 16 | +declare function versions:get-packages-satisfying-version-attributes( |
27 | 17 | $packages as element(package)*,
|
28 |
| - $exist-version-semver as xs:string, |
29 |
| - $version as xs:string?, |
| 18 | + $versions as xs:string?, |
30 | 19 | $semver as xs:string?,
|
31 | 20 | $semver-min as xs:string?,
|
32 | 21 | $semver-max as xs:string?
|
33 | 22 | ) as element(package)* {
|
34 |
| - if ($semver) then |
35 |
| - versions:find-version($packages, $semver, $semver) |
36 |
| - else if ($version) then |
37 |
| - $packages[version = $version] |
38 |
| - else if ($semver-min and $semver-max) then |
39 |
| - versions:find-version($packages, $semver-min, $semver-max) |
40 |
| - else if (exists($exist-version-semver)) then |
41 |
| - versions:find-packages-satisfying-exist-version-requirements($packages, $exist-version-semver) |
42 |
| - else |
43 |
| - () |
| 23 | + $packages[ |
| 24 | + semver:satisfies-expath-package-dependency-versioning-attributes( |
| 25 | + ./version, |
| 26 | + $versions, |
| 27 | + $semver, |
| 28 | + $semver-min, |
| 29 | + $semver-max |
| 30 | + ) |
| 31 | + ] |
| 32 | + => versions:sort-packages() |
44 | 33 | };
|
45 | 34 |
|
46 | 35 | (:~
|
47 |
| - : Find the newest version of packages compatible with a specific version of eXist (or higher) |
| 36 | + : Get the newest version of a package satisfying EXPath Package dependency version attributes |
48 | 37 | :)
|
49 |
| -declare function versions:find-newest-compatible-package( |
50 |
| - $packages as element(package)*, |
51 |
| - $exist-version-semver as xs:string |
52 |
| -) as element(package)? { |
53 |
| - versions:find-newest-compatible-package($packages, $exist-version-semver, (), (), (), ()) |
54 |
| -}; |
55 |
| - |
56 |
| -(:~ |
57 |
| - : Find the newest version of packages compatible with a version of eXist meeting various version criteria |
58 |
| - :) |
59 |
| -declare function versions:find-newest-compatible-package( |
| 38 | +declare function versions:get-newest-package-satisfying-version-attributes( |
60 | 39 | $packages as element(package)*,
|
61 |
| - $exist-version-semver as xs:string, |
62 |
| - $version as xs:string?, |
| 40 | + $versions as xs:string?, |
63 | 41 | $semver as xs:string?,
|
64 |
| - $min-version as xs:string?, |
65 |
| - $max-version as xs:string? |
| 42 | + $semver-min as xs:string?, |
| 43 | + $semver-max as xs:string? |
66 | 44 | ) as element(package)? {
|
67 |
| - versions:find-compatible-packages($packages, $exist-version-semver, $version, $semver, $min-version, $max-version) |
| 45 | + $packages |
| 46 | + => versions:get-packages-satisfying-version-attributes($versions, $semver, $semver-min, $semver-max) |
68 | 47 | => head()
|
69 | 48 | };
|
70 | 49 |
|
71 |
| -declare |
72 |
| - %private |
73 |
| -function versions:find-version($packages as element(package)*, $minVersion as xs:string?, $maxVersion as xs:string?) { |
74 |
| - let $minVersion := if ($minVersion) then $minVersion else "0" |
75 |
| - let $maxVersion := if ($maxVersion) then $maxVersion else "9999" |
76 |
| - return |
77 |
| - versions:find-version($packages, $minVersion, $maxVersion, ()) |
78 |
| -}; |
79 |
| - |
80 |
| -declare |
81 |
| - %private |
82 |
| -function versions:find-version($packages as element(package)*, $minVersion as xs:string, $maxVersion as xs:string, $newest as element()?) { |
83 |
| - if (empty($packages)) then |
84 |
| - $newest |
85 |
| - else |
86 |
| - let $package := head($packages) |
87 |
| - let $packageVersion := ($package/version, $package/@version)[1] |
88 |
| - let $newestVersion := ($newest/version, $newest/@version)[1] |
89 |
| - let $newer := |
90 |
| - if ( |
91 |
| - ( |
92 |
| - empty($newest) or |
93 |
| - semver:ge($packageVersion, $newestVersion, true()) |
94 |
| - ) and |
95 |
| - semver:ge($packageVersion, $minVersion, true()) and |
96 |
| - semver:le($packageVersion, $maxVersion, true()) |
97 |
| - ) then |
98 |
| - $package |
99 |
| - else |
100 |
| - $newest |
101 |
| - return |
102 |
| - versions:find-version(tail($packages), $minVersion, $maxVersion, $newer) |
103 |
| -}; |
104 |
| - |
105 | 50 | (:~
|
106 |
| - : Find packages whose eXist version requirements meet the client's eXist version |
| 51 | + : Find all packages compatible with a specific version of eXist (or higher) |
107 | 52 | :
|
108 |
| - : @deprecated As of 2.1.3, use the private function versions:find-packages-satisfying-exist-version-requirements#2 |
| 53 | + : For example, via app.xqm or list.xq, a client may request the subset of a package's |
| 54 | + : releases that are compatible with eXist 5.3.0. The function examines each release's |
| 55 | + : eXist dependency declarations (if present) and returns all matching packages. |
109 | 56 | :)
|
110 |
| -declare function versions:find-packages-satisfying-exist-version-requirements( |
111 |
| - $packages as element(package)*, |
112 |
| - $exist-version-semver as xs:string, |
113 |
| - $min-version as xs:string?, |
114 |
| - $max-version as xs:string? |
| 57 | +declare function versions:get-packages-satisfying-exist-version( |
| 58 | + $packages as element(package)*, |
| 59 | + $exist-version as xs:string |
115 | 60 | ) as element(package)* {
|
116 |
| - versions:find-packages-satisfying-exist-version-requirements($packages, $exist-version-semver) |
| 61 | + $packages[ |
| 62 | + semver:satisfies-expath-package-dependency-versioning-attributes( |
| 63 | + $exist-version, |
| 64 | + ./requires/@versions, |
| 65 | + ./requires/@semver, |
| 66 | + ./requires/@semver-min, |
| 67 | + ./requires/@semver-max |
| 68 | + ) |
| 69 | + ] |
| 70 | + => versions:sort-packages() |
117 | 71 | };
|
118 | 72 |
|
119 | 73 | (:~
|
120 |
| - : Find packages whose eXist version requirements meet the client's eXist version |
121 |
| - : |
122 |
| - : For example, via app.xqm or list.xq, a client may request the subset of a package's |
123 |
| - : releases that are compatible with eXist 5.3.0. The function examines each release's |
124 |
| - : eXist dependency declarations (if present) and returns all matching packages. |
| 74 | + : Find the newest version of packages compatible with a specific version of eXist (or higher) |
125 | 75 | :)
|
126 |
| -declare %private function versions:find-packages-satisfying-exist-version-requirements( |
127 |
| - $packages as element(package)*, |
| 76 | +declare function versions:get-newest-package-satisfying-exist-version( |
| 77 | + $packages as element(package)*, |
128 | 78 | $exist-version-semver as xs:string
|
129 |
| -) as element(package)* { |
130 |
| - for $package in $packages |
131 |
| - let $satisfies-semver-min-requirement := |
132 |
| - if (exists($package/requires/@semver-min)) then |
133 |
| - semver:ge-parsed( |
134 |
| - semver:parse($exist-version-semver, true()), |
135 |
| - semver:resolve-if-expath-package-server-template-else-parse($package/requires/@semver-min, "min", true()) |
136 |
| - ) |
137 |
| - else |
138 |
| - true() |
139 |
| - let $satisfies-semver-max-requirement := |
140 |
| - if (exists($package/requires/@semver-max)) then |
141 |
| - semver:lt-parsed( |
142 |
| - semver:parse($exist-version-semver, true()), |
143 |
| - semver:resolve-if-expath-package-server-template-else-parse($package/requires/@semver-max, "max", true()) |
144 |
| - ) |
145 |
| - else |
146 |
| - true() |
147 |
| - return |
148 |
| - if ($satisfies-semver-min-requirement and $satisfies-semver-max-requirement) then |
149 |
| - $package |
150 |
| - else |
151 |
| - () |
| 79 | +) as element(package)? { |
| 80 | + $packages |
| 81 | + => versions:get-packages-satisfying-exist-version($exist-version-semver) |
| 82 | + => head() |
| 83 | +}; |
| 84 | + |
| 85 | +(:~ |
| 86 | + : Sort packages by version |
| 87 | + :) |
| 88 | +declare function versions:sort-packages($packages as element(package)*) { |
| 89 | + semver:sort($packages, function($package) { $package/version }, true()) |
152 | 90 | };
|
0 commit comments