Skip to content

docs(7538): soffice is now optional for docx/pdf#7707

Merged
JohnMcLear merged 1 commit intodevelopfrom
chore/docs-soffice-optional-7538
May 9, 2026
Merged

docs(7538): soffice is now optional for docx/pdf#7707
JohnMcLear merged 1 commit intodevelopfrom
chore/docs-soffice-optional-7538

Conversation

@JohnMcLear
Copy link
Copy Markdown
Member

@JohnMcLear JohnMcLear commented May 9, 2026

Summary

Follow-up to #7568. The merged PR landed native DOCX export, PDF export, and DOCX import via pure-JS in-process converters — soffice/LibreOffice is no longer required for those three formats. Several doc comments still implied otherwise:

  • settings.json.template and settings.json.docker still said "Setting [soffice] to null disables LibreOffice and will only allow plain text and HTML import/exports."
  • The docxExport setting comment said it "requires 'soffice' to be set."
  • doc/docker.md and doc/docker.adoc had a "Rebuilding including export functionality for DOC/DOCX/PDF/ODT" section telling users to install LibreOffice for DOCX export.

This PR refreshes those comments and the docker docs to reflect actual behavior:

  • soffice configured: handles all office formats (existing behavior, unchanged).
  • soffice null: docx export, pdf export, and docx import work natively. odt/doc/rtf export and pdf import still need soffice.

Files

File Change
settings.json.template rewrite soffice + docxExport JSDoc comments
settings.json.docker same
doc/docker.md rename section to "Office-format import/export"; clarify when soffice is needed
doc/docker.adoc same; also align the SOFFICE table row with the wording already in doc/docker.md

No code changes, no behavior change — documentation only.

Refs #7538.

Native DOCX export, PDF export, and DOCX import shipped in #7568
via pure-JS in-process converters -- LibreOffice/soffice is no
longer required for those formats. Stale comments in
settings.json.template and settings.json.docker still implied
otherwise ("will only allow plain text and HTML import/exports"),
and the docker docs told users to configure soffice for DOCX as
well. Update them to match what's actually in core:

- soffice present: handles all office formats (existing behavior)
- soffice null: docx export, pdf export, docx import work
  natively; odt/doc/rtf export and pdf import still need soffice

