@@ -38,17 +38,7 @@ declare function versions:find-compatible-packages(
38
38
else if ($semver-min and $semver-max) then
39
39
versions:find-version ($packages, $semver-min, $semver-max)
40
40
else if (exists ($exist-version-semver)) then
41
- for $package in $packages
42
- return
43
- if
44
- (
45
- $exist-version-semver and
46
- versions:is-newer-or-same ($exist-version-semver, $package/requires/@semver-min) and
47
- versions:is-older-or-same ($exist-version-semver, $package/requires/@semver-max)
48
- ) then
49
- $package
50
- else
51
- ()
41
+ versions:find-packages-satisfying-exist-version-requirements ($packages, $exist-version-semver, $semver-min, $semver-max)
52
42
else
53
43
()
54
44
};
@@ -78,18 +68,6 @@ declare function versions:find-newest-compatible-package(
78
68
=> head ()
79
69
};
80
70
81
- declare
82
- %private
83
- function versions:is-newer-or-same ($version1 as xs:string, $version2 as xs:string?) {
84
- empty ($version2) or semver:ge ($version1, $version2, true ())
85
- };
86
-
87
- declare
88
- %private
89
- function versions:is-older-or-same ($version1 as xs:string, $version2 as xs:string?) {
90
- empty ($version2) or semver:le ($version1, $version2, true ())
91
- };
92
-
93
71
declare
94
72
%private
95
73
function versions:find-version ($packages as element (package)*, $minVersion as xs:string?, $maxVersion as xs:string?) {
@@ -106,15 +84,16 @@ function versions:find-version($packages as element(package)*, $minVersion as xs
106
84
$newest
107
85
else
108
86
let $package := head ($packages)
109
- let $packageVersion := $package/version | $package/@version
87
+ let $packageVersion := ($package/version , $package/@version )[1 ]
88
+ let $newestVersion := ($newest/version , $newest/@version )[1 ]
110
89
let $newer :=
111
90
if (
112
91
(
113
92
empty ($newest) or
114
- versions:is-newer ($packageVersion, ($newest/ version , $newest/@ version ))
93
+ semver:ge ($packageVersion, $newestVersion, true ( ))
115
94
) and
116
- versions:is-newer ($packageVersion, $minVersion) and
117
- versions:is-older ($packageVersion, $maxVersion)
95
+ semver:ge ($packageVersion, $minVersion, true () ) and
96
+ semver:le ($packageVersion, $maxVersion, true () )
118
97
) then
119
98
$package
120
99
else
@@ -123,33 +102,33 @@ function versions:find-version($packages as element(package)*, $minVersion as xs
123
102
versions:find-version (tail ($packages), $minVersion, $maxVersion, $newer)
124
103
};
125
104
126
- declare
127
- %private
128
- function versions:is-newer ($available as xs:string, $installed as xs:string) as xs:boolean {
129
- let $verInstalled := tokenize ($installed, "\." )
130
- let $verAvailable := tokenize ($available, "\." )
131
- return
132
- versions:compare-versions (
133
- $verInstalled,
134
- $verAvailable,
135
- function ($version1, $version2) {
136
- number ($version1) >= number ($version2)
137
- }
138
- )
139
- };
140
-
141
- declare
142
- %private
143
- function versions:is-older ($available as xs:string, $installed as xs:string) as xs:boolean {
144
- let $verInstalled := tokenize ($installed, "\." )
145
- let $verAvailable := tokenize ($available, "\." )
105
+ (:~
106
+ : Find packages whose eXist version requirements meet the client's eXist version
107
+ :
108
+ : For example, via app.xqm or list.xq, a client may request the subset of a package's
109
+ : releases that are compatible with eXist 5.3.0. The function examines each release's
110
+ : eXist dependency declarations (if present) and returns all matching packages.
111
+ :)
112
+ declare function versions:find-packages-satisfying-exist-version-requirements (
113
+ $packages as element (package)*,
114
+ $exist-version-semver as xs:string,
115
+ $min-version as xs:string?,
116
+ $max-version as xs:string?
117
+ ) as element (package)* {
118
+ for $package in $packages
119
+ let $satisfies-semver-min-requirement :=
120
+ if (exists ($package/requires/@semver-min)) then
121
+ semver:ge ($exist-version-semver, $package/requires/@semver-min, true ())
122
+ else
123
+ true ()
124
+ let $satisfies-semver-max-requirement :=
125
+ if (exists ($package/requires/@semver-max)) then
126
+ semver:lt ($exist-version-semver, $package/requires/@semver-max, true ())
127
+ else
128
+ true ()
146
129
return
147
- versions:compare-versions (
148
- $verInstalled,
149
- $verAvailable,
150
- function ($version1, $version2) {
151
- number ($version1) <= number ($version2)
152
- }
153
- )
154
- };
155
-
130
+ if ($satisfies-semver-min-requirement and $satisfies-semver-max-requirement) then
131
+ $package
132
+ else
133
+ ()
134
+ };
0 commit comments