Skip to content

Instantly share code, notes, and snippets.

@joewiz
Last active January 3, 2023 17:50
Show Gist options
  • Save joewiz/d3316992efcaa5869bf5db8da3be1122 to your computer and use it in GitHub Desktop.
Save joewiz/d3316992efcaa5869bf5db8da3be1122 to your computer and use it in GitHub Desktop.
List EXPath Packages installed on an eXist-db system
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/bootstrap@5.3.0-alpha1/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/bootstrap@5.3.0-alpha1/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