Radish alpha
r
Radicle website including documentation and guides
Radicle
Git (anonymous pull)
Log in to clone via SSH
releases: Generate Information at Build Time
Lorenz Leutgeb committed 20 days ago
commit 774a5b48cdae4bcf61762d8e0eec7e8931a10792
parent 503de601c4e2784d6d298b5c3c8e143155aed63a
10 files changed +98 -162
modified Makefile
@@ -1,11 +1,18 @@
+
FILES := https://files.radicle.dev
+

default: build

-
build:
+
build: releases
	bundle exec jekyll build $(CONFIG)

-
serve:
+
serve: releases
	bundle exec jekyll serve $(CONFIG) --port 3000 --livereload

+
# NOTE: Manually keep these consistent with `_config.yml`.
+
releases:
+
	curl -s -o _data/releases/radicle.json $(FILES)/releases/latest/radicle.json
+
	curl -s -o _data/releases/radicle-httpd.json $(FILES)/releases/radicle-httpd/latest/radicle-httpd.json
+

dependencies:
	gem install jekyll

modified _config.yml
@@ -30,6 +30,19 @@ include:
  - _redirects
  - .well-known

+
releases:
+
  - id: radicle
+
    base: "https://files.radicle.dev/releases/latest"
+
    name: Radicle
+
    signers:
+
      - alexis
+
      - fintan
+
  - id: radicle-httpd
+
    base: "https://files.radicle.dev/releases/radicle-httpd/latest"
+
    name: Radicle HTTP Daemon
+
    signers:
+
      - rudolfs
+

# Metadata
title: "Radicle: the sovereign forge"
description: "The Radicle forge is an open source, peer-to-peer code collaboration stack built on Git."
modified _data/author/alexis.yml
@@ -4,3 +4,8 @@ radicle:
  age: age1jf5fhwgtr4lpdsgjz2lu0s839eutm7g39y5ya7sw747y0sl204rsdl6zvn
web: cloudhead.io
atproto: cloudhead.io
+

+
signing:
+
  email: cloudhead@radicle.dev
+
  fingerprint: SHA256:iTDjRHSIaoL8dpHbQ0mv+y0IQqPufGl2hQwk4TbXFlw
+
  key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL460KIEccS4881p7PPpiiQBsxF+H5tgC6De6crw9rbU

\ No newline at end of file
modified _data/author/fintan.yml
@@ -3,3 +3,8 @@ radicle:
  did: did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
  age: age1l7yzgrhnxrmjszklf0l2vpfxh0l57swe9jh2qnyh5hjq8vrecassw9vg98
atproto: fintohaps.bsky.social
+

+
signing:
+
  email: fintan@radicle.dev
+
  fingerprint: SHA256:vV38nW5eSWfTMITdAoMCBOFzEEr0bDMXjSWHpwrpsKY
+
  key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEFsaRqAJ1r6bBFwlcWzJKN7DdjItQDumCNc0wqw6Dvk

\ No newline at end of file
modified _data/author/rudolfs.yml
@@ -2,3 +2,8 @@ name: rudolfs
radicle:
  did: did:key:z6MkwPUeUS2fJMfc2HZN1RQTQcTTuhw4HhPySB8JeUg2mVvx
atproto: osins.bsky.social
+

+
signing:
+
  email: rudolfs@osins.org
+
  fingerprint: SHA256:s/6EWLSAoeZWREZxj8vr6FtM6NaDjWhwsGB80eoaSzs
+
  key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPueml1FxzjvwbD7vRZfwoaoyuxLy0L+WLBwSNiVoJe5

\ No newline at end of file
added _data/releases/radicle-httpd.json
@@ -0,0 +1 @@
+
{ "name": "radicle-httpd", "version": "0.25.0", "commit": "5a3337de", "timestamp": "1776953069" }
added _data/releases/radicle.json
@@ -0,0 +1 @@
+
{"name":"rad","version":"1.8.0","commit":"edde15d9ea700a70de04558fafc0b55360e9f5d2","timestamp":"1774539562"}
modified _includes/latest-release.html
@@ -6,61 +6,39 @@
    width: 100%;
    overflow: hidden;
  }
