Since we started opening rad: links in the app, a dev build and an
installed release can't run side by side: they share the identifier, so
whichever starts second hands over to the first and quits. A separate
identifier also keeps dev from sharing window state and logs with the
release.
Clicking a relative link in a README reloaded the whole app, and links
starting with `/` dropped you in the inbox. Links to files in the repo
now open in the source view, at the linked section if there is one, and
links the app can't follow explain why instead of navigating the window
away.
This also fixes a missing linked file showing the previous file's
content instead of an error, and section links disabling the back
button.
Mermaid code blocks showed up as code. Mermaid is loaded lazily, and
diagrams are redrawn when the app theme changes. DOMPurify's config
moves from a global `setConfig` to each call site, because the global
one stripped mermaid's SVG output.
Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
Relative images in markdown and AsciiDoc files were broken, nothing
resolved them against the repository. They're read through a new
`repo_blob_bytes` command, which skips the text encoding and last
commit lookup of `repo_blob`. Images now also keep their alt text.
Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
A blockquote starting with `[!NOTE]` or one of its siblings showed up
as a plain quote, while GitHub and the web explorer render it as a
titled callout.
Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
Assigning someone meant finding and pasting their DID. Now the input
searches aliases and lists you, the repo's delegates and other known
peers, so a DID is only needed for someone the node has never seen.
In the new issue modal, "Add labels" and "Add assignees" sat on their
own row between the description and the action buttons. They now sit at
the left of the action row, opposite Attach, Preview and Save.
The 500 kB default is meant for websites, but Tauri loads the bundle
from disk. The limit stays close to the main chunk's size, so we still
hear about it when it grows noticeably.
Browsing the file tree only changed component state, so no file view
was ever a history entry and back left the repository. The path now
travels as a query parameter, since trailing URL segments are already
consumed by the revision.
Uses @asciidoctor/core, lazily imported so the main bundle is
unchanged, with its own DOMPurify instance because the markdown
allowlist is pinned globally via setConfig.
Include directives resolve through a registered HttpCache that maps
Asciidoctor's URI reads onto repo_blob, so tag, line-range and
nesting handling stay upstream. A per-conversion token in base_dir
scopes each read to one repository and commit.
Embeds went over IPC as JSON number arrays, so a 9MB image turned into
~36MB of JSON. On upload Tauri parses that on the main thread, which
beachballed the app while dropping a large screenshot.
macOS saves Retina screenshots at 144 DPI and we rendered them at twice
the size they had on screen. We now scale PNGs with a 2x or 3x density
down; everything else, including 300 DPI print exports, stays 1:1.
Pasting a single image went through save_embed_by_clipboard, which
stored the clipboard's raw RGBA pixels instead of an encoded image.
The result could not be decoded, so the embed showed as a broken image.
Always store the pasted file's own bytes instead. Nothing else uses
save_embed_by_clipboard, so it's removed.
Co-Authored-By: Rūdolfs Ošiņš <rudolfs@osins.org>
Seeding a repo only fetched from seeds we were already connected to, so
one nobody had announced to us yet stayed in the fetching state. Also
try the preferred seeds and connect to known ones, like `rad seed`.
Following a link to a repo we don't have only led to the explorer, but
the reason it's missing is usually that we haven't seeded it yet.
A deep link that can't be opened now says so instead of doing nothing.
When looking at merged patches you want to see what landed recently, not
what was opened recently. We take the earliest merge, which is exact for
repos that need a single delegate to merge.
References are picked or pasted in the composer, stored as `rad:` URIs
with a readable label, and shown as chips or links that open in-app when
the entity is here.
Co-Authored-By: Rūdolfs Ošiņš <rudolfs@osins.org>
Mentioning someone starts from their alias, but aliases are
self-declared and unrelated nodes often share one. Results say who is
followed or is you, so the composer can tell them apart.
Co-Authored-By: Rūdolfs Ošiņš <rudolfs@osins.org>
On an incremental image build, setting a changed file to the commit
time can make it older than its stale build output, so cargo would skip
the rebuild. Rounding down to the whole second still survives the image
layer and never moves a file back past its outputs.
Pin source mtimes to the commit time at image build, so cargo's
fingerprints survive the image layer and the warm build stays fresh.
Build with line-tables-only debug info and drop the incremental cache
to shrink the baked target/.
Reactions, review edits, patch comments, title, description and
assignees, stopping seeding, creating an identity, and that a
contributor can't resolve someone else's review comment.
Cover the shortcut list, sidebar toggle, editor bold taking priority
over it, new issue, settings, jumping to a repo and stepping through a
patch's commits.
Cover the repo home, file tree, commits, a contributor's branch, patch
filters and the identity page, and check that the sidebar, pins,
hints, diff style and revision sort survive a reload.
Every write path gets a happy path and the contributor gets the
permission cases the ADR asks for: labels, assignees, state, titles,
comments, deleting, seeding by bare RID and clearing notifications.
The UI updates before a write lands, so a reload right after could
cancel it; tests now wait for the command. WebKit also reports such
a cancelled fetch as "Load failed". A delegate and a connected
contributor let tests cover what non-delegates may do.
The diff, comment and review logic was only unit-tested in pieces.
These cover the wiring: a code comment keeps its line across a
reload, a review publishes with its verdict and comments, and a
review comment stays resolved.