"""
Provide OS interaction utilities.
"""
from __future__ import annotations
import asyncio
import os
import shutil
from asyncio import gather
from contextlib import suppress
from os import walk
from pathlib import Path
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from collections.abc import Callable, Awaitable
[docs]
async def link_or_copy(source_file_path: Path, destination_file_path: Path) -> None:
"""
Create a hard link to a source path, or copy it to its destination otherwise.
For most purposes, Betty requires files to be accessible at certain paths, rather than
that these paths provide unique files. Therefore, the fastest thing to do is create
hard links. In case that fails, such as when the source and destination are on different
disks, copy the file instead. You **SHOULD NOT** use this function if the destination file
will be modified afterwards.
If the destination exists, it will be left untouched.
"""
await asyncio.to_thread(_link_or_copy, source_file_path, destination_file_path)