Skip to content

Commit 6c833c4

Browse files
committed
[feature] Support EXPath Package SemVer Templates
1 parent b0dd0ed commit 6c833c4

File tree

2 files changed

+54
-9
lines changed

2 files changed

+54
-9
lines changed

modules/app.xqm

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import module namespace config="http://exist-db.org/xquery/apps/config" at "conf
1010
import module namespace scanrepo="http://exist-db.org/xquery/admin/scanrepo" at "scan.xqm";
1111
import module namespace versions="http://exist-db.org/apps/public-repo/versions" at "versions.xqm";
1212

13+
import module namespace semver="http://exist-db.org/xquery/semver";
1314
import module namespace templates="http://exist-db.org/xquery/html-templating";
1415

1516
declare namespace request="http://exist-db.org/xquery/request";
@@ -434,10 +435,36 @@ declare function app:requires-to-english($requires as element()) {
434435
concat(" version ", $requires/@version)
435436
else if ($requires/@semver) then
436437
concat(" version ", $requires/@semver)
438+
else if ($requires/@semver-min and $requires/@semver-max) then
439+
concat(
440+
" version ",
441+
if (semver:validate-expath-package-semver-template($requires/@semver-min)) then
442+
semver:serialize-parsed(semver:resolve-expath-package-semver-template-min($requires/@semver-min))
443+
else
444+
$requires/@semver-min,
445+
" or later, and ",
446+
if (semver:validate-expath-package-semver-template($requires/@semver-max)) then
447+
concat("earlier than ", semver:serialize-parsed(semver:resolve-expath-package-semver-template-max($requires/@semver-max)))
448+
else
449+
$requires/@semver-max || "or earlier"
450+
)
437451
else if ($requires/@semver-min) then
438-
concat(" version ", $requires/@semver-min, " or later")
452+
concat(
453+
" version ",
454+
if (semver:validate-expath-package-semver-template($requires/@semver-min)) then
455+
semver:serialize-parsed(semver:resolve-expath-package-semver-template-min($requires/@semver-min))
456+
else
457+
$requires/@semver-min,
458+
" or later"
459+
)
439460
else if ($requires/@semver-max) then
440-
concat(" version ", $requires/@semver-max, " or earlier")
461+
concat(
462+
" version ",
463+
if (semver:validate-expath-package-semver-template($requires/@semver-max)) then
464+
concat("earlier than ", semver:serialize-parsed(semver:resolve-expath-package-semver-template-max($requires/@semver-max)))
465+
else
466+
$requires/@semver-min || "or earlier"
467+
)
441468
else
442469
" version " || $config:default-exist-version
443470
};

modules/versions.xqm

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ declare function versions:find-compatible-packages(
3838
else if ($semver-min and $semver-max) then
3939
versions:find-version($packages, $semver-min, $semver-max)
4040
else if (exists($exist-version-semver)) then
41-
versions:find-packages-satisfying-exist-version-requirements($packages, $exist-version-semver, $semver-min, $semver-max)
41+
versions:find-packages-satisfying-exist-version-requirements($packages, $exist-version-semver)
4242
else
4343
()
4444
};
@@ -105,25 +105,43 @@ function versions:find-version($packages as element(package)*, $minVersion as xs
105105
(:~
106106
: Find packages whose eXist version requirements meet the client's eXist version
107107
:
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.
108+
: @deprecated As of 2.1.3, use the private function versions:find-packages-satisfying-exist-version-requirements#2
111109
:)
112110
declare function versions:find-packages-satisfying-exist-version-requirements(
113111
$packages as element(package)*,
114-
$exist-version-semver as xs:string,
112+
$exist-version-semver as xs:string,
115113
$min-version as xs:string?,
116114
$max-version as xs:string?
115+
) as element(package)* {
116+
versions:find-packages-satisfying-exist-version-requirements($packages, $exist-version-semver)
117+
};
118+
119+
(:~
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.
125+
:)
126+
declare %private function versions:find-packages-satisfying-exist-version-requirements(
127+
$packages as element(package)*,
128+
$exist-version-semver as xs:string
117129
) as element(package)* {
118130
for $package in $packages
119131
let $satisfies-semver-min-requirement :=
120132
if (exists($package/requires/@semver-min)) then
121-
semver:ge($exist-version-semver, $package/requires/@semver-min, true())
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+
)
122137
else
123138
true()
124139
let $satisfies-semver-max-requirement :=
125140
if (exists($package/requires/@semver-max)) then
126-
semver:lt($exist-version-semver, $package/requires/@semver-max, true())
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+
)
127145
else
128146
true()
129147
return

0 commit comments

Comments
 (0)