Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
843da01
Start 11.0.0-alpha.4
ChrisJollyAU Sep 23, 2026
71dd23b
Compare a parameter as the type of the column it meets
ChrisJollyAU Sep 23, 2026
708afae
Read the OLE epoch as the epoch on every reader accessor
ChrisJollyAU Sep 23, 2026
c475c1b
Accept GUID text and ACE's {guid {…}} literal on an indexed GUID column
ChrisJollyAU Sep 23, 2026
a27b61a
Add IS [NOT] TRUE/FALSE and IS [NOT] DISTINCT FROM
ChrisJollyAU Sep 23, 2026
78a8f99
Store and read a bracketed parameter name as ACE does
ChrisJollyAU Sep 23, 2026
6396d9f
Identify type 0x11 as BigBinary and fill in the DataTypes CreateFormat
ChrisJollyAU Sep 23, 2026
9052175
Type a scalar subquery, and leave a choice with an untyped arm untyped
ChrisJollyAU Sep 23, 2026
4f0aa5a
Fix the write defects a read-only audit of LibRed.Core turned up
ChrisJollyAU Sep 24, 2026
7e164f8
Finish the audit, then make its bug classes unrepresentable
ChrisJollyAU Sep 24, 2026
3a6343e
Answer the audit's last four ACE probes, and close what they opened
ChrisJollyAU Sep 24, 2026
03437e6
Type Variants and mixed choices as ACE does
ChrisJollyAU Sep 25, 2026
fbbed31
Collapse the duplicated paths an efficiency audit of Core and Engine …
ChrisJollyAU Sep 25, 2026
1e5ba75
Deny the two shell spellings that were routing around the hooks
ChrisJollyAU Sep 25, 2026
8c54651
Let an index seek answer only in its own column's kind
ChrisJollyAU Sep 25, 2026
0dd0e46
Target net10.0 as well as net11.0 from the four LibRed projects
ChrisJollyAU Sep 25, 2026
f319d2b
Record the page-0 header as RC4 and the SIDs as a per-file keystream
ChrisJollyAU Sep 25, 2026
eb6b9c5
Read Access's bang, Yes/No, keyword members and non-ASCII names
ChrisJollyAU Sep 26, 2026
4d01ba9
Keep a property's flag byte and its block's type through the property…
ChrisJollyAU Sep 26, 2026
1110c66
Document the catalog column flags and write them only where Access does
ChrisJollyAU Sep 26, 2026
a08c9eb
Write what ACE writes across a hundred-statement run, found by whole-…
ChrisJollyAU Sep 26, 2026
613fe43
Split, build and renumber as ACE does, found by diffing tables across…
ChrisJollyAU Sep 26, 2026
870346a
tests
ChrisJollyAU Sep 26, 2026
c4d0c58
Decode text, currency and rows without the general-purpose detours
ChrisJollyAU Sep 26, 2026
c94c653
Evaluate every row through one rebound evaluator, not a new one per row
ChrisJollyAU Sep 26, 2026
0b877f6
Record the ACE head-to-head before and after the evaluator and decode…
ChrisJollyAU Sep 26, 2026
06380e4
Decode only the columns a statement reads
ChrisJollyAU Sep 26, 2026
35a8555
Record the ACE head-to-head with column pruning
ChrisJollyAU Sep 26, 2026
160d7ea
Look catalog and key rows up by their key, and decode the rest only f…
ChrisJollyAU Sep 26, 2026
94954a5
Record the DDL benchmarks with key-only catalog reads
ChrisJollyAU Sep 26, 2026
108e62c
Seek referential-integrity and complex-value lookups by their key's i…
ChrisJollyAU Sep 26, 2026
95f87f5
Compare text in the database's collation, by LibRed's own keys alone
ChrisJollyAU Sep 26, 2026
e18b75a
Look collation weights up by code point, not by binary search
ChrisJollyAU Sep 26, 2026
396d650
Record the full sweep and the text comparison runs
ChrisJollyAU Sep 26, 2026
bf1ec21
Key a file by its full path alone, worked out once per open
ChrisJollyAU Sep 26, 2026
0fba5b7
Fold LIKE by ACE's own table, measured, instead of the runtime's casing
ChrisJollyAU Sep 26, 2026
6db80d2
Decide whether an expression is Currency once per node, not per row
ChrisJollyAU Sep 26, 2026
746c82e
Append to the benchmark history only when a run asks with --record
ChrisJollyAU Sep 26, 2026
45908a4
tests
ChrisJollyAU Sep 27, 2026
ac9ced9
Describe an aggregate without computing its row
ChrisJollyAU Sep 27, 2026
b5fbd3d
Record a full benchmark run at ac9ced90
ChrisJollyAU Sep 27, 2026
70ae775
Hold a grouping key's values as passed unless one is text
ChrisJollyAU Sep 27, 2026
de9e222
Decide an aggregate's column facts once per execution, not per group
ChrisJollyAU Sep 27, 2026
cf9411e
Aggregate a GROUP BY in one pass instead of buffering its rows
ChrisJollyAU Sep 27, 2026
fb5e722
Copy a leaf's entries with room for the one being inserted
ChrisJollyAU Sep 27, 2026
d1d8cd5
Serve a transaction's own page parses, and cache a page write without…
ChrisJollyAU Sep 27, 2026
a6627c3
Write a rebuilt leaf together with the parse it was built from
ChrisJollyAU Sep 27, 2026
4a3ce19
Give INSERT ... VALUES one derivation, and keep a transaction's parse…
ChrisJollyAU Sep 27, 2026
a5ec1c4
Encode the Chinese, Japanese and Korean sort orders, and stamp each o…
ChrisJollyAU Sep 27, 2026
329434f
Build text keys without per-character garbage
ChrisJollyAU Sep 27, 2026
bbd2652
Weigh version-1 text without binary searches, and group without re-ke…
ChrisJollyAU Sep 27, 2026
9ae5e33
Seek an index without building a set, a decoder or a key list each time
ChrisJollyAU Sep 27, 2026
69b784f
Build a join's rows from the columns its statement reads
ChrisJollyAU Sep 27, 2026
3f55084
Cascade by the relationship's index blocks, and list schema names in …
ChrisJollyAU Sep 27, 2026
1cd4a6b
Read no collation from a complex column, and name the complex-column …
ChrisJollyAU Sep 27, 2026
bf88d23
Record a full benchmark run at 1cd4a6b5
ChrisJollyAU Sep 28, 2026
f223943
Read and write every property type, and keep a rewritten blob's name …
ChrisJollyAU Sep 28, 2026
5c4e922
Keep a complex-column table's flags through a rebuild, and name index…
ChrisJollyAU Sep 28, 2026
9d00745
Check an object's name within its own container, as ACE does
ChrisJollyAU Sep 28, 2026
93ccf94
Read and write the Name AutoCorrect maps, and read the page type as a…
ChrisJollyAU Sep 28, 2026
37be270
Record what ACE does with a relocation pointer to a missing page
ChrisJollyAU Sep 28, 2026
9280d3e
Take an append-only memo's version history with it on DROP COLUMN
ChrisJollyAU Sep 28, 2026
4782a4e
Retype a Memo/OLE column in place, as ACE does
ChrisJollyAU Sep 28, 2026
6bee7f8
Remove what only the ALTER COLUMN table rebuild used
ChrisJollyAU Sep 28, 2026
ee10991
Retype a text length, and several indexes over a column, as ACE does
ChrisJollyAU Sep 28, 2026
36e4572
Stop dropping and recreating indexes around an ALTER COLUMN
ChrisJollyAU Sep 28, 2026
ed54ac5
Skip the reserved-word names an ACE older than Access 2311 refuses
ChrisJollyAU Sep 28, 2026
429c075
Add Access's Nz, with the results Access gives
ChrisJollyAU Sep 29, 2026
aa94b91
Add TOP n WITH TIES and FETCH … WITH TIES
ChrisJollyAU Sep 29, 2026
c2a0181
Name a derived table's columns with a column list, and emit VALUES th…
ChrisJollyAU Sep 29, 2026
b7e3214
Test the lock manager's case rule per platform
ChrisJollyAU Sep 29, 2026
9e9293c
Add a probe of how ACE chooses the pages it allocates
ChrisJollyAU Sep 29, 2026
8c4b482
Assert the step-by-step whole-file parity with ACE
ChrisJollyAU Sep 29, 2026
74f63fa
Free an UPDATE's replaced long value after writing the new one
ChrisJollyAU Sep 29, 2026
06482c1
Write a row's long values where ACE writes them
ChrisJollyAU Sep 29, 2026
74ce28f
Test a choice inside arithmetic that takes its literal arm
ChrisJollyAU Sep 29, 2026
d5b871a
Store a query's DISTINCT, TOP and PERCENT on one option row, as ACE does
ChrisJollyAU Sep 29, 2026
15d3391
Accept WITH OWNERACCESS OPTION, and keep it in a stored query
ChrisJollyAU Sep 29, 2026
791c3a4
Count OWNERACCESS and OPTION among the ReservedWords
ChrisJollyAU Sep 29, 2026
642f5d1
Keep the LibRedAccess job's blame output when a step fails
ChrisJollyAU Sep 29, 2026
e8eb577
Cast a character above U+7FFF to its unsigned code
ChrisJollyAU Sep 30, 2026
5ecc78d
Keep the columns duplicate elimination and positional renames depend on
ChrisJollyAU Sep 30, 2026
86325bf
Check a foreign key's parent again at commit, and existing rows on ADD
ChrisJollyAU Sep 30, 2026
1ef1342
Add a self-referencing foreign key through the same path as any other
ChrisJollyAU Sep 30, 2026
4e478c7
Check a cascaded row as an updated one, and a parent's end at commit
ChrisJollyAU Sep 30, 2026
82ef014
Bring the docs in line with the code
ChrisJollyAU Sep 30, 2026
0d999b8
Derive every stored SID from page 0, and re-mask them when a password…
ChrisJollyAU Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"hooks": [
{
"type": "command",
"command": "in=$(cat); body=$(printf '%s' \"$in\" | sed 's/\"scratchpad_dir\":\"[^\"]*\"//g; s/\"transcript_path\":\"[^\"]*\"//g; s/\"cwd\":\"[^\"]*\"//g; s/\"description\":\"[^\"]*\"//g'); if printf '%s' \"$body\" | grep -qE '(^|[;&|(\")])[[:space:]]*(python[0-9.]*|pythonw|py)([[:space:]]|\")|sed[[:space:]]+-[a-zA-Z]*i|sed[[:space:]]+--in-place|>[[:space:]]*[^[:space:];&|]*\\.(cs|md|csproj|props|targets|sln|json|ps1|g4)|tee[[:space:]][^;&|]*\\.(cs|md|csproj|props|targets|sln|json|ps1|g4)'; then echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"Shell edits to source files (and Python) are disallowed: they bypass file checkpointing, so /rewind cannot undo them. Use Edit or Write instead. Writing logs to the scratchpad is fine.\"}}'; elif printf '%s' \"$body\" | grep -qE '(^|[;&(\")]|\\\\\\\\n)[[:space:]]*(grep|egrep|fgrep|rg|cat|head|tail|ls|dir|find|fd|fdfind|Get-Content|gc|Get-ChildItem|gci|Select-String|sls)([[:space:]]|\")'; then if ! printf '%s' \"$body\" | grep -qE '(scratchpad|\\.log|\\$log|/tmp/)'; then echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"Reading files through the shell costs a permission prompt and bypasses the dedicated tools. Use Grep for content, Glob for filenames, Read for file contents. Shell text tools stay allowed on scratchpad logs (paths containing scratchpad, .log or $log).\"}}'; elif ! printf '%s' \"$body\" | grep -qE '([;&`]|[$]\\()'; then echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"allow\",\"permissionDecisionReason\":\"Pre-approved: a shell text tool reading a scratchpad/log path, as a single command with no chaining.\"}}'; fi; fi; true"
"command": "in=$(cat); body=$(printf '%s' \"$in\" | sed 's/\"scratchpad_dir\":\"[^\"]*\"//g; s/\"transcript_path\":\"[^\"]*\"//g; s/\"cwd\":\"[^\"]*\"//g; s/\"description\":\"[^\"]*\"//g'); if printf '%s' \"$body\" | grep -qE '(^|[;&|(\")])[[:space:]]*(python[0-9.]*|pythonw|py)([[:space:]]|\")|sed[[:space:]]+-[a-zA-Z]*i|sed[[:space:]]+--in-place|>[[:space:]]*[^[:space:];&|]*\\.(cs|md|csproj|props|targets|sln|json|ps1|g4)|tee[[:space:]][^;&|]*\\.(cs|md|csproj|props|targets|sln|json|ps1|g4)'; then echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"Shell edits to source files (and Python) are disallowed: they bypass file checkpointing, so /rewind cannot undo them. Use Edit or Write instead. Writing logs to the scratchpad is fine.\"}}'; elif printf '%s' \"$body\" | grep -qE '(^|[;&|(\")])[[:space:]]*git[[:space:]]+(-[^[:space:]]+[[:space:]]+([^-[:space:]][^[:space:]]*[[:space:]]+)?){0,3}(grep|cat-file)([[:space:]]|\"|$)'; then echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"git grep and git cat-file read repository files through the shell - the same thing the read rule covers, just spelled to pass the git allow-list. Use Grep for content, Glob for filenames, Read for file contents. git diff, git log and git show stay allowed for reviewing history.\"}}'; elif printf '%s' \"$body\" | grep -qE '(^|[;&(\")]|\\\\\\\\n)[[:space:]]*(grep|egrep|fgrep|rg|cat|head|tail|ls|dir|find|fd|fdfind|Get-Content|gc|Get-ChildItem|gci|Select-String|sls)([[:space:]]|\")'; then if ! printf '%s' \"$body\" | grep -qE '(scratchpad|\\.log|\\$log|/tmp/)'; then echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"Reading files through the shell costs a permission prompt and bypasses the dedicated tools. Use Grep for content, Glob for filenames, Read for file contents. Shell text tools stay allowed on scratchpad logs (paths containing scratchpad, .log or $log).\"}}'; elif ! printf '%s' \"$body\" | grep -qE '([;&`]|[$]\\()'; then echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"allow\",\"permissionDecisionReason\":\"Pre-approved: a shell text tool reading a scratchpad/log path, as a single command with no chaining.\"}}'; fi; elif printf '%s' \"$body\" | grep -qE 'dotnet[[:space:]]+test' && printf '%s' \"$body\" | grep -qE 'LibRed\\.(Core|Engine)\\.AccessTests'; then if ! printf '%s' \"$body\" | grep -qE '(--filter|\"run_in_background\\\"?[[:space:]]*:[[:space:]]*true)'; then echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"LibRed.Core.AccessTests takes about 7 minutes and LibRed.Engine.AccessTests about 1.5. Run it with --filter for the tests that cover the change, or pass run_in_background true and keep working while it runs. A whole suite in the foreground blocks the session for minutes at a time.\"}}'; fi; fi; true"
}
]
}
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
- This project (EntityFrameworkCore.Jet) targets the Microsoft Access Jet/ACE database engine, not SQL Server. Generated SQL, type mappings, and literals must be Jet/ACE-compliant (e.g. decimal/currency instead of bigint, #...# date literals, TIMEVALUE()). Note: Access 2016+ (ACE) does have a native BIGINT (Large Number) type, which is a SIGNED 64-bit integer and cannot hold unsigned values like ulong.MaxValue; unsigned ulong/uint should map to decimal(20,0) to avoid overflow. Provider distinctions are OLE DB / ODBC via the ACE/Jet driver rather than SqlClient. Do not assume SQL Server/T-SQL semantics.
- The Jet/Access SQL dialect does not support COALESCE or NZ. When rewriting queries for Jet, prefer IIF(<expr> IS NULL, <default>, <expr>) instead.
- That rule is about the **Jet dialect**, not the whole repository. This repo also contains LibRed (`src/LibRed`), a from-scratch managed Jet/ACE engine, and its EF Core provider has two SQL modes. In `LibRedSqlMode.Compatible` the rule above applies, because the SQL is generated to also run against ACE. In `LibRedSqlMode.Extended` (the default) it does not: LibRed owns the engine that parses the SQL, so the generator deliberately emits standard SQL that ACE has no syntax for — COALESCE, CASE, NULLIF, CROSS/OUTER APPLY, window functions, OFFSET/FETCH paging and FULL OUTER JOIN. Do not "fix" those back into Jet workarounds; extended mode exists precisely to remove them.
- Deferred enhancement for EntityFrameworkCore.Jet: add ACE engine-version detection so that on Access 2016+ the provider can map to native BIGINT (signed long; unsigned ulong/uint still go to decimal(20,0)) and native DATETIME2, while falling back to decimal(20,0)/legacy datetime on older ACE versions. Not a priority right now. The gap is in the **provider's type mapping**, not in the engine: ACE itself accepts both types, and LibRed already reads, writes and indexes them, gating on the on-disk format version and raising a file's version byte rather than refusing the DDL. Caveat before treating this as a straightforward port: DATETIME2 through Jet/ACE is badly behaved, so it needs its own investigation rather than being mapped by analogy with BIGINT. The asymmetry between the two providers is deliberate, so do not assume either side behaves like the other.
- Deferred enhancement for EntityFrameworkCore.Jet: add ACE engine-version detection so that the provider can map to native BIGINT on Access 2016+ (signed long; unsigned ulong/uint still go to decimal(20,0)) and native DATETIME2 on Access 2019+ — two different thresholds, not one — while falling back to decimal(20,0)/legacy datetime on older ACE versions. Not a priority right now. The gap is in the **provider's type mapping**, not in the engine: ACE itself accepts both types, and LibRed already reads, writes and indexes them, gating on the on-disk format version and raising a file's version byte rather than refusing the DDL. Caveat before treating this as a straightforward port: DATETIME2 through Jet/ACE is badly behaved, so it needs its own investigation rather than being mapped by analogy with BIGINT. The asymmetry between the two providers is deliberate, so do not assume either side behaves like the other.
22 changes: 18 additions & 4 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -731,21 +731,35 @@ jobs:
- name: 'Run Tests: LibRed.Core.AccessTests'
if: env.skipTests != 'true'
shell: pwsh
run: dotnet test .\test\LibRed.Core.AccessTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-hang-timeout 5m
run: dotnet test .\test\LibRed.Core.AccessTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-crash --blame-hang-timeout 5m
# The engine tests that cross-check against ACE. They belong here rather than in the cross-platform
# LibRed job above, which runs on five platforms precisely to prove LibRed needs no ACE at all.
- name: 'Run Tests: LibRed.Engine.AccessTests'
if: always() && env.skipTests != 'true'
shell: pwsh
run: dotnet test .\test\LibRed.Engine.AccessTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-hang-timeout 5m
run: dotnet test .\test\LibRed.Engine.AccessTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-crash --blame-hang-timeout 5m
- name: 'Run Tests: LibRed.Ado.Tests'
if: always() && env.skipTests != 'true'
shell: pwsh
run: dotnet test .\test\LibRed.Ado.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-hang-timeout 5m
run: dotnet test .\test\LibRed.Ado.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-crash --blame-hang-timeout 5m
- name: 'Run Tests: LibRed.EFCore.Tests'
if: always() && env.skipTests != 'true'
shell: pwsh
run: dotnet test .\test\LibRed.EFCore.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-hang-timeout 5m
run: dotnet test .\test\LibRed.EFCore.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-crash --blame-hang-timeout 5m
# A run that dies partway reports only the tests that finished. The blame output names the test that
# was running (Sequence_*.xml) and holds any crash or hang dump, so keep it when a step fails.
- name: 'Upload Blame Results'
if: failure()
uses: actions/upload-artifact@v6
with:
name: libredaccess-blame_ace_${{ matrix.aceVersion }}
path: |
test\LibRed.Core.AccessTests\TestResults\**
test\LibRed.Engine.AccessTests\TestResults\**
test\LibRed.Ado.Tests\TestResults\**
test\LibRed.EFCore.Tests\TestResults\**
if-no-files-found: ignore
retention-days: 7

LibRedFunctional:
needs:
Expand Down
40 changes: 19 additions & 21 deletions .github/workflows/push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ jobs:
- 'test/EFCore.LibRed.FunctionalTests/**'
- 'test/EFCore.LibRed.Extended.FunctionalTests/**'
- 'src/EFCore.Jet.Common/**'
# Northwind.accdb lives here and every LibRed suite links to it as its fixture.
# Northwind.accdb lives here and every LibRed.* test project links to it as its fixture.
- 'test/JetProviderExceptionTests/**'
- name: 'Decide What To Run'
id: Decide
Expand Down Expand Up @@ -739,21 +739,35 @@ jobs:
- name: 'Run Tests: LibRed.Core.AccessTests'
if: env.skipTests != 'true'
shell: pwsh
run: dotnet test .\test\LibRed.Core.AccessTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-hang-timeout 5m
run: dotnet test .\test\LibRed.Core.AccessTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-crash --blame-hang-timeout 5m
# The engine tests that cross-check against ACE. They belong here rather than in the cross-platform
# LibRed job above, which runs on five platforms precisely to prove LibRed needs no ACE at all.
- name: 'Run Tests: LibRed.Engine.AccessTests'
if: always() && env.skipTests != 'true'
shell: pwsh
run: dotnet test .\test\LibRed.Engine.AccessTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-hang-timeout 5m
run: dotnet test .\test\LibRed.Engine.AccessTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-crash --blame-hang-timeout 5m
- name: 'Run Tests: LibRed.Ado.Tests'
if: always() && env.skipTests != 'true'
shell: pwsh
run: dotnet test .\test\LibRed.Ado.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-hang-timeout 5m
run: dotnet test .\test\LibRed.Ado.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-crash --blame-hang-timeout 5m
- name: 'Run Tests: LibRed.EFCore.Tests'
if: always() && env.skipTests != 'true'
shell: pwsh
run: dotnet test .\test\LibRed.EFCore.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-hang-timeout 5m
run: dotnet test .\test\LibRed.EFCore.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --blame-crash --blame-hang-timeout 5m
# A run that dies partway reports only the tests that finished. The blame output names the test that
# was running (Sequence_*.xml) and holds any crash or hang dump, so keep it when a step fails.
- name: 'Upload Blame Results'
if: failure()
uses: actions/upload-artifact@v6
with:
name: libredaccess-blame_ace_${{ matrix.aceVersion }}
path: |
test\LibRed.Core.AccessTests\TestResults\**
test\LibRed.Engine.AccessTests\TestResults\**
test\LibRed.Ado.Tests\TestResults\**
test\LibRed.EFCore.Tests\TestResults\**
if-no-files-found: ignore
retention-days: 7

LibRedFunctional:
needs:
Expand Down Expand Up @@ -888,12 +902,8 @@ jobs:
$buildSha = '${{ github.sha }}'.SubString(0, 7);
$pack = $officialBuild -or $ciBuildOnly

$pushToAzureArtifacts = $pack
$pushToMygetOrg = $pack
$pushToNugetOrg = $pack -and $officialBuild

echo "pushToAzureArtifacts: $pushToAzureArtifacts"
echo "pushToMygetOrg: $pushToMygetOrg"
echo "pushToNugetOrg: $pushToNugetOrg"

echo "officialBuild: $officialBuild"
Expand Down Expand Up @@ -944,24 +954,12 @@ jobs:
}
}

echo "pushToAzureArtifacts=$pushToAzureArtifacts" >> $env:GITHUB_ENV
echo "pushToMygetOrg=$pushToMygetOrg" >> $env:GITHUB_ENV
echo "pushToNugetOrg=$pushToNugetOrg" >> $env:GITHUB_ENV
- name: Upload Artifacts
uses: actions/upload-artifact@v6
with:
name: nupkgs
path: nupkgs
- name: "NuGet Push - myget.org - Debug"
if: ${{ env.pushToMygetOrg == 'true' }}
working-directory: nupkgs
shell: pwsh
run: dotnet nuget push './Debug/withPdbs/**/*.nupkg' --api-key '${{ secrets.MYGETORG_CIRRUSRED_ALLPACKAGES_DEBUG_PUSHNEW }}' --source 'https://www.myget.org/F/cirrusred-debug/api/v3/index.json' --skip-duplicate
- name: "NuGet Push - myget.org - Release"
if: ${{ env.pushToMygetOrg == 'true' }}
working-directory: nupkgs
shell: pwsh
run: dotnet nuget push './Release/default/**/*.nupkg' --api-key '${{ secrets.MYGETORG_CIRRUSRED_ALLPACKAGES_PUSHNEW }}' --source 'https://www.myget.org/F/cirrusred/api/v3/index.json' --skip-duplicate
- name: "NuGet Push - nuget.org - Release"
if: ${{ env.pushToNugetOrg == 'true' }}
working-directory: nupkgs
Expand Down
Loading
Loading