Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
213 commits
Select commit Hold shift + click to select a range
5b0f0b0
Define the portable Database contract and add the encryption API
shai-almog Aug 6, 2026
a29da0d
Make the simulator conformant and able to open encrypted databases
shai-almog Aug 6, 2026
85f6127
Make the iOS database conformant and fix three defects in it
shai-almog Aug 6, 2026
0fedd67
Bring Android to the database contract and add encrypted databases
shai-almog Aug 6, 2026
b0e2de8
Give the native Windows and Linux ports a database
shai-almog Aug 6, 2026
dcf1f1f
Replace WebSQL with SQLite on WebAssembly and gate the engine per app
shai-almog Aug 6, 2026
ce77b83
Add device conformance tests, documentation and the interop proof
shai-almog Aug 6, 2026
70dc81f
Fix the three CI failures from the first run
shai-almog Aug 6, 2026
d595bd9
Exclude the SQLCipher package from the Ant Android build too
shai-almog Aug 6, 2026
7f2f2c7
Address the review findings and the second round of CI failures
shai-almog Aug 6, 2026
766ab43
Address the second batch of review findings
shai-almog Aug 6, 2026
1b78be8
Address the third batch of review findings
shai-almog Aug 6, 2026
c8ca4a5
Satisfy the forbidden PMD rules
shai-almog Aug 6, 2026
dbcceec
Compile the engine's ciphers without assuming CPU features are enabled
shai-almog Aug 6, 2026
ba13354
Add copyright headers to the new guide snippet files
shai-almog Aug 6, 2026
ecad03f
Address the fourth review batch, the guide prose gate and CodeQL noise
shai-almog Aug 6, 2026
efbab6c
Fix failed-commit recovery, parameter counts and the JS key probe
shai-almog Aug 6, 2026
f5767b0
Report unbound parameters from executeQuery(String) with the shared m…
shai-almog Aug 6, 2026
e282819
Default Ant projects to database compatibility mode
shai-almog Aug 6, 2026
730a69a
Roll back through the engine when an Android commit fails
shai-almog Aug 6, 2026
cb0456a
Close out the fourth review round
shai-almog Aug 6, 2026
c6f57d4
Make Android encryption buildable, and actually exercise it
shai-almog Aug 6, 2026
452c6cf
Make encrypt and decrypt work on Android
shai-almog Aug 6, 2026
952f337
Stop the JavaScript port hanging when the SQLite engine will not start
shai-almog Aug 6, 2026
7a70937
Do not assert a filesystem path where databases are not filesystem ba…
shai-almog Aug 6, 2026
62e2271
Close out the fifth review round
shai-almog Aug 6, 2026
4a11dc9
Stop every JavaScript native binding from throwing across the bridge
shai-almog Aug 6, 2026
d4d3c89
Fix three ways the previous round's fixes could fail
shai-almog Aug 6, 2026
483acb2
Complete the migration recovery, and stop OPFS trouble losing data
shai-almog Aug 6, 2026
81cbb36
Type-check the SQLCipher package, which nothing else compiles
shai-almog Aug 6, 2026
4c32755
Close the remaining native and dispatch error paths
shai-almog Aug 7, 2026
13cef92
Resolve the cipher check's dependencies from the reactor, not a repos…
shai-almog Aug 7, 2026
2b527c3
Sweep the error paths I had fixed in only one implementation
shai-almog Aug 7, 2026
ce68bdd
Fix three defects the previous round's fixes introduced or left
shai-almog Aug 7, 2026
79aceb2
Move migration artifacts out of the database namespace entirely
shai-almog Aug 7, 2026
ecf667b
Make delete and exists aware of interrupted conversions, and finish t…
shai-almog Aug 7, 2026
14c1630
Prove ownership of migration files instead of picking a location
shai-almog Aug 7, 2026
be69b0b
Report close failures, and track trigger bodies by position
shai-almog Aug 7, 2026
da4d201
Merge remote-tracking branch 'origin/master' into feature/portable-en…
shai-almog Aug 7, 2026
2420d98
Hoist casts out of catch regions and exchange SQL text as UTF-8 bytes
shai-almog Aug 7, 2026
26dcced
Detect the port from the database, not from Display
shai-almog Aug 7, 2026
c1fc047
Record the export before writing it, and refuse a passphrase SQLite w…
shai-almog Aug 7, 2026
f3e483b
Count named and numbered placeholders the way the engine does
shai-almog Aug 7, 2026
26a59d8
Read a whole SQLite parameter name, not just its identifier characters
shai-almog Aug 7, 2026
643699a
Merge remote-tracking branch 'origin/master' into feature/portable-en…
shai-almog Aug 7, 2026
018356f
Hold a port to its own legacy behaviour, not to another port's
shai-almog Aug 7, 2026
06b22a6
Gate the SQLite payloads on the application, not on the framework
shai-almog Aug 7, 2026
8dc65cf
Keep windows.h from dragging winsock.h into the database bindings
shai-almog Aug 7, 2026
3d74b04
Finish gating the cipher, and stop recovery touching files it does no…
shai-almog Aug 7, 2026
a6bee19
Document what using a database, and encrypting one, costs a build
shai-almog Aug 7, 2026
9b8733a
Track transactions opened by script, and stop three ways to lose data
shai-almog Aug 7, 2026
aabde20
Count every Android connection, and read a script the way the engine …
shai-almog Aug 8, 2026
15865f2
See a transaction whichever entry point opened it
shai-almog Aug 8, 2026
b4b662e
Read ROLLBACK TO as tokens, and hold the database for the whole conve…
shai-almog Aug 8, 2026
59d3853
Take the connection slot before the engine opens, and share one class…
shai-almog Aug 8, 2026
ca1cc1a
Ask the engine whether a transaction is open, instead of inferring it
shai-almog Aug 8, 2026
4712b47
Claim the database for an in-place key rotation too
shai-almog Aug 8, 2026
c7b0fe9
Merge remote-tracking branch 'origin/master' into feature/portable-en…
shai-almog Aug 8, 2026
14555d1
Keep the last readable copy, and make the claim cover recovery
shai-almog Aug 8, 2026
266d6e8
Hold a key change to one connection, and load the JS engine's wasm
shai-almog Aug 8, 2026
406b094
Report an unavailable managed key as a note, not a skipped group
shai-almog Aug 8, 2026
9f409ea
Hold the rekey claim for the whole rewrite, and ship a wasm that comp…
shai-almog Aug 8, 2026
b39c725
Key the simulator registry by the resolved file
shai-almog Aug 8, 2026
e842054
Reserve the slot before opening, and key the browser's engine through…
shai-almog Aug 8, 2026
27c2584
Track savepoint transactions, and read the BEGIN mode as a token
shai-almog Aug 8, 2026
37e28b7
Claim the simulator's file before JDBC opens it, and stop a vacuous c…
shai-almog Aug 8, 2026
6a35664
Read whole savepoint names, and hold the claim until the handle is gone
shai-almog Aug 8, 2026
57167c6
Calibrate the ciphertext check, and stack savepoints of one name
shai-almog Aug 8, 2026
a134e50
Ask the no-key question on a database nothing else depends on
shai-almog Aug 8, 2026
5f0bbb5
End a savepoint transaction through SQL on Android too
shai-almog Aug 8, 2026
9be5fb3
Return a Java long exactly from the browser, and count nested transac…
shai-almog Aug 8, 2026
bf23c85
Merge master into feature/portable-encryptable-database
shai-almog Aug 8, 2026
3a1e67c
Move Google sign-in to a SDK that links on a simulator
shai-almog Aug 8, 2026
185633d
Track a legacy execute, and close the constructor nobody could satisfy
shai-almog Aug 8, 2026
26bc092
Keep a database an unkeyed open could not read, and nest only where n…
shai-almog Aug 8, 2026
9d325d9
Report a database that will not open as an IOException
shai-almog Aug 9, 2026
3f8e3bd
Keep a savepoint stack, and hold the simulator to SQLite's grammar
shai-almog Aug 9, 2026
3150fa1
Unwind the savepoint stack on ROLLBACK TO, and clean up what recovery…
shai-almog Aug 9, 2026
74c115c
Ask which config factory was called, and refresh a rewound cursor's c…
shai-almog Aug 9, 2026
c538064
Key a managed alias on the resolved file on the remaining ports
shai-almog Aug 9, 2026
75e3952
Scan library jars and the database package, and say what count costs
shai-almog Aug 9, 2026
fb4ad8c
Retry the suite build past a Maven Central 403
shai-almog Aug 9, 2026
02b051d
Resolve a managed key the same way wherever it is looked up
shai-almog Aug 9, 2026
2d72a0d
Track a parameterized savepoint, and stop the wrapper deadlocking on …
shai-almog Aug 9, 2026
f664689
Destroy one managed key, not two, and refresh the count on any backwa…
shai-almog Aug 9, 2026
b91482b
End a savepoint transaction through SQL from a script too
shai-almog Aug 9, 2026
0826b63
Merge remote-tracking branch 'origin/master' into feature/portable-en…
shai-almog Aug 9, 2026
8a33f40
Fold savepoint names as SQLite does, and ask the engine after every s…
shai-almog Aug 9, 2026
3bf5d9c
Check the worker before the lock, and read the engine on the failure …
shai-almog Aug 9, 2026
f0840c9
Restore the browser's engine read, and let isInTransaction skip the lock
shai-almog Aug 10, 2026
89a4517
Clear Android's flag when a rollback finds nothing to roll back
shai-almog Aug 10, 2026
a32ef74
Register a wrapped connection, and let queued callers hear that the d…
shai-almog Aug 10, 2026
63f20b4
Read a SQLite URI connection, and clear state when there is nothing l…
shai-almog Aug 10, 2026
594b8df
Match the raw-key literal that is actually written, and free the curs…
shai-almog Aug 10, 2026
a051ebb
Quote by the exact literal, rekey a nameless handle, and stop killing…
shai-almog Aug 10, 2026
5d47d7e
Merge remote-tracking branch 'origin/master' into feature/portable-en…
shai-almog Aug 11, 2026
bb549e4
Resolve opaque SQLite URIs, and count a connection that cannot name i…
shai-almog Aug 11, 2026
34894b8
Keep the constructors a compiled library can still call
shai-almog Aug 11, 2026
fc1620a
Refuse a compatibility handle on a database that is being converted
shai-almog Aug 11, 2026
241339d
Scan for database usage before the port joins the tree
shai-almog Aug 11, 2026
94db2ed
Merge remote-tracking branch 'origin/master' into feature/portable-en…
shai-almog Aug 11, 2026
6f6d54d
Carry the refusal instead of throwing it from a compatibility constru…
shai-almog Aug 11, 2026
2e4e9a4
Reconcile transaction state after a failed cursor step, and refuse to…
shai-almog Aug 12, 2026
262ed99
Do not raise for a rollback the engine already performed
shai-almog Aug 12, 2026
27a21b1
Count transaction control in SQL where the engine counts it
shai-almog Aug 12, 2026
ff0f7a8
Decide iOS cipher availability by asking the engine
shai-almog Aug 12, 2026
da8eaf4
Keep engine settings that only one engine can honour out of the bundl…
shai-almog Aug 12, 2026
4473e02
Never re-run a writing statement to move a cursor, and refuse to dele…
shai-almog Aug 13, 2026
c7822ed
Ask each port how many connections it has open, and treat a writing p…
shai-almog Aug 13, 2026
6579c12
Build the ciphers only when asked, and find that iOS had stopped encr…
shai-almog Aug 13, 2026
3898e19
Take the delete claim before the count is read, and let recovery hold…
shai-almog Aug 13, 2026
3920937
Claim a delete in one step, and recover only for an open that holds t…
shai-almog Aug 13, 2026
aeb3ae8
Rewind only when the cursor has somewhere to go back from
shai-almog Aug 13, 2026
9661aa2
Refuse a delete under an unnamed connection or a running conversion
shai-almog Aug 13, 2026
45b16d5
Record a conversion as unproven before installing it, not after it fails
shai-almog Aug 13, 2026
d3df098
Fix the duplicated package line in DatabaseTest
shai-almog Aug 13, 2026
0e656f6
Close a converted handle that cannot be proven, and name the displace…
shai-almog Aug 13, 2026
6606910
Run the database checks when their own scripts change
shai-almog Aug 13, 2026
6ef695c
Going back to a place the cursor has not left is a no-op
shai-almog Aug 13, 2026
d0784c7
Keep transaction control out of executeQuery, and make the Android ke…
shai-almog Aug 13, 2026
cec6df0
Bind an empty value as empty rather than as null
shai-almog Aug 13, 2026
1bde0d4
Let the worker stop after it drains, instead of parking for the process
shai-almog Aug 13, 2026
1493c06
Stop the worker even when the close fails, and read numbers the way S…
shai-almog Aug 13, 2026
525295f
Validate an Android query without walking it, and mark a killed threa…
shai-almog Aug 13, 2026
64171b8
Refuse work the moment a stop is asked for, and use a filter form tha…
shai-almog Aug 13, 2026
6a68f2d
Keep an Android cursor inside the rows it has, and refuse async work …
shai-almog Aug 13, 2026
ee0d4f0
Read a row without counting the result set, and fix the wrapped inden…
shai-almog Aug 13, 2026
681388d
Give each Windows and Linux application its own database directory
shai-almog Aug 13, 2026
aae711a
Prove a converted database opens, leave in-memory connections alone, …
shai-almog Aug 13, 2026
76d61b3
Refuse an open that recovery has to run before
shai-almog Aug 13, 2026
dbf51f0
Give the connection slot back even when the close fails
shai-almog Aug 14, 2026
e04c2f2
Let the no-file answer decide, whatever the URL looks like
shai-almog Aug 14, 2026
258e6a8
Recognise the memory URLs exactly, not every name that starts like one
shai-almog Aug 14, 2026
fde0b68
Validate an Android query by preparing it, not by moving its cursor
shai-almog Aug 14, 2026
ee17d11
Keep marker entries inside their directory, and report engine failure…
shai-almog Aug 14, 2026
d4bc70f
Report a failed value read from the Android cursor as an IOException too
shai-almog Aug 14, 2026
e780626
Register a colon-named database under its file, from one reading of t…
shai-almog Aug 14, 2026
143441e
Let a writing cursor read the rows its own run produced
shai-almog Aug 14, 2026
b6de9e0
Say why a repeated write is refused even in compatibility mode
shai-almog Aug 14, 2026
53f2ab0
Take the conformance suite out of the framework
shai-almog Aug 14, 2026
070fb52
Do not run the statement to answer a rewind, and take the sidecars on…
shai-almog Aug 15, 2026
0e368af
Delete a database with its working files, on every port
shai-almog Aug 15, 2026
8764948
Report a failed sidecar unlink, and close the primary when its anchor…
shai-almog Aug 15, 2026
1fbafa4
Give a native desktop application a home of its own, and a database u…
shai-almog Aug 15, 2026
d3bdd70
Let a declared skip stand, and say when a delete left files behind
shai-almog Aug 15, 2026
453453f
Read a JavaScript column as text, and ask its type without fetching it
shai-almog Aug 15, 2026
7d628b6
Do not leave a plaintext copy behind when the source will not close
shai-almog Aug 15, 2026
26d17f9
Treat a colon as a drive only where drives exist
shai-almog Aug 15, 2026
fb71af6
Key an iOS managed key on where the database sits, not where iOS put it
shai-almog Aug 16, 2026
357a3e5
Refuse a seek that would have to run the write, and tell a failed rea…
shai-almog Aug 16, 2026
c60d1c7
Ask the filesystem which file a Windows connection is on
shai-almog Aug 16, 2026
ea081eb
Let the registry and the managed alias be different questions
shai-almog Aug 16, 2026
3eb98f7
Merge master
shai-almog Aug 16, 2026
8dd918f
Close the Windows peer when it cannot be registered, and fold names a…
shai-almog Aug 16, 2026
4445a2e
Re-key an iOS database under the alias its next open will look for
shai-almog Aug 16, 2026
1c0c732
Key Windows databases on the folded name alone, and keep a UNC root
shai-almog Aug 16, 2026
47ebe0f
Keep reading a library after one entry inside it cannot be read
shai-almog Aug 16, 2026
ba1139d
Register an iOS connection under the identity a delete asks about
shai-almog Aug 16, 2026
fc50e81
Close a simulator statement whatever goes wrong before a cursor takes it
shai-almog Aug 16, 2026
4d301cf
Clear the Linux keyring secret, refuse to empty a link, and say the w…
shai-almog Aug 16, 2026
b3aa28e
Keep the token when the keyring will not give the secret up
shai-almog Aug 16, 2026
ae3abfe
Never generate a managed key on a lookup that only failed
shai-almog Aug 16, 2026
d1d3f69
Count an attached database as open, and stop reading existence as rea…
shai-almog Aug 16, 2026
35275d9
Track only the attachments this can actually identify
shai-almog Aug 16, 2026
7386f3f
Reserve an attached database before the engine attaches it
shai-almog Aug 16, 2026
a327fbd
Ask the engine what is attached instead of reading the SQL
shai-almog Aug 16, 2026
1daca64
Track an attachment by its file, and see what a parameter attaches
shai-almog Aug 17, 2026
cd6795d
Undo an attachment nothing can hold, and refuse one a cursor would hide
shai-almog Aug 17, 2026
ca19e5d
Detach every schema an unholdable file was attached under
shai-almog Aug 17, 2026
ea93c1f
Read an ATTACH past the comments around it, without a cast that canno…
shai-almog Aug 17, 2026
8fbb057
Follow links into a database key where the engine follows them
shai-almog Aug 17, 2026
968acf4
Refuse an ATTACH whose filename this cannot resolve before it runs
shai-almog Aug 17, 2026
54f130e
Refuse a relative ATTACH where the engine resolves it elsewhere
shai-almog Aug 17, 2026
6ca3d04
Merge remote-tracking branch 'origin/master' into feature/portable-en…
shai-almog Aug 17, 2026
71f0cc8
Take an ATTACH placeholder's own slot, not always the first parameter
shai-almog Aug 17, 2026
2446f8e
Write out the SQLite native entry points the verifier has to read
shai-almog Aug 17, 2026
cac2c8b
Carry auto_vacuum across a conversion, and report a dead RNG as KEY_U…
shai-almog Aug 17, 2026
0ced137
Place the GC gate's hazard inside a mark instead of sleeping through one
shai-almog Aug 17, 2026
0a4f256
Resolve a database path through a native, not java.io.File
shai-almog Aug 17, 2026
12ff173
Carry the journal mode across an Android key conversion too
shai-almog Aug 17, 2026
9de42e9
Put the connection's own settings back after an Android conversion
shai-almog Aug 17, 2026
912fb34
Run every pragma through a cursor, and bind #name like the other three
shai-almog Aug 18, 2026
78abc46
Restore every connection pragma a conversion loses, not the three not…
shai-almog Aug 18, 2026
cf18208
Identify a created Windows file after it exists, and derive the pragm…
shai-almog Aug 18, 2026
0a0a9d8
Separate the registry key from the managed key alias, and refuse a UR…
shai-almog Aug 18, 2026
30deb2b
Read the class file with ASM instead of searching it for bytes
shai-almog Aug 18, 2026
47b227e
Say what an unreadable class costs, and prove Java 17 is not one
shai-almog Aug 18, 2026
9e4eb8d
Read a lambda, an empty file and a stopping worker for what they are
shai-almog Aug 18, 2026
b0fd7d3
Say in close()'s contract that it waits for work the worker took
shai-almog Aug 18, 2026
b21d923
Refuse an ATTACH whose URI carries an authority
shai-almog Aug 18, 2026
17cafc4
Retry the two steps that died on Maven Central, and only for that
shai-almog Aug 18, 2026
3250a30
Refuse to open a browser database whose data is in the old WebSQL store
shai-almog Aug 18, 2026
9f37e3a
Answer a key change honestly on the two Android connections
shai-almog Aug 18, 2026
5027ea4
Let a plaintext Android database be asked for no key at all
shai-almog Aug 18, 2026
eb01f38
Stop reading an unreachable browser engine as an empty one
shai-almog Aug 18, 2026
6fad0e7
Refuse an unidentified connection while any file is claimed
shai-almog Aug 18, 2026
1b0f3b0
Delete a database last, after the files that hold its pages
shai-almog Aug 18, 2026
6908b8d
Key a managed secret to the application, not to what it is called
shai-almog Aug 18, 2026
81aee05
Retry the receipt-sync tests when Central refuses, and only then
shai-almog Aug 18, 2026
d1692b9
Separate one simulator project's secrets from another's
shai-almog Aug 18, 2026
5d73fd1
Wait for the inspector's details form before capturing it
shai-almog Aug 18, 2026
0334a8d
Give the simulator verifier the header every source here carries
shai-almog Aug 18, 2026
3c41c32
Wait for the inspector panel to settle, rather than for the state it …
shai-almog Aug 18, 2026
ad096aa
Give the Central retries a window the size of the outages
shai-almog Aug 18, 2026
acff084
Widen the Central window on the Linux core build too
shai-almog Aug 18, 2026
f33c50e
Retry the archetype build when Central refuses the install plugin
shai-almog Aug 18, 2026
6cf8164
Create a managed key rather than writing one, and keep namespaces dis…
shai-almog Aug 19, 2026
3c27e69
Merge remote-tracking branch 'origin/master' into feature/portable-en…
shai-almog Aug 19, 2026
a3d9274
Decide a first managed key where the operating system decides it
shai-almog Aug 19, 2026
961f177
Stop apt hanging a job for six hours
shai-almog Aug 19, 2026
70ad716
Bound the apt calls that run inside the container too
shai-almog Aug 19, 2026
b0e037c
Give the Larger Text test the header this repository requires
shai-almog Aug 19, 2026
ba7f0b4
Report what the database tests actually did, and refuse to publish a …
shai-almog Aug 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Vendored third-party sources. Marking them keeps them out of language
# statistics and collapses them in diffs, so a routine engine update does not
# read as a 400,000 line change and does not push review tooling past its
# size limits.
vm/ByteCodeTranslator/src/cn1_sqlite3_amalgamation.h linguist-vendored linguist-generated -diff
vm/ByteCodeTranslator/src/cn1_sqlite3.h linguist-vendored linguist-generated -diff
Ports/JavaScriptPort/src/main/webapp/js/sqlite3mc.js linguist-vendored -diff
Ports/JavaScriptPort/src/main/webapp/js/sqlite3-opfs-async-proxy.js linguist-vendored -diff
7 changes: 7 additions & 0 deletions .github/codeql/codeql-config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,10 @@ name: "Codename One CodeQL configuration"
# String sinks across the rest of the codebase).
paths-ignore:
- 'scripts/cn1playground/**/bsh/cn1/gen/**'
# Vendored SQLite engine (SQLite3 Multiple Ciphers), 13MB of upstream C carried
# verbatim. Analysing it reports upstream's findings as ours, and its sheer size
# pushes CodeQL off incremental analysis so it re-reports pre-existing alerts
# across unrelated files. Provenance and update instructions are in
# vm/ByteCodeTranslator/src/cn1_sqlite3_README.md.
- 'vm/ByteCodeTranslator/src/cn1_sqlite3_amalgamation.h'
- 'vm/ByteCodeTranslator/src/cn1_sqlite3.h'
10 changes: 9 additions & 1 deletion .github/workflows/archetype-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,22 @@ jobs:
- name: Install xvfb
run: bash scripts/ci/apt-get-update.sh && sudo apt-get install -y --no-install-recommends xvfb
- name: Build Codename One Maven artifacts (includes archetypes)
# Through the retry wrapper, narrowed to resolution failures: this died with
# "Plugin maven-install-plugin:2.5.2 or one of its dependencies could not be resolved"
# before it had installed anything, one of several jobs Maven Central refused on this
# branch in a day. A build failure in our own code still fails on the first attempt.
env:
RETRY_ONLY_MATCHING: 'status: (403|429|50[0-9])|Could not transfer artifact|Unresolveable build extension|Non-resolvable import POM|or one of its dependencies could not be resolved|authorization failed for https://repo\.maven\.apache\.org|Connection reset|Premature end of Content-Length'
RETRY_ATTEMPTS: '5'
RETRY_DELAY_SECONDS: '60'
run: |
# The cn1{app,lib}-archetype modules are inlined into the maven/
# reactor since the migration, so this single install also stages
# the archetypes into the local repo for `archetype:generate`.
# -Darchetype.test.skip=true keeps the smoke fast — the per-tag
# ITs already run in the release workflow.
cd maven
xvfb-run -a mvn install -Plocal-dev-javase -DskipTests -Darchetype.test.skip=true -Dmaven.javadoc.skip=true
bash ../scripts/ci/retry.sh xvfb-run -a mvn install -Plocal-dev-javase -DskipTests -Darchetype.test.skip=true -Dmaven.javadoc.skip=true
- name: Refresh archetype catalog
run: |
cd maven
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/guibuilder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,13 @@ jobs:
export JAVA_HOME="${JAVA_HOME_8}"
export PATH="${JAVA_HOME}/bin:${PATH}"
cd scripts/guibuilder
xvfb-run -a mvn -B -pl javase -am -Pexecutable-jar package \
# Through the retry wrapper: this step resolves plugins from Maven Central, and the
# runner edge intermittently resets the connection mid-download, which Maven treats as a
# permanent resolution failure -- the packaging died on a truncated
# org.eclipse.sisu.plexus jar with every test already green. A real packaging failure
# fails the same way on each attempt, so retrying costs only time. See scripts/ci/retry.sh.
xvfb-run -a bash ../../scripts/ci/retry.sh \
mvn -B -pl javase -am -Pexecutable-jar package \
-Dcodename1.platform=javase -Dmaven.test.skip=true
ls javase/target/codenameone-guibuilder-*.jar

