Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
140 commits
Select commit Hold shift + click to select a range
0bd3137
fix(downloads): preserve path whitespace
therobbiedavis Jul 1, 2026
6d0f265
fix(paths): allow root-folder filesystem roots
therobbiedavis Jul 1, 2026
6290b23
fix(paths): reject parent traversal broadly
therobbiedavis Jul 1, 2026
8f58785
fix(paths): constrain library move destinations
therobbiedavis Jul 2, 2026
e218c0c
test(paths): use verbatim backslash literals
therobbiedavis Jul 2, 2026
4fb112c
fix(paths): refine destination validation
therobbiedavis Jul 2, 2026
823b029
Fix audiobook move workflow
therobbiedavis Jul 2, 2026
6c0c17f
Fix EF migration schema drift
kevinheneveld Jul 2, 2026
40d53ae
Fix move retry and path validation edge cases
therobbiedavis Jul 3, 2026
7fd4caf
Address PR review path comments
therobbiedavis Jul 3, 2026
25550b8
Fix branch path identity edge cases
therobbiedavis Jul 3, 2026
a05291f
fix: apply filesystem-aware path handling
therobbiedavis Jul 3, 2026
1425dbe
wip: add durable filesystem move framework
therobbiedavis Jul 3, 2026
d6123c5
fix: normalize durable move migration formatting
therobbiedavis Jul 3, 2026
237a486
Harden root relocation and move recovery
therobbiedavis Jul 4, 2026
167ac9a
refactor: simplify relocation state reconciliation
therobbiedavis Jul 4, 2026
2d1cfd4
Enforce move lease fencing and path semantics
therobbiedavis Jul 4, 2026
9c9e7f1
Improve move job error handling and isolation
therobbiedavis Jul 4, 2026
2481738
Fix move lease fencing and path semantics
therobbiedavis Jul 4, 2026
c576ee6
Fix move lease bypass and import reservations
therobbiedavis Jul 5, 2026
e0bf92e
Use resolved semantics for library moves
therobbiedavis Jul 5, 2026
66499f5
Commit import destinations only after success
therobbiedavis Jul 5, 2026
61bef52
Remove additional host path fallbacks
therobbiedavis Jul 5, 2026
9f365fe
Track legacy host path identity sites
therobbiedavis Jul 5, 2026
0def8b2
Use resolved path semantics in library service
therobbiedavis Jul 5, 2026
07e95be
Use resolved path semantics in metadata rescan
therobbiedavis Jul 5, 2026
ca86a47
Use resolved path semantics in organize service
therobbiedavis Jul 5, 2026
c1b925e
Use resolved path semantics for file association
therobbiedavis Jul 5, 2026
35f2454
Use resolved path semantics for library naming
therobbiedavis Jul 5, 2026
74652d0
Use resolved path semantics for scan queues
therobbiedavis Jul 5, 2026
2e3ff76
Update move queue path identity
therobbiedavis Jul 5, 2026
668a151
Use resolved path semantics for download sources
therobbiedavis Jul 5, 2026
4124c0b
Use resolved path semantics for moved path rewrites
therobbiedavis Jul 5, 2026
03dfe06
Classify remote path identity allowance
therobbiedavis Jul 5, 2026
698776e
Update library service behavior
therobbiedavis Jul 5, 2026
0e24e3e
Add library boundary regression tests
therobbiedavis Jul 6, 2026
ba5857d
Fail closed on move lease uncertainty
therobbiedavis Jul 6, 2026
5a7bd13
Split move source and target path semantics
therobbiedavis Jul 6, 2026
4cc51e6
Fence content moves with lease tokens
therobbiedavis Jul 6, 2026
3077735
Use semantic destination changes in edit modal
therobbiedavis Jul 6, 2026
f1f1b5d
Rewrite path refs and lease-safe attempt bumps
therobbiedavis Jul 6, 2026
be965bb
Track skipped relocation metadata rewrites
therobbiedavis Jul 7, 2026
8d1c4f7
Move migration metadata to Designer.cs
therobbiedavis Jul 7, 2026
c3d71f6
Enforce EF-scaffolded migrations and checks
therobbiedavis Jul 7, 2026
9f26dda
Extract shared path normalization and improve relocation
therobbiedavis Jul 7, 2026
b89676f
Guard against move/relocation conflicts
therobbiedavis Jul 7, 2026
e4ed91e
Prevent audiobook moves during active root folder relocations
therobbiedavis Jul 7, 2026
9e8cae5
Serialize filesystem mutations
therobbiedavis Jul 7, 2026
daa4037
Serialize root folder retry broadcasts
therobbiedavis Jul 7, 2026
2cbee01
Honor root case sensitivity for library moves
therobbiedavis Jul 7, 2026
a284041
Centralize destination rewrite and requeue resets
therobbiedavis Jul 8, 2026
2ff37ee
Centralize filesystem mutation services
therobbiedavis Jul 8, 2026
d87a189
Phase 1: Fix destination resolution ordering and enforce expectedSour…
therobbiedavis Jul 8, 2026
d92a7e4
Phase 2: Prevent legacy PUT stale path rollback after BasePath rewrite
therobbiedavis Jul 8, 2026
ad81405
Phase 3: Frontend sparse update payload construction
therobbiedavis Jul 8, 2026
e614907
Phase 5: API error mapping for root-folder delete persistence conflicts
therobbiedavis Jul 8, 2026
a685ae6
Phase 4: Root-folder relocation FK to SetNull for history preservation
therobbiedavis Jul 8, 2026
6b3fef5
Regenerate durable move migrations via EF tooling
therobbiedavis Jul 8, 2026
820d39e
Harden path metadata repair workflows
therobbiedavis Jul 9, 2026
8ef9323
Fix durable move migration and legacy path repair
therobbiedavis Jul 9, 2026
a30744d
Fix custom moves and durable move UI status
therobbiedavis Jul 9, 2026
a4737bc
Harden move recovery and background move status tracking
therobbiedavis Jul 9, 2026
48f9038
Fix Linux path repair test fixtures
therobbiedavis Jul 9, 2026
53133b8
Address code quality path safety findings
therobbiedavis Jul 9, 2026
bf0767f
test: align rewrite legacy path expectation with stored normalization
therobbiedavis Jul 9, 2026
653af7a
fix: rewrite tracked file paths after physical moves
therobbiedavis Jul 9, 2026
1d1fedc
test: cover tracked file path rewrite after moves
therobbiedavis Jul 9, 2026
7e0440a
fix: map source-root path references during rewrites
therobbiedavis Jul 9, 2026
4e892e6
test: cover source-root path reference rewrites
therobbiedavis Jul 9, 2026
f662e19
test: cover physical move with source-root legacy file path
therobbiedavis Jul 9, 2026
8ee59b3
fix: preserve relocation path validation semantics
therobbiedavis Jul 10, 2026
eb954ce
test: align metadata relocation tests with source-root rewrites
therobbiedavis Jul 10, 2026
b7a15ac
fix: harden cross-platform root relocation recovery
therobbiedavis Jul 10, 2026
fd511c8
fix: prune empty move source parents after quarantine cleanup
therobbiedavis Jul 10, 2026
49d7fe5
fix: persist safe move cleanup boundaries
therobbiedavis Jul 10, 2026
983fec6
test: cover unix and UNC move cleanup boundaries
therobbiedavis Jul 10, 2026
7406694
fix(api): add partial audiobook update contract
therobbiedavis Jul 10, 2026
27a091a
fix(api): preserve omitted audiobook fields
therobbiedavis Jul 10, 2026
702254f
fix(api): bind audiobook updates to partial request
therobbiedavis Jul 10, 2026
1fce75e
test(api): cover sparse audiobook booleans
therobbiedavis Jul 10, 2026
cb00e77
fix(filesystem): validate linked path components
therobbiedavis Jul 10, 2026
821caaf
fix(filesystem): block linked audiobook delete trees
therobbiedavis Jul 10, 2026
4e49368
test(filesystem): block linked audiobook delete trees
therobbiedavis Jul 10, 2026
923c2c8
fix(moves): publish through owned partial files
therobbiedavis Jul 10, 2026
7a1117b
fix(moves): validate move publication paths independently
therobbiedavis Jul 10, 2026
9308772
refactor(root-folders): add atomic reassignment contract
therobbiedavis Jul 10, 2026
eaa08cc
fix(root-folders): make reassignment and delete atomic
therobbiedavis Jul 10, 2026
9d4c8f8
fix(root-folders): use atomic reassignment workflow
therobbiedavis Jul 10, 2026
c890482
fix(moves): require manifest before marker recovery
therobbiedavis Jul 10, 2026
9af366d
test(root-folders): cover atomic reassignment rollback
therobbiedavis Jul 10, 2026
95085e6
ci: add temporary focused fix validation
therobbiedavis Jul 10, 2026
020f299
ci: expose temporary validation on pull requests
therobbiedavis Jul 10, 2026
b6f1ec4
ci: report temporary validation diagnostics on PR
therobbiedavis Jul 10, 2026
3fcc792
style(api): remove redundant update request using
therobbiedavis Jul 10, 2026
3da0d49
fix(filesystem): avoid capturing mutation out parameter
therobbiedavis Jul 10, 2026
a483f21
ci: apply mechanical recovery test and format fix
therobbiedavis Jul 10, 2026
d3c9953
ci: make recovery test replacement signature-scoped
therobbiedavis Jul 10, 2026
a42c8c1
test(moves): reject recovery without persisted manifest
github-actions[bot] Jul 10, 2026
84e392a
chore(ci): remove temporary fix validation workflow
therobbiedavis Jul 10, 2026
9564df8
fix(moves): replace stale files only in job-owned temp directories
therobbiedavis Jul 10, 2026
8ced2fb
ci: add temporary Windows test diagnostics
therobbiedavis Jul 10, 2026
df9e039
ci: report compact failed test diagnostics
therobbiedavis Jul 10, 2026
1ebbb93
fix(root-folders): use transactions only on relational providers
therobbiedavis Jul 10, 2026
bc0eb54
fix(moves): allow source subtree ancestor directories
therobbiedavis Jul 10, 2026
9b90c5f
test(root-folders): verify reassignment transactions with SQLite
therobbiedavis Jul 10, 2026
a15cfdf
ci: apply marker guard and validate backend fixes
therobbiedavis Jul 10, 2026
40f5443
chore: stage PR 717 sparse update fixes
therobbiedavis Jul 10, 2026
926339e
chore: stage PR 717 link-safe deletion fixes
therobbiedavis Jul 10, 2026
0a0b816
chore: stage PR 717 manifest-owned recovery fixes
therobbiedavis Jul 10, 2026
06db17a
chore: stage PR 717 recovery regression tests
therobbiedavis Jul 10, 2026
ed8bacf
chore: stage PR 717 root reassignment fixes
therobbiedavis Jul 10, 2026
dd497d8
chore: validate and apply PR 717 review fixes
therobbiedavis Jul 10, 2026
2aafb0f
chore: allow PR-triggered review fix validation
therobbiedavis Jul 10, 2026
42cf808
chore: isolate PR 717 patch phases
therobbiedavis Jul 10, 2026
b3a2cfb
chore: isolate recovery marker persistence patch
therobbiedavis Jul 10, 2026
7eb5d84
chore: isolate recovery orchestration patch
therobbiedavis Jul 10, 2026
fa57b14
chore: isolate manifest copy publication patch
therobbiedavis Jul 10, 2026
70c2b73
chore: split recovery validation steps
therobbiedavis Jul 10, 2026
87e7b4e
chore: anchor recovery orchestration patch uniquely
therobbiedavis Jul 10, 2026
23381a7
chore: capture backend build diagnostics
therobbiedavis Jul 10, 2026
745d9f6
chore: add recovery path semantics import
therobbiedavis Jul 10, 2026
882ffd7
chore: apply recovery persistence import
therobbiedavis Jul 10, 2026
5700162
chore: add recovery logging import
therobbiedavis Jul 10, 2026
c757e6b
chore: capture focused test diagnostics
therobbiedavis Jul 10, 2026
ff66cb0
chore: harden marker-without-manifest guard
therobbiedavis Jul 10, 2026
291f39e
chore: make rollback test force delete failure
therobbiedavis Jul 10, 2026
1c297f3
chore: apply focused regression corrections
therobbiedavis Jul 10, 2026
05e3771
chore: use authoritative async manifest loader
therobbiedavis Jul 10, 2026
40500b0
chore: embed rollback trigger identifier safely
therobbiedavis Jul 10, 2026
1974ca3
chore: validate combined recovery and rollback fixes
therobbiedavis Jul 10, 2026
c7a8576
chore: assert public persistence exception contract
therobbiedavis Jul 10, 2026
0d1fa0d
chore: render PR 717 patch diagnostics
therobbiedavis Jul 10, 2026
100f0f6
chore: expose rendered recovery source for validation
therobbiedavis Jul 10, 2026
05a1488
chore: await marker recovery regression operation
therobbiedavis Jul 10, 2026
da328dc
chore: capture complete backend test diagnostics
therobbiedavis Jul 10, 2026
c8200e9
chore: preserve legacy move identity and source focus
therobbiedavis Jul 10, 2026
c885772
chore: apply legacy identity and source focus fixes
therobbiedavis Jul 10, 2026
ef1a00b
chore: capture frontend diagnostics and full checks
therobbiedavis Jul 11, 2026
84bf7a0
chore: type sparse editor payload to update contract
therobbiedavis Jul 11, 2026
90c3ace
fix: address PR 717 path safety review findings
github-actions[bot] Jul 11, 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
102 changes: 102 additions & 0 deletions .github/workflows/temporary-test-diagnostics.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
name: Temporary Windows Test Diagnostics

