Skip to content

Commit 08f85c5

Browse files
committed
Use new semver.xq 3.0.0 functions
- simplifies this module’s functions, which previously mixed concerns and thus were hard to understand and use.
1 parent 8111b31 commit 08f85c5

File tree

1 file changed

+53
-115
lines changed

1 file changed

+53
-115
lines changed

modules/versions.xqm

Lines changed: 53 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,152 +1,90 @@
11
xquery version "3.1";
22

33
(:~
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
56
:)
67

78
module namespace versions="http://exist-db.org/apps/public-repo/versions";
89

910
import module namespace semver="http://exist-db.org/xquery/semver";
1011

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-
};
2012

2113
(:~
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
2515
:)
26-
declare function versions:find-compatible-packages(
16+
declare function versions:get-packages-satisfying-version-attributes(
2717
$packages as element(package)*,
28-
$exist-version-semver as xs:string,
29-
$version as xs:string?,
18+
$versions as xs:string?,
3019
$semver as xs:string?,
3120
$semver-min as xs:string?,
3221
$semver-max as xs:string?
3322
) 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()
4433
};
4534

4635
(:~
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
4837
:)
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(
6039
$packages as element(package)*,
61-
$exist-version-semver as xs:string,
62-
$version as xs:string?,
40+
$versions as xs:string?,
6341
$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?
6644
) 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)
6847
=> head()
6948
};
7049

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-
10550
(:~
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)
10752
:
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.
10956
:)
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
11560
) 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()
11771
};
11872

11973
(:~
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)
12575
:)
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)*,
12878
$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())
15290
};

0 commit comments

Comments
 (0)