dirsql 0.4.115__tar.gz → 0.4.116__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.115 → dirsql-0.4.116}/Cargo.lock +2 -2
- {dirsql-0.4.115 → dirsql-0.4.116}/PKG-INFO +1 -1
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/Cargo.toml +1 -1
- dirsql-0.4.116/packages/python/e2e-attestations/bot-1480-matcher-speed-1015.json +7 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/Cargo.toml +1 -1
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/listing.rs +25 -46
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/scanner.rs +120 -25
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/tree_walk.rs +168 -75
- {dirsql-0.4.115 → dirsql-0.4.116}/Cargo.toml +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/README.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/__init__.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/_async.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/_dirsql.pyi +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/cli/__init__.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/cli/discover_plugins/__init__.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/cli/main.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/cli/resolve_config_extensions.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/plan_entry_path.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/py.typed +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/read_config.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/resolve_configs_extension_specs.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/resolve_extension.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/dirsql/resolve_package.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/AGENTS.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/context/.gitattributes +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/context/recipes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/context/usage.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/explanation.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/getting-started.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/embed.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/persist.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/query-json.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/index.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/package.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/plugins.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/reference/cli.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/reference/columns.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/reference/config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/reference/glob.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/reference/hooks.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/reference/http-api.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/reference/sdk.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/docs/speed.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/CHANGELOG.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/MIGRATIONS.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/README.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/2026-10-08-watch-requires-named-table.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/changelog.d/README.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/conftest.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/AGENTS.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/context/.gitattributes +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/context/recipes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/context/usage.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/explanation.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/getting-started.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/embed.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/persist.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/query-json.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/index.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/package.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/plugins.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/reference/cli.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/reference/columns.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/reference/config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/reference/glob.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/reference/hooks.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/reference/http-api.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/reference/sdk.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/docs/speed.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1406-watch-no-tables-1008.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1416-watch-speed-1008.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1421-posix-unicode.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1426-walk-spawn-threshold-1008.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1428-ndjson-hooks.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1429-parallel-hooks.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1430-dotdot-as-written.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1448-wildcard-ignored-prefix.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1451-named-dir-never-hidden.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1454-split-few-files.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1457-incremental-refresh-1008.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1459-rescan-on-overflow-1008.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1461-row-footprint-1008.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1461-wide-read-1015.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1462-paired-speed-harness-1008.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1464-fastest-native-1008.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1469-ci-speed-sanity-1009.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1470-perf-suite-1009.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1470-speed-page-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1474-vtab-speed-1014.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1477-onelevel-speed-1015.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1481-gitrepo-speed-1015.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1483-fm-speed-1015.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1484-jsonl-speed-1015.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1487-frontend-query-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1488-frontend-metadata-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1489-frontend-browse-1013.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1503-bench-watch-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1504-bench-names-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1514-watch-rerun-inline-1015.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-1526-main-red-1016.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-issue-1486-frontend-20261009.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-speed-gap-childpath-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-speed-parse-overlap-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-speed-parse-paths-1009.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-speed-parse-pragmas-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-speed-sql-valueref-1013.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-speed-walk-components-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-speed-walk-rowpath-1011.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-speed-walk-rows-1013.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/bot-speed-walk-sched-1009.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/2026-10-08-watch-requires-named-table.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/migrations.d/README.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/src/lib.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/testing-conventions.toml +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/e2e/bench_report.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/e2e/bench_suite.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/e2e/speed_of_light.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/integration/binding/__init__.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/python/tests/integration/hermetic/__init__.py +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/CHANGELOG.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/MIGRATIONS.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/README.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/context/.gitattributes +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/context/recipes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/context/usage.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/explanation.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/getting-started.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/embed.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/persist.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/query-json.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/index.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/plugins.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/reference/cli.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/reference/columns.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/reference/config.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/reference/glob.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/reference/hooks.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/reference/http-api.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/reference/sdk.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/speed.json +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/docs/speed.md +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/brace.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/context.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/execute.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/frontend.html +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/frontend.js +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/init.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/mod.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/repl.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/router.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/run.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/server.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/cli/table.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/command.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/config.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/db.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/default_config.toml +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/extension_resolution.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/functions.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/gitignore_frame.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/infer.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/launcher.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/lib.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/matcher.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/on_file.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/parsed_vtab.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/path_table.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/per_thread.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/persist.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/posix_class.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/progress.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/row_event_flat.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/row_stream.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/sql_literal.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/vtab.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/vtab_scaffold.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/packages/rust/src/watcher.rs +0 -0
- {dirsql-0.4.115 → dirsql-0.4.116}/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.116"
|
|
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.116"
|
|
629
629
|
dependencies = [
|
|
630
630
|
"dirsql",
|
|
631
631
|
"pyo3",
|
|
@@ -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.116"
|
|
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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_gitignore_test.py tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/query_contract_test.py -q",
|
|
3
|
+
"ran_at": 1792158925,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "e01da64bd1c48112f77059fab894961c5dc241ce",
|
|
6
|
+
"branch": "bot/1480-matcher-speed-1015"
|
|
7
|
+
}
|
|
@@ -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.116"
|
|
10
10
|
edition.workspace = true
|
|
11
11
|
# Literal `license` (not `license.workspace = true`) because
|
|
12
12
|
# putitoutthere's preflight check reads `[package].license` directly
|
|
@@ -100,6 +100,13 @@ impl Listing {
|
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
/// Whether an entry is named `name`; the listing must be sorted.
|
|
104
|
+
pub(crate) fn holds(&self, name: &OsStr) -> bool {
|
|
105
|
+
self.entries
|
|
106
|
+
.binary_search_by(|listed| self.name(listed).cmp(name))
|
|
107
|
+
.is_ok()
|
|
108
|
+
}
|
|
109
|
+
|
|
103
110
|
pub(crate) fn name(&self, listed: &Listed) -> &OsStr {
|
|
104
111
|
self.names.get(listed.start, listed.end)
|
|
105
112
|
}
|
|
@@ -138,46 +145,17 @@ fn open_dir(dir: &Path) -> rustix::io::Result<rustix::fd::OwnedFd> {
|
|
|
138
145
|
rustix::fs::open(dir, flags, Mode::empty())
|
|
139
146
|
}
|
|
140
147
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
/// tree of small directories pays for it once.
|
|
146
|
-
static ENTRY_BUFFER: std::cell::RefCell<Vec<u8>> =
|
|
147
|
-
std::cell::RefCell::new(Vec::with_capacity(1 << 20));
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/// Reads entries straight out of the kernel's buffer, where `Dir` would copy
|
|
151
|
-
/// each name into its own allocation.
|
|
152
|
-
#[cfg(target_os = "linux")]
|
|
148
|
+
/// Uses `Dir`, not `RawDir`: on a deep tree of small directories the walk ran
|
|
149
|
+
/// about twice as slow reading through `RawDir`, with no gain on a flat
|
|
150
|
+
/// directory of a million entries.
|
|
151
|
+
#[cfg(unix)]
|
|
153
152
|
fn read_into(dir: &Path, listing: &mut Listing) {
|
|
154
|
-
use rustix::fs::RawDir;
|
|
155
|
-
use std::os::unix::ffi::OsStrExt;
|
|
156
|
-
let Ok(fd) = open_dir(dir) else {
|
|
157
|
-
return;
|
|
158
|
-
};
|
|
159
|
-
ENTRY_BUFFER.with_borrow_mut(|buffer| {
|
|
160
|
-
let mut entries = RawDir::new(&fd, buffer.spare_capacity_mut());
|
|
161
|
-
while let Some(Ok(entry)) = entries.next() {
|
|
162
|
-
let name = entry.file_name().to_bytes();
|
|
163
|
-
if name == b"." || name == b".." {
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
listing.push(OsStr::from_bytes(name), seen(entry.file_type()));
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/// `read_into` for Unix systems without `RawDir`. Built under test too, so the
|
|
172
|
-
/// Linux unit run covers it.
|
|
173
|
-
#[cfg(all(unix, any(test, not(target_os = "linux"))))]
|
|
174
|
-
fn read_dir_with_copies_into(dir: &Path, listing: &mut Listing) {
|
|
175
153
|
use rustix::fs::Dir;
|
|
176
154
|
use std::os::unix::ffi::OsStrExt;
|
|
177
155
|
let Ok(fd) = open_dir(dir) else {
|
|
178
156
|
return;
|
|
179
157
|
};
|
|
180
|
-
let Ok(mut entries) = Dir::
|
|
158
|
+
let Ok(mut entries) = Dir::new(fd) else {
|
|
181
159
|
return;
|
|
182
160
|
};
|
|
183
161
|
while let Some(Ok(entry)) = entries.read() {
|
|
@@ -214,8 +192,6 @@ fn seen_flags(symlink: bool, dir: bool, file: bool) -> Seen {
|
|
|
214
192
|
|
|
215
193
|
#[cfg(not(unix))]
|
|
216
194
|
use read_dir_into as read_into;
|
|
217
|
-
#[cfg(all(unix, not(target_os = "linux")))]
|
|
218
|
-
use read_dir_with_copies_into as read_into;
|
|
219
195
|
|
|
220
196
|
/// A name's first eight bytes as a big-endian word, which orders names as
|
|
221
197
|
/// their bytes do as far as those bytes go.
|
|
@@ -271,6 +247,19 @@ mod tests {
|
|
|
271
247
|
assert_eq!(names(&listing), ["first", "second"]);
|
|
272
248
|
}
|
|
273
249
|
|
|
250
|
+
#[test]
|
|
251
|
+
fn a_sorted_listing_holds_exactly_the_names_pushed() {
|
|
252
|
+
let mut listing = Listing::default();
|
|
253
|
+
for name in [".gitignore", "b", ".git", "a"] {
|
|
254
|
+
listing.push(OsStr::new(name), Seen::File);
|
|
255
|
+
}
|
|
256
|
+
listing.sort();
|
|
257
|
+
assert!(listing.holds(OsStr::new(".git")));
|
|
258
|
+
assert!(listing.holds(OsStr::new("a")));
|
|
259
|
+
assert!(!listing.holds(OsStr::new(".gi")));
|
|
260
|
+
assert!(!Listing::default().holds(OsStr::new(".git")));
|
|
261
|
+
}
|
|
262
|
+
|
|
274
263
|
#[test]
|
|
275
264
|
fn name_prefix_orders_names_as_their_bytes_do() {
|
|
276
265
|
let mut names = ["abcdefghZ", "abcdefgh", "abcdefghA", "ab", "b", "abc", ""];
|
|
@@ -344,16 +333,6 @@ mod tests {
|
|
|
344
333
|
assert_eq!(read_with(read_into, dir.path()), fixture_entries());
|
|
345
334
|
}
|
|
346
335
|
|
|
347
|
-
#[cfg(unix)]
|
|
348
|
-
#[test]
|
|
349
|
-
fn read_dir_with_copies_into_lists_the_entries_without_dot_and_dot_dot() {
|
|
350
|
-
let dir = fixture();
|
|
351
|
-
assert_eq!(
|
|
352
|
-
read_with(read_dir_with_copies_into, dir.path()),
|
|
353
|
-
fixture_entries()
|
|
354
|
-
);
|
|
355
|
-
}
|
|
356
|
-
|
|
357
336
|
#[test]
|
|
358
337
|
fn read_dir_into_classifies_what_std_reports() {
|
|
359
338
|
let dir = fixture();
|
|
@@ -126,6 +126,7 @@ pub fn scan_dirs(root: &Path, start: &Path, ignore: &TableMatcher) -> Vec<PathBu
|
|
|
126
126
|
root,
|
|
127
127
|
start,
|
|
128
128
|
walker,
|
|
129
|
+
&|_| true,
|
|
129
130
|
&|_| false,
|
|
130
131
|
&|rel_path, parent| parent.join(rel_path.file_name().unwrap_or_default()),
|
|
131
132
|
&mut |dir| dirs.push(dir),
|
|
@@ -163,6 +164,7 @@ fn scan_below(
|
|
|
163
164
|
root,
|
|
164
165
|
start,
|
|
165
166
|
walker,
|
|
167
|
+
&|_| true,
|
|
166
168
|
&|rel_path| !matcher.is_ignored(rel_path),
|
|
167
169
|
// Matching and the relative path are made on the worker that found
|
|
168
170
|
// the file: the calling thread hands out every file in turn, so any
|
|
@@ -267,6 +269,7 @@ pub(crate) fn scan_glob_rows<T: Send>(
|
|
|
267
269
|
root,
|
|
268
270
|
root,
|
|
269
271
|
walker,
|
|
272
|
+
&|name| glob.may_match_name(name),
|
|
270
273
|
&|rel_path| is_wanted(glob, ignore, rel_path),
|
|
271
274
|
&|rel_path, _| row(rel_path),
|
|
272
275
|
visit,
|
|
@@ -304,6 +307,8 @@ pub struct PathGlob {
|
|
|
304
307
|
components: Vec<Component>,
|
|
305
308
|
/// Where each word's components begin.
|
|
306
309
|
starts: Vec<usize>,
|
|
310
|
+
/// Where each word's closing `End` sits.
|
|
311
|
+
ends: Vec<usize>,
|
|
307
312
|
/// Whether any word spells a `.` or `..` component, which the walk has to
|
|
308
313
|
/// enter itself: a directory listing never names them.
|
|
309
314
|
spells_relative: bool,
|
|
@@ -362,6 +367,18 @@ impl PathGlob {
|
|
|
362
367
|
.all(|name| self.spells_dot_name(name))
|
|
363
368
|
}
|
|
364
369
|
|
|
370
|
+
/// Whether a file named `name` may match: false when no word could match
|
|
371
|
+
/// it, since only `**` crosses a `/` and so a word's last component, unless
|
|
372
|
+
/// it is `**`, has to match the name alone.
|
|
373
|
+
pub(crate) fn may_match_name(&self, name: &OsStr) -> bool {
|
|
374
|
+
self.ends
|
|
375
|
+
.iter()
|
|
376
|
+
.any(|&end| match &self.components[end - 1] {
|
|
377
|
+
Component::Name(p) | Component::DotName(p) => p.is_match(Path::new(name)),
|
|
378
|
+
Component::AnyDepth | Component::End => true,
|
|
379
|
+
})
|
|
380
|
+
}
|
|
381
|
+
|
|
365
382
|
fn has_components(&self) -> bool {
|
|
366
383
|
!self.components.is_empty()
|
|
367
384
|
}
|
|
@@ -465,10 +482,12 @@ pub fn compile_globs(patterns: &[&str]) -> Result<PathGlob, GlobError> {
|
|
|
465
482
|
.collect();
|
|
466
483
|
let mut components = Vec::new();
|
|
467
484
|
let mut starts = Vec::new();
|
|
485
|
+
let mut ends = Vec::new();
|
|
468
486
|
for word in &words {
|
|
469
487
|
let word_components = compile_components(word)?;
|
|
470
488
|
starts.push(components.len());
|
|
471
489
|
components.extend(word_components);
|
|
490
|
+
ends.push(components.len());
|
|
472
491
|
components.push(Component::End);
|
|
473
492
|
}
|
|
474
493
|
Ok(PathGlob {
|
|
@@ -476,6 +495,7 @@ pub fn compile_globs(patterns: &[&str]) -> Result<PathGlob, GlobError> {
|
|
|
476
495
|
spelled_dot_names,
|
|
477
496
|
components,
|
|
478
497
|
starts,
|
|
498
|
+
ends,
|
|
479
499
|
spells_relative,
|
|
480
500
|
named,
|
|
481
501
|
})
|
|
@@ -547,6 +567,7 @@ fn walk<L: Send>(
|
|
|
547
567
|
root: &Path,
|
|
548
568
|
start: &Path,
|
|
549
569
|
walker: Walk<'_>,
|
|
570
|
+
keep_name: &(dyn Fn(&OsStr) -> bool + Sync),
|
|
550
571
|
keep: &(dyn Fn(&Path) -> bool + Sync),
|
|
551
572
|
leaf: &(dyn Fn(PathBuf, &Path) -> L + Sync),
|
|
552
573
|
visit: &mut dyn FnMut(L),
|
|
@@ -566,7 +587,7 @@ fn walk<L: Send>(
|
|
|
566
587
|
};
|
|
567
588
|
walk_in_order(
|
|
568
589
|
Box::new(place),
|
|
569
|
-
&|place: Box<Place<'_>>| (*place).explore(keep, leaf),
|
|
590
|
+
&|place: Box<Place<'_>>| (*place).explore(keep_name, keep, leaf),
|
|
570
591
|
visit,
|
|
571
592
|
);
|
|
572
593
|
}
|
|
@@ -585,9 +606,11 @@ struct Place<'a> {
|
|
|
585
606
|
impl<'a> Place<'a> {
|
|
586
607
|
/// The directory's entries in walk order: each file `keep` takes, made
|
|
587
608
|
/// into a `leaf` with the directory it sits in, and each directory to
|
|
588
|
-
/// enter.
|
|
609
|
+
/// enter. A regular file whose name `keep_name` rejects is dropped before
|
|
610
|
+
/// its path is built.
|
|
589
611
|
fn explore<L: Send>(
|
|
590
612
|
self,
|
|
613
|
+
keep_name: &(dyn Fn(&OsStr) -> bool + Sync),
|
|
591
614
|
keep: &(dyn Fn(&Path) -> bool + Sync),
|
|
592
615
|
leaf: &(dyn Fn(PathBuf, &Path) -> L + Sync),
|
|
593
616
|
) -> Vec<Step<Box<Place<'a>>, L>> {
|
|
@@ -598,37 +621,35 @@ impl<'a> Place<'a> {
|
|
|
598
621
|
states,
|
|
599
622
|
linked,
|
|
600
623
|
} = self;
|
|
601
|
-
|
|
624
|
+
let listing = Listing::read(&dir);
|
|
625
|
+
if walk.gitignore && listing.holds(OsStr::new(".git")) && holds_git(&dir) {
|
|
602
626
|
walk.in_repo = true;
|
|
603
627
|
walk.frames.clear();
|
|
604
628
|
}
|
|
605
629
|
if walk.in_repo
|
|
630
|
+
&& listing.holds(OsStr::new(".gitignore"))
|
|
606
631
|
&& let Some(frame) = Frame::load(&dir)
|
|
607
632
|
{
|
|
608
633
|
walk.frames.push(Arc::new(frame));
|
|
609
634
|
}
|
|
610
|
-
let listing = Listing::read(&dir);
|
|
611
635
|
let taken = judge_all(listing.entries(), &|listed| {
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
linked,
|
|
630
|
-
}),
|
|
631
|
-
})
|
|
636
|
+
let name = listing.name(listed);
|
|
637
|
+
if listed.seen == Seen::File && !keep_name(name) {
|
|
638
|
+
return None;
|
|
639
|
+
}
|
|
640
|
+
walk.take(&dir, name, listed.seen, &rel, &states, linked)
|
|
641
|
+
.and_then(|taken| match taken {
|
|
642
|
+
Taken::File(child) => keep(&child).then(|| Taken::File(leaf(child, &dir))),
|
|
643
|
+
Taken::Dir {
|
|
644
|
+
child,
|
|
645
|
+
next,
|
|
646
|
+
linked,
|
|
647
|
+
} => Some(Taken::Dir {
|
|
648
|
+
child,
|
|
649
|
+
next,
|
|
650
|
+
linked,
|
|
651
|
+
}),
|
|
652
|
+
})
|
|
632
653
|
});
|
|
633
654
|
let mut steps: Vec<Step<Box<Place<'a>>, L>> = if walk.dirs {
|
|
634
655
|
taken
|
|
@@ -1235,7 +1256,7 @@ mod tests {
|
|
|
1235
1256
|
|
|
1236
1257
|
fn explored_dirs(place: Place<'_>) -> Vec<Place<'_>> {
|
|
1237
1258
|
place
|
|
1238
|
-
.explore(&|_| true, &|_, _| ())
|
|
1259
|
+
.explore(&|_| true, &|_| true, &|_, _| ())
|
|
1239
1260
|
.into_iter()
|
|
1240
1261
|
.filter_map(|step| match step {
|
|
1241
1262
|
Step::Dir(child) => Some(*child),
|
|
@@ -1269,6 +1290,65 @@ mod tests {
|
|
|
1269
1290
|
);
|
|
1270
1291
|
}
|
|
1271
1292
|
|
|
1293
|
+
#[test]
|
|
1294
|
+
fn explore_drops_a_file_whose_name_is_rejected_before_judging_its_path() {
|
|
1295
|
+
let root = tempfile::tempdir().unwrap();
|
|
1296
|
+
fs::write(root.path().join("a.md"), "").unwrap();
|
|
1297
|
+
fs::write(root.path().join("b.md"), "").unwrap();
|
|
1298
|
+
fs::create_dir(root.path().join("d")).unwrap();
|
|
1299
|
+
let ignore = TableMatcher::new(&[], &[]).unwrap();
|
|
1300
|
+
let top = Place {
|
|
1301
|
+
walk: walk_with(&ignore, None, Vec::new()),
|
|
1302
|
+
dir: root.path().to_path_buf(),
|
|
1303
|
+
rel: PathBuf::new(),
|
|
1304
|
+
states: Vec::new(),
|
|
1305
|
+
linked: false,
|
|
1306
|
+
};
|
|
1307
|
+
let judged = std::sync::Mutex::new(Vec::new());
|
|
1308
|
+
let steps = top.explore(
|
|
1309
|
+
&|name| name != OsStr::new("b.md"),
|
|
1310
|
+
&|rel| {
|
|
1311
|
+
judged.lock().unwrap().push(rel.to_path_buf());
|
|
1312
|
+
true
|
|
1313
|
+
},
|
|
1314
|
+
&|rel, _| rel,
|
|
1315
|
+
);
|
|
1316
|
+
let leaves: Vec<PathBuf> = steps
|
|
1317
|
+
.into_iter()
|
|
1318
|
+
.filter_map(|step| match step {
|
|
1319
|
+
Step::Leaf(rel) => Some(rel),
|
|
1320
|
+
Step::Dir(_) => None,
|
|
1321
|
+
})
|
|
1322
|
+
.collect();
|
|
1323
|
+
assert_eq!(leaves, vec![PathBuf::from("a.md")]);
|
|
1324
|
+
assert_eq!(judged.into_inner().unwrap(), vec![PathBuf::from("a.md")]);
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
#[test]
|
|
1328
|
+
fn explore_outside_gitignore_mode_ignores_a_repo_it_enters() {
|
|
1329
|
+
let root = tempfile::tempdir().unwrap();
|
|
1330
|
+
fs::create_dir(root.path().join(".git")).unwrap();
|
|
1331
|
+
fs::write(root.path().join(".gitignore"), "x.md\n").unwrap();
|
|
1332
|
+
fs::write(root.path().join("x.md"), "").unwrap();
|
|
1333
|
+
let ignore = TableMatcher::new(&[], &[]).unwrap();
|
|
1334
|
+
let top = Place {
|
|
1335
|
+
walk: walk_with(&ignore, None, Vec::new()),
|
|
1336
|
+
dir: root.path().to_path_buf(),
|
|
1337
|
+
rel: PathBuf::new(),
|
|
1338
|
+
states: Vec::new(),
|
|
1339
|
+
linked: false,
|
|
1340
|
+
};
|
|
1341
|
+
let leaves: Vec<PathBuf> = top
|
|
1342
|
+
.explore(&|_| true, &|_| true, &|rel, _| rel)
|
|
1343
|
+
.into_iter()
|
|
1344
|
+
.filter_map(|step| match step {
|
|
1345
|
+
Step::Leaf(rel) => Some(rel),
|
|
1346
|
+
Step::Dir(_) => None,
|
|
1347
|
+
})
|
|
1348
|
+
.collect();
|
|
1349
|
+
assert!(leaves.contains(&PathBuf::from("x.md")), "{leaves:?}");
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1272
1352
|
#[test]
|
|
1273
1353
|
fn explore_enters_a_dirsql_directory_below_the_top_level() {
|
|
1274
1354
|
let root = tempfile::tempdir().unwrap();
|
|
@@ -1686,6 +1766,21 @@ mod tests {
|
|
|
1686
1766
|
})
|
|
1687
1767
|
}
|
|
1688
1768
|
|
|
1769
|
+
#[test]
|
|
1770
|
+
fn a_name_may_match_only_when_some_word_ends_in_a_component_matching_it() {
|
|
1771
|
+
let glob = compile_glob("./**/{a,b}*.md").unwrap();
|
|
1772
|
+
assert!(glob.may_match_name(OsStr::new("a1.md")));
|
|
1773
|
+
assert!(glob.may_match_name(OsStr::new("b1.md")));
|
|
1774
|
+
assert!(!glob.may_match_name(OsStr::new("c1.md")));
|
|
1775
|
+
assert!(!glob.may_match_name(OsStr::new("a1.txt")));
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1778
|
+
#[test]
|
|
1779
|
+
fn a_word_ending_in_a_double_star_may_match_any_name() {
|
|
1780
|
+
let glob = compile_glob("{docs/**,*.md}").unwrap();
|
|
1781
|
+
assert!(glob.may_match_name(OsStr::new("a.txt")));
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1689
1784
|
#[test]
|
|
1690
1785
|
fn a_double_star_starts_matched_or_not_yet_consumed() {
|
|
1691
1786
|
assert_eq!(compile_glob("**/*.md").unwrap().start(), vec![0, 1]);
|