dirsql 0.3.88__tar.gz → 0.3.89__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 (137) hide show
  1. {dirsql-0.3.88 → dirsql-0.3.89}/Cargo.lock +1 -1
  2. {dirsql-0.3.88 → dirsql-0.3.89}/PKG-INFO +1 -1
  3. {dirsql-0.3.88/packages/python → dirsql-0.3.89}/docs/howto/extract-from-contents.md +1 -1
  4. {dirsql-0.3.88/packages/rust → dirsql-0.3.89}/docs/reference/hooks.md +2 -2
  5. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/Cargo.toml +1 -1
  6. {dirsql-0.3.88/packages/rust → dirsql-0.3.89/packages/python}/docs/howto/extract-from-contents.md +1 -1
  7. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/reference/hooks.md +2 -2
  8. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/e2e-attestation.json +2 -2
  9. {dirsql-0.3.88 → dirsql-0.3.89/packages/rust}/docs/howto/extract-from-contents.md +1 -1
  10. {dirsql-0.3.88 → dirsql-0.3.89/packages/rust}/docs/reference/hooks.md +2 -2
  11. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/lib.rs +32 -13
  12. {dirsql-0.3.88 → dirsql-0.3.89}/Cargo.toml +0 -0
  13. {dirsql-0.3.88 → dirsql-0.3.89}/README.md +0 -0
  14. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/__init__.py +0 -0
  15. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/_async.py +0 -0
  16. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/_dirsql.pyi +0 -0
  17. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/cli/__init__.py +0 -0
  18. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/cli/binary_path.py +0 -0
  19. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/cli/is_windows.py +0 -0
  20. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/cli/main.py +0 -0
  21. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/cli/resolve_config_extensions.py +0 -0
  22. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/py.typed +0 -0
  23. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/resolve_config_extensions.py +0 -0
  24. {dirsql-0.3.88 → dirsql-0.3.89}/dirsql/resolve_extension.py +0 -0
  25. {dirsql-0.3.88 → dirsql-0.3.89}/docs/.claude/CLAUDE.md +0 -0
  26. {dirsql-0.3.88 → dirsql-0.3.89}/docs/.vitepress/config.ts +0 -0
  27. {dirsql-0.3.88 → dirsql-0.3.89}/docs/.vitepress/theme/index.ts +0 -0
  28. {dirsql-0.3.88 → dirsql-0.3.89}/docs/.vitepress/theme/lang.ts +0 -0
  29. {dirsql-0.3.88 → dirsql-0.3.89}/docs/AGENTS.md +0 -0
  30. {dirsql-0.3.88 → dirsql-0.3.89}/docs/explanation.md +0 -0
  31. {dirsql-0.3.88 → dirsql-0.3.89}/docs/getting-started.md +0 -0
  32. {dirsql-0.3.88 → dirsql-0.3.89}/docs/howto/columns-from-paths.md +0 -0
  33. {dirsql-0.3.88 → dirsql-0.3.89}/docs/howto/define-tables.md +0 -0
  34. {dirsql-0.3.88 → dirsql-0.3.89}/docs/howto/embed.md +0 -0
  35. {dirsql-0.3.88 → dirsql-0.3.89}/docs/howto/load-extension.md +0 -0
  36. {dirsql-0.3.88 → dirsql-0.3.89}/docs/howto/persist.md +0 -0
  37. {dirsql-0.3.88 → dirsql-0.3.89}/docs/howto/react-to-changes.md +0 -0
  38. {dirsql-0.3.88 → dirsql-0.3.89}/docs/howto/search-by-meaning.md +0 -0
  39. {dirsql-0.3.88 → dirsql-0.3.89}/docs/howto/skip-files.md +0 -0
  40. {dirsql-0.3.88 → dirsql-0.3.89}/docs/index.md +0 -0
  41. {dirsql-0.3.88 → dirsql-0.3.89}/docs/migrations.md +0 -0
  42. {dirsql-0.3.88 → dirsql-0.3.89}/docs/package.json +0 -0
  43. {dirsql-0.3.88 → dirsql-0.3.89}/docs/playwright.config.ts +0 -0
  44. {dirsql-0.3.88 → dirsql-0.3.89}/docs/pnpm-lock.yaml +0 -0
  45. {dirsql-0.3.88 → dirsql-0.3.89}/docs/pnpm-workspace.yaml +0 -0
  46. {dirsql-0.3.88 → dirsql-0.3.89}/docs/reference/cli.md +0 -0
  47. {dirsql-0.3.88 → dirsql-0.3.89}/docs/reference/columns.md +0 -0
  48. {dirsql-0.3.88 → dirsql-0.3.89}/docs/reference/config.md +0 -0
  49. {dirsql-0.3.88 → dirsql-0.3.89}/docs/reference/http-api.md +0 -0
  50. {dirsql-0.3.88 → dirsql-0.3.89}/docs/reference/sdk.md +0 -0
  51. {dirsql-0.3.88 → dirsql-0.3.89}/docs/tests/integration/home.spec.ts +0 -0
  52. {dirsql-0.3.88 → dirsql-0.3.89}/docs/tests/integration/language-flag.spec.ts +0 -0
  53. {dirsql-0.3.88 → dirsql-0.3.89}/docs/tests/integration/sidebar.spec.ts +0 -0
  54. {dirsql-0.3.88 → dirsql-0.3.89}/docs/tests/unit/config.test.ts +0 -0
  55. {dirsql-0.3.88 → dirsql-0.3.89}/docs/tests/unit/lang.test.ts +0 -0
  56. {dirsql-0.3.88 → dirsql-0.3.89}/docs/vitest.config.ts +0 -0
  57. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/README.md +0 -0
  58. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/conftest.py +0 -0
  59. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/.claude/CLAUDE.md +0 -0
  60. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/.vitepress/config.ts +0 -0
  61. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  62. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  63. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/AGENTS.md +0 -0
  64. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/explanation.md +0 -0
  65. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/getting-started.md +0 -0
  66. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/howto/columns-from-paths.md +0 -0
  67. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/howto/define-tables.md +0 -0
  68. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/howto/embed.md +0 -0
  69. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/howto/load-extension.md +0 -0
  70. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/howto/persist.md +0 -0
  71. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/howto/react-to-changes.md +0 -0
  72. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/howto/search-by-meaning.md +0 -0
  73. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/howto/skip-files.md +0 -0
  74. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/index.md +0 -0
  75. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/migrations.md +0 -0
  76. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/package.json +0 -0
  77. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/playwright.config.ts +0 -0
  78. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/pnpm-lock.yaml +0 -0
  79. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/pnpm-workspace.yaml +0 -0
  80. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/reference/cli.md +0 -0
  81. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/reference/columns.md +0 -0
  82. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/reference/config.md +0 -0
  83. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/reference/http-api.md +0 -0
  84. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/reference/sdk.md +0 -0
  85. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/tests/integration/home.spec.ts +0 -0
  86. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/tests/integration/language-flag.spec.ts +0 -0
  87. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/tests/integration/sidebar.spec.ts +0 -0
  88. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/tests/unit/config.test.ts +0 -0
  89. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/tests/unit/lang.test.ts +0 -0
  90. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/docs/vitest.config.ts +0 -0
  91. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/src/lib.rs +0 -0
  92. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/tests/__init__.py +0 -0
  93. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/tests/conftest.py +0 -0
  94. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/tests/e2e/__init__.py +0 -0
  95. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/tests/integration/__init__.py +0 -0
  96. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/tests/integration/binding/__init__.py +0 -0
  97. {dirsql-0.3.88 → dirsql-0.3.89}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  98. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/Cargo.toml +0 -0
  99. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/README.md +0 -0
  100. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/benches/db_bench.rs +0 -0
  101. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/benches/differ_bench.rs +0 -0
  102. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/benches/matcher_bench.rs +0 -0
  103. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/benches/scanner_bench.rs +0 -0
  104. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/explanation.md +0 -0
  105. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/getting-started.md +0 -0
  106. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  107. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/howto/define-tables.md +0 -0
  108. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/howto/embed.md +0 -0
  109. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/howto/load-extension.md +0 -0
  110. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/howto/persist.md +0 -0
  111. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/howto/react-to-changes.md +0 -0
  112. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  113. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/howto/skip-files.md +0 -0
  114. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/index.md +0 -0
  115. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/migrations.md +0 -0
  116. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/reference/cli.md +0 -0
  117. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/reference/columns.md +0 -0
  118. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/reference/config.md +0 -0
  119. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/reference/http-api.md +0 -0
  120. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/docs/reference/sdk.md +0 -0
  121. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/bin/dirsql.rs +0 -0
  122. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/cli/execute.rs +0 -0
  123. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/cli/init.rs +0 -0
  124. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/cli/mod.rs +0 -0
  125. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/cli/router.rs +0 -0
  126. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/cli/serialize.rs +0 -0
  127. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/cli/server.rs +0 -0
  128. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/command.rs +0 -0
  129. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/config.rs +0 -0
  130. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/db.rs +0 -0
  131. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/default_config.toml +0 -0
  132. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/differ.rs +0 -0
  133. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/matcher.rs +0 -0
  134. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/persist.rs +0 -0
  135. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/scanner.rs +0 -0
  136. {dirsql-0.3.88 → dirsql-0.3.89}/packages/rust/src/watcher.rs +0 -0
  137. {dirsql-0.3.88 → dirsql-0.3.89}/pyproject.toml +0 -0
