diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-03 20:11:49 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-03 20:11:49 -0500 |
| commit | 570b91b74ac981d392f1724d6011d0558b7150c2 (patch) | |
| tree | cc0f1a97309e5a4ce798f2fee974dcf749640900 /tests/test-coverage-core--command.el | |
| parent | f3d50d1b2aea4f1eda436c54a15cc18596f2df0b (diff) | |
| download | dotemacs-570b91b74ac981d392f1724d6011d0558b7150c2.tar.gz dotemacs-570b91b74ac981d392f1724d6011d0558b7150c2.zip | |
refactor: invoke git via argv in coverage diff helpers
`coverage-core.el` was running git through `shell-command-to-string`, which has two practical problems for central tooling: shell parsing surfaces (especially the `$(git merge-base ...)` substitution), and silent failure modes when git exits non-zero (the bad output just becomes empty parse results).
I extracted three small helpers. `cj/--coverage-git-string` runs git via `process-file` against a temp buffer and signals `user-error` on non-zero exit, with the argv, status, and trimmed output included. `cj/--coverage-git-merge-base` does its own `git merge-base HEAD <base>` invocation. `cj/--coverage-git-diff` is the diff wrapper that always appends `--unified=0`.
`cj/--coverage-changed-lines` now uses `pcase` over the scope symbol and composes the helpers. Branch-vs-main and branch-vs-parent compute the merge-base in a separate call before running `git diff <merge-base>..HEAD`, with no shell substitution involved.
One behavior change is worth flagging. A git failure used to disappear into an empty hash table. It now signals a `user-error` with the failing command, exit status, and git's stderr output.
Tests: I added two argv-boundary cases (working-tree and branch-vs-parent both assert the exact argv list seen) plus a non-zero-exit case that asserts the user-error path. The existing `test-coverage-core--command.el` smoke test gets its `shell-command-to-string` stub upgraded to a `process-file` stub.
Diffstat (limited to 'tests/test-coverage-core--command.el')
| -rw-r--r-- | tests/test-coverage-core--command.el | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/tests/test-coverage-core--command.el b/tests/test-coverage-core--command.el index d7b2c1cc..274938c8 100644 --- a/tests/test-coverage-core--command.el +++ b/tests/test-coverage-core--command.el @@ -66,8 +66,11 @@ uncovered-line markers." (cj/coverage-register-backend test-backend) (cl-letf (((symbol-function 'completing-read) (lambda (&rest _) "Staged — about to commit")) - ((symbol-function 'shell-command-to-string) - (lambda (_) diff-output)) + ((symbol-function 'process-file) + (lambda (_program _infile destination _display &rest _args) + (with-current-buffer destination + (insert diff-output)) + 0)) ((symbol-function 'cj/--coverage-project-root) (lambda () tmp-root)) ((symbol-function 'display-buffer) #'identity)) |
