Build Logs
nationalarchives/dr2-preservica-client • 3.8.1-RC1:2026-01-13
Errors
23
Warnings
0
Total Lines
501
1##################################
2Clonning https://github.com/nationalarchives/dr2-preservica-client.git into /build/repo using revision v0.0.154
3##################################
4Note: switching to '81598aeebf42345d415a013f9a0f06ac6de87c69'.
5
6You are in 'detached HEAD' state. You can look around, make experimental
7changes and commit them, and you can discard any commits you make in this
8state without impacting any branches by switching back to a branch.
9
10If you want to create a new branch to retain commits you create, you may
11do so (now or later) by using -c with the switch command. Example:
12
13 git switch -c <new-branch-name>
14
15Or undo this operation with:
16
17 git switch -
18
19Turn off this advice by setting config variable advice.detachedHead to false
20
21Would override fixed Scala version: 3.7.3
22----
23Preparing build for 3.8.1-RC1
24Scala binary version found: 3.8
25Implicitly using source version 3.8
26Scala binary version found: 3.8
27Implicitly using source version 3.8
28Would try to apply common scalacOption (best-effort, sbt/mill only):
29Append: ,REQUIRE:-source:3.8
30Remove: ,-deprecation,-feature,-Xfatal-warnings,-Werror,MATCH:.*-Wconf.*any:e
31
32Try apply source patch:
33Path: build.sbt
34Pattern: val scala3Version = "3.7.3"
35Replacement: val scala3Version = "3.8.1-RC1"
36Starting compilation server
37Compiling project (Scala 3.7.3, JVM (17))
38Compiled project (Scala 3.7.3, JVM (17))
39Successfully applied pattern 'val scala3Version = "3.7.3"' in build.sbt
40----
41Starting build for 3.8.1-RC1
42Execute tests: true
43sbt project found:
44No prepare script found for project nationalarchives/dr2-preservica-client
45##################################
46Scala version: 3.8.1-RC1
47Targets: uk.gov.nationalarchives%preservica-client-fs2 uk.gov.nationalarchives%preservica-client-root
48Project projectConfig: {"projects":{"exclude":[],"overrides":{}},"java":{},"sbt":{"commands":[],"options":[]},"mill":{"options":[]},"tests":"full","migrationVersions":[],"sourcePatches":[{"path":"build.sbt","pattern":"val scala3Version = \"3.7.3\"","replaceWith":"val scala3Version = \"<SCALA_VERSION>\""}]}
49##################################
50Using extra scalacOptions: ,REQUIRE:-source:3.8
51Filtering out scalacOptions: ,-deprecation,-feature,-Xfatal-warnings,-Werror,MATCH:.*-Wconf.*any:e
52[sbt_options] declare -a sbt_options=()
53[process_args] java_version = '17'
54[copyRt] java9_rt = '/root/.sbt/1.0/java9-rt-ext-eclipse_adoptium_17_0_8/rt.jar'
55# Executing command line:
56java
57-Dfile.encoding=UTF-8
58-Dcommunitybuild.scala=3.8.1-RC1
59-Dcommunitybuild.project.dependencies.add=
60-Xmx7G
61-Xms4G
62-Xss8M
63-Dsbt.script=/root/.sdkman/candidates/sbt/current/bin/sbt
64-Dscala.ext.dirs=/root/.sbt/1.0/java9-rt-ext-eclipse_adoptium_17_0_8
65-jar
66/root/.sdkman/candidates/sbt/1.11.5/bin/sbt-launch.jar
67"setCrossScalaVersions 3.8.1-RC1"
68"++3.8.1-RC1 -v"
69"mapScalacOptions ",REQUIRE:-source:3.8,-Wconf:msg=can be rewritten automatically under:s" ",-deprecation,-feature,-Xfatal-warnings,-Werror,MATCH:.*-Wconf.*any:e""
70"set every credentials := Nil"
71"excludeLibraryDependency com.github.ghik:zerowaste_{scalaVersion} com.olegpy:better-monadic-for_3 org.polyvariant:better-tostring_{scalaVersion} org.wartremover:wartremover_{scalaVersion}"
72"removeScalacOptionsStartingWith -P:wartremover"
73
74moduleMappings
75"runBuild 3.8.1-RC1 """{"projects":{"exclude":[],"overrides":{}},"java":{},"sbt":{"commands":[],"options":[]},"mill":{"options":[]},"tests":"full","migrationVersions":[],"sourcePatches":[{"path":"build.sbt","pattern":"val scala3Version = \"3.7.3\"","replaceWith":"val scala3Version = \"<SCALA_VERSION>\""}]}""" uk.gov.nationalarchives%preservica-client-fs2 uk.gov.nationalarchives%preservica-client-root"
76
77[info] [launcher] getting org.scala-sbt sbt 1.11.6 (this may take some time)...
78[info] welcome to sbt 1.11.6 (Eclipse Adoptium Java 17.0.8)
79[info] loading settings for project repo-build from akka.sbt, plugins.sbt...
80[info] loading project definition from /build/repo/project
81[info] compiling 3 Scala sources to /build/repo/project/target/scala-2.12/sbt-1.0/classes ...
82[info] Non-compiled module 'compiler-bridge_2.12' for Scala 2.12.20. Compiling...
83[info] Compilation completed in 8.628s.
84[info] done compiling
85[info] loading settings for project root from build.sbt, version.sbt...
86[info] set current project to preservica-client-root (in build file:/build/repo/)
87Execute setCrossScalaVersions: 3.8.1-RC1
88OpenCB::Changing crossVersion 3.8.1-RC1 -> 3.8.1-RC1 in fs2/crossScalaVersions
89OpenCB::Changing crossVersion 3.8.1-RC1 -> 3.8.1-RC1 in root/crossScalaVersions
90OpenCB::Changing crossVersion 3.8.1-RC1 -> 3.8.1-RC1 in docs/crossScalaVersions
91[info] set current project to preservica-client-root (in build file:/build/repo/)
92[info] Setting Scala version to 3.8.1-RC1 on 3 projects.
93[info] Switching Scala version on:
94[info] * root (3.8.1-RC1)
95[info] fs2 (3.8.1-RC1)
96[info] docs (3.8.1-RC1)
97[info] Excluding projects:
98[info] Reapplying settings...
99[info] set current project to preservica-client-root (in build file:/build/repo/)
100Execute mapScalacOptions: ,REQUIRE:-source:3.8,-Wconf:msg=can be rewritten automatically under:s ,-deprecation,-feature,-Xfatal-warnings,-Werror,MATCH:.*-Wconf.*any:e
101[info] Reapplying settings...
102[info] set current project to preservica-client-root (in build file:/build/repo/)
103[info] Defining Global / credentials, credentials and 1 others.
104[info] The new values will be used by Compile / scalafmtOnly, Global / pgpSelectPassphrase and 23 others.
105[info] Run `last` for details.
106[info] Reapplying settings...
107[info] set current project to preservica-client-root (in build file:/build/repo/)
108Execute excludeLibraryDependency: com.github.ghik:zerowaste_{scalaVersion} com.olegpy:better-monadic-for_3 org.polyvariant:better-tostring_{scalaVersion} org.wartremover:wartremover_{scalaVersion}
109[info] Reapplying settings...
110OpenCB::Failed to reapply settings in excludeLibraryDependency: Reference to undefined setting:
111
112 Global / allExcludeDependencies from Global / allExcludeDependencies (CommunityBuildPlugin.scala:331)
113 Did you mean allExcludeDependencies ?
114 , retry without global scopes
115[info] Reapplying settings...
116[info] set current project to preservica-client-root (in build file:/build/repo/)
117Execute removeScalacOptionsStartingWith: -P:wartremover
118[info] Reapplying settings...
119[info] set current project to preservica-client-root (in build file:/build/repo/)
120[success] Total time: 0 s, completed Jan 13, 2026, 8:29:14 PM
121Build config: {"projects":{"exclude":[],"overrides":{}},"java":{},"sbt":{"commands":[],"options":[]},"mill":{"options":[]},"tests":"full","migrationVersions":[],"sourcePatches":[{"path":"build.sbt","pattern":"val scala3Version = \"3.7.3\"","replaceWith":"val scala3Version = \"<SCALA_VERSION>\""}]}
122Parsed config: Success(ProjectBuildConfig(ProjectsConfig(List(),Map()),Full,List()))
123Starting build...
124Projects: Set(fs2, root)
125Starting build for ProjectRef(file:/build/repo/,fs2) (preservica-client-fs2)... [0/2]
126OpenCB::Exclude Scala3 specific scalacOption `REQUIRE:-source:3.8` in Scala 2.12.20 module Global
127OpenCB::Filter out '-Werror', matches setting pattern '^-?-Werror'
128OpenCB::Filter out '-deprecation', matches setting pattern '^-?-deprecation'
129Compile scalacOptions: -Wunused:imports, -Xmax-inlines, 50, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
130[info] compiling 12 Scala sources to /build/repo/target/scala-3.8.1-RC1/classes ...
131[info] done compiling
132[info] compiling 1 Scala source to /build/repo/fs2/target/scala-3.8.1-RC1/classes ...
133[info] done compiling
134[info] compiling 10 Scala sources to /build/repo/target/scala-3.8.1-RC1/test-classes ...
135[info] done compiling
136[info] compiling 8 Scala sources to /build/repo/fs2/target/scala-3.8.1-RC1/test-classes ...
137[info] done compiling
138SLF4J: No SLF4J providers were found.
139SLF4J: Defaulting to no-operation (NOP) logger implementation
140SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
141[info] Fs2UserClientTest:
142[info] resetPassword
143[info] - should return an exception if API returns an error
144[info] resetPassword
145[info] - should pass the correct credentials to the API
146[info] resetPassword
147[info] - should return an error if the old and new password are equal
148[info] resetPassword
149[info] - should return an error if the old and new password are equal, but have different letter casing
150[info] resetPassword
151[info] - should return an error if the old and new password are equal, even if they have leading/trailing spaces
152[info] resetPassword
153[info] - should return an error if the current password is empty
154[info] resetPassword
155[info] - should return an error if the new password is empty
156[info] resetPassword
157[info] - should return an error if the new password has fewer than 15 characters
158[info] testNewPassword
159[info] - should call secrets manager for the pending secret
160[info] testNewPassword
161[info] - should call the Preservica auth url with the pending password
162[info] testNewPassword
163[info] - should return an error if secrets manager returns an error
164[info] testNewPassword
165[info] - should return an error if Preservica returns an error
166[info] Fs2EntityClientTest:
167[info] addEntity
168[info] - should make a correct request with a predefined reference to add an entity
169[info] addEntity
170[info] - should make a correct request without a predefined reference to add an entity
171[info] addEntity
172[info] - should make a correct request with the object details inside a XIP node if entity path to add is an 'information object'
173[info] addEntity
174[info] - should return an error if a content-object entity path was passed in
175[info] addEntity
176[info] - should return an error if a non-structural object was passed in without a parent
177[info] addEntity
178[info] - should return a message confirmation if the object got added
179[info] addEntity
180[info] - should return an exception if the API call does
181[info] updateEntity
182[info] - should make a correct request to update the title and description
183[info] updateEntity
184[info] - should make a correct request to update the title
185[info] updateEntity
186[info] - should return an error if a non-structural object was passed in without a parent
187[info] updateEntity
188[info] - should return a message confirmation if the object got updated
189[info] updateEntity
190[info] - should return an exception if the API call does
191[info] getBitstreamInfo
192[info] - should call the correct API endpoints and return the bitstream info
193[info] getBitstreamInfo
194[info] - should return an error if no generations are available
195[info] getBitstreamInfo
196[info] - should return an error if the server is unavailable
197[info] streamBitstreamContent
198[info] - should stream content to the provided function
199[info] streamBitstreamContent
200[info] - should return an error if the server is unavailable
201[info] metadataForEntity
202[info] - should return the correct metadata for a CO
203[info] metadataForEntity
204[info] - should return the correct metadata for an IO
205[info] metadataForEntity
206[info] - should return 'standard' metadata if the Entity type in the request is not an IO nor CO
207[info] metadataForEntity
208[info] - should return an empty list when the object has no fragments
209[info] metadataForEntity
210[info] - should return an error if even one metadata response element is empty
211[info] metadataForEntity
212[info] - should return an error if the server is unavailable
213[info] metadataForEntity
214[info] - should return an error if the entity path is empty
215[info] entitiesUpdatedSince
216[info] - should return an entity if one was updated since the datetime specified
217[info] entitiesUpdatedSince
218[info] - should return hasNext false if there is no Next element in the response
219[info] entitiesUpdatedSince
220[info] - should return an entity, with hasNext set to true, if the entity is before the end date specified
221[info] entitiesUpdatedSince
222[info] - should return an empty list if none have been updated
223[info] entitiesUpdatedSince
224[info] - should return an error if the request is malformed
225[info] entityEventActions
226[info] - should return all paginated values in reverse chronological order (most recent EventAction first)
227[info] entityEventActions
228[info] - should return an error if the request is malformed
229[info] entityEventActions
230[info] - should return an error if the entity path is empty
231[info] entitiesByIdentifiers
232[info] - should return a complete entity if it has the identifier specified
233[info] entitiesByIdentifiers
234[info] - should return two entities if they both have the same identifier
235[info] entitiesByIdentifiers
236[info] - should return an empty list if no entities have the identifiers specified
237[info] entitiesByIdentifiers
238[info] - should return an error if the request is malformed
239[info] addIdentifierForEntity
240[info] - should make a correct request to add an identifier to an Entity
241[info] addIdentifierForEntity
242[info] - should return an exception if the API call does
243[info] addIdentifierForEntity
244[info] - should return a message confirmation if the Identifier was added
245[info] getEntity
246[info] - should return the requested entity
247[info] getEntity
248[info] - should return an error if the returned entity has a different entity type
249[info] getEntity
250[info] - should return an error if the entity is not found
251[info] getEntity
252[info] - should return the entity if the first call fails but the second succeeds
253[info] updateEntityIdentifiers
254[info] - should not send a request if no identifiers are passed
255[info] updateEntityIdentifiers
256[info] - should send a request to Preservica for each identifier
257[info] updateEntityIdentifiers
258[info] - should return an error if the entity path is missing
259[info] updateEntityIdentifiers
260[info] - should return an error if the update request returns an error
261[info] getEntityIdentifiers
262[info] - should return an empty list if there are no identifiers
263[info] getEntityIdentifiers
264[info] - should return the identifiers for an entity
265[info] getEntityIdentifiers
266[info] - should return an error if the entity path is missing
267[info] getEntityIdentifiers
268[info] - should return an error if the get request returns an error
269[info] getUrlsToIoRepresentations
270[info] - should return an empty list if there are no representations
271[info] getUrlsToIoRepresentations
272[info] - should return the url of a Preservation representation
273[info] getUrlsToIoRepresentations
274[info] - should return a url for each representation if 'representationType' filter passed in, was 'None'
275[info] getUrlsToIoRepresentations
276[info] - should return an error if the get request returns an error
277[info] getContentObjectsFromRepresentation
278[info] - should return an empty list if there are no representations
279[info] getContentObjectsFromRepresentation
280[info] - should return the Content Objects of a Preservation Representation
281[info] getContentObjectsFromRepresentation
282[info] - should return an error if the get request returns an error
283[info] getPreservicaNamespaceVersion
284[info] - should extract and return the version, as a float, from a namespace
285[info] streamAllEntityRefs
286[info] - should recursively collect and return the correct entityRefs
287[info] streamAllEntityRefs
288[info] - should return an error if the get request returns an error
289[info] Fs2WorkflowClientTest:
290[info] startWorkflow
291[info] - should return an exception if a request has both workflowContextName and workflowContextId set to None
292[info] startWorkflow
293[info] - should make a correct full request to start a workflow
294[info] startWorkflow
295[info] - should make a request without the '<WorkflowContextName>' node but with these nodes: <WorkflowContextId>, <Parameter>, <CorrelationId> if the corresponding property was not passed in
296[info] startWorkflow
297[info] - should make a request without the '<WorkflowContextId>' node but with these nodes: <WorkflowContextName>, <Parameter>, <CorrelationId> if the corresponding property was not passed in
298[info] startWorkflow
299[info] - should make a request without the '<Parameter>' node but with these nodes: <WorkflowContextName>, <WorkflowContextId>, <CorrelationId> if the corresponding property was not passed in
300[info] startWorkflow
301[info] - should make a request without the '<CorrelationId>' node but with these nodes: <WorkflowContextName>, <WorkflowContextId>, <Parameter> if the corresponding property was not passed in
302[info] startWorkflow
303[info] - should return the 'Id' of the Workflow if the request was successful
304[info] startWorkflow
305[info] - should return an exception if the API call does
306[info] Fs2ContentClientTest:
307[info] search
308[info] - should search using the parameters passed to the method
309[info] search
310[info] - should call the API multiple times if there are multiple pages
311[info] search
312[info] - should return an error if the API returns an error
313[info] Fs2ValidateXmlAgainstXsdTest:
314[info] xmlStringIsValid
315[info] - should return 'true' if the XIP xml string that was passed in was valid
316[info] xmlStringIsValid
317[info] - should throw a 'SAXParseException' if the XIP xml string that was passed in, did not have a namespace
318[info] xmlStringIsValid
319[info] - should throw a 'SAXParseException' if the XIP xml string that was passed in, has an unexpected namespace
320[info] xmlStringIsValid
321[info] - should throw a 'SAXParseException' if the XIP xml string that was passed in, contains an unexpected element
322[info] xmlStringIsValid
323[info] - should throw a 'SAXParseException' if the XIP xml string that was passed in, is missing an expected element
324[info] xmlStringIsValid
325[info] - should return 'true' if the OPEX xml string that was passed in was valid
326[info] xmlStringIsValid
327[Fatal Error] :1:20: The prefix "opex" for element "opex:OPEXMetadata" is not bound.
328[info] - should throw a 'SAXParseException' if the OPEX xml string that was passed in, did not have a namespace
329[info] xmlStringIsValid
330[Fatal Error] :1:65: The prefix "opex" for element "opex:OPEXMetadata" is not bound.
331[info] - should throw a 'SAXParseException' if the OPEX xml string that was passed in, has an unexpected namespace
332[info] xmlStringIsValid
333[info] - should throw a 'SAXParseException' if the OPEX xml string that was passed in, contains an unexpected element
334[info] xmlStringIsValid
335[info] - should throw a 'SAXParseException' if the XIP xml string that was passed in, is missing a matching tag
336[info] xmlStringIsValid
337[Fatal Error] :7:11: The element type "InformationObject" must be terminated by the matching end-tag "</InformationObject>".
338[Fatal Error] :1:1: Premature end of file.
339[info] - should throw a 'SAXParseException' if the XIP xml string that was passed in was empty
340[info] xmlStringIsValid
341[Fatal Error] :7:11: The element type "InformationObject" must be terminated by the matching end-tag "</InformationObject>".
342[info] - should throw a 'SAXParseException' if the OPEX xml string that was passed in, is missing a matching tag
343[info] xmlStringIsValid
344[Fatal Error] :1:1: Premature end of file.
345[info] - should throw a 'SAXParseException' if the OPEX xml string that was passed in was empty
346[info] Fs2EntityTest:
347[info] fromType
348[info] - should return an object with path Some(information-objects) for entity type IO
349[info] fromType
350[info] - should return an object with path Some(content-objects) for entity type CO
351[info] fromType
352[info] - should return an object with path Some(structural-objects) for entity type SO
353[info] fromType
354[info] - should return an object with path None for entity type UnexpectedEntityType
355[info] Fs2DataProcessorTest:
356[info] childNodeFromEntity
357[info] - should return the node requested even if it is lowercase
358[info] childNodeFromEntity
359[info] - should return an error if child node does not exist
360[info] fragmentUrls
361[info] - should return fragments
362[info] fragmentUrls
363[info] - should return an empty list when there are no fragments
364[info] fragments
365[info] - should return multiple fragments
366[info] fragments
367[info] - should return an error if there is no content
368[info] generationUrlFromEntity
369[info] - should return a generation url
370[info] generationUrlFromEntity
371[info] - should raise an error if the generation url is not found
372[info] allGenerationUrls
373[info] - should return a sequence of generation urls
374[info] allGenerationUrls
375[info] - should return an error if there are no generation urls
376[info] generationType
377[info] - should return the 'Original' generation type if the generation's 'original' attribute is 'true'
378[info] generationType
379[info] - should return an error if the generation has no attributes
380[info] generationType
381[info] - should return an error if the generation's 'original' attribute is not present
382[info] generationType
383[info] - should return an error if the generation's 'original' attribute is neither 'true' nor 'false'
384[info] allBitstreamUrls
385[info] - should return the correct urls
386[info] allBitstreamInfo
387[info] - should return the correct bitstream information
388[info] getNextPage
389[info] - should return the next page
390[info] getNextPage
391[info] - should return empty if there is no next page
392[info] getEntities
393[info] - should return the correct entity objects
394[info] getEventActions
395[info] - should return the correct event actions using the date value from the 'Event'
396[info] getEntity
397[info] - should return the full entity if all fields are provided
398[info] getEntity
399[info] - should return deleted false if the deleted tag is missing
400[info] getEntity
401[info] - should return a missing security tag if it isn't set to open, unknown or closed
402[info] getEntity
403[info] - should return a missing parent, title and description if they aren't set
404[info] getEntity
405[info] - should return an error if the entity type in the response doesn't match
406[info] getEntityXml
407[info] - should return the full entity if all fields are provided
408[info] getEntityXml
409[info] - should return an error if the entity type in the response doesn't match
410[info] getEntityXml
411[info] - should return an error if the entity type in the response doesn't exist
412[info] childNodeFromWorkflowInstance
413[info] - should return the node requested
414[info] childNodeFromWorkflowInstance
415[info] - should return an error if child node does not exist
416[info] getIdentifiers
417[info] - should return an empty list if there are no identifiers
418[info] getIdentifiers
419[info] - should return the identifiers
420[info] getUrlsToIoRepresentations
421[info] - should return an empty list if there are no representations
422[info] getUrlsToIoRepresentations
423[info] - should return the url of a Preservation representation
424[info] getUrlsToIoRepresentations
425[info] - should return all urls of representations if 'representationType' filter passed in, was 'None'
426[info] getContentObjectsFromRepresentation
427[info] - should return an empty list if there are no content objects
428[info] getContentObjectsFromRepresentation
429[info] - should return a list of Content Objects belonging to the representation
430[info] getPreservicaNamespaceVersion
431[info] - should extract version number from namespace
432[info] getEntityLinksXml
433[info] - should extract the links from the 'LinksResponse'
434[info] getEntityLinksXml
435[info] - should return an empty list if there missing attributes in the links
436[info] getEntityLinksXml
437[info] - should return an empty list if there are no links
438[info] getEventActionElements
439[info] - should extract the EventActions from the 'EventActionsResponse'
440[info] getRepresentationElement
441[info] - should extract the Representation from the 'RepresentationResponse'
442[info] getGenerationElement
443[info] - should extract the Generation from the 'GenerationsResponse'
444[info] Fs2ProcessMonitorClientTest:
445[info] getMonitors
446[info] - should return an exception if the name does not start with 'opex'
447[info] getMonitors
448[info] - should make an empty body request
449[info] getMonitors
450[info] - should make an request for multiple statuses and categories if multiple are provided
451[info] getMonitors
452[info] - should return the monitor if the request was successful
453[info] getMonitors
454[info] - should return an exception if the API call does
455[info] getMessages
456[info] - should make an empty body request
457[info] getMessages
458[info] - should make an request for multiple mappedMonitorId and statuses if multiple are provided
459[info] getMessages
460[info] - should return only one page of messages if the request was successful and the first page's responsedid not include a url to the next page
461[info] getMessages
462[info] - should return 2 pages of messages if the request was successful and the first page's responseincludes a url to the next page
463[info] getMessages
464[info] - should return an exception if the API call does
465Starting build for ProjectRef(file:/build/repo/,root) (preservica-client-root)... [1/2]
466Compile scalacOptions: -Wunused:imports, -Xmax-inlines, 50, -Wconf:msg=can be rewritten automatically under:s, -source:3.8
467[info] PreservicaClientExceptionTest:
468[info] creating an exception with http details
469[info] - should create the correct message
470[info] creating an exception with a message only
471[info] - should create the correct message
472
473************************
474Build summary:
475[{
476 "module": "preservica-client-fs2",
477 "compile": {"status": "ok", "tookMs": 18275, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
478 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
479 "test-compile": {"status": "ok", "tookMs": 12544, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
480 "test": {"status": "ok", "tookMs": 43819, "passed": 155, "failed": 0, "ignored": 0, "skipped": 0, "total": 155, "byFramework": [{"framework": "unknown", "stats": {"passed": 155, "failed": 0, "ignored": 0, "skipped": 0, "total": 155}}]},
481 "publish": {"status": "skipped", "tookMs": 0},
482 "metadata": {
483 "crossScalaVersions": ["3.7.3"]
484}
485},{
486 "module": "preservica-client-root",
487 "compile": {"status": "ok", "tookMs": 78, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
488 "doc": {"status": "skipped", "tookMs": 0, "files": 0, "totalSizeKb": 0},
489 "test-compile": {"status": "ok", "tookMs": 182, "warnings": 0, "errors": 0, "sourceVersion": "3.8"},
490 "test": {"status": "ok", "tookMs": 994, "passed": 2, "failed": 0, "ignored": 0, "skipped": 0, "total": 2, "byFramework": [{"framework": "unknown", "stats": {"passed": 2, "failed": 0, "ignored": 0, "skipped": 0, "total": 2}}]},
491 "publish": {"status": "skipped", "tookMs": 0},
492 "metadata": {
493 "crossScalaVersions": ["3.7.3"]
494}
495}]
496************************
497[success] Total time: 81 s (0:01:21.0), completed Jan 13, 2026, 8:30:36 PM
498[0JChecking patch project/plugins.sbt...
499Checking patch build.sbt...
500Applied patch project/plugins.sbt cleanly.
501Applied patch build.sbt cleanly.