Skip to content

fix(deps): update dependencies - #16

Merged
tannevaled merged 1 commit into
mainfrom
renovate/deps
Aug 31, 2026
Merged

fix(deps): update dependencies#16
tannevaled merged 1 commit into
mainfrom
renovate/deps

Conversation

@tannevaled

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
github.com/go-crdt/crdt v0.36.0v0.37.0 age confidence
github.com/go-pdfkit/ops v0.8.0v0.11.0 age confidence

Release Notes

go-crdt/crdt (github.com/go-crdt/crdt)

v0.37.0

Compare Source

A release that does nothing, on purpose.

A text and a list learn to accept an operation that names nothing and does
nothing but account for a run of sequence numbers — exactly what a map's
MapSuperseded has always done. Nothing here produces one, and no behaviour
changes.

Why publish it

A peer that does not know a kind refuses it, and the two ends of a session
are not deployed at the same moment. That was the lesson of go-crdt/collab
v0.34.0 a few hours ago, where a new field was made required and broke every
transport that was not gRPC — enough to need a retraction.

So: understand first, send later. The only thing this release buys is the months
it spends published before the other half of #​80 lands, and every one of them is
a month of peers that will not have to be refused.

What a run may stand in for

Only operations nothing else names. A deletion is named by nothing, so a
losing one — two replicas deleted the same character, and only one of them is
that character's recorded deletion — can go. An insertion cannot: it is
named by whatever was inserted after it, and a peer sent a run over one would
park everything that followed, waiting for an origin it will never be given.

The encoding

One meaning, one encoding: the clock is the sequence number, and the two
fields a deletion spends on its target hold the span and a zero. Truncated,
carrying anything in the field this kind does not use, or decoding into a span
that reaches back past sequence number one — all refused, because these arrive
from a peer.

dupDeletes is still there and still built and sorted on every snapshot.
Removing it is #​80's other half, and that needs the compatibility plan the issue
now carries.

v0.36.1

Compare Source

sortIDs said the lists were short and sorted them accordingly. They usually
are. They are not always: every one of them holds the duplicate deletions a
document is carrying — two replicas deleting the same character make one apiece
— and a document being undone and redone makes a great many. 34 044 in a
room of twenty replicas.

Insertion sort is quadratic, and the map they come out of hands them over in a
random order, which is its worst case.

     2.55s 81.21% 81.21%      2.86s 91.08%  crdt.sortIDs
                                             2.86s   100% |   crdt.(*Doc).Snapshot

So the one type of document that undoes things was a hundred times slower than
every other — slow enough that it went untested at any size worth testing,
which is the part that mattered.

20 replicas × 50 rounds
before 2 seeds in 92.7 s
after 40 seeds in 43.7 s

The short case keeps its insertion sort. The long one gets a real sort, in the
same order — asserted against a second insertion sort written out in the test
rather than borrowed from the code under test.

Also

Map.Collect now says what Yjs does instead, read in its source rather than
recalled. It collects a deleted item by replacing the content and keeping the
item, so the identity always survives and an operation arriving late still finds
something to lose to; causal delivery is the whole precondition there. A map's
tombstone has no content — the record is the space — so v0.36.0's clock floor
is the price of an economy Yjs does not attempt, rather than the repair of a
mistake.

sort.Slice is not new API; nothing here changes shape.

go-pdfkit/ops (github.com/go-pdfkit/ops)

v0.11.0: — print a page bigger than the paper

Compare Source

Doc.Poster(across, down) spreads each page over across×down sheets, so that the sheets printed and taped edge to edge make one page the size of a wall. It is the inverse of NUp.

Every sheet is the size of the page it came from, so a poster of an A4 document prints on A4 and each piece has the page's own proportions — pieces of some other shape do not tape back into the page they were cut from. Where the wall is not the page's shape, the page is enlarged as far as it will go inside it and centred.

The sheets meet exactly, with no overlap for taping, and that is argued rather than defaulted: an overlap would have to be a constant, because Poster is told how many sheets to use and not how wide the printer's unprinted border is. Meeting exactly is also the only arrangement that is exactly undone — every part of the page lands on one sheet and one only.

Judged by poppler, in CI. A page divided into a three-by-three grid, each cell a colour of its own with a black pip in its top-left corner, is postered and rendered: the colour says which cell a sheet shows, and the pip says which way up it is. A PDF's origin is at the bottom, so a poster can come out with every piece present and upside down — which no count of pages would catch. poppler is now installed in CI so that check runs there and not only on a machine that happens to have it.

100% statement coverage, go vet and -race clean, nine cross-compile targets, CGO-free.

v0.10.0: — the files a document carries

Compare Source

A PDF can hold whole files inside it — the spreadsheet a report was drawn from, the XML a form was filled from, the source of a figure. Every verb here dropped them.

The catalogue's /Names was dropped whole, on the ground that a name tree points into the document. True of /Dests, whose names point at pages this reorders and removes, and of /JavaScript, which is code. Not true of /EmbeddedFiles: a file inside a document belongs to no page, so nothing here can invalidate it — and nothing on the page says it is there, so nobody notices it went until the file is wanted. 45 of the 3 215 documents in the forms and scans corpora carry one.

Attachments lists what a document holds, Attach puts one in, Detach takes one out. A name already used is refused rather than quietly replacing what is there. A sanitised file still carries nothing inside it.

Files from several documents are all kept — two forms cannot be merged and two catalogues cannot be chosen between, but two sets of files can both be carried, because a file belongs to no page.

A specification pointing at no stream, or at bytes still in a filter nothing here unpacks, is not handed over as a file: passing those on gives somebody a spreadsheet that is not one.

Judged by poppler: pdfdetach lists one file before and two after a rotation and an addition, and saves both with the right bytes.

100% statement coverage, go vet and -race clean, nine cross-compile targets, CGO-free.

v0.9.0: — two piles into one, and a document on one sheet

Compare Source

Doc.Interleave takes pages from each document in turn. It is what a single-sided feeder leaves behind: a stack run through twice comes out as two files — the fronts and the backs — which is one document taken apart. Merging them end to end gives every front then every back; this gives the document. A shorter pile simply runs out, which is what a scanner leaves when the last sheet is single-sided.

Doc.OnePage stacks every page onto one sheet. A page is a unit of paper, not a unit of reading: a receipt, a chat log and a web page cut into A4 are one thing a printer divided. Narrower pages are centred.

The order is asserted rather than looked at: a PDF's origin is at the bottom, so the first page takes the largest offset. Reversed, every page is still there and the document is upside down.

And poppler was asked rather than ourselves — three marks at known heights come out at 28%, 48% and 70% of the stacked sheet, against 26.7%, 46.7% and 68.3% computed.

100% statement coverage, go vet and -race clean, nine cross-compile targets, CGO-free.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate CLI.

@tannevaled
tannevaled merged commit 296ea5b into main Aug 31, 2026
1 check passed
@tannevaled
tannevaled deleted the renovate/deps branch August 31, 2026 11:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant