Skip to content

Commit 0b5d3f9

Browse files
authored
Merge pull request #77 from joewiz/complete-semver-xq-migration
2 parents bd2af36 + 9478329 commit 0b5d3f9

File tree

3 files changed

+47
-81
lines changed

3 files changed

+47
-81
lines changed

modules/list.xq

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@ declare namespace output="http://www.w3.org/2010/xslt-xquery-serialization";
1919
declare option output:method "xml";
2020
declare option output:media-type "application/xml";
2121

22-
let $exist-version := request:get-parameter("version", ())
23-
let $basic-semver-regex := "^\d+\.\d+\.\d+-?.*$"
22+
let $exist-version := request:get-parameter("version", $config:default-exist-version)
2423
let $exist-version-semver :=
25-
if (matches($exist-version, $basic-semver-regex)) then
26-
$exist-version
27-
else
24+
if (semver:validate($exist-version)) then
25+
$exist-version
26+
else
2827
$config:default-exist-version
2928
return
3029
element apps {

modules/scan.xqm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ function scanrepo:generate-package-group($packages as element(package)*) {
127127
let $versions := $packages/version
128128
let $version-maps :=
129129
$versions ! map:merge((
130-
map:entry("semver", semver:coerce(.) => semver:serialize()),
130+
map:entry("semver", semver:parse(., true()) => semver:serialize()),
131131
map:entry("version", .)
132132
))
133133
let $sorted-semvers := semver:sort($version-maps?semver) => reverse()

modules/versions.xqm

Lines changed: 42 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,16 @@ declare function versions:find-compatible-packages(
3131
$semver-min as xs:string?,
3232
$semver-max as xs:string?
3333
) 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+
()
5144
};
5245

5346
(:~
@@ -75,18 +68,6 @@ declare function versions:find-newest-compatible-package(
7568
=> head()
7669
};
7770

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-
9071
declare
9172
%private
9273
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
10384
$newest
10485
else
10586
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]
10789
let $newer :=
10890
if (
10991
(
11092
empty($newest) or
111-
versions:is-newer($packageVersion, ($newest/version, $newest/@version))
93+
semver:ge($packageVersion, $newestVersion, true())
11294
) 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())
11597
) then
11698
$package
11799
else
@@ -120,48 +102,33 @@ function versions:find-version($packages as element(package)*, $minVersion as xs
120102
versions:find-version(tail($packages), $minVersion, $maxVersion, $newer)
121103
};
122104

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
162123
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())
163127
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+
()
167134
};

0 commit comments

Comments
 (0)