aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/ops
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-10-14 11:17:38 +0200
committerChristophe Besson <cbesson@gmail.com>2026-10-14 11:17:38 +0200
commitdaec4bc6a2a9f9e038e5269586b06018ff327a27 (patch)
treec34c58aad624d594dbb1aa8a47f71ab38a5e3081 /packages/meshbay-node/src/meshbay_node/ops
parent80ac882346b474bb7ea4e8c8afd4694bd13dd9dd (diff)
downloadmeshbay-daec4bc6a2a9f9e038e5269586b06018ff327a27.tar.gz
fix(node): index, serve and write files past Windows' MAX_PATHHEADmain
With the system's default setting (LongPathsEnabled off) every call given a plain path of 260 characters or more refuses it, so a deep library was partly invisible: the walk could not list such a directory and its files never reached the members. The node now hands each call that touches a group's disk the extended form (paths.long_path), and keeps the plain path in the index, the hash cache and the log. A directory is listed under its long form and its entries named from the plain one (indexer.walk_files, wire._walk_dirs). Covered: the walk, stats and hashing, reconcile and the watcher, the folder list members see, serving over WebRTC and QUIC, deletion, uploads and their recovery, folder creation and removal, audio tags and the cover beside a track, photos, and a show's episode numbering. ffmpeg extends a long path itself and keeps the plain one. long_path now normalises before prefixing (the extended form skips the system's normalisation) and starts at 248 characters, where creating a directory is already refused. test_long_paths.py runs with the setting off: 15 of its 17 tests fail without the change. Checked by hand in the installed app with files at 312 to 380 characters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/ops')
-rw-r--r--packages/meshbay-node/src/meshbay_node/ops/files.py7
1 files changed, 5 insertions, 2 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/ops/files.py b/packages/meshbay-node/src/meshbay_node/ops/files.py
index 4609627..a448103 100644
--- a/packages/meshbay-node/src/meshbay_node/ops/files.py
+++ b/packages/meshbay-node/src/meshbay_node/ops/files.py
@@ -4,8 +4,11 @@ from __future__ import annotations
import asyncio
import logging
+import os
from pathlib import Path
+from meshbay_common.paths import long_path
+
from meshbay_node.ops.core import OpError, _group_ctx
log = logging.getLogger("meshbay_node.ops")
@@ -41,7 +44,7 @@ async def delete_file(state: dict, group_id: str, file_id: str) -> dict:
f"not readable right now — the file is frozen, not gone", status=409)
try:
- path.unlink()
+ os.unlink(long_path(path))
except FileNotFoundError:
# Already gone from disk; drop the stale entry rather than refusing.
log.warning("Index named a file that is not on disk: %s", path)
@@ -104,7 +107,7 @@ async def prune_index_cache(state: dict) -> dict:
return True
if any(not r.available for r in owning):
return False
- return not path.exists()
+ return not os.path.exists(long_path(path))
paths = await cache.all_paths()
stale = await asyncio.to_thread(lambda: [p for p in paths if _is_stale(p)])