on:
pull_request:

permissions:
contents: write
pull-requests: write
issues: write

jobs:
diagnose-windows:
if: github.event.pull_request.head.repo.full_name == github.repository
runs-on: windows-2025
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x
- name: Restore
run: dotnet restore
- name: Apply recovery marker invariant and format
shell: pwsh
run: |
$path = 'listenarr.infrastructure/Library/Moving/AudiobookContentMoveService.cs'
$content = Get-Content $path -Raw
$old = @'
if (string.Equals(recoveryStage, CopyCompletedStage, StringComparison.Ordinal)
&& LoadManifest(request.JobId).Count == 0)
{
throw new MoveNeedsAttentionException(
"A legacy copy-complete marker has no byte-verified manifest; source cleanup is blocked.");
}
'@
$new = @'
if (recoveryStage is CopyStartedStage or CopyCompletedStage
&& LoadManifest(request.JobId).Count == 0)
{
throw new MoveNeedsAttentionException(
"A move recovery marker exists without a persisted manifest; destination ownership cannot be proven.");
}
'@
if ($content.Contains($old)) {
$content = $content.Replace($old, $new)
Set-Content $path $content -NoNewline
} elseif (-not $content.Contains('recoveryStage is CopyStartedStage or CopyCompletedStage')) {
throw 'Expected recovery marker guard was not found.'
}

