Last active
January 3, 2023 17:50
-
-
Save joewiz/d3316992efcaa5869bf5db8da3be1122 to your computer and use it in GitHub Desktop.
List EXPath Packages installed on an eXist-db system
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
xquery version "3.1"; | |
declare namespace output="http://www.w3.org/2010/xslt-xquery-serialization"; | |
declare namespace pkg="http://expath.org/ns/pkg"; | |
declare option output:method "html"; | |
declare option output:html-version "5.0"; | |
declare option output:media-type "text/html"; | |
declare function local:sort-packages($packages as element(pkg:package)*) as element(pkg:package)* { | |
sort( | |
$packages, | |
"http://www.w3.org/2013/collation/UCA?lang=en", | |
function($package) { $package/pkg:title } | |
) | |
}; | |
let $title := "Packages" | |
let $packages := | |
repo:list() | |
! ( | |
repo:get-resource(., "expath-pkg.xml") | |
=> util:binary-to-string() | |
=> parse-xml() | |
)/pkg:package | |
=> local:sort-packages() | |
return | |
<html> | |
<head> | |
<title>{$title}</title> | |
<meta charset="utf-8"/> | |
<meta name="viewport" content="width=device-width, initial-scale=1"/> | |
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"/> | |
</head> | |
<body> | |
<div class="container"> | |
<h1>{$title}</h1> | |
<p>{count($packages)} packages:</p> | |
<ol>{ | |
$packages! | |
<li> | |
<a href="#{./@abbrev}">{./pkg:title/string()}</a> | |
</li> | |
}</ol> | |
{ | |
for $package in $packages | |
let $title := $package/pkg:title | |
let $dependencies := $package/pkg:dependency | |
let $other-dependencies-on-this-package := | |
$packages/pkg:dependency[@package eq $package/@name] | |
=> local:sort-packages() | |
return | |
<div id="{$package/@abbrev}"> | |
<h2>{$title/string()}</h2> | |
<dl class="row"> | |
<dt class="col-sm-3">Package URI</dt> | |
<dd class="col-sm-9">{$package/@name/string()}</dd> | |
<dt class="col-sm-3">Package abbreviation</dt> | |
<dd class="col-sm-9">{$package/@abbrev/string()}</dd> | |
<dt class="col-sm-3">Installed version</dt> | |
<dd class="col-sm-9">{$package/@version/string()}</dd> | |
<dt class="col-sm-3">Dependencies</dt> | |
<dd class="col-sm-9">{ | |
if ($dependencies) then | |
for $dependency in $dependencies | |
let $name := $dependency/(@package, @processor) | |
let $type := $name/name() | |
let $versions := $dependency/(@version, @semver-min, @semver-max) | |
let $package-dep := $packages[@name eq $name] | |
order by $type descending, $package-dep/pkg:title collation "http://www.w3.org/2013/collation/UCA?lang=en" | |
return | |
<dl class="row"> | |
{ | |
if ($type eq "package") then | |
( | |
<dt class="col-sm-3">Package Title</dt>, | |
<dd class="col-sm-9"><a href="#{$package-dep/@abbrev}">{$package-dep/pkg:title/string()}</a></dd>, | |
<dt class="col-sm-3">Package Abbreviation</dt>, | |
<dd class="col-sm-9">{$package-dep/@abbrev/string()}</dd>, | |
<dt class="col-sm-3">Package URI</dt>, | |
<dd class="col-sm-9">{$name/string()}</dd> | |
) | |
else | |
( | |
<dt class="col-sm-3">Processor Name</dt>, | |
<dd class="col-sm-9">{system:get-product-name()}</dd>, | |
<dt class="col-sm-3">Processor URI</dt>, | |
<dd class="col-sm-9">{$name/string()}</dd> | |
) | |
} | |
<dt class="col-sm-3">Version restriction{ if (count($versions) gt 1) then "s" else () }</dt> | |
<dd class="col-sm-9">{ | |
if ($versions) then | |
for $version in $versions | |
return | |
switch ($version/name()) | |
case "semver-min" return ">=" || $version/string() | |
case "semver-max" return "<" || $version/string() | |
default (: case "version" :) return $version/string() | |
=> string-join(" ") | |
else | |
"n/a" | |
}</dd> | |
<dt class="col-sm-3">Installed version</dt> | |
<dd class="col-sm-9">{ | |
if ($type eq "processor") then | |
system:get-version() | |
else | |
let $package-dep := $packages[@name eq $name] | |
return | |
$package-dep/@version/string() | |
}</dd> | |
</dl> | |
else | |
"n/a" | |
}</dd> | |
<dt class="col-sm-3">Packages with a dependency on this</dt> | |
<dd class="col-sm-9">{ | |
if ($other-dependencies-on-this-package) then | |
for $dependency in $other-dependencies-on-this-package | |
let $package-dep := $dependency/parent::pkg:package | |
order by $package-dep/pkg:title ascending collation "http://www.w3.org/2013/collation/UCA?lang=en" | |
return | |
<dl class="row"> | |
<dt class="col-sm-3">Package Title</dt> | |
<dd class="col-sm-9"><a href="#{$package-dep/@abbrev}">{$package-dep/pkg:title/string()}</a></dd> | |
<dt class="col-sm-3">Package URI</dt> | |
<dd class="col-sm-9">{$package-dep/@name/string()}</dd> | |
<dt class="col-sm-3">Package abbreviation</dt> | |
<dd class="col-sm-9">{$package-dep/@abbrev/string()}</dd> | |
<dt class="col-sm-3">Installed version</dt> | |
<dd class="col-sm-9">{$package-dep/@version/string()}</dd> | |
</dl> | |
else | |
"n/a" | |
}</dd> | |
</dl> | |
</div> | |
} | |
</div> | |
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment