navidrome/core
Deluan Quintão b78c963931
fix(scanner): respect FollowSymlinks in watcher-triggered scans (#6293)
* fix(scanner): respect FollowSymlinks in watcher-triggered scans

With FollowSymlinks disabled, creating a folder symlink inside the library
made the watcher schedule a selective scan with the link itself as the
target. walkDirTree only checked FollowSymlinks for child entries, so it
walked the link and imported its files as duplicates (or, for links that
point outside the library, files that should never be scanned).

walkDirTree now skips any target folder whose path, or any parent folder,
is a symlink when FollowSymlinks is disabled. The skipped target stays in
lastUpdates, so rows previously imported through it are marked missing,
matching what a full scan does. localFS now implements fs.ReadLinkFS so
fs.Lstat can see symlinks instead of following them.

Fixes #6292

* test(scanner): run the #6292 symlinked target tests on Windows

Remove the SkipOnWindows guard from the symlinked target folder tests, so
the go-windows CI job covers the FollowSymlinks fix for selective scans.
2026-10-08 17:34:42 -04:00
..
agents refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
artwork fix(artwork): don't crash the server when a playlist's tracks can't be loaded (#6267) 2026-10-06 07:57:07 -07:00
auth refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
external refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
ffmpeg refactor(scanner): remove the unused legacy ffmpeg metadata extractor (#6231) 2026-09-26 12:30:52 -04:00
lyrics refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
matcher refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
metrics feat(scanner): per-library PID configuration (#6252) 2026-10-02 05:05:32 -04:00
playback refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
playlists feat(scanner): per-library PID configuration (#6252) 2026-10-02 05:05:32 -04:00
publicurl fix(plugins): build public URLs on the caller's address instead of localhost (#6059) 2026-08-31 21:27:43 -04:00
quickconnect feat(jellyfin): add Quick Connect sign-in (#6174) 2026-09-19 14:57:01 -04:00
scrobbler refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
sonic refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
storage fix(scanner): respect FollowSymlinks in watcher-triggered scans (#6293) 2026-10-08 17:34:42 -04:00
stream refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
archiver.go fix(share): reuse cached transcodes for share streams and zip downloads (#6262) 2026-10-03 08:58:54 -07:00
archiver_test.go fix(share): reuse cached transcodes for share streams and zip downloads (#6262) 2026-10-03 08:58:54 -07:00
common.go refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
common_test.go test: unskip path-separator tests on Windows (#5381) (#5916) 2026-08-19 11:50:32 -04:00
core_suite_test.go Rename log.LevelCritical to log.LevelFatal 2022-12-21 14:53:36 -05:00
inspect.go feat(scanner): per-library PID configuration (#6252) 2026-10-02 05:05:32 -04:00
inspect_test.go feat(scanner): per-library PID configuration (#6252) 2026-10-02 05:05:32 -04:00
library.go feat(scanner): per-library PID configuration (#6252) 2026-10-02 05:05:32 -04:00
library_test.go feat(scanner): per-library PID configuration (#6252) 2026-10-02 05:05:32 -04:00
maintenance.go refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
maintenance_test.go refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
players.go feat(subsonic): OpenSubsonic API key authentication (#6219) 2026-09-27 21:56:58 -04:00
players_test.go feat(subsonic): OpenSubsonic API key authentication (#6219) 2026-09-27 21:56:58 -04:00
share.go refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
share_test.go refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
user.go refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
user_test.go refactor(persistence): stateless repositories with per-call context (#6149) 2026-09-25 18:06:10 -04:00
wire_providers.go feat(jellyfin): add Quick Connect sign-in (#6174) 2026-09-19 14:57:01 -04:00