@@ -500,7 +500,7 @@ dependencies = [
500
500
 
501
501
  [[package]]
502
502
  name = "dirsql-py-ext"
503
- version = "0.3.88"
503
+ version = "0.3.89"
504
504
  dependencies = [
505
505
  "dirsql",
506
506
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.3.88
3
+ Version: 0.3.89
4
4
  Summary: Ephemeral SQL index over a local directory
5
5
  Keywords: sql,filesystem,directory,sqlite,index
6
6
  Author: Kevin Scott
@@ -23,7 +23,7 @@ glob = "books/*.json"
23
23
  on-file = "jq -c '[{title, author, year}]' {path}"
24
24
  ```
25
25
 
26
- `{path}` is the matched file, relative to the index root — one of the
26
+ `{path}` is the matched file's absolute path — one of the
27
27
  placeholders defined by the
28
28
  [command hook contract](../reference/hooks.md#on-file), which also covers
29
29
  the argv splitting, working directory, stdout protocol, and timeout shared
@@ -101,8 +101,8 @@ row-mapping rules.
101
101
 
102
102
  | Placeholder | Value |
103
103
  |---|---|
104
- | `{path}` | The matched file's path **relative to the index root**. `on-file = "extract.py {path}"` |
105
- | `{root}` | The index root directory. |
104
+ | `{path}` | The matched file's **absolute** path. `on-file = "extract.py {path}"` — self-sufficient from any working directory, so the command resolves it even when the config lives outside the index. |
105
+ | `{root}` | The index root directory. Derive a root-relative path with `relpath({path}, {root})`. |
106
106
 
107
107
  ### `pre-query`
108
108
 
@@ -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.3.88"
7
+ version = "0.3.89"
8
8
  # abi3 note: the `abi3-py311` pyo3 feature (below) builds ONE stable-ABI
9
9
  # `cp311-abi3` wheel per platform that loads on every CPython >= 3.11
10
10
  # (matching `pyproject.toml`'s `requires-python = ">=3.11"`), instead of
@@ -23,7 +23,7 @@ glob = "books/*.json"
23
23
  on-file = "jq -c '[{title, author, year}]' {path}"
24
24
  ```
25
25
 
26
- `{path}` is the matched file, relative to the index root — one of the
26
+ `{path}` is the matched file's absolute path — one of the
27
27
  placeholders defined by the
28
28
  [command hook contract](../reference/hooks.md#on-file), which also covers
29
29
  the argv splitting, working directory, stdout protocol, and timeout shared
@@ -101,8 +101,8 @@ row-mapping rules.
101
101
 
102
102
  | Placeholder | Value |
103
103
  |---|---|
104
- | `{path}` | The matched file's path **relative to the index root**. `on-file = "extract.py {path}"` |
105
- | `{root}` | The index root directory. |
104
+ | `{path}` | The matched file's **absolute** path. `on-file = "extract.py {path}"` — self-sufficient from any working directory, so the command resolves it even when the config lives outside the index. |
105
+ | `{root}` | The index root directory. Derive a root-relative path with `relpath({path}, {root})`. |
106
106
 
107
107
  ### `pre-query`
108
108
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "command": "uv run python -m pytest tests/e2e/ -x -q",
3
- "ran_at": 1783633566,
3
+ "ran_at": 1783636465,
4
4
  "exit_code": 0,
5
- "commit": "8c54e97f3b78c679885b4a2fd7b7d0f8a543001b"
5
+ "commit": "3b275ebe12b28777822a7dbcc9d8c155697106d7"
6
6
  }
@@ -23,7 +23,7 @@ glob = "books/*.json"
23
23
  on-file = "jq -c '[{title, author, year}]' {path}"
24
24
  ```
25
25
 
26
- `{path}` is the matched file, relative to the index root — one of the
26
+ `{path}` is the matched file's absolute path — one of the
27
27
  placeholders defined by the
28
28
  [command hook contract](../reference/hooks.md#on-file), which also covers
29
29
  the argv splitting, working directory, stdout protocol, and timeout shared
@@ -101,8 +101,8 @@ row-mapping rules.
101
101
 
102
102
  | Placeholder | Value |
103
103
  |---|---|
104
- | `{path}` | The matched file's path **relative to the index root**. `on-file = "extract.py {path}"` |
105
- | `{root}` | The index root directory. |
104
+ | `{path}` | The matched file's **absolute** path. `on-file = "extract.py {path}"` — self-sufficient from any working directory, so the command resolves it even when the config lives outside the index. |
105
+ | `{root}` | The index root directory. Derive a root-relative path with `relpath({path}, {root})`. |
106
106
 
107
107
  ### `pre-query`
108
108
 
@@ -992,8 +992,9 @@ impl DirSQLBuilder {
992
992
  };
993
993
  config_root = Some(resolved_root.clone());
994
994
 
995
- // `on-file` commands run in the config file's directory and compute
996
- // `{path}` relative to the resolved index root.
995
+ // `on-file` commands run in the config file's directory; `{path}`
996
+ // is the matched file's absolute path and `{root}` the resolved
997
+ // index root.
997
998
  let cfg_tables = build_tables_from_config(&cfg, &cfg_parent, &resolved_root)?;
998
999
  tables.extend(cfg_tables);
999
1000
  ignore.extend(cfg.ignore);
@@ -1379,7 +1380,7 @@ fn relative_path(root: &Path, path: &Path) -> String {
1379
1380
  /// array of row objects on stdout, which becomes the file's rows (filesystem
1380
1381
  /// facts are still merged on top, user values winning). `config_dir` is the
1381
1382
  /// command's working directory (the config file's parent) and `root` is the
1382
- /// resolved index root used to compute the `{path}` placeholder. Each run is
1383
+ /// resolved index root exposed as the `{root}` placeholder. Each run is
1383
1384
  /// bounded by the global `[dirsql].hook-timeout` key when present, falling
1384
1385
  /// back to [`command::DEFAULT_COMMAND_TIMEOUT`].
1385
1386
  fn build_tables_from_config(
@@ -1427,10 +1428,10 @@ fn build_tables_from_config(
1427
1428
  /// Run a table's `on-file` command for one matched file and parse its output
1428
1429
  /// into rows.
1429
1430
  ///
1430
- /// Placeholders: `{path}` (the file relative to `root`) and `{root}` (the
1431
- /// index root). `{path}` falls back to the absolute path when the file is not
1432
- /// under `root`. A template that omits a placeholder simply never receives its
1433
- /// value — nothing is appended.
1431
+ /// Placeholders: `{path}` (the file's absolute path) and `{root}` (the index
1432
+ /// root). An absolute `{path}` is self-sufficient from any cwd, so a hook whose
1433
+ /// config lives outside the index still resolves it. A template that omits a
1434
+ /// placeholder simply never receives its value — nothing is appended.
1434
1435
  ///
1435
1436
  /// Per-file isolation: any failure — a spawn/exit/timeout error from
1436
1437
  /// [`command::run_command`], or output that is not a JSON array of objects —
@@ -1444,13 +1445,8 @@ fn run_on_file(
1444
1445
  root: &Path,
1445
1446
  timeout: Duration,
1446
1447
  ) -> Vec<Row> {
1447
- let abs = Path::new(abs_path);
1448
- let rel = abs
1449
- .strip_prefix(root)
1450
- .map(|p| p.to_string_lossy().into_owned())
1451
- .unwrap_or_else(|_| abs_path.to_string());
1452
1448
  let placeholders = [
1453
- Placeholder::new("path", rel),
1449
+ Placeholder::new("path", abs_path),
1454
1450
  Placeholder::new("root", root.to_string_lossy().into_owned()),
1455
1451
  ];
1456
1452
 
@@ -2907,6 +2903,29 @@ mod internal_tests {
2907
2903
  assert_eq!(rows[0]["q"], Value::Text("{abspath}".into()));
2908
2904
  }
2909
2905
 
2906
+ /// `{path}` interpolates the matched file's **absolute** path (not a
2907
+ /// root-relative one). The command echoes its `{path}` argument back as a
2908
+ /// row value, and we assert it is byte-for-byte the absolute path even when
2909
+ /// the file sits directly under `root` (the case the old `strip_prefix`
2910
+ /// would have shortened to a bare relative path).
2911
+ #[test]
2912
+ fn run_on_file_passes_absolute_path_for_path_placeholder() {
2913
+ let dir = TempDir::new().unwrap();
2914
+ let abs = dir.path().join("f.txt");
2915
+ let rows = run_on_file(
2916
+ r#"sh -c "printf '[{\"p\":\"%s\"}]' \"$1\"" sh {path}"#,
2917
+ &abs.to_string_lossy(),
2918
+ dir.path(),
2919
+ dir.path(),
2920
+ command::DEFAULT_COMMAND_TIMEOUT,
2921
+ );
2922
+ assert_eq!(rows.len(), 1);
2923
+ assert_eq!(
2924
+ rows[0]["p"],
2925
+ Value::Text(abs.to_string_lossy().into_owned())
2926
+ );
2927
+ }
2928
+
2910
2929
  /// A command that cannot be spawned yields no rows (per-file isolation).
2911
2930
  #[test]
2912
2931
  fn run_on_file_returns_no_rows_on_spawn_failure() {
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes