NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist
Streaming export engine used by the Reprint Exporter WordPress plugin
Last release 2 months ago
27 Jul 2026
Ships fairly regularly
a new release about every 9 days
Some releases are documented
notes for 10 of 39 stable releases
Nothing withdrawn
no release was ever pulled
6 months old
39 releases · first in 2026
One column per month.
Text-primary-key exports now resume in the source primary key's indexed collation order, so every batch can seek into the primary B-tree instead of sc
Text-primary-key exports now resume in the source primary key's indexed
collation order, so every batch can seek into the primary B-tree instead
of scanning and sorting the table again.
#398 made both sides of pagination byte-ordered with CAST(primary_key AS BINARY). That kept WHERE and ORDER BY consistent, but applying a
function to the indexed column prevents MySQL from using the primary key
for either the range or the order.
For example:
CREATE TABLE translated_keys (
category VARCHAR(16) CHARACTER SET latin1 COLLATE latin1_german2_ci NOT NULL,
sequence_number INT NOT NULL,
PRIMARY KEY (category, sequence_number)
);
INSERT INTO translated_keys VALUES
(CONVERT(X'E4' USING latin1), 1),
('ae', 2),
(CONVERT(X'E4' USING latin1), 3),
('b', 1);With batch_size=1, resuming after each row previously compared and
ordered by CAST(category AS BINARY). MySQL reported a full scan and
Using filesort for every batch. On this table, ä and ae are equal
under the indexed collation, so sequence_number must order those
composite keys.
The SELECT list still casts text to binary, so the dump and cursor
retain the original database bytes. Pagination compares the bare text
column with FROM_BASE64(...) and orders by that same bare column. The
column's declared character set and collation win the comparison;
connection charset and collation do not participate.
Both the native PDO path and the wpdb fallback run SET NAMES utf8mb4 COLLATE utf8mb4_bin before exporter queries. This gives them the same
client, connection, and result charsets and the same connection
collation without overriding a column's stored collation.
The resulting plan uses a PRIMARY range scan without a filesort on
MySQL 5.7, MySQL 8.0, and MariaDB 10.11. ENUM and SET retain byte
ordering because their indexes order numeric positions while the cursor
contains their displayed strings.
The one-row resume tests cover raw latin1 bytes, numeric-looking text
keys, a non-binary collation, and a composite (latin1 VARCHAR, INT)
key with collation-equal text values. The new index-order and composite
tests fail against #398 and pass here. The connection tests start PDO
with a latin1 session and simulate the PDO-less wpdb path; both
confirm that exporter setup ends at utf8mb4_bin.
cd tests && ../vendor/bin/phpunit
php vendor/bin/phpstan analyze --memory-limit=1G
vendor/bin/phpcs --standard=PHPCompatibility --runtime-set testVersion 7.2- -ps packages/reprint-exporter/src/class-mysql-dump-producer.php packages/reprint-exporter/src/export.php packages/reprint-exporter/src/class-wpdb-driver-pdo.php
git diff --checkResumed pushes now stop if state.json says we've saved more bytes than we actually did.
Resumed pushes now stop if state.json says we've saved more bytes than
we actually did.
Before this PR, lost bytes could become NULs in a corrupt file that
still passed the final size check. The old writer extended the empty
file to offset 5. The filesystem filled the gap with NULs. Later chunks
restored the expected length, so finalize() accepted the file.
With this PR, any uploaded file chunk that can't be cleanly appended to
the partial staged file halts processing the request. No skipping, no
recovery attempt, just full stop. PHP likely has more uploaded file data
buffered, but we don't care. Correctness is more important than
performance and in the initial Push version, we'll be very strict. In a
future iteration we may set that one broken file aside and communicate
to the source site "hey, resend that path please", but for now we'll err
on the side of simplicity.
Splits HMAC verification so Reprint can authenticate signed headers before doing any body hashing, while making the intended boundary explicit: HMAC i
Splits HMAC verification so Reprint can authenticate signed headers
before doing any body hashing, while making the intended boundary
explicit: HMAC is for small control-plane requests, not large data
uploads.
The existing verify() and verify_globals() paths still work for
current small requests. Newer code can use verify_control_request()
for bounded protocol commands or verify_content_hash() when it already
has a digest.
Push/inverse-pull needs two different trust boundaries:
That avoids reading or buffering a multi-megabyte body just to
authenticate it, and it keeps the future chunked upload flow compatible
with PHP hosts that buffer request bodies.
cd tests && ../vendor/bin/phpunit --colors=never HmacServerTest.phpcomposer analyzePrevent errors during compressibility checks
Prevent errors during compressibility checks (#258)
Retargets #1 into the monorepo package path.
Retargets #1 into the monorepo package path.
Also adds README files to the split Composer package directories explaining that the wp-php-toolkit package repositories are read-only mirrors and that changes should be proposed against adamziel/reprint.
Co-Authored-By: Luca Tumedei luca.tumedei@automattic.com
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
Prepare reprint v0.8.0 release
Prepare reprint v0.8.0 release
Bump php-toolkit packages to 0.7.9
Bump php-toolkit packages to 0.7.9
Picks up wp-php-toolkit v0.7.3 , which fixed the published-package autoload regressions caught by WordPress/php-toolkit#264 . The most relevant fixes
Picks up wp-php-toolkit
v0.7.3,
which fixed the published-package autoload regressions caught by
WordPress/php-toolkit#264. The most relevant fixes for reprint:
Picks up the v0.7.2 fixes — PSR-4 vs WP class-*.php naming, the WP-coexistence regression where html5-named-character-references.php loaded WP_Token_M
Picks up the v0.7.2 fixes — PSR-4 vs WP class-*.php naming, the
WP-coexistence regression where html5-named-character-references.php
loaded WP_Token_Map at composer bootstrap (caused fatals in any
consumer that also loads WordPress, e.g. wpcomsh tests), and the
package-bootstrap fatals from v0.7.0/v0.7.1.
Picks up the v0.7.2 fixes — PSR-4 vs WP class-*.php naming, the WP-coexistence regression where html5-named-character-references.php loaded WP_Token_M
Picks up the v0.7.2 fixes — PSR-4 vs WP class-*.php naming, the
WP-coexistence regression where html5-named-character-references.php
loaded WP_Token_Map at composer bootstrap (caused fatals in any
consumer that also loads WordPress, e.g. wpcomsh tests), and the
package-bootstrap fatals from v0.7.0/v0.7.1.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →