dirsql 0.4.6__tar.gz → 0.4.7__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.
Files changed (223) hide show
  1. {dirsql-0.4.6 → dirsql-0.4.7}/Cargo.lock +18 -1
  2. {dirsql-0.4.6 → dirsql-0.4.7}/PKG-INFO +1 -1
  3. {dirsql-0.4.6/packages/python → dirsql-0.4.7}/docs/reference/cli.md +3 -0
  4. {dirsql-0.4.6 → dirsql-0.4.7}/docs/reference/path-tables.md +34 -5
  5. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/Cargo.toml +1 -1
  6. {dirsql-0.4.6/packages/rust → dirsql-0.4.7/packages/python}/docs/reference/cli.md +3 -0
  7. {dirsql-0.4.6/packages/rust → dirsql-0.4.7/packages/python}/docs/reference/path-tables.md +34 -5
  8. dirsql-0.4.7/packages/python/e2e-attestations/feat-742-gitignore-by-default.json +7 -0
  9. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/Cargo.toml +3 -0
  10. dirsql-0.4.7/packages/rust/changelog.d/2026-08-03-gitignore-by-default.md +9 -0
  11. dirsql-0.4.7/packages/rust/changelog.d/2026-08-03-nested-default-ignores.md +11 -0
  12. {dirsql-0.4.6 → dirsql-0.4.7/packages/rust}/docs/reference/cli.md +3 -0
  13. {dirsql-0.4.6/packages/python → dirsql-0.4.7/packages/rust}/docs/reference/path-tables.md +34 -5
  14. dirsql-0.4.7/packages/rust/migrations.d/2026-08-03-gitignore-by-default.md +52 -0
  15. dirsql-0.4.7/packages/rust/migrations.d/2026-08-03-nested-default-ignores.md +46 -0
  16. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/bin/dirsql.rs +31 -7
  17. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/db.rs +63 -12
  18. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/lib.rs +39 -0
  19. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/matcher.rs +41 -0
  20. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/parsed_vtab.rs +52 -17
  21. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/path_table.rs +5 -4
  22. dirsql-0.4.7/packages/rust/src/scanner.rs +609 -0
  23. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/vtab.rs +51 -16
  24. dirsql-0.4.6/packages/rust/src/scanner.rs +0 -220
  25. {dirsql-0.4.6 → dirsql-0.4.7}/Cargo.toml +0 -0
  26. {dirsql-0.4.6 → dirsql-0.4.7}/README.md +0 -0
  27. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/__init__.py +0 -0
  28. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/_async.py +0 -0
  29. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/_dirsql.pyi +0 -0
  30. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/__init__.py +0 -0
  31. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/binary_path.py +0 -0
  32. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/discover_plugins/__init__.py +0 -0
  33. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  34. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  35. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  36. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  37. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  38. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/is_windows.py +0 -0
  39. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/main.py +0 -0
  40. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/cli/resolve_config_extensions.py +0 -0
  41. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/py.typed +0 -0
  42. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/resolve_config_extensions.py +0 -0
  43. {dirsql-0.4.6 → dirsql-0.4.7}/dirsql/resolve_extension.py +0 -0
  44. {dirsql-0.4.6 → dirsql-0.4.7}/docs/.claude/CLAUDE.md +0 -0
  45. {dirsql-0.4.6 → dirsql-0.4.7}/docs/.vitepress/config.ts +0 -0
  46. {dirsql-0.4.6 → dirsql-0.4.7}/docs/.vitepress/theme/index.ts +0 -0
  47. {dirsql-0.4.6 → dirsql-0.4.7}/docs/.vitepress/theme/lang.ts +0 -0
  48. {dirsql-0.4.6 → dirsql-0.4.7}/docs/AGENTS.md +0 -0
  49. {dirsql-0.4.6 → dirsql-0.4.7}/docs/explanation.md +0 -0
  50. {dirsql-0.4.6 → dirsql-0.4.7}/docs/getting-started.md +0 -0
  51. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/columns-from-paths.md +0 -0
  52. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/define-tables.md +0 -0
  53. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/embed.md +0 -0
  54. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/extract-from-contents.md +0 -0
  55. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/load-extension.md +0 -0
  56. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/parse-files-into-columns.md +0 -0
  57. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/persist.md +0 -0
  58. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/query-without-config.md +0 -0
  59. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/react-to-changes.md +0 -0
  60. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/search-by-meaning.md +0 -0
  61. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/skip-files.md +0 -0
  62. {dirsql-0.4.6 → dirsql-0.4.7}/docs/howto/write-a-plugin.md +0 -0
  63. {dirsql-0.4.6 → dirsql-0.4.7}/docs/index.md +0 -0
  64. {dirsql-0.4.6 → dirsql-0.4.7}/docs/migrations.md +0 -0
  65. {dirsql-0.4.6 → dirsql-0.4.7}/docs/package.json +0 -0
  66. {dirsql-0.4.6 → dirsql-0.4.7}/docs/pnpm-lock.yaml +0 -0
  67. {dirsql-0.4.6 → dirsql-0.4.7}/docs/pnpm-workspace.yaml +0 -0
  68. {dirsql-0.4.6 → dirsql-0.4.7}/docs/reference/columns.md +0 -0
  69. {dirsql-0.4.6 → dirsql-0.4.7}/docs/reference/config.md +0 -0
  70. {dirsql-0.4.6 → dirsql-0.4.7}/docs/reference/hooks.md +0 -0
  71. {dirsql-0.4.6 → dirsql-0.4.7}/docs/reference/http-api.md +0 -0
  72. {dirsql-0.4.6 → dirsql-0.4.7}/docs/reference/sdk.md +0 -0
  73. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/CHANGELOG.md +0 -0
  74. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/MIGRATIONS.md +0 -0
  75. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/README.md +0 -0
  76. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  77. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  78. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  79. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  80. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  81. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  82. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  83. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  84. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  85. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  86. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  87. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  88. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/changelog.d/README.md +0 -0
  89. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/conftest.py +0 -0
  90. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/.claude/CLAUDE.md +0 -0
  91. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/.vitepress/config.ts +0 -0
  92. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  93. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  94. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/AGENTS.md +0 -0
  95. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/explanation.md +0 -0
  96. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/getting-started.md +0 -0
  97. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/columns-from-paths.md +0 -0
  98. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/define-tables.md +0 -0
  99. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/embed.md +0 -0
  100. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/extract-from-contents.md +0 -0
  101. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/load-extension.md +0 -0
  102. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  103. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/persist.md +0 -0
  104. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/query-without-config.md +0 -0
  105. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/react-to-changes.md +0 -0
  106. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/search-by-meaning.md +0 -0
  107. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/skip-files.md +0 -0
  108. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/howto/write-a-plugin.md +0 -0
  109. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/index.md +0 -0
  110. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/migrations.md +0 -0
  111. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/package.json +0 -0
  112. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/pnpm-lock.yaml +0 -0
  113. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/pnpm-workspace.yaml +0 -0
  114. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/reference/columns.md +0 -0
  115. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/reference/config.md +0 -0
  116. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/reference/hooks.md +0 -0
  117. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/reference/http-api.md +0 -0
  118. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/docs/reference/sdk.md +0 -0
  119. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/e2e-attestations/claude-710-accumulate-onfile.json +0 -0
  120. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/e2e-attestations/claude-714-unify-file-failures.json +0 -0
  121. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/e2e-attestations/claude-715-binding-scan-failures.json +0 -0
  122. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/e2e-attestations/claude-716-drop-regex.json +0 -0
  123. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  124. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  125. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  126. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  127. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  128. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  129. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  130. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  131. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/migrations.d/README.md +0 -0
  132. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/src/lib.rs +0 -0
  133. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/tests/__init__.py +0 -0
  134. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/tests/conftest.py +0 -0
  135. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/tests/e2e/__init__.py +0 -0
  136. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  137. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  138. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/tests/integration/__init__.py +0 -0
  139. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/tests/integration/binding/__init__.py +0 -0
  140. {dirsql-0.4.6 → dirsql-0.4.7}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  141. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/CHANGELOG.md +0 -0
  142. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/MIGRATIONS.md +0 -0
  143. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/README.md +0 -0
  144. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/benches/db_bench.rs +0 -0
  145. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/benches/differ_bench.rs +0 -0
  146. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/benches/matcher_bench.rs +0 -0
  147. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/benches/scanner_bench.rs +0 -0
  148. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-batch-ingest-transaction.md +0 -0
  149. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-chained-pre-post-query-hooks.md +0 -0
  150. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  151. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-fan-out-file-table-matching.md +0 -0
  152. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-persist-wal.md +0 -0
  153. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  154. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-repeatable-builder-config.md +0 -0
  155. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-repeatable-cli-config.md +0 -0
  156. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  157. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-13-subcommand-local-config-flags.md +0 -0
  158. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-19-path-table-query-fallback.md +0 -0
  159. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-19-path-table-vtab.md +0 -0
  160. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  161. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-20-path-table-glob-semantics.md +0 -0
  162. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-20-schema-inference.md +0 -0
  163. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-21-on-file-flag.md +0 -0
  164. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  165. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-23-init-escalation-example.md +0 -0
  166. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-23-query-default-cli.md +0 -0
  167. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  168. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  169. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-07-29-on-file-failures-accumulate.md +0 -0
  170. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-08-02-drop-regex.md +0 -0
  171. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-08-02-per-file-scan-failures.md +0 -0
  172. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/2026-08-02-release-profile.md +0 -0
  173. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/changelog.d/README.md +0 -0
  174. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/explanation.md +0 -0
  175. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/getting-started.md +0 -0
  176. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  177. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/define-tables.md +0 -0
  178. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/embed.md +0 -0
  179. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  180. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/load-extension.md +0 -0
  181. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  182. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/persist.md +0 -0
  183. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/query-without-config.md +0 -0
  184. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/react-to-changes.md +0 -0
  185. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  186. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/skip-files.md +0 -0
  187. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  188. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/index.md +0 -0
  189. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/migrations.md +0 -0
  190. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/reference/columns.md +0 -0
  191. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/reference/config.md +0 -0
  192. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/reference/hooks.md +0 -0
  193. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/reference/http-api.md +0 -0
  194. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/docs/reference/sdk.md +0 -0
  195. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  196. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-13-fan-out-file-table-matching.md +0 -0
  197. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-13-persist-wal.md +0 -0
  198. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  199. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  200. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-13-subcommand-local-config-flags.md +0 -0
  201. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  202. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-20-path-table-glob-semantics.md +0 -0
  203. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  204. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-23-init-escalation-example.md +0 -0
  205. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-23-query-default-cli.md +0 -0
  206. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  207. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  208. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/2026-08-02-per-file-scan-failures.md +0 -0
  209. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/migrations.d/README.md +0 -0
  210. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/cli/execute.rs +0 -0
  211. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/cli/init.rs +0 -0
  212. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/cli/mod.rs +0 -0
  213. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/cli/router.rs +0 -0
  214. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/cli/serialize.rs +0 -0
  215. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/cli/server.rs +0 -0
  216. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/command.rs +0 -0
  217. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/config.rs +0 -0
  218. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/default_config.toml +0 -0
  219. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/differ.rs +0 -0
  220. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/infer.rs +0 -0
  221. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/persist.rs +0 -0
  222. {dirsql-0.4.6 → dirsql-0.4.7}/packages/rust/src/watcher.rs +0 -0
  223. {dirsql-0.4.6 → dirsql-0.4.7}/pyproject.toml +0 -0
@@ -470,6 +470,7 @@ dependencies = [
470
470
  "futures-executor",
471
471
  "futures-util",
472
472
  "globset",
473
+ "ignore",
473
474
  "libc",
474
475
  "notify",
475
476
  "predicates",
@@ -499,7 +500,7 @@ dependencies = [
499
500
 
500
501
  [[package]]
501
502
  name = "dirsql-py-ext"
502
- version = "0.4.6"
503
+ version = "0.4.7"
503
504
  dependencies = [
504
505
  "dirsql",
505
506
  "pyo3",
@@ -1138,6 +1139,22 @@ dependencies = [
1138
1139
  "icu_properties",
1139
1140
  ]
1140
1141
 
1142
+ [[package]]
1143
+ name = "ignore"
1144
+ version = "0.4.32"
1145
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1146
+ checksum = "0b17771570a2b94107741a7b033f19132c2eee21d59d21b24d2ced26500bd66e"
1147
+ dependencies = [
1148
+ "crossbeam-deque",
1149
+ "globset",
1150
+ "log",
1151
+ "memchr",
1152
+ "regex-automata",
1153
+ "same-file",
1154
+ "walkdir",
1155
+ "winapi-util",
1156
+ ]
1157
+
1141
1158
  [[package]]
1142
1159
  name = "indexmap"
1143
1160
  version = "2.14.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.6
3
+ Version: 0.4.7
4
4
  Requires-Dist: tomli>=2 ; python_full_version < '3.11'
5
5
  Summary: Ephemeral SQL index over a local directory
6
6
  Keywords: sql,filesystem,directory,sqlite,index
@@ -69,6 +69,7 @@ Config flags are subcommand-local: pass them after `server`
69
69
  | `--host <addr>` | `localhost` | Bind address. |
70
70
  | `--port <n>` | `7117` | TCP port to bind. |
71
71
  | `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches at `<root>/.dirsql/cache.db`; `--persist <path>` caches at `<path>`. Off by default (the index is ephemeral). Also available on [`dirsql query`](#dirsql-query). See [Keep the index across restarts](../howto/persist.md). |
72
+ | `--no-ignore` | off | Scan files a `.gitignore` would hide. [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by default; this flag restores the full walk. The built-in skips (`node_modules`/`.git`) and configured `ignore` patterns still apply. Also available on [`dirsql query`](#dirsql-query). |
72
73
  | `--extension <path>` | none | Load a SQLite extension by literal path, overriding the config's `[[dirsql.extension]]` entries. Repeatable. Format: `<path>` or `<path>::<entrypoint>`. Internal plumbing for the pip/npm launchers, which resolve package-name extensions and pass the resolved paths here — not intended for direct use. When any `--extension` is present, the config file's own extension entries are not loaded. |
73
74
  | `--version` | | Print the version and exit. |
74
75
  | `--help` | | Print usage and exit. |
@@ -163,6 +164,8 @@ uses**, so behavior is identical to `POST /query` by construction:
163
164
  on-disk cache. Because its value is optional, place a bare `--persist` after
164
165
  the SQL (`dirsql query "SELECT …" --persist`) or use the `=` form
165
166
  (`--persist=/path`) so it does not swallow the SQL argument.
167
+ - **`--no-ignore`** is honored: path-tables in the query scan files a
168
+ `.gitignore` would hide. See [Skip rules](./path-tables.md#skip-rules).
166
169
  - **Hooks** ([`pre-query`](./hooks.md#pre-query) /
167
170
  [`post-query`](./hooks.md#post-query)) and the
168
171
  [`[dirsql].hook-timeout`](./config.md#dirsql-keys) apply identically.
@@ -179,19 +179,48 @@ A path-table scan applies the same [`ignore`](/reference/config) patterns your
179
179
  declared tables use, plus two built-in defaults so a zero-config
180
180
  `SELECT * FROM './'` does not drown in machinery:
181
181
 
182
- - `node_modules/**`
183
- - `.git/**`
182
+ - `**/node_modules/**`
183
+ - `**/.git/**`
184
+
185
+ Both apply at any depth, so a `node_modules` nested inside a subdirectory is
186
+ skipped just like one at the top.
187
+
188
+ ### `.gitignore`
189
+
190
+ Path-table scans also respect `.gitignore` files by default, the way fd and
191
+ ripgrep do: a `.gitignore` anywhere in the tree applies below its own
192
+ directory, deeper files override shallower ones, `!pattern` re-includes, and
193
+ an ignored directory is pruned rather than walked. In a typical repo this
194
+ excludes build output, virtualenvs, and caches with zero ceremony. No `.git`
195
+ directory is required — a `.gitignore` in any scanned directory counts — and
196
+ the built-in defaults above remain as a floor for directories with no
197
+ `.gitignore` at all.
198
+
199
+ Pass [`--no-ignore`](./cli.md#flags) to restore the full walk — the
200
+ determinism switch for scripted use, since results otherwise depend on
201
+ `.gitignore` state. It disables only the `.gitignore` respect; the built-in
202
+ defaults and configured `ignore` patterns still apply.
203
+
204
+ ### Naming a skipped directory
184
205
 
185
206
  Skip rules are judged on the part of the path *below* what you named outright,
186
- so pointing at a skipped directory still scans it:
207
+ so pointing at a skipped directory — built-in or gitignored — still scans it:
187
208
 
188
209
  ```sql
189
210
  SELECT path FROM './'; -- no node_modules rows
190
211
  SELECT path FROM './node_modules/*/package.json'; -- scans it anyway
212
+ SELECT path FROM './dist'; -- scans dist/ even when gitignored
191
213
  ```
192
214
 
193
- Dotfiles are ordinary files: `'./'` and `'./*'` include them. Add an `ignore`
194
- pattern if you would rather not see them.
215
+ A `.gitignore` at or below the directory you named still filters beneath it;
216
+ only rules inherited from above it are set aside.
217
+
218
+ ### Hidden files
219
+
220
+ Dotfiles are ordinary files: `'./'` and `'./*'` include them, with or without
221
+ `--no-ignore`. This is a deliberate divergence from fd/ripgrep — querying
222
+ dotfile directories (`.claude/`, …) is a first-class `dirsql` use case. Add an
223
+ `ignore` pattern if you would rather not see them.
195
224
 
196
225
  ## Joining against declared tables
197
226
 
@@ -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.6"
7
+ version = "0.4.7"
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
@@ -69,6 +69,7 @@ Config flags are subcommand-local: pass them after `server`
69
69
  | `--host <addr>` | `localhost` | Bind address. |
70
70
  | `--port <n>` | `7117` | TCP port to bind. |
71
71
  | `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches at `<root>/.dirsql/cache.db`; `--persist <path>` caches at `<path>`. Off by default (the index is ephemeral). Also available on [`dirsql query`](#dirsql-query). See [Keep the index across restarts](../howto/persist.md). |
72
+ | `--no-ignore` | off | Scan files a `.gitignore` would hide. [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by default; this flag restores the full walk. The built-in skips (`node_modules`/`.git`) and configured `ignore` patterns still apply. Also available on [`dirsql query`](#dirsql-query). |
72
73
  | `--extension <path>` | none | Load a SQLite extension by literal path, overriding the config's `[[dirsql.extension]]` entries. Repeatable. Format: `<path>` or `<path>::<entrypoint>`. Internal plumbing for the pip/npm launchers, which resolve package-name extensions and pass the resolved paths here — not intended for direct use. When any `--extension` is present, the config file's own extension entries are not loaded. |
73
74
  | `--version` | | Print the version and exit. |
74
75
  | `--help` | | Print usage and exit. |
@@ -163,6 +164,8 @@ uses**, so behavior is identical to `POST /query` by construction:
163
164
  on-disk cache. Because its value is optional, place a bare `--persist` after
164
165
  the SQL (`dirsql query "SELECT …" --persist`) or use the `=` form
165
166
  (`--persist=/path`) so it does not swallow the SQL argument.
167
+ - **`--no-ignore`** is honored: path-tables in the query scan files a
168
+ `.gitignore` would hide. See [Skip rules](./path-tables.md#skip-rules).
166
169
  - **Hooks** ([`pre-query`](./hooks.md#pre-query) /
167
170
  [`post-query`](./hooks.md#post-query)) and the
168
171
  [`[dirsql].hook-timeout`](./config.md#dirsql-keys) apply identically.
@@ -179,19 +179,48 @@ A path-table scan applies the same [`ignore`](/reference/config) patterns your
179
179
  declared tables use, plus two built-in defaults so a zero-config
180
180
  `SELECT * FROM './'` does not drown in machinery:
181
181
 
182
- - `node_modules/**`
183
- - `.git/**`
182
+ - `**/node_modules/**`
183
+ - `**/.git/**`
184
+
185
+ Both apply at any depth, so a `node_modules` nested inside a subdirectory is
186
+ skipped just like one at the top.
187
+
188
+ ### `.gitignore`
189
+
190
+ Path-table scans also respect `.gitignore` files by default, the way fd and
191
+ ripgrep do: a `.gitignore` anywhere in the tree applies below its own
192
+ directory, deeper files override shallower ones, `!pattern` re-includes, and
193
+ an ignored directory is pruned rather than walked. In a typical repo this
194
+ excludes build output, virtualenvs, and caches with zero ceremony. No `.git`
195
+ directory is required — a `.gitignore` in any scanned directory counts — and
196
+ the built-in defaults above remain as a floor for directories with no
197
+ `.gitignore` at all.
198
+
199
+ Pass [`--no-ignore`](./cli.md#flags) to restore the full walk — the
200
+ determinism switch for scripted use, since results otherwise depend on
201
+ `.gitignore` state. It disables only the `.gitignore` respect; the built-in
202
+ defaults and configured `ignore` patterns still apply.
203
+
204
+ ### Naming a skipped directory
184
205
 
185
206
  Skip rules are judged on the part of the path *below* what you named outright,
186
- so pointing at a skipped directory still scans it:
207
+ so pointing at a skipped directory — built-in or gitignored — still scans it:
187
208
 
188
209
  ```sql
189
210
  SELECT path FROM './'; -- no node_modules rows
190
211
  SELECT path FROM './node_modules/*/package.json'; -- scans it anyway
212
+ SELECT path FROM './dist'; -- scans dist/ even when gitignored
191
213
  ```
192
214
 
193
- Dotfiles are ordinary files: `'./'` and `'./*'` include them. Add an `ignore`
194
- pattern if you would rather not see them.
215
+ A `.gitignore` at or below the directory you named still filters beneath it;
216
+ only rules inherited from above it are set aside.
217
+
218
+ ### Hidden files
219
+
220
+ Dotfiles are ordinary files: `'./'` and `'./*'` include them, with or without
221
+ `--no-ignore`. This is a deliberate divergence from fd/ripgrep — querying
222
+ dotfile directories (`.claude/`, …) is a first-class `dirsql` use case. Add an
223
+ `ignore` pattern if you would rather not see them.
195
224
 
196
225
  ## Joining against declared tables
197
226
 
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1785774560,
4
+ "exit_code": 0,
5
+ "commit": "3559de42c86374f67ceeb7266a6867193234cec1",
6
+ "branch": "feat/742-gitignore-by-default"
7
+ }
@@ -55,6 +55,9 @@ clap = { version = "4", features = ["derive"], optional = true }
55
55
  futures = { version = "0.3", optional = true }
56
56
  futures-channel.workspace = true
57
57
  globset = "0.4"
58
+ # Hierarchical `.gitignore` matching for path-table scans (the fd/ripgrep
59
+ # semantics), without adopting its walker: the scan keeps `walkdir`.
60
+ ignore = "0.4"
58
61
  notify = "7"
59
62
  rusqlite = { version = "0.34", features = ["bundled", "load_extension", "hooks", "vtab"] }
60
63
  serde.workspace = true
@@ -0,0 +1,9 @@
1
+ **Changed** Path-table scans (`SELECT ... FROM './'`) now respect
2
+ `.gitignore` files by default, the way fd/ripgrep do: a `.gitignore` anywhere
3
+ in the tree applies below its own directory (hierarchically, `!pattern`
4
+ re-includes), and ignored directories are pruned rather than walked. No
5
+ `.git` directory is required. Hidden files are still scanned (deliberate
6
+ divergence from fd/rg), the built-in `node_modules`/`.git` defaults remain as
7
+ a floor, and naming a gitignored directory outright (`FROM './dist'`) still
8
+ scans it. The new CLI flag `--no-ignore` and Rust builder option
9
+ `DirSQLBuilder::no_ignore(bool)` restore the full walk. (#742)
@@ -0,0 +1,11 @@
1
+ **Fixed**
2
+
3
+ - **Path-table scans now skip `node_modules` and `.git` at any depth.** The
4
+ built-in `DEFAULT_IGNORES` were anchored at the table root
5
+ (`node_modules/**`, `.git/**`), so nested occurrences such as
6
+ `presentations/foo/node_modules/...` leaked into `SELECT ... FROM './'`
7
+ results. The defaults are now `**/node_modules/**` and `**/.git/**`, and
8
+ the directory walker prunes wholly-ignored directories during traversal
9
+ instead of filtering after the walk, so an ignored tree is never read at
10
+ all. Naming a skipped directory outright (e.g.
11
+ `FROM './apps/site/node_modules'`) still scans it, at any depth. (#741)
@@ -69,6 +69,7 @@ Config flags are subcommand-local: pass them after `server`
69
69
  | `--host <addr>` | `localhost` | Bind address. |
70
70
  | `--port <n>` | `7117` | TCP port to bind. |
71
71
  | `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches at `<root>/.dirsql/cache.db`; `--persist <path>` caches at `<path>`. Off by default (the index is ephemeral). Also available on [`dirsql query`](#dirsql-query). See [Keep the index across restarts](../howto/persist.md). |
72
+ | `--no-ignore` | off | Scan files a `.gitignore` would hide. [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by default; this flag restores the full walk. The built-in skips (`node_modules`/`.git`) and configured `ignore` patterns still apply. Also available on [`dirsql query`](#dirsql-query). |
72
73
  | `--extension <path>` | none | Load a SQLite extension by literal path, overriding the config's `[[dirsql.extension]]` entries. Repeatable. Format: `<path>` or `<path>::<entrypoint>`. Internal plumbing for the pip/npm launchers, which resolve package-name extensions and pass the resolved paths here — not intended for direct use. When any `--extension` is present, the config file's own extension entries are not loaded. |
73
74
  | `--version` | | Print the version and exit. |
74
75
  | `--help` | | Print usage and exit. |
@@ -163,6 +164,8 @@ uses**, so behavior is identical to `POST /query` by construction:
163
164
  on-disk cache. Because its value is optional, place a bare `--persist` after
164
165
  the SQL (`dirsql query "SELECT …" --persist`) or use the `=` form
165
166
  (`--persist=/path`) so it does not swallow the SQL argument.
167
+ - **`--no-ignore`** is honored: path-tables in the query scan files a
168
+ `.gitignore` would hide. See [Skip rules](./path-tables.md#skip-rules).
166
169
  - **Hooks** ([`pre-query`](./hooks.md#pre-query) /
167
170
  [`post-query`](./hooks.md#post-query)) and the
168
171
  [`[dirsql].hook-timeout`](./config.md#dirsql-keys) apply identically.
@@ -179,19 +179,48 @@ A path-table scan applies the same [`ignore`](/reference/config) patterns your
179
179
  declared tables use, plus two built-in defaults so a zero-config
180
180
  `SELECT * FROM './'` does not drown in machinery:
181
181
 
182
- - `node_modules/**`
183
- - `.git/**`
182
+ - `**/node_modules/**`
183
+ - `**/.git/**`
184
+
185
+ Both apply at any depth, so a `node_modules` nested inside a subdirectory is
186
+ skipped just like one at the top.
187
+
188
+ ### `.gitignore`
189
+
190
+ Path-table scans also respect `.gitignore` files by default, the way fd and
191
+ ripgrep do: a `.gitignore` anywhere in the tree applies below its own
192
+ directory, deeper files override shallower ones, `!pattern` re-includes, and
193
+ an ignored directory is pruned rather than walked. In a typical repo this
194
+ excludes build output, virtualenvs, and caches with zero ceremony. No `.git`
195
+ directory is required — a `.gitignore` in any scanned directory counts — and
196
+ the built-in defaults above remain as a floor for directories with no
197
+ `.gitignore` at all.
198
+
199
+ Pass [`--no-ignore`](./cli.md#flags) to restore the full walk — the
200
+ determinism switch for scripted use, since results otherwise depend on
201
+ `.gitignore` state. It disables only the `.gitignore` respect; the built-in
202
+ defaults and configured `ignore` patterns still apply.
203
+
204
+ ### Naming a skipped directory
184
205
 
185
206
  Skip rules are judged on the part of the path *below* what you named outright,
186
- so pointing at a skipped directory still scans it:
207
+ so pointing at a skipped directory — built-in or gitignored — still scans it:
187
208
 
188
209
  ```sql
189
210
  SELECT path FROM './'; -- no node_modules rows
190
211
  SELECT path FROM './node_modules/*/package.json'; -- scans it anyway
212
+ SELECT path FROM './dist'; -- scans dist/ even when gitignored
191
213
  ```
192
214
 
193
- Dotfiles are ordinary files: `'./'` and `'./*'` include them. Add an `ignore`
194
- pattern if you would rather not see them.
215
+ A `.gitignore` at or below the directory you named still filters beneath it;
216
+ only rules inherited from above it are set aside.
217
+
218
+ ### Hidden files
219
+
220
+ Dotfiles are ordinary files: `'./'` and `'./*'` include them, with or without
221
+ `--no-ignore`. This is a deliberate divergence from fd/ripgrep — querying
222
+ dotfile directories (`.claude/`, …) is a first-class `dirsql` use case. Add an
223
+ `ignore` pattern if you would rather not see them.
195
224
 
196
225
  ## Joining against declared tables
197
226
 
@@ -0,0 +1,52 @@
1
+ ### Path-table scans respect `.gitignore` by default
2
+
3
+ #### Summary
4
+
5
+ Path-table scans (`SELECT ... FROM './'`, `FROM '/abs/**'`, and the `--on-file`
6
+ parsed form) now respect `.gitignore` files by default — hierarchically, with
7
+ traversal pruning, like fd/ripgrep — in the Rust core and therefore in the CLI
8
+ and every SDK binding. A query over a repository returns fewer rows than
9
+ before when `.gitignore` names files or directories in the scanned tree. No
10
+ API signature changed; the opt-out is the new CLI flag `--no-ignore` and Rust
11
+ builder option `DirSQLBuilder::no_ignore(bool)`. Declared (config) tables are
12
+ unaffected.
13
+
14
+ #### Required changes
15
+
16
+ _None required for code._ To keep the previous full-walk behavior for a
17
+ path-table query:
18
+
19
+ | Surface | Before | After |
20
+ | ------- | ------ | ----- |
21
+ | CLI | `dirsql "SELECT * FROM './'"` (scanned gitignored files) | `dirsql "SELECT * FROM './'" --no-ignore` |
22
+ | Rust SDK | `DirSQL::builder().root(r).build()` (scanned gitignored files) | `DirSQL::builder().root(r).no_ignore(true).build()` |
23
+
24
+ #### Deprecations removed
25
+
26
+ _None._
27
+
28
+ #### Behavior changes without code changes
29
+
30
+ - Path-table scans: previously `.gitignore` files were not consulted, so
31
+ gitignored files (build output, virtualenvs, caches) appeared as rows; now
32
+ any `.gitignore` in the scanned tree excludes its matches below its own
33
+ directory and ignored directories are pruned. Row counts over repositories
34
+ shrink accordingly.
35
+ - Unchanged, for scoping: hidden files are still scanned; the built-in
36
+ `**/node_modules/**` / `**/.git/**` defaults and configured `ignore`
37
+ patterns still apply (also under `--no-ignore`); naming an ignored
38
+ directory outright (`FROM './dist'`) still scans it; declared tables and
39
+ watch events are not affected.
40
+
41
+ #### Verification
42
+
43
+ ```bash
44
+ mkdir -p /tmp/dirsql-gitignore-check/dist
45
+ printf 'dist/\n' > /tmp/dirsql-gitignore-check/.gitignore
46
+ touch /tmp/dirsql-gitignore-check/dist/bundle.js /tmp/dirsql-gitignore-check/app.js
47
+ cd /tmp/dirsql-gitignore-check
48
+ dirsql "SELECT path FROM './' ORDER BY path"
49
+ # expected: [{"path":".gitignore"},{"path":"app.js"}]
50
+ dirsql "SELECT path FROM './' ORDER BY path" --no-ignore
51
+ # expected: [{"path":".gitignore"},{"path":"app.js"},{"path":"dist/bundle.js"}]
52
+ ```
@@ -0,0 +1,46 @@
1
+ ### Default path-table ignores apply at any depth (#741)
2
+
3
+ #### Summary
4
+
5
+ The built-in path-table skip rules were anchored at the table root
6
+ (`node_modules/**`, `.git/**`), so a `node_modules` or `.git` nested below a
7
+ subdirectory leaked into path-table query results. The defaults are now
8
+ `**/node_modules/**` and `**/.git/**`, matching at any depth (globset's
9
+ `**/foo` also matches a top-level `foo`, so root-level behavior is
10
+ unchanged). No API signature changes — this changes query results only.
11
+
12
+ #### Required changes
13
+
14
+ _None._
15
+
16
+ #### Deprecations removed
17
+
18
+ _None._
19
+
20
+ #### Behavior changes without code changes
21
+
22
+ - Path-table scans (`FROM './'`, `FROM './dir'`, absolute and `~/` forms):
23
+ previously files under a *nested* `node_modules/` or `.git/` (e.g.
24
+ `apps/site/node_modules/pkg/index.js`) appeared in results; now they are
25
+ skipped like their top-level counterparts. Queries that relied on nested
26
+ `node_modules`/`.git` contents surfacing implicitly must name the
27
+ directory outright (`FROM './apps/site/node_modules'`), which still scans
28
+ it — the skip rules continue to apply only beneath the literal path you
29
+ write.
30
+ - The walker now prunes wholly-ignored directories during traversal instead
31
+ of filtering matches afterwards, so ignored trees are no longer read at
32
+ all. Results are identical apart from the nested-skip fix; large ignored
33
+ trees simply scan faster.
34
+
35
+ #### Verification
36
+
37
+ ```bash
38
+ mkdir -p /tmp/d741/sub/node_modules
39
+ echo x > /tmp/d741/sub/node_modules/x.txt
40
+ echo y > /tmp/d741/sub/real.txt
41
+ cd /tmp/d741
42
+ dirsql "SELECT path FROM './'"
43
+ # expected: [{"path":"sub/real.txt"}] (no node_modules row)
44
+ dirsql "SELECT path FROM './sub/node_modules'"
45
+ # expected: [{"path":"sub/node_modules/x.txt"}] (named outright, still scans)
46
+ ```
@@ -113,17 +113,24 @@ struct ConfigArgs {
113
113
  /// Off by default (ephemeral index).
114
114
  #[arg(long, num_args = 0..=1)]
115
115
  persist: Option<Option<PathBuf>>,
116
+
117
+ /// Scan files a `.gitignore` would hide. Path-tables respect `.gitignore`
118
+ /// files by default (hierarchically, like fd/ripgrep); this flag restores
119
+ /// the full walk. The built-in skips (`node_modules`/`.git`) and any
120
+ /// configured `ignore` patterns still apply.
121
+ #[arg(long = "no-ignore")]
122
+ no_ignore: bool,
116
123
  }
117
124
 
118
125
  impl ConfigArgs {
119
- /// Apply the `--persist [PATH]` flag to a builder. Absent no change;
120
- /// bare `--persist` → persist at the default location; `--persist <path>`
121
- /// → persist at `<path>`.
122
- fn apply_persist(&self, mut builder: dirsql::DirSQLBuilder) -> dirsql::DirSQLBuilder {
126
+ /// Apply the index-shaping flags to a builder: `--persist [PATH]` (absent
127
+ /// → no change; bare `--persist` → the default location; `--persist
128
+ /// <path>` that path) and `--no-ignore`.
129
+ fn apply_index_flags(&self, mut builder: dirsql::DirSQLBuilder) -> dirsql::DirSQLBuilder {
123
130
  if let Some(path) = &self.persist {
124
131
  builder = builder.persist(path.as_ref());
125
132
  }
126
- builder
133
+ builder.no_ignore(self.no_ignore)
127
134
  }
128
135
 
129
136
  /// The config paths passed via `-c`/`--config`. Empty when none were given
@@ -460,7 +467,7 @@ fn load_state(cfg: &ConfigArgs, path_table_parser: Option<String>) -> AppState {
460
467
  .extensions(parse_extension_specs(&cfg.extension))
461
468
  .suppress_config_extensions(true);
462
469
  }
463
- builder = cfg.apply_persist(builder);
470
+ builder = cfg.apply_index_flags(builder);
464
471
  // `--on-file` touches path-tables only: config `[[table]]` definitions keep
465
472
  // their own `on-file` hooks; a path-table named in the query gets this
466
473
  // parser regardless of any `-c`.
@@ -573,7 +580,7 @@ fn load_configless_state(cfg: &ConfigArgs, path_table_parser: Option<String>) ->
573
580
  }
574
581
  };
575
582
 
576
- let mut builder = cfg.apply_persist(DirSQL::builder().root(root));
583
+ let mut builder = cfg.apply_index_flags(DirSQL::builder().root(root));
577
584
  if let Some(command) = path_table_parser {
578
585
  builder = builder.path_table_parser(command);
579
586
  }
@@ -823,6 +830,23 @@ mod tests {
823
830
  );
824
831
  }
825
832
 
833
+ #[test]
834
+ fn no_ignore_flag_defaults_false() {
835
+ let cli = Cli::parse_from(["dirsql"]);
836
+ assert!(!cli.common.no_ignore);
837
+ }
838
+
839
+ #[test]
840
+ fn no_ignore_flag_sets_true_in_the_default_query_mode() {
841
+ let cli = Cli::parse_from(["dirsql", "SELECT 1", "--no-ignore"]);
842
+ assert!(cli.common.no_ignore);
843
+ }
844
+
845
+ #[test]
846
+ fn no_ignore_flag_parses_after_the_query_subcommand() {
847
+ assert!(query_common(&["dirsql", "query", "SELECT 1", "--no-ignore"]).no_ignore);
848
+ }
849
+
826
850
  #[test]
827
851
  fn persist_flag_parses_after_the_query_subcommand() {
828
852
  // Subcommand-local (#609); the flag sits after the positional SQL to