From 57e558ce13fae77eed07095638a753ba75af55d4 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 10 May 2026 14:17:25 -0500 Subject: refactor(system-lib): extract cj/process-output-or-error and cj/git-output-or-error from coverage-core Phase 2.3 of utility-consolidation. `cj/--coverage-git-string' was a generic argv-based runner ("run program, return stdout, raise user-error on non-zero with status+output in the message") trapped inside coverage-core. Lift the generic shape into `cj/process-output-or-error' and add `cj/git-output-or-error' as a one-line wrapper that supplies "git" as the program. Both live in system-lib.el. Future callers I have in mind: reconcile-open-repos shell-style git calls (the high-priority data-safety task), vc-config clipboard cloning, mail integrations that touch git for commit signatures. Six Normal/Boundary/Error tests cover success/no-args/non-zero-exit for the generic runner, the user-error message content (program name, exit status, trimmed output), and the git wrapper's program argument routing. Migrate coverage-core's `cj/--coverage-git-merge-base' and `cj/--coverage-git-diff' to call the new git wrapper. Drop the local `cj/--coverage-git-string' definition. Add `(require \='system-lib)' to coverage-core.el per the Phase 2 exit criterion. --- modules/coverage-core.el | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'modules/coverage-core.el') diff --git a/modules/coverage-core.el b/modules/coverage-core.el index 93979530..47e891e6 100644 --- a/modules/coverage-core.el +++ b/modules/coverage-core.el @@ -14,6 +14,7 @@ (require 'seq) (require 'subr-x) +(require 'system-lib) (defvar cj/coverage-backends nil "Registry of coverage backends in priority order. @@ -197,30 +198,17 @@ empty hash table. Malformed hunk headers are skipped silently." (forward-line 1))) result)) -(defun cj/--coverage-git-string (&rest args) - "Run git with ARGS and return its stdout as a string. -Signals `user-error' when git exits non-zero." - (with-temp-buffer - (let ((status (apply #'process-file "git" nil (current-buffer) nil args)) - (output (buffer-string))) - (unless (zerop status) - (user-error "git %s failed with status %s: %s" - (string-join args " ") - status - (string-trim output))) - output))) - (defun cj/--coverage-git-merge-base (base) "Return the merge-base between HEAD and BASE." (let ((merge-base (string-trim - (cj/--coverage-git-string "merge-base" "HEAD" base)))) + (cj/git-output-or-error "merge-base" "HEAD" base)))) (unless (not (string-empty-p merge-base)) (user-error "git merge-base HEAD %s returned no commit" base)) merge-base)) (defun cj/--coverage-git-diff (&rest args) "Return git diff output for ARGS plus --unified=0." - (apply #'cj/--coverage-git-string + (apply #'cj/git-output-or-error (append (list "diff") args (list "--unified=0")))) (defun cj/--coverage-changed-lines (scope &optional base) -- cgit v1.2.3