@@ -31,23 +31,16 @@ declare function versions:find-compatible-packages(
31
31
$semver-min as xs:string?,
32
32
$semver-max as xs:string?
33
33
) as element (package)* {
34
- for $package in $packages
35
- return
36
- if ($semver) then
37
- versions:find-version ($packages, $semver, $semver)
38
- else if ($version) then
39
- $packages[version = $version]
40
- else if ($semver-min and $semver-max) then
41
- versions:find-version ($packages, $semver-min, $semver-max)
42
- else if
43
- (
44
- $exist-version-semver and
45
- versions:is-newer-or-same ($exist-version-semver, $package/requires/@semver-min) and
46
- versions:is-older-or-same ($exist-version-semver, $package/requires/@semver-max)
47
- ) then
48
- $package
49
- else
50
- ()
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, $semver-min, $semver-max)
42
+ else
43
+ ()
51
44
};
52
45
53
46
(:~
@@ -75,18 +68,6 @@ declare function versions:find-newest-compatible-package(
75
68
=> head ()
76
69
};
77
70
78
- declare
79
- %private
80
- function versions:is-newer-or-same ($version1 as xs:string, $version2 as xs:string?) {
81
- empty ($version2) or semver:ge ($version1, $version2, true ())
82
- };
83
-
84
- declare
85
- %private
86
- function versions:is-older-or-same ($version1 as xs:string, $version2 as xs:string?) {
87
- empty ($version2) or semver:le ($version1, $version2, true ())
88
- };
89
-
90
71
declare
91
72
%private
92
73
function versions:find-version ($packages as element (package)*, $minVersion as xs:string?, $maxVersion as xs:string?) {
@@ -103,15 +84,16 @@ function versions:find-version($packages as element(package)*, $minVersion as xs
103
84
$newest
104
85
else
105
86
let $package := head ($packages)
106
- let $packageVersion := $package/version | $package/@version
87
+ let $packageVersion := ($package/version , $package/@version )[1 ]
88
+ let $newestVersion := ($newest/version , $newest/@version )[1 ]
107
89
let $newer :=
108
90
if (
109
91
(
110
92
empty ($newest) or
111
- versions:is-newer ($packageVersion, ($newest/ version , $newest/@ version ))
93
+ semver:ge ($packageVersion, $newestVersion, true ( ))
112
94
) and
113
- versions:is-newer ($packageVersion, $minVersion) and
114
- versions:is-older ($packageVersion, $maxVersion)
95
+ semver:ge ($packageVersion, $minVersion, true () ) and
96
+ semver:le ($packageVersion, $maxVersion, true () )
115
97
) then
116
98
$package
117
99
else
@@ -120,48 +102,33 @@ function versions:find-version($packages as element(package)*, $minVersion as xs
120
102
versions:find-version (tail ($packages), $minVersion, $maxVersion, $newer)
121
103
};
122
104
123
- declare
124
- %private
125
- function versions:is-newer ($available as xs:string, $installed as xs:string) as xs:boolean {
126
- let $verInstalled := tokenize ($installed, "\." )
127
- let $verAvailable := tokenize ($available, "\." )
128
- return
129
- versions:compare-versions (
130
- $verInstalled,
131
- $verAvailable,
132
- function ($version1, $version2) {
133
- number ($version1) >= number ($version2)
134
- }
135
- )
136
- };
137
-
138
- declare
139
- %private
140
- function versions:is-older ($available as xs:string, $installed as xs:string) as xs:boolean {
141
- let $verInstalled := tokenize ($installed, "\." )
142
- let $verAvailable := tokenize ($available, "\." )
143
- return
144
- versions:compare-versions (
145
- $verInstalled,
146
- $verAvailable,
147
- function ($version1, $version2) {
148
- number ($version1) <= number ($version2)
149
- }
150
- )
151
- };
152
-
153
- declare
154
- %private
155
- function versions:compare-versions ($installed as xs:string*, $available as xs:string*, $compare as function (*)) as xs:boolean {
156
- if (empty ($installed)) then
157
- exists ($available)
158
- else if (empty ($available)) then
159
- false ()
160
- else if (head ($available) = head ($installed)) then
161
- if (count ($available) = 1 and count ($installed) = 1 ) then
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
162
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 ())
163
127
else
164
- versions:compare-versions (tail ($installed), tail ($available), $compare)
165
- else
166
- $compare(head ($available), head ($installed))
128
+ true ()
129
+ return
130
+ if ($satisfies-semver-min-requirement and $satisfies-semver-max-requirement) then
131
+ $package
132
+ else
133
+ ()
167
134
};
0 commit comments