starting new job...
→ running command: dir='/etc/byggsteg/job-clone//lenkesamler/trunk'
branch='trunk'
if ! command -v git >/dev/null 2>&1; then
echo 'byggsteg: git is not on this deployment PATH, so the clone cannot be updated' >&2
exit 1
fi
if ! cd "$dir"; then
echo "byggsteg: cannot enter the clone $dir" >&2
exit 1
fi
root=$(git rev-parse --show-toplevel 2>/dev/null)
if [ "$root" != "$(pwd -P)" ]; then
echo "byggsteg: $dir is not a git checkout; remove it and the next run clones it again" >&2
exit 1
fi
if ! origin=$(git remote get-url origin 2>/dev/null); then
echo "byggsteg: $dir has no origin remote to fetch $branch from" >&2
exit 1
fi
before=$(git rev-parse --short HEAD 2>/dev/null) || before=none
attempt=1
while :; do
if GIT_TERMINAL_PROMPT=0 git fetch --quiet origin "+refs/heads/$branch:refs/remotes/origin/$branch"; then
break
fi
if [ "$attempt" -ge 3 ]; then
echo "byggsteg: could not fetch $branch from $origin after 3 attempts; is the branch still there, and is the remote reachable?" >&2
exit 1
fi
echo "byggsteg: fetching $branch from $origin failed; retrying in $((attempt * 2))s" >&2
sleep $((attempt * 2))
attempt=$((attempt + 1))
done
if ! git checkout --quiet --force -B "$branch" FETCH_HEAD; then
echo "byggsteg: fetched $branch from $origin but could not check it out" >&2
exit 1
fi
after=$(git rev-parse --short HEAD)
if [ "$before" = "$after" ]; then
echo "byggsteg: $branch was already at $after"
else
echo "byggsteg: $branch moved from $before to $after"
fi
byggsteg: trunk moved from 2fe6186 to bf9f9b8
→ running command: cd /etc/byggsteg/job-clone/lenkesamler/trunk && uname -a
Linux wolk-jjba 7.2.11-gnu #1 SMP PREEMPT_DYNAMIC 1 x86_64 GNU/Linux
→ running command: cd /etc/byggsteg/job-clone/lenkesamler/trunk && git log --name-status HEAD^..HEAD
commit bf9f9b85a4565e1b23f12cd7bbc95db4aa99e0f9
Author: Josep Bigorra <jjbigorra@gmail.com>
Date: Wed Nov 4 23:09:17 2026 +0100
docs: Update visual identity
M README.org
A logo.svg
→ running command: cd /etc/byggsteg/job-clone/lenkesamler/trunk && maak test
The following derivation will be built:
/gnu/store/5034a5p4sdr3k2yx5vq6c251qznwas6c-profile.drv
building CA certificate bundle...
listing Emacs sub-directories...
building fonts directory...
building directory of Info manuals...
building profile with 10 packages...
scanning directories for unit tests...
scanning present working directory for unit tests...
shuffled the files with seed 675423767 (replay with VERITAS_SEED=675423767)
found unit tests: (cli-spec.scm json-spec.scm html-spec.scm markdown-spec.scm csv-spec.scm prelude-spec.scm netscape-spec.scm import-json-spec.scm checker-spec.scm xbel-spec.scm import-spec.scm scheme-spec.scm org-spec.scm main-spec.scm)
running unit tests from file: cli-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the terminal reading
[🧪 test] a folder is a name in brackets
[⚙️ assert] the name of the folder is written in brackets
✅ got: [Work]
[⚙️ assert] and its bookmarks are indented under it
✅ got:
Codeberg
[⚙️ assert] and a folder inside it is indented further
✅ got:
[Ops]
Grafana
[🧪 test] a link is its name, its day, its tags and its address
[⚙️ assert] a link is a line of its own, with the day it was added
✅ got: Codeberg added: 2025-01-22 dev | https://codeberg.org/jjba23
[⚙️ assert] a link with no day and no tags is only its name and its address
✅ got: Mastodon | https://mastodon.social
[🧪 test] the tags of a link are said, not listed
[⚙️ assert] two tags are written one after the other
✅ got: dev, calc
[⚙️ assert] and never as the list they are held in
✅ got: (dev calc)
[🧪 test] a list inside the list of bookmarks is read as its bookmarks
[⚙️ assert] a folder built by map is written as the links it holds
✅ got: A | https://a.example
B | https://b.example
[🧪 test] a value that is not a bookmark is refused
[⚙️ assert] a number in a bookmarks file is an error, not a line
✅ success catching error: wrong-type-arg: (throw Wrong type argument in position ~a: ~a (1 unknown data type for bookmark) (unknown data type for bookmark))
ℹ️ info - ran 1 tasks in: 0 seconds, 68584 microseconds
running unit tests from file: json-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the JSON reading
[🧪 test] a folder is a list of its items
[⚙️ assert] the name of the folder
✅ got: Work
[⚙️ assert] and the bookmarks written in it
✅ got: 2
[⚙️ assert] and a folder of it is a folder of the JSON
✅ got: Ops
[🧪 test] a link is its address, its name and what it was given
[⚙️ assert] the address it is reached by
✅ got: https://codeberg.org/jjba23
[⚙️ assert] the name it was given
✅ got: Codeberg
[⚙️ assert] the day it was added
✅ got: 2025-01-22
[⚙️ assert] and its tags, as strings
✅ got: #(dev)
[🧪 test] a link that was given no day and no tags
[⚙️ assert] is written with a day of false
✅ got: #f
[⚙️ assert] and with no tags at all
✅ got: #f
[⚙️ assert] and it is still reached over https
✅ got: https://mastodon.social
[🧪 test] a folder built by map is the bookmarks it holds
[⚙️ assert] a list inside the list of bookmarks is read as its links, in order
✅ got: (A B)
ℹ️ info - ran 1 tasks in: 0 seconds, 68493 microseconds
running unit tests from file: html-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the writer
[🧪 test] a text that holds markup is written as entities
[⚙️ assert] an ampersand in the body of an element
✅ got: <p>a & b</p>
[⚙️ assert] and in an element of a document
✅ got: <p>a & b</p>
[⚙️ assert] and in every element of a document, not only the first
✅ got: x & y<p>a & b</p>
[⚙️ assert] while a writer not asked for it writes the text as it stands
✅ got: <p>a & b</p>
[🧪 test] an attribute is escaped whenever it is written
[⚙️ assert] an address holding a query
✅ got: <a href="x?a=1&b=2">t</a>
[🧪 test] the shape of the markup a browser is handed
[⚙️ assert] an element with no body is closed at once
✅ got: <br />
[⚙️ assert] a bare text is written as it stands
✅ got: plain
[⚙️ assert] the body of an element is written, and then the element closed
✅ got: <div><span>a</span></div>
[🧪 test] a page is read for what it says
[⚙️ assert] the text of a document is its words, without its markup
✅ got: ab
ℹ️ info - ran 1 tasks in: 0 seconds, 86562 microseconds
running unit tests from file: markdown-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the Markdown reading
[🧪 test] a folder is a heading
[⚙️ assert] a folder of the top level is a first-level heading
✅ got: # Work
[⚙️ assert] and a folder inside it is the heading under it
✅ got: ## Ops
[🧪 test] a link is an item of the list
[⚙️ assert] a link is its name, over the address it is reached by
✅ got: - [Codeberg](https://codeberg.org/jjba23)
[⚙️ assert] and a link of the top level is an item as well
✅ got: - [Mastodon](https://mastodon.social)
[🧪 test] a folder built by map is the bookmarks it holds
[⚙️ assert] a list inside the list of bookmarks is read as its links, in order
✅ got:
- [A](https://a.example)
- [B](https://b.example)
ℹ️ info - ran 1 tasks in: 0 seconds, 62453 microseconds
running unit tests from file: csv-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the spreadsheet reading
[🧪 test] a sheet says what its columns are
[⚙️ assert] the first line names the columns
✅ got: folder,name,url,added,tags
[⚙️ assert] a sheet of no bookmarks is still a sheet
✅ got: (folder,name,url,added,tags)
[🧪 test] a link is a row of the sheet
[⚙️ assert] a folder is not a row of its own
✅ got: 4
[⚙️ assert] a link of a folder says which folder it is in
✅ got: Work,Codeberg,https://codeberg.org/jjba23,2025-01-22,dev
[⚙️ assert] a folder inside it is a path of two names
✅ got: Work/Ops,Grafana,https://grafana.test-backend.nl,,
[⚙️ assert] and a link of the top level is in no folder
✅ got: ,Mastodon,https://mastodon.social,,
[🧪 test] a name is written as a field, not as it was typed
[⚙️ assert] a name holding the separator is quoted
✅ got: ,"R&D, notes",https://example.org,,
[⚙️ assert] and the quote characters in a name are doubled
✅ got: "a ""quoted"" read",example.org,https://example.org,,
[⚙️ assert] while a name with nothing to quote is as typed
✅ got: ,Mastodon,https://mastodon.social,,
[🧪 test] the tags of a link are one field of the row
[⚙️ assert] two tags are said one after the other, in the field they share
✅ got: ,N,https://x.example,,"dev, calc"
[🧪 test] a folder built by map is read as the links it holds
[⚙️ assert] a list inside the list of bookmarks is read as its rows, in order
✅ got: (folder,name,url,added,tags ,A,https://a.example,, ,B,https://b.example,,)
ℹ️ info - ran 1 tasks in: 0 seconds, 58740 microseconds
running unit tests from file: prelude-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the prelude
[🧪 test] a link is reached by the scheme it names
[⚙️ assert] every link, with a scheme or without one, becomes the address it asks for
✅ got: ((codeberg.org/jjba23 . https://codeberg.org/jjba23) (www.gnu.org/software/emacs . https://www.gnu.org/software/emacs) (https://example.org . https://example.org) (http://example.org . http://example.org) (ftp://ftp.gnu.org/gnu . ftp://ftp.gnu.org/gnu) (mailto:post@example.org . mailto:post@example.org) (gemini://gemini.circumlunar.space . gemini://gemini.circumlunar.space) (magnet:?xt=urn:btih:0123456789abcdef . magnet:?xt=urn:btih:0123456789abcdef) (MAILTO:post@example.org . MAILTO:post@example.org) (example.org:8080/status . https://example.org:8080/status))
[⚙️ assert] the fallback protocol is the one a run names
✅ got: gemini://example.org
[🧪 test] a link is what it was written as
[⚙️ assert] a link written without a name is named by its address
✅ got: codeberg.org/jjba23
[⚙️ assert] and carries no date
✅ got: #f
[⚙️ assert] and no tags
✅ got: #f
[⚙️ assert] while a named link keeps its name
✅ got: Codeberg
[⚙️ assert] and the day it was added
✅ got: 2025-01-22
[⚙️ assert] and its tags
✅ got: (dev)
[🧪 test] a folder is a name and the bookmarks in it
[⚙️ assert] the name is the one it was given
✅ got: Work
[⚙️ assert] and its items are the bookmarks written in it, in order
✅ got: 2
[⚙️ assert] a folder holds folders
✅ got: #t
[⚙️ assert] and links
✅ got: #t
[🧪 test] a day is read as the instant it names
[⚙️ assert] the first day of the epoch is the epoch
✅ got: 0
[⚙️ assert] and a day the bookmarks of this project are dated with is read as midnight of that day
✅ got: 1737504000
[⚙️ assert] while a date that is not a date is refused rather than guessed
✅ got: #t;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;; or pass the --no-auto-compile argument to disable.
;;; compiling ./test/veritas/unit/cli-spec.scm
;;; compiling ./src/lenkesamler/prelude.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/prelude.scm.go
;;; compiling ./src/lenkesamler/renderer/cli.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/cli.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/cli-spec.scm.go
;;; compiling ./test/veritas/unit/json-spec.scm
;;; compiling ./src/lenkesamler/renderer/json.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/json.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/json-spec.scm.go
;;; compiling ./test/veritas/unit/html-spec.scm
;;; compiling ./src/lenkesamler/html.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/html.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/html-spec.scm.go
;;; compiling ./test/veritas/unit/markdown-spec.scm
;;; compiling ./src/lenkesamler/renderer/markdown.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/markdown.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/markdown-spec.scm.go
;;; compiling ./test/veritas/unit/csv-spec.scm
;;; compiling ./src/lenkesamler/renderer/csv.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/csv.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/csv-spec.scm.go
;;; compiling ./test/veritas/unit/prelude-spec.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/prelude-spec.scm.go
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
;;; compiling ./test/veritas/unit/netscape-spec.scm
;;; compiling ./src/lenkesamler/renderer/netscape.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/netscape.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/netscape-spec.scm.go
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
;;; compiling ./test/veritas/unit/import-json-spec.scm
;;; compiling ./src/lenkesamler/importer.scm
;;; compiling ./src/lenkesamler/importer/json.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/json.scm.go
;;; compiling ./src/lenkesamler/importer/netscape.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/netscape.scm.go
;;; compiled
[🧪 test] a list of lists is read as the bookmarks it holds
[⚙️ assert] flattening keeps folders, and the links of every list in order
✅ got: (#<url-record link: "a.example" name: "a.example" added: #f tags: #f> #<dir-record name: "Work" urls: (#<url-record link: "a.example" name: "a.example" added: #f tags: #f>)> #<url-record link: "a.example" name: "a.example" added: #f tags: #f>)
[⚙️ assert] and an empty list holds nothing
✅ got: ()
ℹ️ info - ran 1 tasks in: 0 seconds, 75101 microseconds
running unit tests from file: netscape-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the file a browser imports
[🧪 test] a link is a line of the list
[⚙️ assert] a file holding one link is the format's head, the link and the format's tail
✅ got: <!DOCTYPE NETSCAPE-Bookmark-file-1><META http-equiv="Content-Type" content="text/html; charset=UTF-8" /><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1>
<DL><P>
<DT><A HREF="https://codeberg.org/jjba23">Codeberg</A>
</DL><P>
[⚙️ assert] the day a link was added is the instant that day began
✅ got: <!DOCTYPE NETSCAPE-Bookmark-file-1><META http-equiv="Content-Type" content="text/html; charset=UTF-8" /><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1>
<DL><P>
<DT><A HREF="https://codeberg.org/jjba23" ADD_DATE="1737504000">Codeberg</A>
</DL><P>
[🧪 test] a folder is a list inside the list
[⚙️ assert] a folder is named by an H3 and holds a list of its own
✅ got: <!DOCTYPE NETSCAPE-Bookmark-file-1><META http-equiv="Content-Type" content="text/html; charset=UTF-8" /><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1>
<DL><P>
<DT><H3>Work</H3><DL><P>
<DT><A HREF="https://codeberg.org/jjba23">Codeberg</A><P></DL>
</DL><P>
[⚙️ assert] and a folder may hold a folder
✅ got: <!DOCTYPE NETSCAPE-Bookmark-file-1><META http-equiv="Content-Type" content="text/html; charset=UTF-8" /><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1>
<DL><P>
<DT><H3>Work</H3><DL><P>
<DT><H3>Ops</H3><DL><P>
<DT><A HREF="https://grafana.test-backend.nl">Grafana</A><P></DL><P></DL>
</DL><P>
[🧪 test] a name is text of the document, not markup of it
[⚙️ assert] an ampersand and an angle bracket in a name are entities
✅ got: R&D <notes>
[⚙️ assert] and the name is never written to the file as it was typed
✅ got: R&D <notes>
[⚙️ assert] while the markup the format's own glue is made of is written as it stands
✅ got: <DL><P>
[🧪 test] an address is reached by the scheme it names
[⚙️ assert] a mail address stays a mail address
✅ got: HREF="mailto:post@example.org"
[⚙️ assert] and a link written without a scheme is reached over https
✅ got: HREF="https://mastodon.social"
[⚙️ assert] and a query in an address is escaped as the attribute it is written in
✅ got: HREF="https://example.org/search?a=1&b=2"
[🧪 test] a folder built by map is the links it holds
[⚙️ assert] a list inside the list of bookmarks is read as its links, in order
✅ got: <!DOCTYPE NETSCAPE-Bookmark-file-1><META http-equiv="Content-Type" content="text/html; charset=UTF-8" /><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1>
<DL><P>
<DT><A HREF="https://prod.example">Prod</A>
<DT><A HREF="https://test.example">Test</A>
</DL><P>
ℹ️ info - ran 1 tasks in: 0 seconds, 55663 microseconds
running unit tests from file: import-json-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] reading a JSON bookmarks document
[🧪 test] the document this project writes is the document it reads
[⚙️ assert] every folder, link, name, day and tag comes back
✅ got: (#<dir-record name: "Work" urls: (#<url-record link: "https://codeberg.org/jjba23" name: "Codeberg" added: "2025-01-22" tags: (dev)> #<dir-record name: "Ops" urls: (#<url-record link: "https://grafana.test-backend.nl" name: "Grafana" added: #f tags: #f>)>)> #<url-record link: "https://mastodon.social" name: "Mastodon" added: #f tags: #f>)
[🧪 test] a bare list of bookmarks is a document too
[⚙️ assert] a list, with no object around it, is read as the bookmarks it holds
✅ got: (#<url-record link: "a.example" name: "A" added: #f tags: #f>)
[🧪 test] a link with no day is a link with no day
[⚙️ assert] the `false' a document writes says nothing, and that is what is read
✅ got: (#<url-record link: "x.example" name: "X" added: #f tags: #f>)
[🧪 test] a tag written as a string is a tag as a bookmarks file writes it
[⚙️ assert] the tags come back as symbols
✅ got: (dev calc)
[🧪 test] a document of no bookmarks is a file of no bookmarks
[⚙️ assert] an empty list of entries is read as none
✅ got: ()
[🧪 test] the reader is chosen by what the file holds
[⚙️ assert] a JSON document is read as JSON, whatever white space comes first
✅ got: (#<url-record link: "a.example" name: "A" added: #f tags: #f>)
[⚙️ assert] and a browser's file is read as the file a browser wrote
✅ got: Work
[⚙️ assert] with the folders a browser kept
✅ got: Ops & friends
[🧪 test] a JSON document that holds no bookmarks is named as a mistake
[⚙️ assert] an object naming something other than bookmarks
✅ success catching error: misc-error: (#f lenkesamler: this JSON is not a list of bookmarks ~S (-- expected an object holding `bookmarks', or a list of them) #f)
ℹ️ info - ran 1 tasks in: 0 seconds, 80112 microseconds
running unit tests from file: checker-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] checking the links of a file
[🧪 test] a link that answers is a link that is there
[⚙️ assert] a 200 is ok
✅ got: ok
[⚙️ assert] and what it answered is said
✅ got: 200
[⚙️ assert] anything a server calls fine is ok
✅ got: ok
[🧪 test] a link that answers elsewhere has moved
[⚙️ assert] a redirect is not a failure
✅ got: moved
[⚙️ assert] and where it leads now is said
✅ got: 301 -> https://d.example
[🧪 test] a refusal is the answer
[⚙️ assert] a 404 is a link that is gone
✅ got: broken
[⚙️ assert] and the code is said
✅ got: 404
[⚙️ assert] a server that fails is a link gone as well
✅ got: broken
[⚙️ assert] and a file holding one is a failure
✅ got: #t
[🧪 test] a silence is no answer
[⚙️ assert] a server that cannot be reached is an error
✅ got: error
[⚙️ assert] and why it could not be reached is said
✅ got: getaddrinfo-error: Name or service not known
[⚙️ assert] which is a failure, as a refusal is
✅ got: #t
[🧪 test] the report says what it found
[⚙️ assert] one line per link, in the order the file holds them, and a count
✅ got: checked 3 links
ok https://a.example (200)
moved https://b.example (301 -> https://d.example)
broken https://c.example (404)
1 ok, 1 moved, 1 broken, 0 error, 0 skipped
[🧪 test] a file of no links is checked, and finds nothing
[⚙️ assert] the report says it checked nothing
✅ got: checked 0 links
0 ok, 0 moved, 0 broken, 0 error, 0 skipped
[🧪 test] a file of live links is not a failure
[⚙️ assert] a moved link is not a failure either
✅ got: #f
[🧪 test] a folder is walked, and an address is asked once
[⚙️ assert] a link inside a folder is checked, and a repeated address once
✅ got: (https://dup.example https://nested.example)
[🧪 test] a link that is not a page is skipped
[⚙️ assert] an address no web server answers is skipped
✅ got: skipped
[⚙️ assert] and the report says why
✅ got: not a web address
[⚙️ assert] it is not a failure, so a file holding one is fine
✅ got: #f
[⚙️ assert] and it is said in the report like any other link
✅ got: checked 1 link
skipped mailto:post@example.org (not a web address)
0 ok, 0 moved, 0 broken, 0 error, 1 skipped
ℹ️ info - ran 1 tasks in: 0 seconds, 43131 microseconds
running unit tests from file: xbel-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the XBEL reading
[🧪 test] the document says what it is
[⚙️ assert] it begins with the XML declaration
✅ got: #t
[⚙️ assert] and a doctype naming the language
✅ got: <!DOCTYPE xbel PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML" "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
[⚙️ assert] the root is xbel, at version 1.0
✅ got: <xbel version="1.0">
[⚙️ assert] and the root is closed, on a line of its own
✅ got: #t
[🧪 test] a folder is an element holding what it holds
[⚙️ assert] a folder is named by its title child
✅ got: <folder><title>Work</title>
[⚙️ assert] a link inside it is nested one level further, with its address and name
✅ got: <bookmark href="https://codeberg.org/jjba23" added="2025-01-22"><title>Codeberg</title></bookmark>
[⚙️ assert] a folder inside a folder is nested again, not listed beside it
✅ got: <folder><title>Ops</title>
[⚙️ assert] and a folder is closed on a line of its own
✅ got: </folder>
[🧪 test] a link says where it leads and what it is called
[⚙️ assert] a link written without a scheme is a page
✅ got: <bookmark href="https://grafana.test-backend.nl"><title>Grafana</title></bookmark>
[⚙️ assert] a link that names its own scheme keeps it
✅ got: href="mailto:post@example.org"
[⚙️ assert] a link with no day is given no `added', rather than an empty one
✅ got: added
[⚙️ assert] a link named by its own address is titled with it
✅ got: <title>example.org</title>
[🧪 test] a name is text, not markup
[⚙️ assert] an ampersand in a name is escaped
✅ got: <title>R&D <notes></title>
[🧪 test] a reader of XML reads the file
[⚙️ assert] the document parses to the folders and links it was written from
✅ got: (*TOP* (*PI* xml version="1.0" encoding="UTF-8") (xbel (@ (version 1.0)) (folder (title Work) (bookmark (@ (href https://codeberg.org/jjba23) (added 2025-01-22)) (title Codeberg)) (folder (title Ops) (bookmark (@ (href https://grafana.test-backend.nl)) (title Grafana)))) (bookmark (@ (href https://example.org)) (title R&D <notes>))))
[🧪 test] a document of no bookmarks is still a document
[⚙️ assert] the file parses to an empty xbel
✅ got: (*TOP* (*PI* xml version="1.0" encoding="UTF-8") (xbel (@ (version 1.0))))
ℹ️ info - ran 1 tasks in: 0 seconds, 110824 microseconds
running unit tests from file: import-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the file a browser wrote
[🧪 test] a folder is the folder a browser wrote
[⚙️ assert] the folder of the file, by its name
✅ got: Work
[⚙️ assert] and the folder written inside it
✅ got: Ops & friends
[⚙️ assert] the top level is the two folders and the links
✅ got: (dir url url)
[🧪 test] a link is the link a browser wrote
[⚙️ assert] the address it was written with
✅ got: https://codeberg.org/jjba23
[⚙️ assert] the name it was written under
✅ got: Codeberg
[⚙️ assert] and the day it was added, read as a day
✅ got: 2025-01-22
[🧪 test] the entities of HTML are read back
[⚙️ assert] an ampersand in a folder's name
✅ got: Ops & friends
[⚙️ assert] an angle bracket in a link's name
✅ got: R&D <notes>
[⚙️ assert] and an ampersand in a query, which is no entity
✅ got: http://example.org/search?a=1&b=2
[⚙️ assert] an address with no day was given none
✅ got: #f
[⚙️ assert] a folder holding only a link holds that link
✅ got: #t
[🧪 test] the tags a browser kept are kept
[⚙️ assert] a link a browser tagged is tagged here
✅ got: (dev search)
[⚙️ assert] and a link it did not tag is not
✅ got: #f
[🧪 test] an address that names its own scheme keeps it
[⚙️ assert] a mail address is a mail address
✅ got: mailto:post@example.org
[⚙️ assert] and a day of zero is the day it names, not no day
✅ got: 1970-01-01
[🧪 test] a file with no bookmarks in it holds none
[⚙️ assert] an empty file
✅ got: ()
[⚙️ assert] and a file that never opens a list
✅ got: ()
[⚙️ assert] a comment whose own text holds a bracket ends nothing
✅ got: https://x.example
[🧪 test] what a browser wrote becomes a bookmarks file
[⚙️ assert] the folder a browser wrote is a folder here
✅ got: (dir "Work"
[⚙️ assert] and the folder inside it is inside it
✅ got: (dir "Ops & friends"
[⚙️ assert] and the tags a browser kept are tags here
✅ got: #:tags '(dev search)
[🧪 test] a bookmarks file read back is the file it wrote
[⚙️ assert] the file this project exports is the file it imports
✅ got: (#<dir-record name: "Work" urls: (#<url-record link: "https://codeberg.org/jjba23" name: "Codeberg" added: "2025-01-22" tags: (dev)> #<dir-record name: "Ops" urls: (#<url-record link: "https://grafana.test-backend.nl" name: "Grafana" added: #f tags: #f>)>)> #<url-record link: "mailto:post@example.org" name: "Write to the list" added: #f tags: #f> #<url-record link: "https://example.org" name: "https://example.org" added: #f tags: #f>)
[🧪 test] a file holds addresses, and an address is what is given back
[⚙️ assert] a link written without a scheme comes back with the one a browser follows
✅ got: https://example.org
ℹ️ info - ran 1 tasks in: 0 seconds, 40227 microseconds
running unit tests from file: scheme-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] the file written back
[🧪 test] what is written is a bookmarks file
[⚙️ assert] the module a bookmarks file defines
✅ got: (define-module (lenkesamler bookmarks)
[⚙️ assert] and the list it is read from
✅ got: (define lenkesamler-bookmarks
[⚙️ assert] and the link it holds
✅ got: (url "mastodon.social" #:name "Mastodon")
[🧪 test] a name equal to the link is not written twice
[⚙️ assert] a link named by its address stays one form
✅ got: (url "example.org")
[⚙️ assert] with no name written beside it
✅ got: #:name
[🧪 test] a value is written as the value it is
[⚙️ assert] a name holding a quote is a string, quoted
✅ got: "a \"quoted\" read"
[⚙️ assert] and a character outside ASCII is itself
✅ got: 🌐 REST
[🧪 test] the file that is written is the file that is read
[⚙️ assert] loading the written file gives back the bookmarks it was written from
✅ got: (#<dir-record name: "Work" urls: (#<url-record link: "codeberg.org/jjba23" name: "Codeberg" added: "2025-01-22" tags: (dev)> #<dir-record name: "Ops" urls: (#<url-record link: "grafana.test-backend.nl" name: "Grafana" added: #f tags: #f>)>)> #<url-record link: "mastodon.social" name: "Mastodon" added: #f tags: #f> #<url-record link: "example.org" name: "example.org" added: #f tags: #f>)
[⚙️ assert] and writing what was read gives the same source again
✅ got: ;;; Lenkesamler bookmarks.
;; Written by lenkesamler: a bookmarks file, to be edited by hand.
(define-module (lenkesamler bookmarks)
#:declarative? #t
#:use-module (lenkesamler prelude))
(define lenkesamler-bookmarks
(list
(dir "Work"
(url "codeberg.org/jjba23" #:name "Codeberg" #:added "2025-01-22" #:tags '(dev))
(dir "Ops"
(url "grafana.test-backend.nl" #:name "Grafana")))
(url "mastodon.social" #:name "Mastodon")
(url "example.org")))
[🧪 test] a file with no bookmarks in it is still a file
[⚙️ assert] reading it gives no bookmarks
✅ got: ()
ℹ️ info - ran 1 tasks in: 0 seconds, 231163 microseconds
running unit tests from file: org-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)/root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/import-json-spec.scm.go
;;; compiling ./test/veritas/unit/checker-spec.scm
;;; compiling ./src/lenkesamler/checker.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/checker.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/checker-spec.scm.go
;;; compiling ./test/veritas/unit/xbel-spec.scm
;;; compiling ./src/lenkesamler/renderer/xbel.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/xbel.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/xbel-spec.scm.go
;;; compiling ./test/veritas/unit/import-spec.scm
;;; compiling ./src/lenkesamler/renderer/scheme.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/scheme.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/import-spec.scm.go
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
warning: mutating the process environment while multiple threads are running;
further behavior unspecified.
;;; compiling ./test/veritas/unit/scheme-spec.scm
WARNING: Use of `load' in declarative module (veritas unit scheme-spec). Add #:declarative? #f to your define-module invocation.
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/scheme-spec.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/written-bookmarks.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/written-bookmarks.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/written-bookmarks.scm
;;; WARNING: compilation of /etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/written-bookmarks.scm failed:
;;; thunk may only be entered once: #<procedure 7f0cd9a71400 at system/base/compile.scm:66:5 ()>
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/written-bookmarks.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/written-bookmarks.scm.go
;;; compiling ./test/veritas/unit/org-spec.scm
;;; compiling ./src/lenkesamler/renderer/org.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/org.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/org-spec.scm.go
;;; compiling ./test/veritas/unit/main-spec.scm
;;; compiling ./src/lenkesamler/main.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/main.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/veritas/unit/main-spec.scm.go
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/bookmarks.scm
output mode: cli
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm.go
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/bookmarks.scm
output mode: cli
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm
;;; WARNING: compilation of /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm failed:
;;; thunk may only be entered once: #<procedure 7f0cdad2d880 at system/base/compile.scm:66:5 ()>
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/bookmarks.scm
output mode: netscape
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm.go
lenkesamler: wrote reports/spec/links.html
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/bookmarks.scm
output mode: netscape
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm
;;; WARNING: compilation of /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm failed:
;;; thunk may only be entered once: #<procedure 7f0cdb313480 at system/base/compile.scm:66:5 ()>
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/bookmarks.scm
output mode: cli
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm.go
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/no-such-file.scm
output mode: cli
---------------------------------------------------------
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/bookmarks.scm
output mode: cli
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm.go
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/browser-bookmarks.html
output mode: scheme
---------------------------------------------------------
lenkesamler: wrote reports/spec/imported-bookmarks.scm
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: reports/spec/imported-bookmarks.scm
output mode: cli
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/imported-bookmarks.scm
;;; WARNING: compilation of /etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/imported-bookmarks.scm failed:
;;; thunk may only be entered once: #<procedure 7f0cd9ab1800 at system/base/compile.scm:66:5 ()>
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading:
+----------------------------------------------+
[📑 suite] the Org mode reading
[🧪 test] a folder is a heading
[⚙️ assert] a folder of the top level is a first-level heading
✅ got: * Work
[⚙️ assert] and a folder inside it is the heading under it
✅ got: ** Ops
[🧪 test] a link is an item of the list
[⚙️ assert] a link is the address it is reached by, then its name
✅ got: - [[https://codeberg.org/jjba23][Codeberg]]
[⚙️ assert] and a link of the top level is an item as well
✅ got: - [[https://mastodon.social][Mastodon]]
[🧪 test] a folder built by map is the bookmarks it holds
[⚙️ assert] a list inside the list of bookmarks is read as its links, in order
✅ got:
- [[https://a.example][A]]
- [[https://b.example][B]]
ℹ️ info - ran 1 tasks in: 0 seconds, 55762 microseconds
running unit tests from file: main-spec.scm, entrypoint: spec
ℹ️ info - shuffled with seed 675423767 (replay with VERITAS_SEED=675423767)
+----------------------------------------------+
[📑 suite] a run of lenkesamler
[🧪 test] a bookmarks file is read from where the run stands
[⚙️ assert] the bookmarks of the file are the document
✅ got: Codeberg
[⚙️ assert] and so are the folders of the file
✅ got: [Work]
[🧪 test] the report of a run is not the document
[⚙️ assert] what the run says about itself is not written to the document
✅ got: Lenkesamler: Your bookmark manager
[🧪 test] a destination is the file the document is written to
[⚙️ assert] nothing is written to the standard output
✅ got:
[⚙️ assert] the document is written to the file, in the directory it names
✅ got: #t
[⚙️ assert] and the file holds the document the run prints without one
✅ got: <!DOCTYPE NETSCAPE-Bookmark-file-1><META http-equiv="Content-Type" content="text/html; charset=UTF-8" /><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1>
<DL><P>
<DT><H3>Work</H3><DL><P>
<DT><A HREF="https://codeberg.org/jjba23" ADD_DATE="1737500400" TAGS="dev">Codeberg</A>
<DT><H3>Ops</H3><DL><P>
<DT><A HREF="https://grafana.test-backend.nl">Grafana</A><P></DL><P></DL>
<DT><A HREF="mailto:post@example.org">Write to the list</A>
<DT><A HREF="https://example.org/search?a=1&b=2">R&D <notes></A>
<DT><H3>Ops prod</H3><DL><P>
<DT><A HREF="https://grafana.prod-backend.nl">Grafana</A><P></DL>
<DT><H3>Ops test</H3><DL><P>
<DT><A HREF="https://grafana.test-backend.nl">Grafana</A><P></DL>
</DL><P>
[⚙️ assert] a name that is markup is escaped in the file a browser imports
✅ got: R&D <notes>
[🧪 test] a mode is the document it names
[⚙️ assert] markdown is md and commonmark
✅ got:
# Work
- [Codeberg](https://codeberg.org/jjba23)
## Ops
- [Grafana](https://grafana.test-backend.nl)
- [Write to the list](mailto:post@example.org)
- [R&D <notes>](https://example.org/search?a=1&b=2)
# Ops prod
- [Grafana](https://grafana.prod-backend.nl)
# Ops test
- [Grafana](https://grafana.test-backend.nl)
[⚙️ assert] and netscape is browser and web
✅ got: <!DOCTYPE NETSCAPE-Bookmark-file-1><META http-equiv="Content-Type" content="text/html; charset=UTF-8" /><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1>
<DL><P>
<DT><H3>Work</H3><DL><P>
<DT><A HREF="https://codeberg.org/jjba23" ADD_DATE="1737500400" TAGS="dev">Codeberg</A>
<DT><H3>Ops</H3><DL><P>
<DT><A HREF="https://grafana.test-backend.nl">Grafana</A><P></DL><P></DL>
<DT><A HREF="mailto:post@example.org">Write to the list</A>
<DT><A HREF="https://example.org/search?a=1&b=2">R&D <notes></A>
<DT><H3>Ops prod</H3><DL><P>
<DT><A HREF="https://grafana.prod-backend.nl">Grafana</A><P></DL>
<DT><H3>Ops test</H3><DL><P>
<DT><A HREF="https://grafana.test-backend.nl">Grafana</A><P></DL>
</DL><P>
[⚙️ assert] and scheme is scm
✅ got: ;;; Lenkesamler bookmarks.
;; Written by lenkesamler: a bookmarks file, to be edited by hand.
(define-module (lenkesamler bookmarks)
#:declarative? #t
#:use-module (lenkesamler prelude))
(define lenkesamler-bookmarks
(list
(dir "Work"
(url "codeberg.org/jjba23" #:name "Codeberg" #:added "2025-01-22" #:tags '(dev))
(dir "Ops"
(url "grafana.test-backend.nl" #:name "Grafana")))
(url "mailto:post@example.org" #:name "Write to the list")
(url "example.org/search?a=1&b=2" #:name "R&D <notes>")
(dir "Ops prod"
(url "grafana.prod-backend.nl" #:name "Grafana"))
(dir "Ops test"
(url "grafana.test-backend.nl" #:name "Grafana"))))
[⚙️ assert] and a folder built by map is read, whatever the mode
✅ got: Grafana | https://grafana.prod-backend.nl
[⚙️ assert] and xbel is an XML document
✅ got: <xbel version="1.0">
[🧪 test] a mode nobody knows is named as a mistake
[⚙️ assert] there is no SQLite mode yet
✅ success catching error: misc-error: (#f lenkesamler: unknown output mode ~S ~S ~S (sqlite -- expected one of: (cli csv json org markdown md commonmark netscape browser web scheme scm xbel)) #f)
[🧪 test] a bookmarks file that is not there is named as a mistake
[⚙️ assert] a path a run cannot read is said so
✅ success catching error: misc-error: (#f ~A ~S (lenkesamler: no bookmarks file at test/fixtures/no-such-file.scm) #f)
[🧪 test] a file with no lenkesamler-bookmarks in it is named as a mistake
[⚙️ assert] asking for a setting the file does not define says which one
✅ success catching error: misc-error: (#f lenkesamler: no such setting in the bookmarks file ~S ~S (lenkesamler-bookmarks-typo -- a bookmarks file must define the module (lenkesamler bookmarks) and, in it, a lenkesamler-bookmarks list) #f)
[🧪 test] a browser's bookmarks file is imported as a bookmarks file
[⚙️ assert] a run that imports writes a file and prints nothing
✅ got:
[⚙️ assert] the file it wrote is there
✅ got: #t
[⚙️ assert] and what it wrote is a bookmarks file of this project
✅ got: (define lenkesamler-bookmarks
[⚙️ assert] the folder a browser wrote is a folder here
✅ got: [Work]
[⚙️ assert] and the link inside it is the link it was
✅ got: https://codeberg.org/jjba23
[⚙️ assert] and the folder inside the folder keeps its name
✅ got: [Ops & friends]
[🧪 test] a JSON bookmarks file is imported as a bookmarks file
[⚙️ assert] a run that imports writes a file
✅ got:
[⚙️ assert] the folder a JSON document held is a folder here
✅ got: [Work]
[⚙️ assert] with the folder inside it
✅ got: [Ops]
[⚙️ assert] and the link leads where it did
✅ got: https://codeberg.org/jjba23test/fixtures/bookmarks.json
output mode: scheme
---------------------------------------------------------
lenkesamler: wrote reports/spec/imported-json-bookmarks.scm
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: reports/spec/imported-json-bookmarks.scm
output mode: cli
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/imported-json-bookmarks.scm
;;; WARNING: compilation of /etc/byggsteg/job-clone/lenkesamler/trunk/reports/spec/imported-json-bookmarks.scm failed:
;;; thunk may only be entered once: #<procedure 7f0cde6e3700 at system/base/compile.scm:66:5 ()>
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/bookmarks.scm
output mode: cli
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/bookmarks.scm.go
---------------------------------------------------------
Lenkesamler: Your bookmark manager and sync tool powered by Lisp
reading: test/fixtures/offline-bookmarks.scm
checking every link
---------------------------------------------------------
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/offline-bookmarks.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.7/etc/byggsteg/job-clone/lenkesamler/trunk/test/fixtures/offline-bookmarks.scm.go
[⚙️ assert] and the tags came with it, as a file writes them
✅ got: #:tags '(dev)
[🧪 test] a check is a report, not a document
[⚙️ assert] a run that checks prints its report
✅ got: checked 2 links
[⚙️ assert] a link that is not a page is said to be skipped, and not to be gone
✅ got: skipped mailto:post@example.org (not a web address)
[⚙️ assert] an address written twice is reported once
✅ got: 0 ok, 0 moved, 0 broken, 0 error, 2 skipped
[⚙️ assert] a run that checks takes no mode, because it writes no document
✅ success catching error: misc-error: (#f lenkesamler: --check reports on the links of a file ~S ~S (cli -- it writes no document, so it takes no --mode) #f)
[🧪 test] a run reads one file, and is told which
[⚙️ assert] a run given both a bookmarks file and a browser's file
✅ success catching error: misc-error: (#f lenkesamler: a run reads one file ~S ~S ~S (test/fixtures/bookmarks.scm test/fixtures/browser-bookmarks.html -- name --file or --import, not both) #f)
[⚙️ assert] a run given no file at all
✅ success catching error: misc-error: (#f lenkesamler: no bookmarks to read ~S (-- name a bookmarks file with --file, or a browser's bookmarks file with --import) #f)
ℹ️ info - ran 1 tasks in: 1 seconds, 47937 microseconds
finished running tests
--------------------------------------------------------------
Maak 0.14.0: the infinitely extensible command runner
Loading tasks from Maak file: /etc/byggsteg/job-clone/lenkesamler/trunk/maak.scm
Executing Maak tasks: test
--------------------------------------------------------------
=> Running Maak task: test
Run the project's test suite.
The specs live under test/veritas/unit, which is where the runner looks for a
suite -- the test root ./test, the module prefix `veritas' and the suite name
`unit' -- and it is also what their own `(veritas unit ...)' module names
resolve to on the load path below, next to this project's own sources.
The run names the locale it reads in instead of inheriting one, and names it
before the runner is asked: Guile reads a page by the locale in force, and this
suite reads documents that hold more than ASCII -- a bookmark named `R&D', a
title in another script. `C.UTF-8' is that name for a machine that has never
generated a locale, which is what a container, a service and this project's own
continuous integration are. The suite sets the clock it reads dates by itself,
so the machine's timezone is not a part of the reading.
The specs are compiled every run rather than read from a cache. A compiled
spec outlives the library it was compiled against -- Guile decides a compiled
file is still good by the spec's own text, and not by the macros that text was
compiled with -- so a spec compiled before `(veritas veritas)' changed shape is
loaded afterwards as if it still had the old one, which reads as a failure
inside this project. Compiling from source costs a few seconds and makes the
reading depend on the specs alone, which is what a suite run to judge a change
has to be.
Executing: guix time-machine --channels=channels.scm -- shell -m manifest.scm -- guile --fresh-auto-compile -L ./src -L . -L ./test -c '(begin (setlocale LC_ALL "C.UTF-8") (use-modules (veritas runner)) (run-tests))'
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/maak.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/maak.scm.go
;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;; or pass the --no-auto-compile argument to disable.
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/maak.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/maak.scm.go
→ running command: cd /etc/byggsteg/job-clone/lenkesamler/trunk && sudo maak deploy
--------------------------------------------------------------
Maak 0.14.0: the infinitely extensible command runner
Loading tasks from Maak file: /etc/byggsteg/job-clone/lenkesamler/trunk/maak.scm
Executing Maak tasks: deploy
--------------------------------------------------------------
=> Running Maak task: deploy
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/checker.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/checker.scm.go
;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;; or pass the --no-auto-compile argument to disable.
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/checker.scm
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/prelude.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/prelude.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/prelude.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/prelude.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/checker.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/html.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/html.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/html.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/html.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer.scm
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/json.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/json.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/json.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/json.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/netscape.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/netscape.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/netscape.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer/netscape.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/importer.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/main.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/main.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/main.scm
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/cli.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/cli.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/cli.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/cli.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/csv.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/csv.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/csv.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/csv.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/org.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/org.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/org.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/org.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/netscape.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/netscape.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/netscape.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/netscape.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/json.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/json.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/json.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/json.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/markdown.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/markdown.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/markdown.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/markdown.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/scheme.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/scheme.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/scheme.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/scheme.scm.go
;;; note: source file /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/xbel.scm
;;; newer than compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/xbel.scm.go
;;; compiling /etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/xbel.scm
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/renderer/xbel.scm.go
;;; compiled /root/.cache/guile/ccache/3.0-LE-8-4.6/etc/byggsteg/job-clone/lenkesamler/trunk/src/lenkesamler/main.scm.go
API documentation saved to doc/api
index.texi:163: warning: @end should only appear at the beginning of a line
index.texi:602: warning: @end should only appear at the beginning of a line
index.texi:619: warning: @end should only appear at the beginning of a line
index.texi: warning: must specify a title with a title command or @top
Executing: guix time-machine --channels=channels.scm -- shell -m manifest.scm -- documenta api ./src/lenkesamler
Executing: guix time-machine --channels=channels.scm -- shell -m manifest.scm -- texi2any -v --html --css-ref=https://jointhefreeworld.org/static/css/jointhefreeworld.css ./doc/api/index.texi
renamed './index' -> './doc/api-dist'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/API.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fchecker.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fhtml.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fimporter_005fjson.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fimporter_005fnetscape.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fimporter.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fmain.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fprelude.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fcli.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fcsv.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fjson.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fmarkdown.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fnetscape.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005forg.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fscheme.html'
removed '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fxbel.html'
removed directory '/srv/http/jointhefreeworld.org/api-docs/lenkesamler'
mkdir: created directory '/srv/http/jointhefreeworld.org/api-docs/lenkesamler'
renamed 'doc/api-dist/API.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/API.html'
renamed 'doc/api-dist/lenkesamler_005fchecker.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fchecker.html'
renamed 'doc/api-dist/lenkesamler_005fhtml.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fhtml.html'
renamed 'doc/api-dist/lenkesamler_005fimporter_005fjson.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fimporter_005fjson.html'
renamed 'doc/api-dist/lenkesamler_005fimporter_005fnetscape.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fimporter_005fnetscape.html'
renamed 'doc/api-dist/lenkesamler_005fimporter.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fimporter.html'
renamed 'doc/api-dist/lenkesamler_005fmain.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fmain.html'
renamed 'doc/api-dist/lenkesamler_005fprelude.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005fprelude.html'
renamed 'doc/api-dist/lenkesamler_005frenderer_005fcli.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fcli.html'
renamed 'doc/api-dist/lenkesamler_005frenderer_005fcsv.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fcsv.html'
renamed 'doc/api-dist/lenkesamler_005frenderer_005fjson.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fjson.html'
renamed 'doc/api-dist/lenkesamler_005frenderer_005fmarkdown.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fmarkdown.html'
renamed 'doc/api-dist/lenkesamler_005frenderer_005fnetscape.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fnetscape.html'
renamed 'doc/api-dist/lenkesamler_005frenderer_005forg.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005forg.html'
renamed 'doc/api-dist/lenkesamler_005frenderer_005fscheme.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fscheme.html'
renamed 'doc/api-dist/lenkesamler_005frenderer_005fxbel.html' -> '/srv/http/jointhefreeworld.org/api-docs/lenkesamler/lenkesamler_005frenderer_005fxbel.html'
Executing: mv -v doc/api-dist/* /srv/http/jointhefreeworld.org/api-docs/lenkesamler
removed 'doc/api/index.texi'
removed directory 'doc/api'
removed directory 'doc/api-dist'
removed directory 'doc'