aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--.gitlab-ci.yml11
-rwxr-xr-xbin/check_links40
-rwxr-xr-xbin/make_redirects2
-rw-r--r--spec/README.md50
5 files changed, 80 insertions, 26 deletions
diff --git a/.gitignore b/.gitignore
index dc6ea07..2f9bd0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,6 @@
# mdbook outputs
/html
+
+# bin/check_links output
+/html.link-check
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1b82c3c..95a4783 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -17,6 +17,17 @@ build:
paths:
- cache
+link-check:
+ image: rust:bookworm
+ script:
+ - cargo install mdbook
+ - apt-get update && apt-get install -y git python3 python3-yaml linklint
+ - ./bin/build_html
+ - ./bin/check_links
+ artifacts:
+ paths:
+ - html.link-check
+
include:
project: tpo/tpa/ci-templates
file:
diff --git a/bin/check_links b/bin/check_links
new file mode 100755
index 0000000..890ac30
--- /dev/null
+++ b/bin/check_links
@@ -0,0 +1,40 @@
+#!/bin/bash
+#
+# Check rustdoc HTML links and anchors
+# bin/build_html must have been run first.
+#
+# Adapted from
+# https://gitlab.torproject.org/Diziet/rust-derive-adhoc/-/blob/main/maint/check-doc-links?ref_type=heads
+
+set -e
+set -o pipefail
+
+# nailing-cargo --no-nail --- bin/build_html
+# nailing-cargo --preclean=no --- bin/check_links
+
+chk_dir=html.link-check
+
+rm -rf html.link-check
+cp -al html $chk_dir
+
+# Fix up https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=425632
+
+find $chk_dir -name \*.html -print0 |
+xargs -0r -- perl -i~ -pe '
+ s{\bid=("[^"]+")[^<>]*\>}{$&<a name=$1>}g;
+'
+
+linklint -out linklint.errors -error -root $chk_dir /
+
+cat linklint.errors
+
+set +e
+grep ERROR linklint.errors
+rc=$?
+set -e
+
+case $rc in
+0) echo >&2 '** found linkcheck errors **'; exit 1;;
+1) ;;
+*) echo >&2 "linkcheck failed $rc"; exit 1;;
+esac
diff --git a/bin/make_redirects b/bin/make_redirects
index ea8ea3b..4cd4e05 100755
--- a/bin/make_redirects
+++ b/bin/make_redirects
@@ -43,7 +43,7 @@ def readme_redirects(rs):
for kwd, info in rs.items():
target = info['target']
desc = info['description']
- lines.append(f'<dt><a href="/{kwd}"><code>/{kwd}</code></a></dt>\n')
+ lines.append(f'<dt><code>/{kwd}</code></dt>\n')
lines.append(f'<dd><a href="{target}"><code>{target}</code> ({desc})</a></dt>\n')
lines.append("</dl>\n")
diff --git a/spec/README.md b/spec/README.md
index 6d1dfeb..f4f8d1a 100644
--- a/spec/README.md
+++ b/spec/README.md
@@ -46,7 +46,7 @@ its documentation.
To edit these specs, clone the [git repository] and edit the
appropriate file in the [`spec` directory]. These files will match
the URLs of their corresponding pages, so if you want to edit
-[`tor-spec/flow-control.html`](./tor-spec/flow-control),
+[`tor-spec/flow-control.html`],
you'll be looking for a file
called [`spec/tor-spec/flow-control.md`].
@@ -97,53 +97,53 @@ long-term permalinks.
<!-- BEGIN AUTO-GENERATED REDIRECTS -->
<dl>
-<dt><a href="/address-spec"><code>/address-spec</code></a></dt>
+<dt><code>/address-spec</code></dt>
<dd><a href="https://spec.torproject.org/address-spec"><code>https://spec.torproject.org/address-spec</code> (Special Hostnames in Tor)</a></dt>
-<dt><a href="/bandwidth-file-spec"><code>/bandwidth-file-spec</code></a></dt>
+<dt><code>/bandwidth-file-spec</code></dt>
<dd><a href="https://spec.torproject.org/bandwidth-file-spec"><code>https://spec.torproject.org/bandwidth-file-spec</code> (Directory Authority Bandwidth File spec)</a></dt>
-<dt><a href="/bridgedb-spec"><code>/bridgedb-spec</code></a></dt>
+<dt><code>/bridgedb-spec</code></dt>
<dd><a href="https://spec.torproject.org/bridgedb-spec"><code>https://spec.torproject.org/bridgedb-spec</code> (BridgeDB specification)</a></dt>
-<dt><a href="/cert-spec"><code>/cert-spec</code></a></dt>
+<dt><code>/cert-spec</code></dt>
<dd><a href="https://spec.torproject.org/cert-spec"><code>https://spec.torproject.org/cert-spec</code> (Ed25519 certificates in Tor)</a></dt>
-<dt><a href="/collector-protocol"><code>/collector-protocol</code></a></dt>
+<dt><code>/collector-protocol</code></dt>
<dd><a href="https://gitlab.torproject.org/tpo/network-health/metrics/collector/-/blob/master/src/main/resources/docs/PROTOCOL?ref_type=heads"><code>https://gitlab.torproject.org/tpo/network-health/metrics/collector/-/blob/master/src/main/resources/docs/PROTOCOL?ref_type=heads</code> (Protocol of CollecTor's File Structure)</a></dt>
-<dt><a href="/control-spec"><code>/control-spec</code></a></dt>
+<dt><code>/control-spec</code></dt>
<dd><a href="https://spec.torproject.org/control-spec"><code>https://spec.torproject.org/control-spec</code> (Tor control protocol, version 1)</a></dt>
-<dt><a href="/dir-spec"><code>/dir-spec</code></a></dt>
+<dt><code>/dir-spec</code></dt>
<dd><a href="https://spec.torproject.org/dir-spec"><code>https://spec.torproject.org/dir-spec</code> (Tor directory protocol, version 3)</a></dt>
-<dt><a href="/dir-list-spec"><code>/dir-list-spec</code></a></dt>
+<dt><code>/dir-list-spec</code></dt>
<dd><a href="https://spec.torproject.org/dir-list-spec"><code>https://spec.torproject.org/dir-list-spec</code> (Tor Directory List file format)</a></dt>
-<dt><a href="/ext-orport-spec"><code>/ext-orport-spec</code></a></dt>
+<dt><code>/ext-orport-spec</code></dt>
<dd><a href="https://spec.torproject.org/ext-orport-spec"><code>https://spec.torproject.org/ext-orport-spec</code> (Extended ORPort for pluggable transports)</a></dt>
-<dt><a href="/gettor-spec"><code>/gettor-spec</code></a></dt>
+<dt><code>/gettor-spec</code></dt>
<dd><a href="https://gitlab.torproject.org/tpo/core/torspec/-/raw/main/attic/text_formats/gettor-spec.txt?ref_type=heads"><code>https://gitlab.torproject.org/tpo/core/torspec/-/raw/main/attic/text_formats/gettor-spec.txt?ref_type=heads</code> (GetTor specification)</a></dt>
-<dt><a href="/padding-spec"><code>/padding-spec</code></a></dt>
+<dt><code>/padding-spec</code></dt>
<dd><a href="https://spec.torproject.org/padding-spec"><code>https://spec.torproject.org/padding-spec</code> (Tor Padding Specification)</a></dt>
-<dt><a href="/path-spec"><code>/path-spec</code></a></dt>
+<dt><code>/path-spec</code></dt>
<dd><a href="https://spec.torproject.org/path-spec"><code>https://spec.torproject.org/path-spec</code> (Tor Path Specification)</a></dt>
-<dt><a href="/pt-spec"><code>/pt-spec</code></a></dt>
+<dt><code>/pt-spec</code></dt>
<dd><a href="https://spec.torproject.org/pt-spec"><code>https://spec.torproject.org/pt-spec</code> (Tor Pluggable Transport Specification, version 1)</a></dt>
-<dt><a href="/rend-spec"><code>/rend-spec</code></a></dt>
+<dt><code>/rend-spec</code></dt>
<dd><a href="https://spec.torproject.org/rend-spec"><code>https://spec.torproject.org/rend-spec</code> (Tor Onion Service Rendezvous Specification, latest version)</a></dt>
-<dt><a href="/rend-spec-v2"><code>/rend-spec-v2</code></a></dt>
+<dt><code>/rend-spec-v2</code></dt>
<dd><a href="https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/attic/rend-spec-v2.txt?ref_type=heads"><code>https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/attic/rend-spec-v2.txt?ref_type=heads</code> (Tor Onion Service Rendezvous Specification, Version 2 (Obsolete))</a></dt>
-<dt><a href="/rend-spec-v3"><code>/rend-spec-v3</code></a></dt>
+<dt><code>/rend-spec-v3</code></dt>
<dd><a href="https://spec.torproject.org/rend-spec"><code>https://spec.torproject.org/rend-spec</code> (Tor Onion Service Rendezvous Specification, Version 3 (Latest))</a></dt>
-<dt><a href="/socks-extensions"><code>/socks-extensions</code></a></dt>
+<dt><code>/socks-extensions</code></dt>
<dd><a href="https://spec.torproject.org/socks-extensions"><code>https://spec.torproject.org/socks-extensions</code> (Tor's extensions to the SOCKS protocol)</a></dt>
-<dt><a href="/srv-spec"><code>/srv-spec</code></a></dt>
+<dt><code>/srv-spec</code></dt>
<dd><a href="https://spec.torproject.org/srv-spec"><code>https://spec.torproject.org/srv-spec</code> (Tor Shared Random Subsystem Specification)</a></dt>
-<dt><a href="/tor-fw-helper-spec"><code>/tor-fw-helper-spec</code></a></dt>
+<dt><code>/tor-fw-helper-spec</code></dt>
<dd><a href="https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/attic/tor-fw-helper-spec.txt?ref_type=heads"><code>https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/attic/tor-fw-helper-spec.txt?ref_type=heads</code> (Tor's (little) Firewall Helper specification)</a></dt>
-<dt><a href="/tor-spec"><code>/tor-spec</code></a></dt>
+<dt><code>/tor-spec</code></dt>
<dd><a href="https://spec.torproject.org/tor-spec"><code>https://spec.torproject.org/tor-spec</code> (Tor Protocol Specification)</a></dt>
-<dt><a href="/torbrowser-design"><code>/torbrowser-design</code></a></dt>
+<dt><code>/torbrowser-design</code></dt>
<dd><a href="https://2019.www.torproject.org/projects/torbrowser/design/"><code>https://2019.www.torproject.org/projects/torbrowser/design/</code> (The Design and Implementation of the Tor Browser)</a></dt>
-<dt><a href="/version-spec"><code>/version-spec</code></a></dt>
+<dt><code>/version-spec</code></dt>
<dd><a href="https://spec.torproject.org/version-spec"><code>https://spec.torproject.org/version-spec</code> (How Tor Version Numbers Work)</a></dt>
-<dt><a href="/tor-design"><code>/tor-design</code></a></dt>
+<dt><code>/tor-design</code></dt>
<dd><a href="https://svn.torproject.org/svn/projects/design-paper/tor-design.pdf"><code>https://svn.torproject.org/svn/projects/design-paper/tor-design.pdf</code> (Tor: The Second-Generation Onion Router)</a></dt>
-<dt><a href="/walking-onions"><code>/walking-onions</code></a></dt>
+<dt><code>/walking-onions</code></dt>
<dd><a href="https://spec.torproject.org/proposals/323-walking-onions-full.html"><code>https://spec.torproject.org/proposals/323-walking-onions-full.html</code> (Walking Onions specifications)</a></dt>
</dl>
<!-- END AUTO-GENERATED REDIRECTS -->