dc8be1bd1a
Cap encoded slug length and use \\?\ long-path writes (0.3.6). Co-authored-by: Cursor <cursoragent@cursor.com>
54 lines
1.3 KiB
Python
54 lines
1.3 KiB
Python
"""Filesystem helpers (Windows MAX_PATH / long paths)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import shutil
|
|
from pathlib import Path
|
|
|
|
|
|
def fs_path(path: Path | str) -> Path:
|
|
"""
|
|
On Windows, prefix with ``\\\\?\\`` so open/mkdir work beyond MAX_PATH (~260).
|
|
|
|
No-op on other platforms. Idempotent if already prefixed.
|
|
"""
|
|
p = Path(path)
|
|
if os.name != "nt":
|
|
return p
|
|
s = os.fspath(p)
|
|
if s.startswith("\\\\?\\"):
|
|
return p
|
|
if not p.is_absolute():
|
|
p = p.resolve()
|
|
s = os.fspath(p)
|
|
if s.startswith("\\\\"):
|
|
# UNC: \\server\share\... → \\?\UNC\server\share\...
|
|
return Path("\\\\?\\UNC\\" + s[2:])
|
|
return Path("\\\\?\\" + s)
|
|
|
|
|
|
def ensure_dir(path: Path) -> Path:
|
|
p = fs_path(path)
|
|
p.mkdir(parents=True, exist_ok=True)
|
|
return p
|
|
|
|
|
|
def write_text(path: Path, text: str, *, encoding: str = "utf-8") -> None:
|
|
p = fs_path(path)
|
|
p.parent.mkdir(parents=True, exist_ok=True)
|
|
p.write_text(text, encoding=encoding)
|
|
|
|
|
|
def copy_file(src: Path, dst: Path) -> None:
|
|
s = fs_path(src)
|
|
d = fs_path(dst)
|
|
d.parent.mkdir(parents=True, exist_ok=True)
|
|
shutil.copy2(s, d)
|
|
|
|
|
|
def remove_file(path: Path) -> None:
|
|
p = fs_path(path)
|
|
if p.is_file():
|
|
p.unlink()
|