Touches:
- settings.json.template (soffice + docxExport comments)
- settings.json.docker (same)
- doc/docker.md ("Office-format import/export" section)
- doc/docker.adoc (same section + the SOFFICE table row,
  matching what doc/docker.md already says since #7568)

No code changes, no behavior change -- documentation only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@qodo-code-review
Copy link
Copy Markdown

ⓘ You've reached your Qodo monthly free-tier limit. Reviews pause until next month — upgrade your plan to continue now, or link your paid account if you already have one.

@qodo-free-for-open-source-projects
Copy link
Copy Markdown

Review Summary by Qodo

Update docs: soffice now optional for DOCX/PDF formats

📝 Documentation

Grey Divider

Walkthroughs

Description
• Update documentation to reflect native DOCX/PDF support
• Clarify soffice is optional for DOCX export/import and PDF export
• Document fallback behavior when soffice is null
• Update settings comments to match actual implementation
Diagram
flowchart LR
  A["soffice configured"] -->|"handles all formats"| B["DOCX/PDF/ODT/DOC/RTF"]
  C["soffice null"] -->|"pure-JS converters"| D["DOCX/PDF export + DOCX import"]
  C -->|"unavailable"| E["ODT/DOC/RTF export + PDF import"]
Loading

Grey Divider

File Changes

1. doc/docker.adoc 📝 Documentation +10/-9

Clarify office format support and soffice requirements

• Renamed section from "Rebuilding including export functionality" to "Office-format import/export"
• Clarified DOCX/PDF/DOCX import work out of the box without LibreOffice
• Updated instructions to explain DOC/ODT/RTF export and PDF import still require LibreOffice
• Updated SOFFICE environment variable documentation table entry

doc/docker.adoc


2. doc/docker.md 📝 Documentation +9/-8

Clarify office format support and soffice requirements

• Renamed section from "Rebuilding including export functionality" to "Office-format import/export"
• Clarified DOCX/PDF/DOCX import work out of the box without LibreOffice
• Updated instructions to explain DOC/ODT/RTF export and PDF import still require LibreOffice

doc/docker.md


3. settings.json.docker 📝 Documentation +10/-7

Update soffice and docxExport configuration comments

• Updated soffice comment to clarify it handles all formats when configured
• Documented fallback to pure-JS converters when soffice is null
• Specified which formats work natively (DOCX/PDF export, DOCX import)
• Updated docxExport comment to explain dual-path behavior

settings.json.docker


View more (1)
4. settings.json.template 📝 Documentation +10/-7

Update soffice and docxExport configuration comments

• Updated soffice comment to clarify it handles all formats when configured
• Documented fallback to pure-JS converters when soffice is null
• Specified which formats work natively (DOCX/PDF export, DOCX import)
• Updated docxExport comment to explain dual-path behavior

settings.json.template


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects
Copy link
Copy Markdown

qodo-free-for-open-source-projects Bot commented May 9, 2026

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (0)

Context used

Grey Divider


Remediation recommended

1. RTF export misdocumented 🐞 Bug ≡ Correctness
Description
Docs and config-template comments claim RTF export is available via LibreOffice, but the server only
exposes export types pdf|doc|docx|txt|html|odt|etherpad so /export/rtf cannot work. This will
mislead operators into thinking RTF export is supported when it is not (RTF is import-only).
Code

doc/docker.md[R44-48]

+DOC/ODT/RTF export and PDF import still require LibreOffice. To enable
+them, install LibreOffice via the `INSTALL_SOFFICE` build variable (any
+value), and either set the `soffice` property in
+`<BASEDIR>/settings.json.docker` to `/usr/bin/soffice` or set the
+`SOFFICE` environment variable to `/usr/bin/soffice`.
Evidence
The updated Docker docs explicitly list “RTF export”, but the Express export route only allows a
fixed set of export types that does not include rtf, and the UI only renders links for
DOC/DOCX/PDF/ODT. The only RTF handling in the backend is on the import side via LibreOffice.

doc/docker.md[44-48]
src/node/hooks/express/importexport.ts[31-44]
src/static/js/pad_impexp.ts[147-160]
src/node/handler/ImportHandler.ts[68-72]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The docs/templates mention **RTF export**, but Etherpad does not expose an `rtf` export endpoint (and the UI has no RTF export link). This creates incorrect operator guidance.

### Issue Context
Backend export route allowlist omits `rtf`; RTF appears only in import handling.

### Fix Focus Areas
- doc/docker.md[44-48]
- doc/docker.adoc[71-75]
- doc/docker.adoc[456-456]
- settings.json.template[427-431]
- settings.json.docker[429-433]

Update wording to reflect reality (e.g., “RTF import” instead of “RTF export”), or drop RTF from export lists entirely.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Advisory comments

2. Windows PDF path undocumented 🐞 Bug ⚙ Maintainability
Description
The docs say that when soffice is configured all advanced formats (including PDF) use LibreOffice,
but on Windows the code reports sofficeAvailable() === 'withoutPDF' and forces native PDF export
even if soffice is set. This mismatch can confuse Windows operators/debugging because the actual
conversion path differs from what the docs claim.
Code

doc/docker.adoc[456]

+| Absolute path to the soffice (LibreOffice) executable. When configured, all advanced import/export formats use it (docx, pdf, odt, doc, rtf). Setting it to null falls back to in-process pure-JS converters: docx and pdf export, plus docx import, still work; odt/doc/rtf and pdf import remain unavailable.
Evidence
sofficeAvailable() returns withoutPDF on Windows whenever settings.soffice is non-null, and
ExportHandler uses that state to route PDF exports to the in-process native converter rather than
LibreOffice. The updated docs line claims PDF uses LibreOffice when configured, which is not true on
Windows.

doc/docker.adoc[456-456]
src/node/utils/Settings.ts[822-828]
src/node/handler/ExportHandler.ts[93-103]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
Docs currently state that when `soffice` is configured, PDF export uses LibreOffice. On Windows, the implementation intentionally routes PDF exports through the native converter (`withoutPDF` state).

### Issue Context
This is documentation clarity: PDF export still works, but through a different pipeline than the docs suggest.

### Fix Focus Areas
- doc/docker.adoc[456-456]
- doc/docker.md (SOFFICE row; update equivalent wording if present)
- settings.json.template[427-431]
- settings.json.docker[429-433]

Adjust text to mention the Windows `withoutPDF` behavior (PDF export uses native path even with `soffice` configured), or soften “all formats use it” wording.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

@JohnMcLear JohnMcLear merged commit ed4579c into develop May 9, 2026
43 of 44 checks passed
@JohnMcLear JohnMcLear deleted the chore/docs-soffice-optional-7538 branch May 9, 2026 10:29
@qodo-free-for-open-source-projects
Copy link
Copy Markdown

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Windows without plugins (24)

Failed stage: Run the backend tests [❌]

Failed test name: First item being an UL then subsequent being OL will fail

Failure summary:

The GitHub Action failed because the test suite reported a failing assertion during the list/HTML
export/import related tests.
- The log shows a failing test case titled First item being an UL then
subsequent being OL will fail, where the assertion text matches did not pass (it is marked with -
text matches instead of around line 530).
- After this failed assertion, the test runner exited
with [ELIFECYCLE] Test failed and the job ended with exit code 1.
Note: Other [ERROR] log lines (for
example, LibreOffice export conversion failing to spawn /bin/false) are followed by passing
assertions such as ✔ returns 500 on export error, so they are expected by the tests and are not the
cause of the action failure.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

363:  �[32m[2026-05-09T10:29:22.208] [INFO] plugins - �[39mLoading plugin ep_etherpad-lite...
364:  �[32m[2026-05-09T10:29:22.209] [INFO] plugins - �[39mLoaded 1 plugins
365:  �[32m[2026-05-09T10:29:22.634] [INFO] server - �[39mInstalled plugins: 
366:  �[32m[2026-05-09T10:29:22.635] [INFO] settings - �[39mReport bugs at https://github.com/ether/etherpad/issues
367:  �[32m[2026-05-09T10:29:22.636] [INFO] settings - �[39mYour Etherpad version is 2.7.3 (fe3440e)
368:  �[32m[2026-05-09T10:29:23.551] [INFO] updater - �[39mupdater: install method = git, tier = notify
369:  �[32m[2026-05-09T10:29:23.554] [INFO] http - �[39mHTTP server listening for connections
370:  �[32m[2026-05-09T10:29:23.554] [INFO] settings - �[39mYou can access your Etherpad instance at http://localhost:0/
371:  �[33m[2026-05-09T10:29:23.554] [WARN] settings - �[39mAdmin username and password not set in settings.json. To access admin please uncomment and edit "users" in settings.json
372:  �[32m[2026-05-09T10:29:23.554] [INFO] server - �[39mEtherpad is running
373:  D:\a\etherpad\etherpad\src\tests\backend\specs\anonymizeAuthor.ts
374:  ✔ zeroes the display identity on globalAuthor:<id>
375:  ✔ drops token2author and mapper2author mappings pointing at the author
376:  ✔ is idempotent — second call returns zero counters
377:  ✔ returns zero counters for an unknown authorID
378:  ✔ re-runs the sweep when a prior call errored before setting erased=true
379:  D:\a\etherpad\etherpad\src\tests\backend\specs\anonymizeIp.ts
...

463:  textColorFromBackgroundColor — invariant
464:  ✔ always picks whichever of black/white gives the higher contrast
465:  D:\a\etherpad\etherpad\src\tests\backend\specs\compactPad.ts
466:  API.compactPad()
467:  ✔ collapses all history when keepRevisions is omitted
468:  ✔ keeps only the last N revisions when keepRevisions is a number
469:  ✔ rejects negative keepRevisions
470:  ✔ rejects non-numeric keepRevisions
471:  ✔ rejects fractional keepRevisions
472:  ✔ refuses to run when cleanup.enabled is false
473:  HTTP API dispatch (1.3.1)
474:  ✔ passes keepRevisions from query string into compactPad
475:  ✔ collapses all history when keepRevisions is absent from URL
476:  runCompactAll (bin/compactAllPads loop)
477:  ✔ parses --keep / --dry-run / no args
478:  �[91m[2026-05-09T10:29:25.379] [ERROR] settings - �[39m--keep expects a non-negative integer; got abc
479:  �[91m[2026-05-09T10:29:25.379] [ERROR] settings - �[39m--keep expects a non-negative integer; got -1
480:  ✔ rejects --keep with non-integer / negative / unknown args
481:  ✔ compacts every pad and tallies before/after revisions
482:  ✔ honours --keep N by passing it through to compactPad
483:  ✔ --dry-run does not call compactPad
484:  ✔ keeps going when one pad fails to compact
485:  ✔ keeps going when one pad fails the pre-flight count
486:  ✔ reports listAllPads failure without iterating
487:  ✔ handles an empty instance
...

515:  ✔ text matches
516:  ✔ alines match
517:  ✔ attributes are sorted in canonical order
518:  A single completely empty line break within an ol should reset count if OL is closed off..
519:  ✔ text matches
520:  ✔ alines match
521:  ✔ attributes are sorted in canonical order
522:  A single <p></p> should create a new line
523:  ✔ text matches
524:  ✔ alines match
525:  ✔ attributes are sorted in canonical order
526:  Tests if ols properly get line numbers when in a normal OL #2
527:  ✔ text matches
528:  ✔ alines match
529:  ✔ attributes are sorted in canonical order
530:  First item being an UL then subsequent being OL will fail
531:  - text matches
...

646:  D:\a\etherpad\etherpad\src\tests\backend\specs\ensureAuthorTokenCookie.ts
647:  ✔ mints a fresh t.* token when the cookie is absent
648:  ✔ reuses the cookie value and does not emit Set-Cookie when already set
649:  ✔ sets Secure when the request is HTTPS
650:  ✔ uses SameSite=None when embedded cross-site (Sec-Fetch-Site: cross-site)
651:  ✔ ignores an invalid existing cookie and mints a fresh one
652:  D:\a\etherpad\etherpad\src\tests\backend\specs\export_list.ts
653:  ✔ indent lines export with list-style-type:none (184ms)
654:  ✔ ordered list numbering preserved across bullet interruptions (round-trip)
655:  ✔ ordered list numbering preserved across bullet interruptions (no explicit start)
656:  ✔ ordered list numbering preserved with multiple items
657:  ✔ nested ordered list counters reset when closing levels
658:  D:\a\etherpad\etherpad\src\tests\backend\specs\export.ts
659:  �[32m[2026-05-09T10:29:26.059] [INFO] settings - �[39mExporting pad "testExportPad" in doc format
660:  �[32m[2026-05-09T10:29:26.071] [INFO] LibreOffice - �[39m[8744] Converting C:\Users\RUNNER~1\AppData\Local\Temp/etherpad_export_2328913933.html to odt in C:\Users\RUNNER~1\AppData\Local\Temp
661:  �[91m[2026-05-09T10:29:26.077] [ERROR] LibreOffice - �[39m[8744] stderr: The system cannot find the path specified.
662:  �[91m[2026-05-09T10:29:26.079] [ERROR] LibreOffice - �[39m[8744] Conversion failed: Error: Failed to spawn /bin/false: spawn /bin/false ENOENT
663:  at exports (D:\a\etherpad\etherpad\src\node\utils\run_cmd.ts:124:48)
664:  at doConvertTask (D:\a\etherpad\etherpad\src\node\utils\LibreOffice.ts:38:13)
665:  at D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:151:38
666:  at D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:4017:13
667:  at Object.process (D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:1680:21)
668:  at D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:1532:23
669:  at D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:74:45
670:  �[91m[2026-05-09T10:29:26.081] [ERROR] settings - �[39mError: Failed to spawn /bin/false: spawn /bin/false ENOENT
671:  at exports (D:\a\etherpad\etherpad\src\node\utils\run_cmd.ts:124:48)
672:  at doConvertTask (D:\a\etherpad\etherpad\src\node\utils\LibreOffice.ts:38:13)
673:  at D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:151:38
674:  at D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:4017:13
675:  at Object.process (D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:1680:21)
676:  at D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:1532:23
677:  at D:\a\etherpad\etherpad\node_modules\.pnpm\async@3.2.6\node_modules\async\dist\async.js:74:45
678:  ✔ returns 500 on export error
679:  native DOCX export (#7538)
680:  �[32m[2026-05-09T10:29:26.086] [INFO] settings - �[39mExporting pad "testExportPad" in docx format
681:  ✔ returns a valid DOCX archive (PK zip signature) (263ms)
682:  �[32m[2026-05-09T10:29:26.349] [INFO] settings - �[39mExporting pad "testExportPad" in docx format
683:  ✔ sends the Word-processing-ml content-type
684:  native PDF export (#7538)
685:  �[32m[2026-05-09T10:29:26.368] [INFO] settings - �[39mExporting pad "testExportPad" in pdf format
686:  ✔ returns a valid %PDF- document (120ms)
687:  �[32m[2026-05-09T10:29:26.489] [INFO] settings - �[39mExporting pad "testExportPad" in pdf format
688:  ✔ sends application/pdf content-type
689:  odt without soffice (#7538)
690:  �[91m[2026-05-09T10:29:26.510] [ERROR] settings - �[39mImpossible to export pad "testExportPad" in odt format. There is no converter configured
691:  ✔ returns the "not enabled" message for odt
...

748:  D:\a\etherpad\etherpad\src\tests\backend\specs\ExportEtherpad.ts
749:  exportEtherpadAdditionalContent
750:  ✔ exports custom records
751:  ✔ export from read-only pad uses read-only ID
752:  ✔ does not export records from pad with similar ID
753:  revNum bounding (issue #5071)
754:  ✔ defaults to full history when revNum is omitted
755:  ✔ limits exported revisions to 0..revNum when supplied
756:  ✔ treats a revNum above head as equivalent to full history
757:  D:\a\etherpad\etherpad\src\tests\backend\specs\favicon.ts
758:  ✔ uses custom favicon if set (relative pathname)
759:  ✔ uses custom favicon from url
760:  ✔ uses custom favicon if set (absolute pathname)
761:  ✔ falls back if custom favicon is missing
762:  ✔ uses skin favicon if present
763:  �[91m[2026-05-09T10:29:26.618] [ERROR] settings - �[39m(node:4620) [DEP0147] DeprecationWarning: In future versions of Node.js, fs.rmdir(path, { recursive: true }) will be removed. Use fs.rm(path, { recursive: true }) instead
764:  (Use `node --trace-deprecation ...` to show where the warning was created)
...

1117:  ✔ defer call cb(unrejectedPromise) then defer call to cb(resolvedPromise) (diff. outcomes) -> log+throw
1118:  ✔ defer call cb(unrejectedPromise) then defer call to cb(rejectedPromise) (diff. outcomes) -> log+throw
1119:  ✔ defer call cb(unrejectedPromise) then defer call to cb(rejectedPromise) (same outcome) -> only log
1120:  ✔ defer call cb(unrejectedPromise) then defer call to cb(unresolvedPromise) (diff. outcomes) -> log+throw
1121:  ✔ defer call cb(unrejectedPromise) then defer call cb(unrejectedPromise) (diff. outcomes) -> log+throw
1122:  ✔ defer call cb(unrejectedPromise) then defer call cb(unrejectedPromise) (same outcome) -> only log
1123:  hooks.aCallAll
1124:  basic behavior
1125:  ✔ calls all asynchronously, returns values in order
1126:  ✔ passes hook name
1127:  ✔ undefined context -> {}
1128:  ✔ null context -> {}
1129:  ✔ context unmodified
1130:  aCallAll callback
1131:  ✔ exception in callback rejects
1132:  ✔ propagates error on exception
1133:  ✔ propagages null error on success
1134:  ✔ propagages results on success
...

1215:  ✔ author already exists, no pads
1216:  ✔ author already exists, on different pad
1217:  ✔ author already exists, on same pad
1218:  enforces consistent pad ID
1219:  ✔ pad record has different pad ID
1220:  ✔ globalAuthor record has different pad ID
1221:  ✔ pad rev record has different pad ID
1222:  order of records does not matter
1223:  ✔ [0,1,2]
1224:  ✔ [0,2,1]
1225:  ✔ [1,0,2]
1226:  ✔ [1,2,0]
1227:  ✔ [2,0,1]
1228:  ✔ [2,1,0]
1229:  old .etherpad imports without author metadata
1230:  ✔ imports without error when revision lacks meta.author
1231:  ✔ getRevisionAuthor returns empty string for missing author
...

1247:  ✔ src/node/handler/PadMessageHandler.ts does not log a raw IP
1248:  ✔ src/node/handler/SocketIORouter.ts does not log a raw IP
1249:  ✔ src/node/hooks/express/webaccess.ts does not log a raw IP
1250:  ✔ src/node/hooks/express/importexport.ts does not log a raw IP
1251:  invalid ipLogging falls back to anonymous at load time
1252:  ✔ rejects an unknown mode
1253:  ✔ rejects null
1254:  D:\a\etherpad\etherpad\src\tests\backend\specs\largePaste.ts
1255:  ✔ can set and retrieve 50,000 characters of text on a pad
1256:  D:\a\etherpad\etherpad\src\tests\backend\specs\LinkInstaller.ts
1257:  readFileSync with plain paths (bug fix)
1258:  ✔ reads a plugin package.json using a plain file path and utf-8
1259:  ✔ path.join produces a plain string path, not a URL object
1260:  addSubDependency-style resolution
1261:  ✔ recursively resolves nested dependencies from package.json files
1262:  error handling when package.json is missing
1263:  ✔ logs an error instead of crashing when package.json does not exist
1264:  D:\a\etherpad\etherpad\src\tests\backend\specs\lowerCasePadIds.ts
...

1268:  ✔ lowercase pad ids
1269:  �[32m[2026-05-09T10:29:27.605] [INFO] access - �[39m[CREATE] pad:ALREADYexistingPad socket:v8scPQJ2kANvAzM9AAAP IP:ANONYMOUS authorID:a.EIV8cwzLx2jMzq7t
1270:  �[32m[2026-05-09T10:29:27.636] [INFO] access - �[39m[CREATE] pad:alreadyexistingpad socket:uvlLxYnhUaTrmHTeAAAR IP:ANONYMOUS authorID:a.fSRONVsqGZxHtlRl
1271:  ✔ keeps old pads accessible (69ms)
1272:  �[32m[2026-05-09T10:29:27.669] [INFO] access - �[39m[CREATE] pad:maliciousattempt socket:-eD4UJT2tCBHzrYPAAAT IP:ANONYMOUS authorID:a.4pdOuoc2pmHhnRrU
1273:  ✔ disallow creation of different case pad-name via socket connection
1274:  D:\a\etherpad\etherpad\src\tests\backend\specs\messages.ts
1275:  CHANGESET_REQ
1276:  �[32m[2026-05-09T10:29:27.690] [INFO] access - �[39m[ENTER] pad:NrFtQWTuBs socket:fGVw_hIWHmNaDGaTAAAV IP:ANONYMOUS authorID:a.NO1oQMNXij16i8d2
1277:  �[32m[2026-05-09T10:29:27.731] [INFO] access - �[39m[ENTER] pad:NrFtQWTuBs socket:dV5s1KCVMyrdv5WVAAAX IP:ANONYMOUS authorID:a.cFhqrimTz99Yy42K
1278:  ✔ users are unable to read changesets from other pads
1279:  �[32m[2026-05-09T10:29:28.751] [INFO] access - �[39m[LEAVE] pad:NrFtQWTuBs socket:fGVw_hIWHmNaDGaTAAAV IP:ANONYMOUS authorID:a.NO1oQMNXij16i8d2
1280:  �[32m[2026-05-09T10:29:28.751] [INFO] access - �[39m[LEAVE] pad:NrFtQWTuBs socket:dV5s1KCVMyrdv5WVAAAX IP:ANONYMOUS authorID:a.cFhqrimTz99Yy42K
1281:  �[32m[2026-05-09T10:29:28.777] [INFO] access - �[39m[ENTER] pad:BumR7X6SnP socket:yyIGiBDvL2vt6QMzAAAZ IP:ANONYMOUS authorID:a.2fKx1EFc99Hlp8Aq
1282:  �[32m[2026-05-09T10:29:28.794] [INFO] access - �[39m[ENTER] pad:BumR7X6SnP socket:UyHuIZguat4JRk8yAAAb IP:ANONYMOUS authorID:a.az9ulGyvBwP18uv9
1283:  �[91m[2026-05-09T10:29:29.807] [ERROR] socket.io - �[39mError handling pad message from UyHuIZguat4JRk8yAAAb: Error: CHANGESET_REQ: rev is not a number
1284:  at Object.exports.handleMessage (D:\a\etherpad\etherpad\src\node\handler\PadMessageHandler.ts:545:11)
...

1290:  �[32m[2026-05-09T10:29:29.852] [INFO] access - �[39m[ENTER] pad:0uh5JQc5vq socket:OBzKGYisnXRgmG35AAAf IP:ANONYMOUS authorID:a.AG88QyFCra6UBG2T
1291:  ✔ CHANGESET_REQ: revNum is converted to number if possible (regression)
1292:  �[32m[2026-05-09T10:29:30.866] [INFO] access - �[39m[LEAVE] pad:0uh5JQc5vq socket:bd-iqYyN330ejKbXAAAd IP:ANONYMOUS authorID:a.LzRaTbwqZxzob8g6
1293:  �[32m[2026-05-09T10:29:30.866] [INFO] access - �[39m[LEAVE] pad:0uh5JQc5vq socket:OBzKGYisnXRgmG35AAAf IP:ANONYMOUS authorID:a.AG88QyFCra6UBG2T
1294:  �[32m[2026-05-09T10:29:30.885] [INFO] access - �[39m[ENTER] pad:wKEL4FTmnr socket:zJ05jyWphj86saetAAAh IP:ANONYMOUS authorID:a.PI2anczK19rsvbDu
1295:  �[32m[2026-05-09T10:29:30.910] [INFO] access - �[39m[ENTER] pad:wKEL4FTmnr socket:VrFRT5nrVP--pqpZAAAj IP:ANONYMOUS authorID:a.8ZeIKVcQMB1jD0Mn
1296:  ✔ CHANGESET_REQ: revNum 2 is converted to head rev 1 (regression)
1297:  �[32m[2026-05-09T10:29:31.926] [INFO] access - �[39m[LEAVE] pad:wKEL4FTmnr socket:zJ05jyWphj86saetAAAh IP:ANONYMOUS authorID:a.PI2anczK19rsvbDu
1298:  �[32m[2026-05-09T10:29:31.926] [INFO] access - �[39m[LEAVE] pad:wKEL4FTmnr socket:VrFRT5nrVP--pqpZAAAj IP:ANONYMOUS authorID:a.8ZeIKVcQMB1jD0Mn
1299:  USER_CHANGES
1300:  �[32m[2026-05-09T10:29:31.941] [INFO] access - �[39m[ENTER] pad:qh4zvYcfgs socket:UzKHCm8ZrdlEv6zZAAAl IP:ANONYMOUS authorID:a.WnQu0vRjc6oNNJ8E
1301:  �[32m[2026-05-09T10:29:31.970] [INFO] access - �[39m[ENTER] pad:qh4zvYcfgs socket:hgmh7tUEp8beQjzQAAAn IP:ANONYMOUS authorID:a.dTfHkZ7DIhmKK5vp
1302:  ✔ changes are applied
1303:  �[32m[2026-05-09T10:29:32.975] [INFO] access - �[39m[LEAVE] pad:qh4zvYcfgs socket:UzKHCm8ZrdlEv6zZAAAl IP:ANONYMOUS authorID:a.WnQu0vRjc6oNNJ8E
1304:  �[32m[2026-05-09T10:29:32.976] [INFO] access - �[39m[LEAVE] pad:qh4zvYcfgs socket:hgmh7tUEp8beQjzQAAAn IP:ANONYMOUS authorID:a.dTfHkZ7DIhmKK5vp
1305:  [ELIFECYCLE] Test failed. See above for more details.
1306:  ##[error]Process completed with exit code 1.
1307:  Post job cleanup.

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