From d3e5e11f8de4e385c79343d7369db713739e0212 Mon Sep 17 00:00:00 2001 From: Daniel Dolezal Date: Tue, 28 Jul 2026 00:14:00 +0200 Subject: [PATCH] fix(cli): ignore generated folders in subfolders - Match directory ignore patterns against every path segment. - Prevent nested .comments folders from uploading XML sidecar files. - Bump the standalone CLI to 0.4.2 for the ignore fix. --- cli/nanoshare_client/ignore.py | 2 ++ cli/pyproject.toml | 2 +- tests/test_nanoshare_cli.py | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cli/nanoshare_client/ignore.py b/cli/nanoshare_client/ignore.py index d02542b..e07903a 100644 --- a/cli/nanoshare_client/ignore.py +++ b/cli/nanoshare_client/ignore.py @@ -46,6 +46,8 @@ def is_ignored(rel_path: str, patterns: list[str]) -> bool: if pattern.endswith('/'): if path == normalized or path.startswith(f'{normalized}/'): return True + if any(fnmatch(part, normalized) for part in parts): + return True continue if '/' in normalized: if fnmatch(path, normalized): diff --git a/cli/pyproject.toml b/cli/pyproject.toml index 738f08a..aa2ca8f 100644 --- a/cli/pyproject.toml +++ b/cli/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "nanoshare-cli" -version = "0.4.1" +version = "0.4.2" description = "NanoShare desktop CLI and folder sync client" readme = "README.md" requires-python = ">=3.11" diff --git a/tests/test_nanoshare_cli.py b/tests/test_nanoshare_cli.py index 094f295..db5b1a1 100644 --- a/tests/test_nanoshare_cli.py +++ b/tests/test_nanoshare_cli.py @@ -213,6 +213,8 @@ def test_sync_ignores_local_files_from_nanoshareignore(tmp_path, monkeypatch): (tmp_path / 'scratch.tmp').write_text('ignored') (tmp_path / '.comments').mkdir() (tmp_path / '.comments' / 'ignored.xml').write_text('') + (tmp_path / 'Cerberus' / '.comments').mkdir(parents=True) + (tmp_path / 'Cerberus' / '.comments' / '76. Two-headeds.PNG.xml').write_text('') (tmp_path / '.env').write_text('SECRET=ignored') (tmp_path / '.venv').mkdir() (tmp_path / '.venv' / 'ignored.py').write_text('ignored') @@ -261,6 +263,7 @@ def test_default_ignore_patterns_skip_common_generated_files(tmp_path): patterns = load_ignore_patterns(tmp_path) assert is_ignored('.comments/comment.xml', patterns) + assert is_ignored('Cerberus/.comments/76. Two-headeds.PNG.xml', patterns) assert is_ignored('.env', patterns) assert is_ignored('.env.local', patterns) assert is_ignored('.venv/bin/python', patterns)