dirsql 0.4.84__tar.gz → 0.4.85__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dirsql-0.4.84 → dirsql-0.4.85}/Cargo.lock +2 -2
- {dirsql-0.4.84 → dirsql-0.4.85}/PKG-INFO +1 -1
- {dirsql-0.4.84/packages/rust → dirsql-0.4.85}/docs/reference/http-api.md +1 -1
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/Cargo.toml +1 -1
- dirsql-0.4.85/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +3 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/http-api.md +1 -1
- dirsql-0.4.85/packages/python/e2e-attestations/bot-1398-inotify-error.json +7 -0
- dirsql-0.4.85/packages/python/e2e-attestations/bot-1407-child-place-depth.json +7 -0
- dirsql-0.4.85/packages/python/e2e-attestations/claude-1258-one-pattern.json +7 -0
- dirsql-0.4.85/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +7 -0
- dirsql-0.4.85/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +28 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/Cargo.toml +1 -1
- {dirsql-0.4.84 → dirsql-0.4.85/packages/rust}/docs/reference/http-api.md +1 -1
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/router.rs +19 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/server.rs +39 -11
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/lib.rs +9 -4
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/matcher.rs +3 -2
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/scanner.rs +29 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/vtab_scaffold.rs +1 -1
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/watcher.rs +74 -2
- {dirsql-0.4.84 → dirsql-0.4.85}/Cargo.toml +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/README.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/__init__.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/_async.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/_dirsql.pyi +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/__init__.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/__init__.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/main.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/resolve_config_extensions.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/plan_entry_path.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/py.typed +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/read_config.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/resolve_configs_extension_specs.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/resolve_extension.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/resolve_package.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/AGENTS.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/context/.gitattributes +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/context/recipes.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/context/usage.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/explanation.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/getting-started.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/embed.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/persist.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/query-json.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/index.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/package.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/plugins.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/cli.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/columns.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/hooks.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/sdk.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/CHANGELOG.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/MIGRATIONS.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/README.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/README.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/conftest.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/AGENTS.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/context/.gitattributes +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/context/recipes.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/context/usage.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/explanation.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/getting-started.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/embed.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/persist.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/query-json.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/index.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/package.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/plugins.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/cli.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/columns.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/hooks.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/sdk.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/README.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/src/lib.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/testing-conventions.toml +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/e2e/speed_of_light.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/integration/binding/__init__.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/integration/hermetic/__init__.py +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/CHANGELOG.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/MIGRATIONS.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/README.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/context/.gitattributes +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/context/recipes.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/context/usage.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/explanation.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/getting-started.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/embed.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/persist.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/query-json.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/index.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/plugins.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/cli.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/columns.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/config.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/hooks.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/sdk.md +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/brace.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/context.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/execute.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/init.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/mod.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/repl.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/run.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/table.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/command.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/config.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/db.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/default_config.toml +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/extension_resolution.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/functions.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/infer.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/launcher.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/listing.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/on_file.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/parsed_vtab.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/path_table.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/persist.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/posix_class.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/progress.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/row_event_flat.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/sql_literal.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/tree_walk.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/vtab.rs +0 -0
- {dirsql-0.4.84 → dirsql-0.4.85}/pyproject.toml +0 -0
|
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
|
|
|
552
552
|
|
|
553
553
|
[[package]]
|
|
554
554
|
name = "dirsql"
|
|
555
|
-
version = "0.4.
|
|
555
|
+
version = "0.4.85"
|
|
556
556
|
dependencies = [
|
|
557
557
|
"assert_cmd",
|
|
558
558
|
"axum",
|
|
@@ -602,7 +602,7 @@ dependencies = [
|
|
|
602
602
|
|
|
603
603
|
[[package]]
|
|
604
604
|
name = "dirsql-py-ext"
|
|
605
|
-
version = "0.4.
|
|
605
|
+
version = "0.4.85"
|
|
606
606
|
dependencies = [
|
|
607
607
|
"dirsql",
|
|
608
608
|
"pyo3",
|
|
@@ -112,4 +112,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
|
|
|
112
112
|
|---|---|
|
|
113
113
|
| `200` | Stream opened (`text/event-stream`). |
|
|
114
114
|
| `405` | `POST /events`. Plain-text body `method not allowed`. |
|
|
115
|
-
| `503` | The server is in [degraded mode](./cli.md#degraded-mode). JSON `{"error": …}` body. |
|
|
115
|
+
| `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
|
|
@@ -4,7 +4,7 @@ name = "dirsql-py-ext"
|
|
|
4
4
|
# pypi/maturin handler can rewrite it via `write-version` before
|
|
5
5
|
# `maturin build`. `pyproject.toml` declares `dynamic = ["version"]`
|
|
6
6
|
# and maturin reads this field. Mirrors `packages/rust/Cargo.toml`.
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.85"
|
|
8
8
|
# abi3 note: the `abi3-py310` pyo3 feature (below) builds ONE stable-ABI
|
|
9
9
|
# `cp310-abi3` wheel per platform that loads on every CPython >= 3.10
|
|
10
10
|
# (matching `pyproject.toml`'s `requires-python = ">=3.10"`), instead of
|
|
@@ -112,4 +112,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
|
|
|
112
112
|
|---|---|
|
|
113
113
|
| `200` | Stream opened (`text/event-stream`). |
|
|
114
114
|
| `405` | `POST /events`. Plain-text body `method not allowed`. |
|
|
115
|
-
| `503` | The server is in [degraded mode](./cli.md#degraded-mode). JSON `{"error": …}` body. |
|
|
115
|
+
| `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/capture_collision_test.py tests/e2e/declared_table_name_test.py tests/e2e/extension_package_test.py tests/e2e/query_contract_test.py tests/e2e/plugin_discovery_test.py tests/e2e/sigint_interrupt_test.py tests/e2e/fanout_test.py tests/e2e/use_case_transcripts_test.py tests/e2e/plugin_extension_discovery_test.py -x -q",
|
|
3
|
+
"ran_at": 1791301900,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "14d2a11edd69bb0715bbffdb085b1d6582728dd8",
|
|
6
|
+
"branch": "claude/1258-one-pattern"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/query_contract_test.py tests/e2e/declared_table_name_test.py tests/e2e/fanout_test.py -x -q",
|
|
3
|
+
"ran_at": 1791310416,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "bcedde49401cf6f9cc01deb2d95af1d1e907f0f7",
|
|
6
|
+
"branch": "claude/1330-vtab-prefetch-flag"
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
### Config table globs share the path-table glob compiler
|
|
2
|
+
|
|
3
|
+
#### Summary
|
|
4
|
+
|
|
5
|
+
A declared `[[table]] glob` is now compiled by the same compiler as a
|
|
6
|
+
path-table. A brace range such as `f{1..3}.md` expands as in bash instead of
|
|
7
|
+
matching nothing. Nothing else changes.
|
|
8
|
+
|
|
9
|
+
#### Required changes
|
|
10
|
+
|
|
11
|
+
_None._
|
|
12
|
+
|
|
13
|
+
#### Deprecations removed
|
|
14
|
+
|
|
15
|
+
_None._
|
|
16
|
+
|
|
17
|
+
#### Behavior changes without code changes
|
|
18
|
+
|
|
19
|
+
- `glob = "f{1..3}.md"` matches `f1.md`, `f2.md` and `f3.md`.
|
|
20
|
+
|
|
21
|
+
#### Verification
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
cd "$(mktemp -d)"
|
|
25
|
+
touch f1.md f2.md f3.md f4.md
|
|
26
|
+
dirsql query "SELECT path FROM './f{1..3}.md' ORDER BY path"
|
|
27
|
+
# expected: [{"path":"f1.md"},{"path":"f2.md"},{"path":"f3.md"}]
|
|
28
|
+
```
|
|
@@ -6,7 +6,7 @@ description = "Ephemeral SQL index over a local directory"
|
|
|
6
6
|
# version stays for the binding crates (publish = false). The literal
|
|
7
7
|
# intentionally lags the published version: putitoutthere rewrites it to
|
|
8
8
|
# the planned release version at build time and never commits it back.
|
|
9
|
-
version = "0.4.
|
|
9
|
+
version = "0.4.85"
|
|
10
10
|
edition.workspace = true
|
|
11
11
|
# Literal `license` (not `license.workspace = true`) because
|
|
12
12
|
# putitoutthere's preflight check reads `[package].license` directly
|
|
@@ -112,4 +112,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
|
|
|
112
112
|
|---|---|
|
|
113
113
|
| `200` | Stream opened (`text/event-stream`). |
|
|
114
114
|
| `405` | `POST /events`. Plain-text body `method not allowed`. |
|
|
115
|
-
| `503` | The server is in [degraded mode](./cli.md#degraded-mode). JSON `{"error": …}` body. |
|
|
115
|
+
| `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
|
|
@@ -26,6 +26,7 @@ use super::execute::{QueryFailure, execute_query, require_ready};
|
|
|
26
26
|
pub(super) struct AppContext {
|
|
27
27
|
pub state: AppState,
|
|
28
28
|
pub events: broadcast::Sender<String>,
|
|
29
|
+
pub watch_failure: Option<String>,
|
|
29
30
|
pub cancel: watch::Receiver<bool>,
|
|
30
31
|
pub query_timeout: Duration,
|
|
31
32
|
}
|
|
@@ -72,6 +73,9 @@ async fn handle_events(State(ctx): State<SharedCtx>) -> Response {
|
|
|
72
73
|
if let Err(failure) = require_ready(&ctx.state) {
|
|
73
74
|
return failure_response(&failure);
|
|
74
75
|
}
|
|
76
|
+
if let Some(reason) = &ctx.watch_failure {
|
|
77
|
+
return failure_response(&QueryFailure::Unavailable(reason.clone()));
|
|
78
|
+
}
|
|
75
79
|
|
|
76
80
|
// Subscribe BEFORE anything that might block so we don't drop events
|
|
77
81
|
// that fire between subscribing and the first poll.
|
|
@@ -163,6 +167,21 @@ mod tests {
|
|
|
163
167
|
);
|
|
164
168
|
}
|
|
165
169
|
|
|
170
|
+
#[tokio::test]
|
|
171
|
+
async fn events_return_503_while_the_server_is_unavailable() {
|
|
172
|
+
let (events, _) = broadcast::channel::<String>(1);
|
|
173
|
+
let (_cancel_tx, cancel) = watch::channel(false);
|
|
174
|
+
let ctx = Arc::new(AppContext {
|
|
175
|
+
state: AppState::Unavailable("config failed to load".into()),
|
|
176
|
+
events,
|
|
177
|
+
watch_failure: None,
|
|
178
|
+
cancel,
|
|
179
|
+
query_timeout: Duration::from_secs(1),
|
|
180
|
+
});
|
|
181
|
+
let resp = handle_events(State(ctx)).await;
|
|
182
|
+
assert_eq!(resp.status(), StatusCode::SERVICE_UNAVAILABLE);
|
|
183
|
+
}
|
|
184
|
+
|
|
166
185
|
#[test]
|
|
167
186
|
fn error_response_sets_json_content_type() {
|
|
168
187
|
let resp = error_response(StatusCode::BAD_REQUEST, "boom");
|
|
@@ -38,14 +38,16 @@ pub async fn serve_with_state(
|
|
|
38
38
|
// the underlying notify watcher (which `DirSQL::watch` only permits
|
|
39
39
|
// once per instance).
|
|
40
40
|
let (event_tx, _) = broadcast::channel::<String>(256);
|
|
41
|
-
|
|
42
|
-
start_watch_task(db.clone(), event_tx.clone())
|
|
43
|
-
|
|
41
|
+
let watch_failure = match state {
|
|
42
|
+
AppState::Ready(ref db) => start_watch_task(db.clone(), event_tx.clone()),
|
|
43
|
+
AppState::Unavailable(_) => None,
|
|
44
|
+
};
|
|
44
45
|
|
|
45
46
|
let (cancel_tx, cancel_rx) = watch::channel(false);
|
|
46
47
|
let shared = Arc::new(AppContext {
|
|
47
48
|
state,
|
|
48
49
|
events: event_tx,
|
|
50
|
+
watch_failure,
|
|
49
51
|
cancel: cancel_rx,
|
|
50
52
|
query_timeout: config.query_timeout,
|
|
51
53
|
});
|
|
@@ -69,18 +71,20 @@ pub async fn serve_with_state(
|
|
|
69
71
|
})
|
|
70
72
|
}
|
|
71
73
|
|
|
72
|
-
|
|
74
|
+
/// Returns the reason `/events` must refuse requests when the watcher
|
|
75
|
+
/// could not attach.
|
|
76
|
+
fn start_watch_task(db: DirSQL, tx: broadcast::Sender<String>) -> Option<String> {
|
|
73
77
|
// `db.watch()` spawns its own OS thread and returns an async stream.
|
|
74
78
|
// We pump the stream into the broadcast channel. If no subscribers
|
|
75
79
|
// exist, send() errors but we keep pumping (future subscribers
|
|
76
80
|
// will get subsequent events).
|
|
77
|
-
let
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
let mut stream = match db.watch() {
|
|
82
|
+
Ok(stream) => stream,
|
|
83
|
+
Err(err) => {
|
|
84
|
+
let reason = format!("filesystem watcher failed to start: {err}");
|
|
85
|
+
eprintln!("dirsql: {reason}; /events will return 503");
|
|
86
|
+
return Some(reason);
|
|
87
|
+
}
|
|
84
88
|
};
|
|
85
89
|
tokio::spawn(async move {
|
|
86
90
|
while let Some(event) = stream.next().await {
|
|
@@ -88,6 +92,7 @@ fn start_watch_task(db: DirSQL, tx: broadcast::Sender<String>) {
|
|
|
88
92
|
let _ = tx.send(payload);
|
|
89
93
|
}
|
|
90
94
|
});
|
|
95
|
+
None
|
|
91
96
|
}
|
|
92
97
|
|
|
93
98
|
#[cfg(test)]
|
|
@@ -122,6 +127,29 @@ mod tests {
|
|
|
122
127
|
handle.shutdown().await.expect("graceful shutdown");
|
|
123
128
|
}
|
|
124
129
|
|
|
130
|
+
#[tokio::test]
|
|
131
|
+
async fn start_watch_task_reports_no_failure_once_the_watcher_attaches() {
|
|
132
|
+
let dir = tempfile::tempdir().unwrap();
|
|
133
|
+
let db = DirSQL::new(dir.path(), Vec::new()).unwrap();
|
|
134
|
+
let (tx, _) = broadcast::channel::<String>(1);
|
|
135
|
+
assert_eq!(start_watch_task(db, tx), None);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// `poll_events` locks out `watch`, the one deterministic way to make the
|
|
139
|
+
// watcher refuse to attach without exhausting inotify.
|
|
140
|
+
#[tokio::test]
|
|
141
|
+
async fn start_watch_task_returns_the_reason_when_the_watcher_cannot_attach() {
|
|
142
|
+
let dir = tempfile::tempdir().unwrap();
|
|
143
|
+
let db = DirSQL::new(dir.path(), Vec::new()).unwrap();
|
|
144
|
+
db.poll_events(std::time::Duration::ZERO).unwrap();
|
|
145
|
+
let (tx, _) = broadcast::channel::<String>(1);
|
|
146
|
+
let reason = start_watch_task(db, tx).expect("watch() must fail");
|
|
147
|
+
assert!(
|
|
148
|
+
reason.starts_with("filesystem watcher failed to start: "),
|
|
149
|
+
"got: {reason}"
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
125
153
|
// Binding to a non-local TEST-NET address (RFC 5737) fails with
|
|
126
154
|
// "cannot assign requested address", surfacing `ServerError::Bind` rather
|
|
127
155
|
// than panicking — deterministic and DNS-free.
|
|
@@ -224,9 +224,9 @@ impl DirSqlError {
|
|
|
224
224
|
DirSqlError::Lock(e.to_string())
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
-
fn watch
|
|
227
|
+
fn watch(e: notify::Error) -> Self {
|
|
228
228
|
DirSqlError::Watch {
|
|
229
|
-
message: e
|
|
229
|
+
message: watcher::describe_watch_error(&e, cfg!(target_os = "linux")),
|
|
230
230
|
source: Some(Box::new(e)),
|
|
231
231
|
}
|
|
232
232
|
}
|
|
@@ -2527,6 +2527,11 @@ struct AsyncDirSqlInner {
|
|
|
2527
2527
|
ready_notify: tokio::sync::Notify,
|
|
2528
2528
|
}
|
|
2529
2529
|
|
|
2530
|
+
#[cfg(test)]
|
|
2531
|
+
fn generic_watch_error(message: &str) -> notify::Error {
|
|
2532
|
+
notify::Error::generic(message)
|
|
2533
|
+
}
|
|
2534
|
+
|
|
2530
2535
|
#[cfg(test)]
|
|
2531
2536
|
impl AsyncDirSqlInner {
|
|
2532
2537
|
/// Fresh inner with an empty `db` cell — the pre-`ready` state.
|
|
@@ -2681,10 +2686,10 @@ mod readonly_tests {
|
|
|
2681
2686
|
DirSqlError::lock("x").to_string(),
|
|
2682
2687
|
"failed to lock shared state: x"
|
|
2683
2688
|
);
|
|
2684
|
-
// `watch`, `config`, `matcher` wrap a typed
|
|
2689
|
+
// `watch`, `config`, `matcher` wrap a typed error to preserve a
|
|
2685
2690
|
// `source()` chain.
|
|
2686
2691
|
let io = || std::io::Error::other("x");
|
|
2687
|
-
let watch_err = DirSqlError::watch(
|
|
2692
|
+
let watch_err = DirSqlError::watch(generic_watch_error("x"));
|
|
2688
2693
|
assert_eq!(watch_err.to_string(), "watcher error: x");
|
|
2689
2694
|
assert!(StdError::source(&watch_err).is_some());
|
|
2690
2695
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
use crate::posix_class::expand_posix_classes;
|
|
2
|
+
use crate::scanner::{PathGlob, compile_glob};
|
|
2
3
|
use globset::GlobBuilder;
|
|
3
4
|
use regex::{Regex, RegexBuilder};
|
|
4
5
|
use std::path::Path;
|
|
@@ -81,7 +82,7 @@ pub struct MatchResult {
|
|
|
81
82
|
/// A compiled glob pattern. `{name}` placeholders are rewritten to `*` before
|
|
82
83
|
/// compilation, so they are pure match wildcards.
|
|
83
84
|
struct PatternEntry {
|
|
84
|
-
pattern:
|
|
85
|
+
pattern: PathGlob,
|
|
85
86
|
table_name: String,
|
|
86
87
|
}
|
|
87
88
|
|
|
@@ -161,7 +162,7 @@ impl TableMatcher {
|
|
|
161
162
|
let mut entries = Vec::new();
|
|
162
163
|
for (pattern, table_name) in mappings {
|
|
163
164
|
entries.push(PatternEntry {
|
|
164
|
-
pattern:
|
|
165
|
+
pattern: compile_glob(&glob_with_placeholders_as_star(pattern))?,
|
|
165
166
|
table_name: table_name.to_string(),
|
|
166
167
|
});
|
|
167
168
|
}
|
|
@@ -921,6 +921,35 @@ mod tests {
|
|
|
921
921
|
);
|
|
922
922
|
}
|
|
923
923
|
|
|
924
|
+
fn explored_dirs(place: Place<'_>) -> Vec<Place<'_>> {
|
|
925
|
+
place
|
|
926
|
+
.explore(&|_| true)
|
|
927
|
+
.into_iter()
|
|
928
|
+
.filter_map(|step| match step {
|
|
929
|
+
Step::Dir(child) => Some(*child),
|
|
930
|
+
Step::Leaf(_) => None,
|
|
931
|
+
})
|
|
932
|
+
.collect()
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
#[test]
|
|
936
|
+
fn explore_enters_a_dirsql_directory_below_the_top_level() {
|
|
937
|
+
let root = tempfile::tempdir().unwrap();
|
|
938
|
+
fs::create_dir_all(root.path().join("a").join(RESERVED_DIR)).unwrap();
|
|
939
|
+
let ignore = TableMatcher::new(&[], &[]).unwrap();
|
|
940
|
+
let top = Place {
|
|
941
|
+
walk: walk_with(&ignore, None, Vec::new()),
|
|
942
|
+
dir: root.path().to_path_buf(),
|
|
943
|
+
rel: PathBuf::new(),
|
|
944
|
+
depth: 0,
|
|
945
|
+
states: Vec::new(),
|
|
946
|
+
linked: false,
|
|
947
|
+
};
|
|
948
|
+
let [a] = <[Place<'_>; 1]>::try_from(explored_dirs(top)).ok().unwrap();
|
|
949
|
+
let nested: Vec<PathBuf> = explored_dirs(a).into_iter().map(|p| p.rel).collect();
|
|
950
|
+
assert_eq!(nested, vec![Path::new("a").join(RESERVED_DIR)]);
|
|
951
|
+
}
|
|
952
|
+
|
|
924
953
|
#[test]
|
|
925
954
|
fn is_reserved_dir_matches_top_level_dirsql() {
|
|
926
955
|
assert!(is_reserved_dir(1, true, OsStr::new(RESERVED_DIR)));
|
|
@@ -331,7 +331,7 @@ fn lookup_cost(prefetch: bool) -> f64 {
|
|
|
331
331
|
fn plan_idx_num(lookup: Option<usize>, prefetch: bool) -> c_int {
|
|
332
332
|
let lookup = lookup.map_or(SCAN_IDX, lookup_idx_num);
|
|
333
333
|
if prefetch {
|
|
334
|
-
lookup
|
|
334
|
+
lookup + PREFETCH_IDX
|
|
335
335
|
} else {
|
|
336
336
|
lookup
|
|
337
337
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
use notify::event::{ModifyKind, RenameMode};
|
|
2
2
|
use notify::{
|
|
3
|
-
Config, Event, EventKind, RecommendedWatcher, RecursiveMode,
|
|
3
|
+
Config, ErrorKind, Event, EventKind, RecommendedWatcher, RecursiveMode,
|
|
4
|
+
Watcher as NotifyWatcher,
|
|
4
5
|
};
|
|
5
6
|
use std::path::{Path, PathBuf};
|
|
6
7
|
use std::sync::mpsc;
|
|
7
8
|
use std::time::Duration;
|
|
8
9
|
|
|
10
|
+
const EMFILE: i32 = 24;
|
|
11
|
+
|
|
9
12
|
/// Events emitted by the file watcher.
|
|
10
13
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
11
14
|
pub enum FileEvent {
|
|
@@ -74,6 +77,25 @@ impl Watcher {
|
|
|
74
77
|
}
|
|
75
78
|
}
|
|
76
79
|
|
|
80
|
+
/// The message for a watcher that failed to start. On inotify, the opaque
|
|
81
|
+
/// limit errors name the exhausted limit and the sysctl that raises it.
|
|
82
|
+
pub(crate) fn describe_watch_error(err: ¬ify::Error, inotify: bool) -> String {
|
|
83
|
+
let base = err.to_string();
|
|
84
|
+
if !inotify {
|
|
85
|
+
return base;
|
|
86
|
+
}
|
|
87
|
+
let (limit, sysctl) = match &err.kind {
|
|
88
|
+
ErrorKind::Io(io) if io.raw_os_error() == Some(EMFILE) => {
|
|
89
|
+
("inotify instance limit", "fs.inotify.max_user_instances")
|
|
90
|
+
}
|
|
91
|
+
ErrorKind::MaxFilesWatch => ("inotify watch limit", "fs.inotify.max_user_watches"),
|
|
92
|
+
_ => return base,
|
|
93
|
+
};
|
|
94
|
+
format!(
|
|
95
|
+
"{base}; the {limit} is likely exhausted: raise it with `sudo sysctl {sysctl}=<higher value>`"
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
77
99
|
/// Translate a notify Event into zero or more FileEvents.
|
|
78
100
|
fn translate_event(event: &Event) -> Vec<FileEvent> {
|
|
79
101
|
let mut results = Vec::new();
|
|
@@ -106,7 +128,7 @@ fn translate_event(event: &Event) -> Vec<FileEvent> {
|
|
|
106
128
|
results
|
|
107
129
|
}
|
|
108
130
|
|
|
109
|
-
// Test fixtures: build `notify::Event`s without the unit tests naming the
|
|
131
|
+
// Test fixtures: build `notify::Event`s and `notify::Error`s without the unit tests naming the
|
|
110
132
|
// `notify::event::*` inner-kind types (the unit-lint isolation rule).
|
|
111
133
|
// `translate_event` matches only the outer variant, so the inner kind is an
|
|
112
134
|
// arbitrary valid value.
|
|
@@ -192,6 +214,21 @@ fn access_event(paths: Vec<PathBuf>) -> Event {
|
|
|
192
214
|
}
|
|
193
215
|
}
|
|
194
216
|
|
|
217
|
+
#[cfg(test)]
|
|
218
|
+
fn io_error(raw_os_error: i32) -> notify::Error {
|
|
219
|
+
notify::Error::io(std::io::Error::from_raw_os_error(raw_os_error))
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
#[cfg(test)]
|
|
223
|
+
fn max_files_watch_error() -> notify::Error {
|
|
224
|
+
notify::Error::new(ErrorKind::MaxFilesWatch)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
#[cfg(test)]
|
|
228
|
+
fn path_not_found_error() -> notify::Error {
|
|
229
|
+
notify::Error::path_not_found()
|
|
230
|
+
}
|
|
231
|
+
|
|
195
232
|
#[cfg(test)]
|
|
196
233
|
mod tests {
|
|
197
234
|
use super::*;
|
|
@@ -200,6 +237,41 @@ mod tests {
|
|
|
200
237
|
// `tests/watcher.rs` (unit-lint isolation); only the pure
|
|
201
238
|
// `translate_event` mapping tests belong here.
|
|
202
239
|
|
|
240
|
+
#[test]
|
|
241
|
+
fn describe_watch_error_names_the_instance_limit_for_emfile_on_inotify() {
|
|
242
|
+
let err = io_error(24);
|
|
243
|
+
let msg = describe_watch_error(&err, true);
|
|
244
|
+
assert!(msg.starts_with(&err.to_string()), "{msg}");
|
|
245
|
+
assert!(msg.contains("inotify instance limit"), "{msg}");
|
|
246
|
+
assert!(msg.contains("fs.inotify.max_user_instances"), "{msg}");
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
#[test]
|
|
250
|
+
fn describe_watch_error_names_the_watch_limit_for_max_files_watch_on_inotify() {
|
|
251
|
+
let err = max_files_watch_error();
|
|
252
|
+
let msg = describe_watch_error(&err, true);
|
|
253
|
+
assert!(msg.starts_with(&err.to_string()), "{msg}");
|
|
254
|
+
assert!(msg.contains("inotify watch limit"), "{msg}");
|
|
255
|
+
assert!(msg.contains("fs.inotify.max_user_watches"), "{msg}");
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
#[test]
|
|
259
|
+
fn describe_watch_error_leaves_emfile_alone_off_inotify() {
|
|
260
|
+
let err = io_error(24);
|
|
261
|
+
assert_eq!(describe_watch_error(&err, false), err.to_string());
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
#[test]
|
|
265
|
+
fn describe_watch_error_leaves_other_errors_alone() {
|
|
266
|
+
let other_io = io_error(2);
|
|
267
|
+
assert_eq!(describe_watch_error(&other_io, true), other_io.to_string());
|
|
268
|
+
let not_found = path_not_found_error();
|
|
269
|
+
assert_eq!(
|
|
270
|
+
describe_watch_error(¬_found, true),
|
|
271
|
+
not_found.to_string()
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
203
275
|
#[test]
|
|
204
276
|
fn translate_event_maps_create() {
|
|
205
277
|
let results = translate_event(&create_event(vec![PathBuf::from("/tmp/test.txt")]));
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|