dotnet format
if (-not (git diff --quiet)) {
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git add -u
git commit -m 'fix(moves): require manifest for direct-copy recovery markers'
git push origin HEAD:${{ github.head_ref }}
}
- name: Run tests and report compact failures
shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
$ErrorActionPreference = 'Continue'
dotnet test tests/Listenarr.Tests.csproj --no-restore --logger "trx;LogFileName=test-results.trx" *> test.log
$status = $LASTEXITCODE

$diagnostics = [System.Collections.Generic.List[string]]::new()
$trxPath = Get-ChildItem -Path tests/TestResults -Filter test-results.trx -Recurse | Select-Object -First 1
if ($trxPath) {
[xml]$trx = Get-Content $trxPath.FullName
$namespace = [System.Xml.XmlNamespaceManager]::new($trx.NameTable)
$namespace.AddNamespace('t', 'http://microsoft.com/schemas/VisualStudio/TeamTest/2010')
$failed = $trx.SelectNodes("//t:UnitTestResult[@outcome='Failed']", $namespace)
foreach ($result in $failed) {
$diagnostics.Add("FAILED: $($result.testName)")
$message = $result.SelectSingleNode('t:Output/t:ErrorInfo/t:Message', $namespace)
$stack = $result.SelectSingleNode('t:Output/t:ErrorInfo/t:StackTrace', $namespace)
if ($message) { $diagnostics.Add($message.InnerText.Trim()) }
if ($stack) { $diagnostics.Add($stack.InnerText.Trim()) }
$diagnostics.Add('')
}
}

if ($diagnostics.Count -eq 0) {
$diagnostics.AddRange([string[]](Get-Content test.log | Select-Object -Last 80))
}

@(
'<!-- temporary-windows-test-diagnostics-compact -->'
'### Temporary Windows test diagnostics'
''
"Exit code: ``$status``"
''
'```text'
$diagnostics
'```'
) | Set-Content diagnostics.md
gh pr comment $env:PR_NUMBER --body-file diagnostics.md
if ($status -ne 0) { exit 1 }
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -414,5 +414,6 @@ If you have any questions about contributing, please:
4. In `listenarr.api/Program.cs` call the infrastructure registration extension instead of registering types inline.
5. Delete the old API placeholder files and run `dotnet test` to verify no regressions.
- Add a small DI/registration unit test (DependencyInjectionTests) that asserts required services are resolvable; run it early in CI to catch layering regressions.
- Create EF Core migrations with `dotnet ef migrations add` only. Do not hand-author migration `.cs`, `.Designer.cs`, or model snapshot files; generated migrations may be reviewed, but the scaffold is the source of truth so EF discovery metadata and accumulated snapshots stay complete.

Thank you for contributing to Listenarr! 🎵📚
Loading