From 9557109a174a1515f37e311dc84f01cdd74b43bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 11 May 2026 00:49:39 +0300 Subject: [PATCH] feat(scripts): common.sh helpers (log_*, require_cmd, make_backup_dir) Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/lib/common.sh | 27 +++++++++++++++++++++++ scripts/tests/common-test.sh | 42 ++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 scripts/lib/common.sh create mode 100644 scripts/tests/common-test.sh diff --git a/scripts/lib/common.sh b/scripts/lib/common.sh new file mode 100644 index 0000000..edfa5af --- /dev/null +++ b/scripts/lib/common.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Shared helpers for brain scripts +# Source guard +[ -n "${__BRAIN_COMMON_LOADED:-}" ] && return 0 +__BRAIN_COMMON_LOADED=1 + +log_info() { printf "[INFO] %s\n" "$*" >&2; } +log_warn() { printf "[WARN] %s\n" "$*" >&2; } +log_error() { printf "[ERROR] %s\n" "$*" >&2; } + +require_cmd() { + local cmd="$1" + if ! command -v "$cmd" >/dev/null 2>&1; then + log_error "Required command not found: $cmd" + return 1 + fi + return 0 +} + +make_backup_dir() { + local target="$1" + local ts + ts=$(date +%Y%m%d-%H%M%S) + local backup="${target%/}/.brain-backup-${ts}" + mkdir -p "$backup" + printf "%s" "$backup" +} diff --git a/scripts/tests/common-test.sh b/scripts/tests/common-test.sh new file mode 100644 index 0000000..374565e --- /dev/null +++ b/scripts/tests/common-test.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# Tests for scripts/lib/common.sh +set -u +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +source "$SCRIPT_DIR/lib/common.sh" + +FAILURES=0 +assert_eq() { + local expected="$1" actual="$2" name="$3" + if [ "$expected" = "$actual" ]; then + echo "PASS: $name" + else + echo "FAIL: $name (expected '$expected', got '$actual')" + FAILURES=$((FAILURES + 1)) + fi +} + +# Test 1: log_info writes to stderr +output=$(log_info "test message" 2>&1 1>/dev/null) +case "$output" in + *"test message"*) assert_eq "ok" "ok" "log_info goes to stderr" ;; + *) assert_eq "ok" "fail" "log_info goes to stderr" ;; +esac + +# Test 2: require_cmd succeeds for existing command +require_cmd ls >/dev/null 2>&1 +assert_eq "0" "$?" "require_cmd ls returns 0" + +# Test 3: require_cmd fails for missing command +require_cmd this_command_definitely_does_not_exist_12345 >/dev/null 2>&1 +result=$? +[ "$result" -ne 0 ] && assert_eq "0" "0" "require_cmd missing returns non-zero" || assert_eq "0" "1" "require_cmd missing returns non-zero" + +# Test 4: make_backup_dir creates dir +tmpdir=$(mktemp -d) +backup=$(make_backup_dir "$tmpdir") +[ -d "$backup" ] && assert_eq "yes" "yes" "make_backup_dir creates directory" || assert_eq "yes" "no" "make_backup_dir creates directory" +rm -rf "$tmpdir" + +echo "---" +echo "Failures: $FAILURES" +exit $FAILURES