-
  .loading .release-info {
-
    display: none;
-
  }
-
  .loading .release-loader {
-
    display: inline-block;
-
  }
-
  .release-loader {
-
    display: none;
-
    border: 2px solid var(--color-border-hint);
-
    border-top: 2px solid var(--color-border-default);
-
    border-right: 2px solid var(--color-border-default);
-
    border-radius: 50%;
-
    height: 1rem;
-
    width: 1rem;
-
    animation: spin 1s linear infinite;
-
  }
  #release-timestamp, #release-commit {
    color: var(--color-fg-dim);
  }
-
  .hidden {
-
    display: none !important;
-
  }
-

-
  @keyframes spin {
-
    0% { transform: rotate(0deg); }
-
    100% { transform: rotate(360deg); }
-
  }
</style>

-
<blockquote id="release" class="hidden loading">
+
<blockquote id="release">
  💾
-
  <span class="release-loader"></span>
  <span>
-
    <a href="https://files.radicle.dev/releases/latest" id="release-info"></a>
+
    <a href="https://files.radicle.dev/releases/latest" id="release-info">Radicle {{ site.data.releases.radicle.version }}</a>
    <span class="desktop dim">&middot; </span>
-
    <span id="release-commit" class="desktop"></span>
-
    <span id="release-timestamp" class="desktop"></span>
+
    <span id="release-commit" class="desktop">{{ site.data.releases.radicle.commit }}</span>
+
    <span id="release-timestamp" class="desktop">{{ site.data.releases.radicle.timestamp | date_to_xmlschema }}</span>
  </span>
</blockquote>

<script>
  const release = document.getElementById('release');
-
  release.classList.remove("hidden");

  fetch("https://files.radicle.dev/releases/latest/radicle.json")
    .then(res => res.json())
    .then(data => {
+
      if (data.timestamp === "{{ site.data.releases.radicle.timestamp }}") {
+
        console.info("Release data is up to date.")
+
        return;
+
      }
+

      const version = data.version;
      const commit = data.commit;
      const release = document.getElementById("release");
      const releaseInfo = document.getElementById("release-info");

-
      release.classList.remove("loading");
      releaseInfo.innerText = `Radicle ${version}`;
      document.getElementById("release-commit").innerText = commit;
-
      document.getElementById("release-timestamp").innerText = `(${new Date(data.timestamp * 1000).toUTCString()})`;
+
      document.getElementById("release-timestamp").innerText = `(${new Date(data.timestamp * 1000).toISOString()})`;
    });
</script>
modified _pages/download.md
@@ -2,6 +2,8 @@
title: Download Radicle
subtitle: Download a Radicle release
variant: wide
+
binary: ["unknown-linux-musl", "apple-darwin"]
+
arch: ["x86_64", "aarch64"]
---
This is Radicle's <strong class="highlight">download</strong> page,
which references various ways of downloading Radicle to your machine.
@@ -45,140 +47,58 @@ reproduce the binaries on this page from source.

[rb]: https://reproducible-builds.org/

-
<noscript>
-
  <p class="notice">
-
    <strong>Note</strong>: to load the latest release data, enable JavaScript in your browser.
+
{% for release in site.releases %}
+
{% assign data = site.data.releases[release.id] %}
+
<p id="{{ release.id }}-release-header">
+
  <h2 id="{{ release.id }}-release-name">{{ release.name }} {{ data.version }}</h2>
+
  <p id="{{ release.id }}-release-info">
+
    Built from commit <code>{{ data.commit }}</code> on {{ data.timestamp | date_to_xmlschema }}.
  </p>
-
</noscript>
-

-
<p id="radicle-release-header" class="loading">
-
  <span class="release-loader"></span>
-
  <span>
-
    <h2 id="radicle-release-name">Radicle</h2>