Expand Down
18 changes: 14 additions & 4 deletions .github/workflows/ios-packaging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -237,10 +237,20 @@ jobs:
./scripts/run-ios-native-tests.sh \
"${{ steps.build_ios_app.outputs.workspace }}" \
"${{ steps.build_ios_app.outputs.scheme }}"
# 20 was enough while the sample built one app. It declares a watchMain now, so the app
# scheme carries an embedded watch app with a ParparVM translation of its own and
# xcodebuild builds that before running a single test. The same raise was already applied
# to this step in scripts-ios-native.yml; this workflow runs it too and was missed.
# Two things grew into this budget, and both still apply. The reuse above is partial:
# run-ios-native-tests.sh injects the test target into the pbxproj before building, and
# Xcode rebuilds the app target after a project change even though the objects are there,
# so this step still pays a near-full native build -- 6m55s of the 8m13s it takes on a
# fast runner. Measured on one commit, a slow runner spent 4m31s booting the simulator
# (a fast one: 1m15s) and 13 minutes on that build, and the cap fired before the tests
# started. On top of that the sample now declares a watchMain, so the app scheme carries
# an embedded watch app with a ParparVM translation of its own, which xcodebuild builds
# before running a single test -- the raise scripts-ios-native.yml already took.
#
# So the higher of the two, not either alone: the watch build is added work on top of the
# rebuild, not a re-description of it. The real fix is to inject before the UI-smoke step
# so this build is genuinely incremental; until then the budget has to cover the build it
# actually does.
timeout-minutes: 45

