dirsql 0.4.106__tar.gz → 0.4.108__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.106 → dirsql-0.4.108}/Cargo.lock +2 -2
- {dirsql-0.4.106 → dirsql-0.4.108}/PKG-INFO +1 -1
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/react-to-changes.md +2 -1
- {dirsql-0.4.106/packages/rust → dirsql-0.4.108}/docs/reference/http-api.md +1 -1
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/reference/sdk.md +4 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/Cargo.toml +1 -1
- dirsql-0.4.108/packages/python/changelog.d/2026-10-08-watch-requires-named-table.md +1 -0
- {dirsql-0.4.106/packages/rust → dirsql-0.4.108/packages/python}/docs/howto/react-to-changes.md +2 -1
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/reference/http-api.md +1 -1
- {dirsql-0.4.106/packages/rust → dirsql-0.4.108/packages/python}/docs/reference/sdk.md +4 -0
- dirsql-0.4.108/packages/python/e2e-attestations/bot-1406-watch-no-tables-1008.json +7 -0
- dirsql-0.4.108/packages/python/e2e-attestations/bot-1461-row-footprint-1008.json +7 -0
- dirsql-0.4.108/packages/python/migrations.d/2026-10-08-watch-requires-named-table.md +23 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/Cargo.toml +1 -1
- {dirsql-0.4.106/packages/python → dirsql-0.4.108/packages/rust}/docs/howto/react-to-changes.md +2 -1
- {dirsql-0.4.106 → dirsql-0.4.108/packages/rust}/docs/reference/http-api.md +1 -1
- {dirsql-0.4.106/packages/python → dirsql-0.4.108/packages/rust}/docs/reference/sdk.md +4 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/server.rs +25 -3
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/lib.rs +82 -42
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/vtab.rs +56 -25
- {dirsql-0.4.106 → dirsql-0.4.108}/Cargo.toml +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/README.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/__init__.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/_async.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/_dirsql.pyi +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/cli/__init__.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/cli/discover_plugins/__init__.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/cli/main.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/cli/resolve_config_extensions.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/plan_entry_path.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/py.typed +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/read_config.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/resolve_configs_extension_specs.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/resolve_extension.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/dirsql/resolve_package.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/AGENTS.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/context/.gitattributes +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/context/recipes.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/context/usage.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/explanation.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/getting-started.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/embed.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/persist.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/query-json.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/index.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/package.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/plugins.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/reference/cli.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/reference/columns.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/reference/config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/reference/glob.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/reference/hooks.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/CHANGELOG.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/MIGRATIONS.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/README.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/changelog.d/README.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/conftest.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/AGENTS.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/context/.gitattributes +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/context/recipes.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/context/usage.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/explanation.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/getting-started.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/embed.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/persist.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/query-json.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/index.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/package.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/plugins.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/reference/cli.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/reference/columns.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/reference/config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/reference/glob.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/reference/hooks.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1421-posix-unicode.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1426-walk-spawn-threshold-1008.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1428-ndjson-hooks.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1429-parallel-hooks.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1430-dotdot-as-written.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1448-wildcard-ignored-prefix.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1451-named-dir-never-hidden.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1454-split-few-files.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1457-incremental-refresh-1008.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-1459-rescan-on-overflow-1008.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/migrations.d/README.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/src/lib.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/testing-conventions.toml +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/tests/e2e/speed_of_light.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/tests/integration/binding/__init__.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/python/tests/integration/hermetic/__init__.py +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/CHANGELOG.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/MIGRATIONS.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/README.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/context/.gitattributes +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/context/recipes.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/context/usage.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/explanation.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/getting-started.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/embed.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/persist.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/query-json.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/index.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/plugins.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/reference/cli.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/reference/columns.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/reference/config.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/reference/glob.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/reference/hooks.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/brace.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/context.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/execute.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/init.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/mod.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/repl.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/router.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/run.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/cli/table.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/command.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/config.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/db.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/default_config.toml +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/extension_resolution.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/functions.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/infer.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/launcher.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/listing.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/matcher.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/on_file.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/parsed_vtab.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/path_table.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/persist.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/posix_class.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/progress.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/row_event_flat.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/scanner.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/sql_literal.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/tree_walk.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/vtab_scaffold.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/packages/rust/src/watcher.rs +0 -0
- {dirsql-0.4.106 → dirsql-0.4.108}/pyproject.toml +0 -0
|
@@ -573,7 +573,7 @@ dependencies = [
|
|
|
573
573
|
|
|
574
574
|
[[package]]
|
|
575
575
|
name = "dirsql"
|
|
576
|
-
version = "0.4.
|
|
576
|
+
version = "0.4.108"
|
|
577
577
|
dependencies = [
|
|
578
578
|
"assert_cmd",
|
|
579
579
|
"axum",
|
|
@@ -625,7 +625,7 @@ dependencies = [
|
|
|
625
625
|
|
|
626
626
|
[[package]]
|
|
627
627
|
name = "dirsql-py-ext"
|
|
628
|
-
version = "0.4.
|
|
628
|
+
version = "0.4.108"
|
|
629
629
|
dependencies = [
|
|
630
630
|
"dirsql",
|
|
631
631
|
"pyo3",
|
|
@@ -7,7 +7,8 @@ side.
|
|
|
7
7
|
|
|
8
8
|
Row events are emitted for **named tables**, so this flow needs a config —
|
|
9
9
|
[path-tables](../reference/path-tables.md) are scanned per query and are not
|
|
10
|
-
watched
|
|
10
|
+
watched, so `watch()` on an instance with no named tables raises an error and
|
|
11
|
+
`/events` returns `503`. Define one next to your files. A named table's columns are whatever
|
|
11
12
|
its [`on-file`](../reference/config.md#table) hook emits; here a minimal hook
|
|
12
13
|
prints each file's basename:
|
|
13
14
|
|
|
@@ -115,4 +115,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
|
|
|
115
115
|
|---|---|
|
|
116
116
|
| `200` | Stream opened (`text/event-stream`). |
|
|
117
117
|
| `405` | `POST /events`. Plain-text body `method not allowed`. |
|
|
118
|
-
| `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. |
|
|
118
|
+
| `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, or the instance has no named tables). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
|
|
@@ -301,6 +301,10 @@ under the root. The watcher starts on first iteration (Python/TypeScript)
|
|
|
301
301
|
or at the `watch()` call (Rust). The stream never terminates on its own;
|
|
302
302
|
stop consuming it to stop.
|
|
303
303
|
|
|
304
|
+
An instance with no named tables cannot be watched: path-tables emit no
|
|
305
|
+
watch events, so `watch()` (and the polling primitives) raise an error naming
|
|
306
|
+
that cause. Define a table first.
|
|
307
|
+
|
|
304
308
|
Python/TypeScript: each `watch()` call returns an independent stream, and every stream
|
|
305
309
|
on one instance receives every event observed after it was created, so
|
|
306
310
|
several consumers (one per client, say) can share one instance.
|
|
@@ -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.108"
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
**Changed** — `watch()` (and the polling primitives) on an instance with no named tables now fails immediately with `watching requires at least one named table: path-tables emit no watch events; define a table`, instead of starting a watcher that never yields. The `dirsql server` `/events` endpoint returns 503 with the same reason; `/query` is unaffected.
|
{dirsql-0.4.106/packages/rust → dirsql-0.4.108/packages/python}/docs/howto/react-to-changes.md
RENAMED
|
@@ -7,7 +7,8 @@ side.
|
|
|
7
7
|
|
|
8
8
|
Row events are emitted for **named tables**, so this flow needs a config —
|
|
9
9
|
[path-tables](../reference/path-tables.md) are scanned per query and are not
|
|
10
|
-
watched
|
|
10
|
+
watched, so `watch()` on an instance with no named tables raises an error and
|
|
11
|
+
`/events` returns `503`. Define one next to your files. A named table's columns are whatever
|
|
11
12
|
its [`on-file`](../reference/config.md#table) hook emits; here a minimal hook
|
|
12
13
|
prints each file's basename:
|
|
13
14
|
|
|
@@ -115,4 +115,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
|
|
|
115
115
|
|---|---|
|
|
116
116
|
| `200` | Stream opened (`text/event-stream`). |
|
|
117
117
|
| `405` | `POST /events`. Plain-text body `method not allowed`. |
|
|
118
|
-
| `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. |
|
|
118
|
+
| `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, or the instance has no named tables). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
|
|
@@ -301,6 +301,10 @@ under the root. The watcher starts on first iteration (Python/TypeScript)
|
|
|
301
301
|
or at the `watch()` call (Rust). The stream never terminates on its own;
|
|
302
302
|
stop consuming it to stop.
|
|
303
303
|
|
|
304
|
+
An instance with no named tables cannot be watched: path-tables emit no
|
|
305
|
+
watch events, so `watch()` (and the polling primitives) raise an error naming
|
|
306
|
+
that cause. Define a table first.
|
|
307
|
+
|
|
304
308
|
Python/TypeScript: each `watch()` call returns an independent stream, and every stream
|
|
305
309
|
on one instance receives every event observed after it was created, so
|
|
306
310
|
several consumers (one per client, say) can share one instance.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/server_speed_test.py tests/e2e/query_contract_test.py tests/e2e/sigint_interrupt_test.py tests/e2e/cli_version_test.py -x -q",
|
|
3
|
+
"ran_at": 1791474667,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "31f567c6cc0e5873a9bdc41df84e95a6722527f1",
|
|
6
|
+
"branch": "bot/1406-watch-no-tables-1008"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/query_contract_test.py tests/e2e/on_file_query_test.py tests/e2e/stat_speed_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/use_case_dossier_test.py -x -q",
|
|
3
|
+
"ran_at": 1791489188,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "fe75eb79358f5324a5af3395d1e2383e6233c98f",
|
|
6
|
+
"branch": "bot/1461-row-footprint-1008"
|
|
7
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
### `watch()` requires a named table
|
|
2
|
+
|
|
3
|
+
#### Summary
|
|
4
|
+
|
|
5
|
+
`watch()`, `poll_events()`/`pollEvents()` and `start_watching()`/`startWatcher()` on an instance with no named tables now raise an error naming the cause, rather than watching and silently yielding nothing. Path-tables emit no watch events. Instances with at least one named table are unaffected.
|
|
6
|
+
|
|
7
|
+
#### Required changes
|
|
8
|
+
|
|
9
|
+
| Before | After |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| `DirSQL(root).watch()` yields nothing forever | Define a table (programmatic or `[[table]]`), or stop calling `watch()` |
|
|
12
|
+
|
|
13
|
+
#### Deprecations removed
|
|
14
|
+
|
|
15
|
+
_None._
|
|
16
|
+
|
|
17
|
+
#### Behavior changes without code changes
|
|
18
|
+
|
|
19
|
+
A path-table-only instance that called `watch()` now gets an error. `dirsql server` with no tables returns 503 from `/events`.
|
|
20
|
+
|
|
21
|
+
#### Verification
|
|
22
|
+
|
|
23
|
+
Run `dirsql server -c <config with no [[table]]>` and `curl -i http://localhost:7117/events`; expect `503` naming "path-tables emit no watch events".
|
|
@@ -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.108"
|
|
10
10
|
edition.workspace = true
|
|
11
11
|
# Literal `license` (not `license.workspace = true`) because
|
|
12
12
|
# putitoutthere's preflight check reads `[package].license` directly
|
{dirsql-0.4.106/packages/python → dirsql-0.4.108/packages/rust}/docs/howto/react-to-changes.md
RENAMED
|
@@ -7,7 +7,8 @@ side.
|
|
|
7
7
|
|
|
8
8
|
Row events are emitted for **named tables**, so this flow needs a config —
|
|
9
9
|
[path-tables](../reference/path-tables.md) are scanned per query and are not
|
|
10
|
-
watched
|
|
10
|
+
watched, so `watch()` on an instance with no named tables raises an error and
|
|
11
|
+
`/events` returns `503`. Define one next to your files. A named table's columns are whatever
|
|
11
12
|
its [`on-file`](../reference/config.md#table) hook emits; here a minimal hook
|
|
12
13
|
prints each file's basename:
|
|
13
14
|
|
|
@@ -115,4 +115,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
|
|
|
115
115
|
|---|---|
|
|
116
116
|
| `200` | Stream opened (`text/event-stream`). |
|
|
117
117
|
| `405` | `POST /events`. Plain-text body `method not allowed`. |
|
|
118
|
-
| `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. |
|
|
118
|
+
| `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, or the instance has no named tables). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
|
|
@@ -301,6 +301,10 @@ under the root. The watcher starts on first iteration (Python/TypeScript)
|
|
|
301
301
|
or at the `watch()` call (Rust). The stream never terminates on its own;
|
|
302
302
|
stop consuming it to stop.
|
|
303
303
|
|
|
304
|
+
An instance with no named tables cannot be watched: path-tables emit no
|
|
305
|
+
watch events, so `watch()` (and the polling primitives) raise an error naming
|
|
306
|
+
that cause. Define a table first.
|
|
307
|
+
|
|
304
308
|
Python/TypeScript: each `watch()` call returns an independent stream, and every stream
|
|
305
309
|
on one instance receives every event observed after it was created, so
|
|
306
310
|
several consumers (one per client, say) can share one instance.
|
|
@@ -109,6 +109,16 @@ fn start_watch_task(db: DirSQL, tx: broadcast::Sender<String>) -> Option<String>
|
|
|
109
109
|
mod tests {
|
|
110
110
|
use super::*;
|
|
111
111
|
|
|
112
|
+
fn db_with_a_table(root: &std::path::Path) -> DirSQL {
|
|
113
|
+
let config = root.join("dirsql.toml");
|
|
114
|
+
std::fs::write(
|
|
115
|
+
&config,
|
|
116
|
+
"[[table]]\nname = \"t\"\nddl = \"CREATE TABLE t (x TEXT)\"\nglob = \"*.none\"\non-file = \"true\"\n",
|
|
117
|
+
)
|
|
118
|
+
.unwrap();
|
|
119
|
+
DirSQL::builder().root(root).config(config).build().unwrap()
|
|
120
|
+
}
|
|
121
|
+
|
|
112
122
|
// An `Unavailable` state needs no DB/filesystem, so the real bind /
|
|
113
123
|
// graceful-shutdown plumbing runs without standing up an index.
|
|
114
124
|
#[tokio::test]
|
|
@@ -130,7 +140,7 @@ mod tests {
|
|
|
130
140
|
#[tokio::test]
|
|
131
141
|
async fn serve_with_a_ready_db_attaches_the_watcher_then_shuts_down() {
|
|
132
142
|
let dir = tempfile::tempdir().unwrap();
|
|
133
|
-
let db =
|
|
143
|
+
let db = db_with_a_table(dir.path());
|
|
134
144
|
let config = ServerConfig::bind("127.0.0.1".to_string(), 0);
|
|
135
145
|
let handle = serve(config, db).await.expect("bind on an ephemeral port");
|
|
136
146
|
assert_ne!(handle.local_addr().port(), 0);
|
|
@@ -140,17 +150,29 @@ mod tests {
|
|
|
140
150
|
#[tokio::test]
|
|
141
151
|
async fn start_watch_task_reports_no_failure_once_the_watcher_attaches() {
|
|
142
152
|
let dir = tempfile::tempdir().unwrap();
|
|
143
|
-
let db =
|
|
153
|
+
let db = db_with_a_table(dir.path());
|
|
144
154
|
let (tx, _) = broadcast::channel::<String>(1);
|
|
145
155
|
assert_eq!(start_watch_task(db, tx), None);
|
|
146
156
|
}
|
|
147
157
|
|
|
158
|
+
#[tokio::test]
|
|
159
|
+
async fn start_watch_task_names_the_cause_without_named_tables() {
|
|
160
|
+
let dir = tempfile::tempdir().unwrap();
|
|
161
|
+
let db = DirSQL::new(dir.path(), Vec::new()).unwrap();
|
|
162
|
+
let (tx, _) = broadcast::channel::<String>(1);
|
|
163
|
+
let reason = start_watch_task(db, tx).expect("watch() must fail");
|
|
164
|
+
assert!(
|
|
165
|
+
reason.contains("path-tables emit no watch events"),
|
|
166
|
+
"got: {reason}"
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
148
170
|
// `poll_events` locks out `watch`, the one deterministic way to make the
|
|
149
171
|
// watcher refuse to attach without exhausting inotify.
|
|
150
172
|
#[tokio::test]
|
|
151
173
|
async fn start_watch_task_returns_the_reason_when_the_watcher_cannot_attach() {
|
|
152
174
|
let dir = tempfile::tempdir().unwrap();
|
|
153
|
-
let db =
|
|
175
|
+
let db = db_with_a_table(dir.path());
|
|
154
176
|
db.poll_events(std::time::Duration::ZERO).unwrap();
|
|
155
177
|
let (tx, _) = broadcast::channel::<String>(1);
|
|
156
178
|
let reason = start_watch_task(db, tx).expect("watch() must fail");
|
|
@@ -407,13 +407,6 @@ impl Table {
|
|
|
407
407
|
struct DirSqlInner {
|
|
408
408
|
db: Mutex<Db>,
|
|
409
409
|
root: PathBuf,
|
|
410
|
-
/// Canonicalized `root`, used **only** for the live filesystem watcher:
|
|
411
|
-
/// `notify` misbehaves on relative paths (it may deliver no events, or
|
|
412
|
-
/// deliver them under the cwd-joined path so the relative prefix no
|
|
413
|
-
/// longer strips). Literal fallback when canonicalization fails (e.g. a
|
|
414
|
-
/// not-yet-created root); the user's `root` — and therefore the initial
|
|
415
|
-
/// scan and the `path` column — stays byte-for-byte unchanged.
|
|
416
|
-
watch_root: PathBuf,
|
|
417
410
|
/// One entry per distinct table anchor; each holds the matcher for the
|
|
418
411
|
/// tables anchored there.
|
|
419
412
|
groups: Vec<AnchorGroup>,
|
|
@@ -437,13 +430,7 @@ struct DirSqlInner {
|
|
|
437
430
|
fs: Arc<dyn FileSystem>,
|
|
438
431
|
}
|
|
439
432
|
|
|
440
|
-
fn watch_scopes(
|
|
441
|
-
if groups.is_empty() {
|
|
442
|
-
return vec![WatchScope {
|
|
443
|
-
root: index_root.to_path_buf(),
|
|
444
|
-
ignore: TableMatcher::new(&[], &[]).expect("no patterns to compile"),
|
|
445
|
-
}];
|
|
446
|
-
}
|
|
433
|
+
fn watch_scopes(groups: &[AnchorGroup]) -> Vec<WatchScope> {
|
|
447
434
|
groups
|
|
448
435
|
.iter()
|
|
449
436
|
.map(|group| WatchScope {
|
|
@@ -456,8 +443,11 @@ fn watch_scopes(index_root: &Path, groups: &[AnchorGroup]) -> Vec<WatchScope> {
|
|
|
456
443
|
/// The tables sharing one anchor, matched against paths relative to it.
|
|
457
444
|
struct AnchorGroup {
|
|
458
445
|
anchor: PathBuf,
|
|
459
|
-
/// `anchor` canonicalized for the live watcher
|
|
460
|
-
///
|
|
446
|
+
/// `anchor` canonicalized for the live watcher only: `notify` misbehaves
|
|
447
|
+
/// on relative paths (it may deliver no events, or deliver them under the
|
|
448
|
+
/// cwd-joined path so the relative prefix no longer strips). Literal
|
|
449
|
+
/// fallback when canonicalization fails; `anchor` and the `path` column
|
|
450
|
+
/// stay byte-for-byte as supplied.
|
|
461
451
|
watch_anchor: PathBuf,
|
|
462
452
|
matcher: TableMatcher,
|
|
463
453
|
tables: Vec<String>,
|
|
@@ -585,6 +575,7 @@ impl DirSQL {
|
|
|
585
575
|
/// no-ops. Called implicitly by [`poll_events`](Self::poll_events) and
|
|
586
576
|
/// [`watch`](Self::watch).
|
|
587
577
|
pub fn start_watching(&self) -> Result<()> {
|
|
578
|
+
self.require_named_tables()?;
|
|
588
579
|
let mut guard = self.inner.watcher.lock().map_err(DirSqlError::lock)?;
|
|
589
580
|
if guard.is_none() {
|
|
590
581
|
// Watch the canonicalized anchors, never the (possibly relative)
|
|
@@ -595,11 +586,19 @@ impl DirSQL {
|
|
|
595
586
|
Ok(())
|
|
596
587
|
}
|
|
597
588
|
|
|
589
|
+
fn require_named_tables(&self) -> Result<()> {
|
|
590
|
+
if self.inner.groups.is_empty() {
|
|
591
|
+
return Err(DirSqlError::watch_msg(
|
|
592
|
+
"watching requires at least one named table: path-tables emit no watch events; define a table",
|
|
593
|
+
));
|
|
594
|
+
}
|
|
595
|
+
Ok(())
|
|
596
|
+
}
|
|
597
|
+
|
|
598
598
|
/// The trees the live watcher must cover: each table anchor, under the
|
|
599
|
-
/// skip rules its tables' scan applies.
|
|
600
|
-
/// watches the index root.
|
|
599
|
+
/// skip rules its tables' scan applies.
|
|
601
600
|
fn watch_scopes(&self) -> Vec<WatchScope> {
|
|
602
|
-
watch_scopes(&self.inner.
|
|
601
|
+
watch_scopes(&self.inner.groups)
|
|
603
602
|
}
|
|
604
603
|
|
|
605
604
|
/// Poll-based watch API. Blocks up to `timeout` waiting for the next
|
|
@@ -680,6 +679,7 @@ impl DirSQL {
|
|
|
680
679
|
///
|
|
681
680
|
/// Mutually exclusive with [`poll_events`](Self::poll_events).
|
|
682
681
|
pub fn watch(&self) -> Result<WatchStream> {
|
|
682
|
+
self.require_named_tables()?;
|
|
683
683
|
if self.inner.poll_used.load(Ordering::SeqCst) {
|
|
684
684
|
return Err(DirSqlError::watch_msg(
|
|
685
685
|
"poll_events() already in use; cannot call watch()",
|
|
@@ -1583,9 +1583,6 @@ impl DirSQL {
|
|
|
1583
1583
|
// Commit the ingest transaction.
|
|
1584
1584
|
_tx.commit().map_err(DirSqlError::sqlite)?;
|
|
1585
1585
|
|
|
1586
|
-
// Canonicalize the watch root so the live watcher never sees a
|
|
1587
|
-
// relative path; `root` itself is left untouched.
|
|
1588
|
-
let watch_root = PathBuf::from(fs.canonical_root(&root));
|
|
1589
1586
|
let mut groups = groups;
|
|
1590
1587
|
for group in &mut groups {
|
|
1591
1588
|
group.watch_anchor = PathBuf::from(fs.canonical_root(&group.anchor));
|
|
@@ -1595,7 +1592,6 @@ impl DirSQL {
|
|
|
1595
1592
|
inner: Arc::new(DirSqlInner {
|
|
1596
1593
|
db: Mutex::new(db),
|
|
1597
1594
|
root,
|
|
1598
|
-
watch_root,
|
|
1599
1595
|
groups,
|
|
1600
1596
|
on_file_map,
|
|
1601
1597
|
strict_map,
|
|
@@ -3436,11 +3432,11 @@ mod internal_tests {
|
|
|
3436
3432
|
);
|
|
3437
3433
|
}
|
|
3438
3434
|
|
|
3439
|
-
/// Building with a **relative** root canonicalizes
|
|
3435
|
+
/// Building with a **relative** root canonicalizes the watch anchor to an
|
|
3440
3436
|
/// absolute path while leaving `root` exactly as the caller supplied it,
|
|
3441
3437
|
/// so `notify` never sees `.`.
|
|
3442
3438
|
#[test]
|
|
3443
|
-
fn
|
|
3439
|
+
fn relative_root_canonicalizes_watch_anchor_only() {
|
|
3444
3440
|
let canonical = if cfg!(windows) {
|
|
3445
3441
|
r"C:\ws\canonical"
|
|
3446
3442
|
} else {
|
|
@@ -3462,11 +3458,11 @@ mod internal_tests {
|
|
|
3462
3458
|
|
|
3463
3459
|
assert_eq!(db.inner.root, PathBuf::from("."));
|
|
3464
3460
|
assert!(
|
|
3465
|
-
db.inner.
|
|
3466
|
-
"
|
|
3467
|
-
db.inner.
|
|
3461
|
+
db.inner.groups[0].watch_anchor.is_absolute(),
|
|
3462
|
+
"watch_anchor must be absolute, got {:?}",
|
|
3463
|
+
db.inner.groups[0].watch_anchor
|
|
3468
3464
|
);
|
|
3469
|
-
assert_eq!(db.inner.
|
|
3465
|
+
assert_eq!(db.inner.groups[0].watch_anchor, PathBuf::from(canonical));
|
|
3470
3466
|
}
|
|
3471
3467
|
|
|
3472
3468
|
/// With an absolute root, `process_file_event` strips the `watch_root`
|
|
@@ -3730,8 +3726,17 @@ mod internal_tests {
|
|
|
3730
3726
|
/// tableless for these lock-poison / error-path tests.
|
|
3731
3727
|
fn simple_db() -> (TempDir, DirSQL) {
|
|
3732
3728
|
let dir = TempDir::new().unwrap();
|
|
3733
|
-
let db =
|
|
3734
|
-
|
|
3729
|
+
let db = DirSQL::with_ignore(
|
|
3730
|
+
dir.path(),
|
|
3731
|
+
vec![Table::new(
|
|
3732
|
+
"t",
|
|
3733
|
+
"CREATE TABLE t (x TEXT)",
|
|
3734
|
+
"*.none",
|
|
3735
|
+
|_| vec![],
|
|
3736
|
+
)],
|
|
3737
|
+
Vec::<String>::new(),
|
|
3738
|
+
)
|
|
3739
|
+
.unwrap();
|
|
3735
3740
|
(dir, db)
|
|
3736
3741
|
}
|
|
3737
3742
|
|
|
@@ -4141,6 +4146,27 @@ mod internal_tests {
|
|
|
4141
4146
|
);
|
|
4142
4147
|
}
|
|
4143
4148
|
|
|
4149
|
+
#[test]
|
|
4150
|
+
fn watch_without_named_tables_names_the_cause() {
|
|
4151
|
+
let db = DirSQL::new(TempDir::new().unwrap().path(), vec![]).unwrap();
|
|
4152
|
+
let err = db.watch().unwrap_err().to_string();
|
|
4153
|
+
assert!(
|
|
4154
|
+
err.contains("path-tables emit no watch events"),
|
|
4155
|
+
"got: {err}"
|
|
4156
|
+
);
|
|
4157
|
+
assert!(err.contains("define a table"), "got: {err}");
|
|
4158
|
+
}
|
|
4159
|
+
|
|
4160
|
+
#[test]
|
|
4161
|
+
fn poll_events_without_named_tables_names_the_cause() {
|
|
4162
|
+
let db = DirSQL::new(TempDir::new().unwrap().path(), vec![]).unwrap();
|
|
4163
|
+
let err = db.poll_events(Duration::ZERO).unwrap_err().to_string();
|
|
4164
|
+
assert!(
|
|
4165
|
+
err.contains("path-tables emit no watch events"),
|
|
4166
|
+
"got: {err}"
|
|
4167
|
+
);
|
|
4168
|
+
}
|
|
4169
|
+
|
|
4144
4170
|
#[test]
|
|
4145
4171
|
fn watch_twice_reports_already_started() {
|
|
4146
4172
|
let (_dir, db) = simple_db();
|
|
@@ -4968,7 +4994,16 @@ mod internal_tests {
|
|
|
4968
4994
|
#[tokio::test]
|
|
4969
4995
|
async fn async_dirsql_builds_queries_and_forwards() {
|
|
4970
4996
|
let dir = TempDir::new().unwrap();
|
|
4971
|
-
let adb = AsyncDirSQL::new(
|
|
4997
|
+
let adb = AsyncDirSQL::new(
|
|
4998
|
+
dir.path(),
|
|
4999
|
+
vec![Table::new(
|
|
5000
|
+
"t",
|
|
5001
|
+
"CREATE TABLE t (x TEXT)",
|
|
5002
|
+
"*.none",
|
|
5003
|
+
|_| vec![],
|
|
5004
|
+
)],
|
|
5005
|
+
)
|
|
5006
|
+
.unwrap();
|
|
4972
5007
|
adb.ready().await.unwrap();
|
|
4973
5008
|
let rows = adb.query("SELECT 1 AS n").await.unwrap();
|
|
4974
5009
|
assert_eq!(rows[0]["n"], Value::Integer(1));
|
|
@@ -4984,7 +5019,16 @@ mod internal_tests {
|
|
|
4984
5019
|
#[tokio::test]
|
|
4985
5020
|
async fn async_dirsql_watch_forwards() {
|
|
4986
5021
|
let dir = TempDir::new().unwrap();
|
|
4987
|
-
let adb = AsyncDirSQL::new(
|
|
5022
|
+
let adb = AsyncDirSQL::new(
|
|
5023
|
+
dir.path(),
|
|
5024
|
+
vec![Table::new(
|
|
5025
|
+
"t",
|
|
5026
|
+
"CREATE TABLE t (x TEXT)",
|
|
5027
|
+
"*.none",
|
|
5028
|
+
|_| vec![],
|
|
5029
|
+
)],
|
|
5030
|
+
)
|
|
5031
|
+
.unwrap();
|
|
4988
5032
|
adb.ready().await.unwrap();
|
|
4989
5033
|
let _stream = adb.watch().unwrap();
|
|
4990
5034
|
}
|
|
@@ -5848,7 +5892,7 @@ mod internal_tests {
|
|
|
5848
5892
|
.collect();
|
|
5849
5893
|
let ignore: Vec<String> = ignore.iter().map(|p| p.to_string()).collect();
|
|
5850
5894
|
let (groups, _, _) = compile_groups(&tables, &ignore, Path::new("/idx")).unwrap();
|
|
5851
|
-
watch_scopes(
|
|
5895
|
+
watch_scopes(&groups)
|
|
5852
5896
|
}
|
|
5853
5897
|
|
|
5854
5898
|
fn roots(scopes: &[WatchScope]) -> Vec<PathBuf> {
|
|
@@ -5860,14 +5904,10 @@ mod internal_tests {
|
|
|
5860
5904
|
let dir = TempDir::new().unwrap();
|
|
5861
5905
|
let db = populated_db(dir.path(), "**/*.txt", &["a.txt"]);
|
|
5862
5906
|
|
|
5863
|
-
assert_eq!(
|
|
5864
|
-
|
|
5865
|
-
|
|
5866
|
-
|
|
5867
|
-
fn watch_scopes_without_tables_is_the_whole_index_root() {
|
|
5868
|
-
let scopes = scopes_for(&[], &[]);
|
|
5869
|
-
assert_eq!(roots(&scopes), vec![PathBuf::from("/canonical-idx")]);
|
|
5870
|
-
assert!(!scopes[0].ignore.is_ignored_dir(Path::new("node_modules")));
|
|
5907
|
+
assert_eq!(
|
|
5908
|
+
roots(&db.watch_scopes()),
|
|
5909
|
+
vec![db.inner.groups[0].watch_anchor.clone()]
|
|
5910
|
+
);
|
|
5871
5911
|
}
|
|
5872
5912
|
|
|
5873
5913
|
#[test]
|