-
    <p id="radicle-release-info"><!-- Dynamic --></p>
-
  </span>
</p>

<noscript>
-
  <p>
-
    Browse the latest release at
-
    <a href="https://files.radicle.dev/releases/latest">https://files.radicle.dev/releases/latest</a>
-
  </p>
-
</noscript>
-

-
<table class="hidden loading" id="radicle-releases">
-
  <thead>
-
    <th scope="col">OS</th>
-
    <th scope="col" class="desktop">Arch</th>
-
    <th scope="col">File</th>
-
    <th scope="col">Signature</th>
-
    <th scope="col">Checksum</th>
-
  </thead>
-
  <tr data-release-arch="x86_64" data-release-binary="unknown-linux-musl">
-
    <th scope="row" rowspan="2">Linux</th>
-
    <td class="release-arch desktop">Loading…</td>
-
    <td>💾 <a class="release-url">Loading…</a></td>
-
    <td><a class="release-sig">Loading…</a></td>
-
    <td><a class="release-checksum">Loading…</a></td>
-
  </tr>
-
  <tr data-release-arch="aarch64" data-release-binary="unknown-linux-musl">
-
    <td class="release-arch desktop">Loading…</td>
-
    <td>💾 <a class="release-url">Loading…</a></td>
-
    <td><a class="release-sig">Loading…</a></td>
-
    <td><a class="release-checksum">Loading…</a></td>
-
  </tr>
-
  <tr data-release-arch="x86_64" data-release-binary="apple-darwin">
-
    <th scope="row" rowspan="2">macOS</th>
-
    <td class="release-arch desktop">Loading…</td>
-
    <td>💾 <a class="release-url">Loading…</a></td>
-
    <td><a class="release-sig">Loading…</a></td>
-
    <td><a class="release-checksum">Loading…</a></td>
-
  </tr>
-
  <tr data-release-arch="aarch64" data-release-binary="apple-darwin">
-
    <td class="release-arch desktop">Loading…</td>
-
    <td>💾 <a class="release-url">Loading…</a></td>
-
    <td><a class="release-sig">Loading…</a></td>
-
    <td><a class="release-checksum">Loading…</a></td>
-
  </tr>
-
</table>
-

-
<table>
-
  <thead><th>Signer</th></thead>
-
  <tr><td>Key</td><td><code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL460KIEccS4881p7PPpiiQBsxF+H5tgC6De6crw9rbU</code></td></tr>
-
  <tr><td>Fingerprint</td><td><code>SHA256:iTDjRHSIaoL8dpHbQ0mv+y0IQqPufGl2hQwk4TbXFlw</code></td></tr>
-
  <tr><td>Owner</td><td>cloudhead@radicle.dev</td></tr>
-
  <tr><td>Key</td><td><code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrJyJTwj/xG7F7qY0HDFXbb8A+xNNH8eILQ8hlvKW7/</code></td></tr>
-
  <tr><td>Fingerprint</td><td><code>SHA256:MOkcQvljDqQn8y+zlHFssx6gdH0rXdC+Wn88bsTPp6g</code></td></tr>
-
  <tr><td>Owner</td><td>erik@radicle.dev</td></tr>
-
  <tr><td>Key</td><td><code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEFsaRqAJ1r6bBFwlcWzJKN7DdjItQDumCNc0wqw6Dvk</code></td></tr>
-
  <tr><td>Fingerprint</td><td><code>SHA256:vV38nW5eSWfTMITdAoMCBOFzEEr0bDMXjSWHpwrpsKY</code></td></tr>
-
  <tr><td>Owner</td><td>fintan@radicle.dev</td></tr>
-
  <tr><td>Key</td><td><code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFhK7CqgIIbSthoNn8ea32krOnMzC807Z+PpBkR2YOVj</code></td></tr>
-
  <tr><td>Fingerprint</td><td><code>SHA256:xX6bpr+AeF5G0wIvU8nLisgYRM6XjQVNJs3hkMGt+T0</code></td></tr>
