Skip to content

Gracefully handle cross-OS path conflicts during restore #82

Description

@woutervanranst

Summary

Commit 11fe5668026c4e62837bd688578dd158679c7d60 removed the archive-time hard requirement that rejected path collisions up front. That improves archive portability, but it leaves a follow-up gap on restore: a snapshot can now legitimately contain paths that cannot be materialized cleanly on the current OS/filesystem.

Problem

Restore should not rely on every archived path being directly writable on every target OS.

Examples:

  • Case-only distinct paths archived on a case-sensitive filesystem, then restored onto a case-insensitive filesystem
  • Windows-invalid names or path forms restored on Windows (CON, NUL, trailing dots/spaces, etc.)
  • Other filesystem-specific path conflicts where two archived entries map to the same effective destination path

Today this looks like a place where restore can still fail awkwardly or behave unclearly after the archive-side validator was removed.

Enhancement

Add a restore-side strategy for cross-OS compatibility that degrades gracefully instead of failing the whole restore.

Possible direction:

  • Detect destination-path conflicts before writing files
  • Restore all non-conflicting files normally
  • Skip or quarantine conflicting entries with explicit reporting
  • Surface a clear summary of skipped/conflicting paths in the restore result / logs

Acceptance Direction

  • Restoring a snapshot with cross-OS-incompatible paths should not abort the entire restore when unaffected files can still be restored
  • The user should get a clear explanation of which paths were skipped or conflicted and why
  • Behavior should be covered by integration tests for representative cross-OS collision cases

Context

This is a follow-up to the archive-side change in 11fe5668026c4e62837bd688578dd158679c7d60.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions