fix kcov errors
authorShane Jaroch <chown_tee@proton.me>
Fri, 16 Jan 2026 23:23:43 +0000 (18:23 -0500)
committerShane Jaroch <chown_tee@proton.me>
Fri, 16 Jan 2026 23:49:55 +0000 (18:49 -0500)
Makefile
tests/coverage_report.py
tests/test-install-logic.sh

index 1e82b44b2d082d253d5a00d2b6c0469bf88fc506..230644dce5b2de11828be7332992745d856e8b69 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -110,11 +110,14 @@ test/installer:   ##H Test installer logic
        @rm -rf $(COV_INSTALL)
        @mkdir -p $(COV_INSTALL)
        @export COV_DIR=$(COV_INSTALL); \
-        kcov --bash-handle-sh-invocation \
+        kcov --bash-dont-parse-binary-dir \
             --include-pattern=install.sh \
             --exclude-path=$(PWD)/.git,$(PWD)/tests \
             $(COV_INSTALL) \
-            ./tests/test-install-logic.sh
+            ./tests/test-install-logic.sh 2>&1 | tee .tmp/kcov.log; \
+        if grep -q 'kcov: error:' .tmp/kcov.log; then \
+            echo "FAIL: kcov errors detected (see above)"; exit 1; \
+        fi
 
 
 .PHONY: test/purity
@@ -170,7 +173,7 @@ test/cov:   ##H Show coverage gaps
 _test_cov_internal:
        @err=0; \
        $(call CHECK_COVERAGE,$(COV_SYSTEM),git-remote-gcrypt,56) || err=1; \
-       $(call CHECK_COVERAGE,$(COV_INSTALL),install.sh,78) || err=1; \
+       $(call CHECK_COVERAGE,$(COV_INSTALL),install.sh,84) || err=1; \
        exit $$err
 
 
index 77a5e115b6c946b790811d7e1e8d11f8e2c8467d..0dc89782a5ec013cc97e7342a08172ca0c0c9ef3 100644 (file)
@@ -27,7 +27,9 @@ total_lines = 0
 missed_lines = 0
 
 for c in tree.findall(".//class"):
-    if patt in c.get("filename", ""):
+    filename = c.get("filename", "")
+    # Use exact filename match, not substring (avoid "uninstall.sh" matching "install.sh")
+    if filename == patt or filename.endswith("/" + patt):
         for line in c.findall(".//line"):
             total_lines += 1
             if line.get("hits") == "0":
index b1effeb856ecf78c88c86bc14c664430cc726ed0..9bb21b061591c9936115f1abf6dfec2cf5debf6f 100755 (executable)
@@ -17,9 +17,9 @@ print_err() { printf "\033[1;31m[TEST] FAIL: %s\033[0m\n" "$1"; }
 
 print_info "Running install logic tests in $SANDBOX..."
 
-# 2. Symlink/Copy artifacts
-# Symlink core logic to help kcov find the source
-ln -s "$REPO_ROOT/install.sh" "$SANDBOX/install.sh"
+# 2. Copy/Symlink artifacts
+# Copy install.sh so kcov can track it correctly (symlinks confuse kcov)
+cp "$REPO_ROOT/install.sh" "$SANDBOX/install.sh"
 ln -s "$REPO_ROOT/git-remote-gcrypt" "$SANDBOX/git-remote-gcrypt"
 ln -s "$REPO_ROOT/utils" "$SANDBOX/utils"
 ln -s "$REPO_ROOT/completions" "$SANDBOX/completions"
@@ -141,11 +141,9 @@ echo "--- Test 5: Permission Failure (Simulated) ---"
 # Instead, we mock 'install' to fail, ensuring error paths are hit.
 SHADOW_BIN_FAIL="$SANDBOX/shadow_bin_install_fail"
 mkdir -p "$SHADOW_BIN_FAIL"
-cat >"$SHADOW_BIN_FAIL/install" <<EOF
-#!/bin/sh
-echo "Mock failure" >&2
-exit 1
-EOF
+echo '#!/bin/sh' >"$SHADOW_BIN_FAIL/install"
+echo 'echo "Mock failure" >&2' >>"$SHADOW_BIN_FAIL/install"
+echo 'exit 1' >>"$SHADOW_BIN_FAIL/install"
 chmod +x "$SHADOW_BIN_FAIL/install"
 
 if PATH="$SHADOW_BIN_FAIL:$PATH" prefix="$SANDBOX/usr" DESTDIR="" bash "$INSTALLER" >.install_log 2>&1; then
@@ -163,10 +161,8 @@ echo "--- Test 6: Missing rst2man ---"
 # Shadow rst2man in PATH
 SHADOW_BIN="$SANDBOX/shadow_bin"
 mkdir -p "$SHADOW_BIN"
-cat >"$SHADOW_BIN/rst2man" <<EOF
-#!/bin/sh
-exit 127
-EOF
+echo '#!/bin/sh' >"$SHADOW_BIN/rst2man"
+echo 'exit 127' >>"$SHADOW_BIN/rst2man"
 chmod +x "$SHADOW_BIN/rst2man"
 ln -sf "$SHADOW_BIN/rst2man" "$SHADOW_BIN/rst2man.py"
 
@@ -192,10 +188,8 @@ fi
 # We need to shadow 'uname' too
 SHADOW_BIN_OS="$SANDBOX/shadow_bin_os"
 mkdir -p "$SHADOW_BIN_OS"
-cat >"$SHADOW_BIN_OS/uname" <<EOF
-#!/bin/sh
-exit 127
-EOF
+echo '#!/bin/sh' >"$SHADOW_BIN_OS/uname"
+echo 'exit 127' >>"$SHADOW_BIN_OS/uname"
 chmod +x "$SHADOW_BIN_OS/uname"
 
 if PATH="$SHADOW_BIN_OS:$PATH" prefix="$SANDBOX/usr" DESTDIR="" OS_RELEASE_FILE="$SANDBOX/unknown" bash "$INSTALLER" >.install_log 2>&1; then