-
  <tr><td>Owner</td><td>lorenz@radicle.dev</td></tr>
-
</table>
-

-
<p id="radicle-httpd-release-header" class="loading">
-
  <span class="release-loader"></span>
-
  <span>
-
    <h2 id="radicle-httpd-release-name">Radicle HTTP Daemon</h2>
-
    <p id="radicle-httpd-release-info"><!-- Dynamic --></p>
-
  </span>
-
</p>
-

-
<noscript>
-
  <p>
-
    Browse the latest release at
-
    <a href="https://files.radicle.dev/releases/radicle-httpd/latest">https://files.radicle.dev/releases/radicle-httpd/latest</a>
+
  <p class="notice">
+
    <strong>Note</strong>: To load the latest release data enable JavaScript or refer to
+
    <a href="{{ release.base }}">{{ release.base }}</a>
  </p>
</noscript>

-
<table class="hidden loading" id="radicle-httpd-releases">
+
<table class="loading" id="{{ release.id }}-releases" style="border:1px white">
  <thead>
-
    <th scope="col">OS</th>
-
    <th scope="col" class="desktop">Arch</th>
-
    <th scope="col">File</th>
-
    <th scope="col">Signature</th>
-
    <th scope="col">Checksum</th>
+
    <tr>
+
      <th scope="col" rowspan="2">OS</th>
+
      <th scope="col" rowspan="2" class="desktop">Arch</th>
+
      <th scope="col" colspan="3" style="text-align:center">💾 File</th>
+
    </tr>
+
    <tr>
+
      <th scope="col">Archive</th>
+
      <th scope="col">Signature</th>
+
      <th scope="col">Checksum</th>
+
    </tr>
  </thead>
-
  <tr data-release-arch="x86_64" data-release-binary="unknown-linux-musl">
-
    <th scope="row" rowspan="2">Linux</th>
-
    <td class="release-arch desktop">Loading…</td>
-
    <td>💾 <a class="release-url">Loading…</a></td>
-
    <td><a class="release-sig">Loading…</a></td>
-
    <td><a class="release-checksum">Loading…</a></td>
-
  </tr>
-
  <tr data-release-arch="aarch64" data-release-binary="unknown-linux-musl">
-
    <td class="release-arch desktop">Loading…</td>
-
    <td>💾 <a class="release-url">Loading…</a></td>
-
    <td><a class="release-sig">Loading…</a></td>
-
    <td><a class="release-checksum">Loading…</a></td>
-
  </tr>
-
  <tr data-release-arch="x86_64" data-release-binary="apple-darwin">
-
    <th scope="row" rowspan="2">macOS</th>
-
    <td class="release-arch desktop">Loading…</td>
-
    <td>💾 <a class="release-url">Loading…</a></td>
-
    <td><a class="release-sig">Loading…</a></td>
-
    <td><a class="release-checksum">Loading…</a></td>
-
  </tr>
-
  <tr data-release-arch="aarch64" data-release-binary="apple-darwin">
-
    <td class="release-arch desktop">Loading…</td>
-
    <td>💾 <a class="release-url">Loading…</a></td>
-
    <td><a class="release-sig">Loading…</a></td>
-
    <td><a class="release-checksum">Loading…</a></td>
+
  {% for binary in page.binary %}
+
  {% for arch in page.arch %}
+
  <tr data-release-arch="{{ arch }}" data-release-binary="{{ binary }}">
+
    {% if forloop.index == 1 %}<th scope="row" rowspan="2">{% if binary == "apple-darwin" %}macOS{% else %}Linux{% endif %}</th>{% endif %}
+
    <td class="release-arch desktop">{{ arch }}</td>
+
    <td><a class="release-url" href="{{ release.base }}/{{ release.id }}-{{ data.version }}-{{ arch }}-{{ binary }}.tar.xz">{{ release.id}}-{{ data.version }}-{{ arch }}-{{ binary }}.tar.xz</a></td>
+
    <td><a class="release-sig" href="{{ release.base }}/{{ release.id }}-{{ data.version }}-{{ arch }}-{{ binary }}.tar.xz.sig">.sig</a></td>
+
    <td><a class="release-checksum" href="{{ release.base }}/{{ release.id }}-{{ data.version }}-{{ arch }}-{{ binary }}.tar.xz.sha256">.sha256</a></td>
  </tr>
+
  {% endfor %}
+
  {% endfor %}
</table>

<table>
  <thead><th>Signer</th></thead>
-
  <tr><td>Key</td><td><code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEFsaRqAJ1r6bBFwlcWzJKN7DdjItQDumCNc0wqw6Dvk</code></td></tr>
-
  <tr><td>Fingerprint</td><td><code>SHA256:vV38nW5eSWfTMITdAoMCBOFzEEr0bDMXjSWHpwrpsKY</code></td></tr>
-
  <tr><td>Owner</td><td>fintan@radicle.dev</td></tr>
-
  <tr><td>Key</td><td><code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPueml1FxzjvwbD7vRZfwoaoyuxLy0L+WLBwSNiVoJe5</code></td></tr>
-
  <tr><td>Fingerprint</td><td><code>SHA256:s/6EWLSAoeZWREZxj8vr6FtM6NaDjWhwsGB80eoaSzs</code></td></tr>
-
  <tr><td>Owner</td><td>rudolfs@osins.org</td></tr>
-
  <tr><td>Build host</td><td>Aarch64 Apple M1</td></tr>
+
  {% for signer in release.signers %}
+
  {% assign info = site.data.author[signer].signing %}
+
  <tr><td>Key</td><td><code>{{ info.key }}</code></td></tr>
+
  <tr><td>Fingerprint</td><td><code>{{ info.fingerprint }}</code></td></tr>
+
  <tr><td>Owner</td><td>{{ info.email }}</td></tr>
+
  {% endfor %}
</table>
+
{% endfor %}

## Download

@@ -248,16 +168,21 @@ This will place binaries in `~/.radicle/bin` and manuals in `~/.radicle/man`,
and overwrite any existing Radicle binaries.

<script>
-
  getRelease("Radicle", "https://files.radicle.dev/releases/latest", "radicle");
-
  getRelease("Radicle HTTP Daemon", "https://files.radicle.dev/releases/radicle-httpd/latest", "radicle-httpd");
+
  {% for release in site.releases %}
+
  getRelease("{{ release.name }}", "{{ release.base }}", "{{ release.id }}", "{{ site.data.releases[release.id].timestamp }}");
+
  {% endfor %}

-
  function getRelease(name, urlBase, releaseId) {
+
  function getRelease(name, urlBase, releaseId, knownTimestamp) {
      const releases = document.getElementById(`${releaseId}-releases`);
-
      releases.classList.remove("hidden");

      fetch(`${urlBase}/${releaseId}.json`)
        .then(res => res.json())
        .then(data => {
+
          if (data.timestamp === knownTimestamp) {
+
            console.info(`Release data for ${name} is up to date.`)
+
            return;
+
          }
+

          const version = data.version;
          const commit = data.commit;
          const release = document.getElementById(`${releaseId}-release-header`);
@@ -282,7 +207,7 @@ and overwrite any existing Radicle binaries.

          release.classList.remove("loading");
          releaseName.innerText = `${name} ${version}`;
-
          releaseInfo.innerHTML = `Built from commit <code>${commit}</code> on ${new Date(data.timestamp * 1000).toUTCString()}.`;
+
          releaseInfo.innerHTML = `Built from commit <code>${commit}</code> on ${new Date(data.timestamp * 1000).toISOString()}.`;
        });
    }
</script>
modified assets/css/page.css
@@ -230,10 +230,6 @@ a:hover {
  color: var(--color-bg-default) !important;
}

-
.hidden {
-
  display: none;
-
}
-

.date {
  color: var(--color-fg-dim);
}