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.
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.
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.
Issues, patches, commits and the peer selector each had their own
debounce, and issues and patches the same search index. Vitest now
resolves Svelte's browser build, as effects never run in the server one.
Seeding only set the policy, so a repo stayed unreplicated until a
seed happened to announce it again. Fetch from connected seeds in the
background, like `rad seed` does.
Resetting only forgot the key, so the pending timeout still fired and
rescheduled itself: the sidebar kept reloading repos every 5 seconds
after nothing was left to replicate, and after it unmounted.
Since js-yaml 5 an empty or comment-only block throws instead of returning
undefined, as does invalid YAML. Markdown renders the content from the
same parse, so one such block made the whole document fail to render.
/repos is no longer a route, so specs fell back to the inbox and logged a
routing error. The inbox opens the first-launch guide, so tests now start
with it dismissed. The router now logs the URL it couldn't resolve
instead of just "URL".
svelte-check already type-checks what tsc did, clippy already runs cargo
check, and radicle-tauri has no doc tests. Linting all targets also
covers test code, which cargo test builds but never lints.
Runs the same steps as the workflows and logs each step's output, exit
code and duration, so a failed run can be read back without the terminal.
The output ends with a summary of each step.
The dev server's unbundled modules made each page load take seconds, which
is most of the time a test spends; E2E_DEV_SERVER=1 keeps the dev server.
Each run writes a JSON report, and CI uses two workers now that the
dropped keep-alive connections behind the flakiness are fixed.
The page always talked to the shared palm backend, so tests couldn't set
up peers of their own. Peers now have no passphrase by default, so tests
don't need an ssh-agent and test keys stay out of the developer's agent.
Fixtures wait for replication instead of relying on gossip timing, and a
request cancelled by a reload no longer counts as a page error.
Several commands had no route or returned stubs, so e2e tests silently got
null or empty data. A missing route now fails loudly, the profile loads on
first use so onboarding works, and node status is polled over HTTP. A
parity test keeps the routes from drifting from the Tauri handlers again;
it also caught revisions_by_patch being registered twice.
Parallel e2e tests hit the repo's sigrefs lock when creating COBs
concurrently, which the Tauri avoids by running these commands on
the main thread serially.
A single catalog in lib/shortcuts defines every shortcut's keys and
description. Components bind behaviour to it by id for as long as they
are mounted, and one listener applies the shared rules for text fields,
modals, priority and cycling. The shortcuts modal lists the catalog.
A repository can sit in storage without being seeded, which `rad ls`
hides and `rad ls --all` shows as "local". A new Settings preference
picks the `Show` passed to `list_repos_summary`, defaulting to seeded.
Unseeding only deletes the policy row, so a node defaulting to `allow`
keeps seeding: `unseed` now reports `DefaultPolicySeeds` instead of
claiming success, and both callers refresh in a `finally` so a failed
`clean` no longer leaves a stale row behind.
Show the email alongside each name. Co-authors are read from the commit
message trailers and listed as their own section. The trigger avatars
now stack and fan apart on hover, and cover everyone credited on the
commit rather than just the author and committer. Timestamps now show
both committed and authored times in the tooltip.
A desktop launch inherits a `PATH` that holds none of the user's own
install locations, so `Command::new("git")` finds nothing usable, or on
macOS finds Apple's shim and only prompts to install the developer
tools.
Resolve git to an absolute path instead, searching `PATH` first and the
usual install locations after, and cache the result for the process.
`rad` is looked for the same way, which also fixes the CLI check for a
Homebrew or Nix install.
`list_commits` walked back from the revision head and stopped at the
first commit equal to `base`. A merge commit reaches `base` through one
of its parents, so the walk truncated there and dropped everything the
other parent contributed: a revision whose head merges the target branch
in looked like a single-commit revision.
Add it to the patch list byline and the patch page metadata, shown only
when it differs from the default branch. The merge activity item now
names the real target instead of always naming the default branch.
Co-Authored-By: Brandon Oxendine <brandon.oxendine@gmail.com>