- name: Upload packaging artifacts
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/javase-cef-ffmpeg-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ jobs:
# confirm the tool it installed is how a transient upstream outage becomes an
# unreadable failure in somebody else's test.
$ok = $false
foreach ($delay in 0, 30, 90) {
foreach ($delay in 0, 30, 90, 180, 300) {
if ($delay -gt 0) {
Write-Host "choco install ffmpeg failed; retrying in $delay s..."
Start-Sleep -Seconds $delay
Expand Down
28 changes: 24 additions & 4 deletions .github/workflows/linux-build-run.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,14 @@ jobs:
with: { distribution: 'temurin', java-version: '8' }

- name: Build plugin + cn1-ads-mock (JDK 8)
# Maven Central intermittently serves 403/429 from the runner CDN edge and Maven treats it
# as a permanent resolution failure, which killed this job at dependency download before
# anything was compiled. See scripts/ci/retry.sh; these steps only build, so a blanket
# retry cannot turn a flaky test into a pass.
run: |
cd maven
JAVA_HOME="$JDK_8_HOME" mvn -B -pl codenameone-maven-plugin,cn1-ads-mock -am \
JAVA_HOME="$JDK_8_HOME" bash ../scripts/ci/retry.sh \
mvn -B -pl codenameone-maven-plugin,cn1-ads-mock -am \
-DskipTests '-Dmaven.javadoc.skip=true' '-Plocal-dev-javase' install

- name: Build hellocodenameone-common (JDK 17)
Expand All @@ -102,7 +107,8 @@ jobs:
sleep 2
mkdir -p "$HOME/.codenameone"
[ -f "$HOME/.codenameone/guibuilder.jar" ] || : > "$HOME/.codenameone/guibuilder.jar"
mvn -B -f scripts/hellocodenameone/pom.xml -pl common -am install -DskipTests '-Dmaven.javadoc.skip=true'
bash scripts/ci/retry.sh \
mvn -B -f scripts/hellocodenameone/pom.xml -pl common -am install -DskipTests '-Dmaven.javadoc.skip=true'

- name: Package suite classes
run: |
Expand Down Expand Up @@ -181,9 +187,23 @@ jobs:
# plugin -- so this step works on arm64 too. The suite classes the translator
# also needs come from the prepare-suite artifact below.
- name: Build core + Linux port (JDK 8)
# Retried for the same reason as the two steps above, which this one was left out of:
# Maven Central answers 429 from the runner CDN edge and Maven treats it as a permanent
# resolution failure, so the job dies at plugin download with nothing built. See
# scripts/ci/retry.sh; this step only builds, so a blanket retry cannot turn a flaky test
# into a pass.
#
# Five attempts a minute apart rather than the default three at thirty seconds: this failed
# with "authorization failed for https://repo.maven.apache.org" on all three, one of
# several jobs Central refused on this branch in a day, and a window of about a minute is
# shorter than those refusals have lasted.
env:
RETRY_ATTEMPTS: '5'
RETRY_DELAY_SECONDS: '60'
run: |
cd maven
JAVA_HOME="$JDK_8_HOME" mvn -B -pl linux -am \
JAVA_HOME="$JDK_8_HOME" bash ../scripts/ci/retry.sh \
mvn -B -pl linux -am \
-DskipTests '-Dmaven.javadoc.skip=true' '-Plocal-dev-javase' install

- name: Download suite classes
Expand Down Expand Up @@ -265,7 +285,7 @@ jobs:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope >/dev/null 2>&1 || true
mkdir -p /tmp/cn1-cores
rc=0
mvn -B clean package -pl JavaAPI -am -DskipTests
bash "$GITHUB_WORKSPACE/scripts/ci/retry.sh" mvn -B clean package -pl JavaAPI -am -DskipTests
mvn -B test -pl tests -am \
'-Dtest=CleanTargetLinuxIntegrationTest#capturesHelloSuiteOverWebSocketLinux' \
'-Dsurefire.failIfNoSpecifiedTests=false' || rc=$?
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/parparvm-tests-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,13 @@ jobs:
# than with a function and splatting, because that shape is already proven
# on these runners and this is not the place to find out about a quoting
# difference.
# Five attempts out to five minutes rather than three out to ninety seconds: a run
# that took all three still ended on "status code: 429, reason phrase: Too Many
# Requests" two minutes after it started, which is a rate limit that had not lifted
# yet rather than a blip. This step only downloads and builds, so waiting longer costs
# time and cannot turn a failing test green.
$ok = $false
foreach ($delay in 0, 30, 90) {
foreach ($delay in 0, 30, 90, 180, 300) {
if ($delay -gt 0) {
Write-Host "mvn failed; retrying in $delay s..."
Start-Sleep -Seconds $delay
Expand All @@ -226,7 +231,7 @@ jobs:
# a gate is for, and worse than the flake it was hiding.
$resolutionFailure = 'status: (403|429|50[0-9])|Could not transfer artifact|Unresolveable build extension|Non-resolvable import POM|Could not resolve dependencies'
$ok = $false
foreach ($delay in 0, 30, 90) {
foreach ($delay in 0, 30, 90, 180, 300) {
if ($delay -gt 0) {
Write-Host "mvn failed on a dependency-resolution error; retrying in $delay s..."
Start-Sleep -Seconds $delay
Expand Down
7 changes: 7 additions & 0 deletions .github/workflows/parparvm-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,18 @@ jobs:
# Maven Central intermittently serves 403/429 from the runner CDN edge
# and Maven treats it as a permanent resolution failure (killed this job
# at dependency download, before any test ran). See scripts/ci/retry.sh.
#
# Narrowed with RETRY_ONLY_MATCHING because the second command RUNS THE
# TESTS: without it the wrapper retries every nonzero exit, so a test that
# failed once and passed on the retry would take this gate green and hide
# the race that produced it. The Windows counterpart restricts it for the
# same reason.
run: |
retry() { bash ../scripts/ci/retry.sh "$@"; }
retry mvn -B clean package -pl JavaAPI -am -DskipTests
retry mvn -B test -pl tests -am -DexcludedGroups=benchmark
env:
RETRY_ONLY_MATCHING: 'status: (403|429|50[0-9])|Could not transfer artifact|Unresolveable build extension|Non-resolvable import POM|Connection reset|Premature end of Content-Length'
JDK_8_HOME: ${{ env.JDK_8_HOME }}
JDK_11_HOME: ${{ env.JDK_11_HOME }}
JDK_17_HOME: ${{ env.JDK_17_HOME }}
Expand Down
Loading
Loading