@sebastienrousseau/dotfiles 0.2.481 → 0.2.499
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.
- package/docs/ARCHITECTURE.md +29 -196
- package/docs/COMPLIANCE.md +10 -10
- package/docs/COPYRIGHT +3 -4
- package/docs/OPERATIONS.md +38 -65
- package/docs/PLAN.md +3 -3
- package/docs/PR_DESCRIPTION.md +85 -84
- package/docs/ROADMAP.md +11 -11
- package/docs/ROADMAP_legacy.md +556 -0
- package/docs/SECURITY_CHECKLIST.md +1 -1
- package/docs/TASK.md +4 -4
- package/docs/WALKTHROUGH.md +33 -152
- package/package.json +17 -5
- package/scripts/backup.sh +142 -0
- package/scripts/banner.sh +20 -0
- package/scripts/benchmark.sh +20 -0
- package/scripts/build.sh +41 -0
- package/scripts/clean.sh +31 -0
- package/scripts/compile.sh +54 -0
- package/scripts/copy.sh +108 -0
- package/scripts/{tools/detect-collisions.py → detect-collisions.py} +1 -1
- package/scripts/doctor.sh +79 -0
- package/scripts/dotfiles.sh +63 -0
- package/scripts/download.sh +35 -0
- package/scripts/help.sh +57 -0
- package/scripts/lock-configs.sh +57 -0
- package/scripts/package.sh +46 -0
- package/scripts/ssh.sh +55 -0
- package/scripts/teleport.sh +23 -0
- package/scripts/{tests/test-aliases.sh → test-aliases.sh} +3 -3
- package/scripts/test_smoke.sh +88 -0
- package/scripts/unpack.sh +28 -0
- package/scripts/{diagnostics/verify_state.sh → verify_state.sh} +21 -21
- package/templates/projects/go/README.md +0 -4
- package/templates/projects/node/README.md +0 -4
- package/templates/projects/python/README.md +0 -4
- package/templates/projects/python/pyproject.toml +0 -15
- package/CHANGELOG.md +0 -285
- package/LICENSE +0 -1283
- package/README.md +0 -315
- package/docs/ALIASES.md +0 -128
- package/docs/FEATURES.md +0 -166
- package/docs/FONTS.md +0 -147
- package/docs/INSTALL.md +0 -119
- package/docs/KEYS.md +0 -40
- package/docs/KEY_ROTATION.md +0 -219
- package/docs/LEGACY_ROADMAP.md +0 -142
- package/docs/NEOVIM_IDE_GUIDE.md +0 -52
- package/docs/README.md +0 -269
- package/docs/REPO_AUDIT.md +0 -23
- package/docs/SCREENSHOTS.md +0 -116
- package/docs/SECRETS.md +0 -76
- package/docs/SECURITY.md +0 -30
- package/docs/TESTING.md +0 -190
- package/docs/TOOLS.md +0 -146
- package/docs/TROUBLESHOOTING.md +0 -112
- package/docs/UTILS.md +0 -105
- package/docs/WSL2_NIX_TROUBLESHOOTING.md +0 -723
- package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -101
- package/docs/adr/ADR-002-shell-performance.md +0 -121
- package/docs/adr/ADR-003-security-first.md +0 -140
- package/docs/adr/ADR-004-cli-architecture.md +0 -157
- package/docs/adr/ADR-005-chezmoi-choice.md +0 -89
- package/docs/adr/ADR-006-shell-selection.md +0 -115
- package/docs/adr/README.md +0 -33
- package/docs/themes/README.md +0 -20
- package/dot_config/aider/aider.conf.yml +0 -32
- package/dot_config/alacritty/alacritty.toml.tmpl +0 -483
- package/dot_config/ansible/ansible.cfg.tmpl +0 -11
- package/dot_config/atuin/config.toml +0 -23
- package/dot_config/bat/config +0 -8
- package/dot_config/brave-flags.conf.tmpl +0 -7
- package/dot_config/btop/btop.conf +0 -16
- package/dot_config/btop/themes/tokyonight.theme +0 -34
- package/dot_config/bun/bunfig.toml.tmpl +0 -33
- package/dot_config/claude/mcp_servers.json +0 -49
- package/dot_config/clippy.toml +0 -55
- package/dot_config/containers/containers.conf +0 -14
- package/dot_config/curl/dot_curlrc +0 -18
- package/dot_config/dlv/config.yml +0 -39
- package/dot_config/docker/config.json.tmpl +0 -15
- package/dot_config/dotfiles/boot/README.md +0 -11
- package/dot_config/dotfiles/grub/README.md +0 -11
- package/dot_config/dotfiles/lock/README.md +0 -11
- package/dot_config/dotfiles/versions.env.tmpl +0 -19
- package/dot_config/duf/duf.conf +0 -6
- package/dot_config/duti/defaults.duti +0 -5
- package/dot_config/emoji/emoji.txt +0 -34
- package/dot_config/fastfetch/config.jsonc +0 -28
- package/dot_config/firefox/user.js +0 -8
- package/dot_config/flatpak/flatpak.list +0 -4
- package/dot_config/fontconfig/fonts.conf.tmpl +0 -44
- package/dot_config/gem/gemrc +0 -9
- package/dot_config/gh/config.yml +0 -12
- package/dot_config/ghostty/config.tmpl +0 -661
- package/dot_config/git/attributes +0 -12
- package/dot_config/git/config.tmpl +0 -77
- package/dot_config/git/ignore +0 -27
- package/dot_config/gnupg/gpg-agent.conf.tmpl +0 -11
- package/dot_config/go/aliases.sh +0 -61
- package/dot_config/go/env.sh +0 -24
- package/dot_config/go/golangci.yml +0 -118
- package/dot_config/go/gopls.json +0 -30
- package/dot_config/goose/config.yaml +0 -29
- package/dot_config/gtk-3.0/gtk.css.tmpl +0 -305
- package/dot_config/gtk-3.0/settings.ini.tmpl +0 -66
- package/dot_config/gtk-4.0/gtk.css.tmpl +0 -309
- package/dot_config/gtk-4.0/settings.ini.tmpl +0 -21
- package/dot_config/htop/htoprc +0 -20
- package/dot_config/ice/README.md +0 -13
- package/dot_config/inputrc +0 -2
- package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
- package/dot_config/just/justfile +0 -104
- package/dot_config/k9s/config.yaml.tmpl +0 -65
- package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
- package/dot_config/karabiner/karabiner.json +0 -14
- package/dot_config/kitty/kitty.conf.tmpl +0 -517
- package/dot_config/lazydocker/config.yml +0 -186
- package/dot_config/lazygit/config.yml +0 -23
- package/dot_config/lsd/config.yaml +0 -19
- package/dot_config/mas/masapps.txt +0 -5
- package/dot_config/minikube/config.json +0 -13
- package/dot_config/mise/config.toml +0 -41
- package/dot_config/mongosh/mongoshrc.js +0 -67
- package/dot_config/mycli/myclirc +0 -67
- package/dot_config/nano/nanorc +0 -28
- package/dot_config/ncdu/config +0 -12
- package/dot_config/nvim/init.lua +0 -4
- package/dot_config/nvim/lazy-lock.json +0 -27
- package/dot_config/nvim/lua/config/autocmds.lua +0 -63
- package/dot_config/nvim/lua/config/keymaps.lua +0 -87
- package/dot_config/nvim/lua/config/lazy.lua +0 -34
- package/dot_config/nvim/lua/config/options.lua +0 -48
- package/dot_config/nvim/lua/plugins/coding.lua +0 -234
- package/dot_config/nvim/lua/plugins/dap.lua +0 -201
- package/dot_config/nvim/lua/plugins/editor.lua +0 -59
- package/dot_config/nvim/lua/plugins/git.lua +0 -9
- package/dot_config/nvim/lua/plugins/lsp.lua +0 -221
- package/dot_config/nvim/lua/plugins/markdown.lua +0 -17
- package/dot_config/nvim/lua/plugins/rust.lua +0 -33
- package/dot_config/nvim/lua/plugins/sessions.lua +0 -32
- package/dot_config/nvim/lua/plugins/ui.lua +0 -537
- package/dot_config/nvim/snippets/all.lua +0 -9
- package/dot_config/nvim/snippets/python.lua +0 -16
- package/dot_config/pip/pip.conf.tmpl +0 -32
- package/dot_config/pypoetry/config.toml.tmpl +0 -6
- package/dot_config/pyrightconfig.json.tmpl +0 -5
- package/dot_config/raycast/README.md +0 -13
- package/dot_config/redis/redisclirc +0 -41
- package/dot_config/shell/00-container-detect.sh +0 -53
- package/dot_config/shell/00-core-paths.sh.tmpl +0 -95
- package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
- package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
- package/dot_config/shell/50-logic-functions.sh.tmpl +0 -10
- package/dot_config/shell/90-theme-switch.sh +0 -70
- package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -35
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -23
- package/dot_config/shell/Brewfile +0 -207
- package/dot_config/shell/Brewfile.cask +0 -92
- package/dot_config/shell/Brewfile.cli +0 -119
- package/dot_config/shell/README.md +0 -267
- package/dot_config/shell/custom/context_suggest.zsh +0 -68
- package/dot_config/shell/custom/error_analysis.zsh +0 -45
- package/dot_config/sops/dot_sops.yaml +0 -23
- package/dot_config/starship.toml.tmpl +0 -124
- package/dot_config/task/Taskfile.yml +0 -86
- package/dot_config/tflint/tflint.hcl.tmpl +0 -9
- package/dot_config/tmux/tmux.conf.tmpl +0 -181
- package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
- package/dot_config/vscode/extensions.txt +0 -11
- package/dot_config/vscode/settings.json.tmpl +0 -123
- package/dot_config/waybar/style.css +0 -8
- package/dot_config/wezterm/wezterm.lua.tmpl +0 -236
- package/dot_config/wget/wgetrc +0 -12
- package/dot_config/yarn/yarnrc.yml.tmpl +0 -36
- package/dot_config/yazi/yazi.toml +0 -40
- package/dot_config/zellij/config.kdl +0 -79
- package/dot_config/zsh/dot_zprofile +0 -13
- package/dot_config/zsh/dot_zshenv +0 -6
- package/dot_config/zsh/dot_zshrc.tmpl +0 -199
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -5
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
- package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -123
- package/dot_config/zsh/rc.d/40-bell.zsh.tmpl +0 -20
- package/dot_config/zsh/rc.d/50-login-fortune.zsh.tmpl +0 -9
- package/dot_local/bin/executable_ai_core +0 -130
- package/dot_local/bin/executable_b64 +0 -59
- package/dot_local/bin/executable_dot +0 -178
- package/dot_local/bin/executable_dot_completion +0 -55
- package/dot_local/bin/executable_epoch +0 -62
- package/dot_local/bin/executable_extract +0 -108
- package/dot_local/bin/executable_git-ai-commit +0 -160
- package/dot_local/bin/executable_git-ai-diff +0 -154
- package/dot_local/bin/executable_hash +0 -123
- package/dot_local/bin/executable_hex +0 -79
- package/dot_local/bin/executable_ip +0 -37
- package/dot_local/bin/executable_jsonv +0 -54
- package/dot_local/bin/executable_jwt +0 -78
- package/dot_local/bin/executable_kill-port +0 -59
- package/dot_local/bin/executable_lorem +0 -103
- package/dot_local/bin/executable_regex +0 -96
- package/dot_local/bin/executable_tmux-sessionizer +0 -187
- package/dot_local/bin/executable_tour +0 -137
- package/dot_local/bin/executable_update +0 -108
- package/dot_local/bin/executable_uuid +0 -57
- package/dot_local/bin/executable_yamlv +0 -39
- package/dot_local/bin/executable_zig-install +0 -89
- package/dot_local/bin/voice_ops +0 -7
- package/dot_local/share/bash-completion/completions/dot +0 -54
- package/dot_local/share/zsh/completions/.keep +0 -0
- package/install.sh +0 -255
- package/scripts/ci/validate-ci-config.sh +0 -222
- package/scripts/demo/record.sh +0 -41
- package/scripts/diagnostics/benchmark.sh +0 -201
- package/scripts/diagnostics/doctor.sh +0 -115
- package/scripts/diagnostics/drift-dashboard.sh +0 -26
- package/scripts/diagnostics/health.sh +0 -356
- package/scripts/diagnostics/history-analysis.sh +0 -77
- package/scripts/diagnostics/security-score.sh +0 -392
- package/scripts/dot/commands/appearance.sh +0 -63
- package/scripts/dot/commands/core.sh +0 -130
- package/scripts/dot/commands/diagnostics.sh +0 -100
- package/scripts/dot/commands/meta.sh +0 -117
- package/scripts/dot/commands/restore.sh +0 -209
- package/scripts/dot/commands/secrets.sh +0 -81
- package/scripts/dot/commands/security.sh +0 -73
- package/scripts/dot/commands/tools.sh +0 -228
- package/scripts/dot/lib/utils.sh +0 -72
- package/scripts/fonts/install-nerd-fonts.sh +0 -59
- package/scripts/fonts/patch-fonts.sh +0 -34
- package/scripts/ops/chezmoi-apply.sh +0 -42
- package/scripts/ops/chezmoi-diff.sh +0 -14
- package/scripts/ops/chezmoi-remove.sh +0 -43
- package/scripts/ops/chezmoi-update.sh +0 -16
- package/scripts/ops/heal.sh +0 -466
- package/scripts/ops/health-check.sh +0 -380
- package/scripts/ops/rollback.sh +0 -531
- package/scripts/ops/teleport.sh +0 -32
- package/scripts/secrets/age-init.sh +0 -69
- package/scripts/secrets/create-secrets-file.sh +0 -44
- package/scripts/secrets/encrypt-ssh-key.sh +0 -42
- package/scripts/security/backup.sh +0 -17
- package/scripts/security/dns-doh.sh +0 -29
- package/scripts/security/encryption-check.sh +0 -39
- package/scripts/security/enforce-policies.sh +0 -339
- package/scripts/security/firewall.sh +0 -34
- package/scripts/security/lock-configs.sh +0 -57
- package/scripts/security/lock-screen.sh +0 -33
- package/scripts/security/manage-secrets.sh +0 -415
- package/scripts/security/telemetry-kill.sh +0 -28
- package/scripts/security/usb-safety.sh +0 -29
- package/scripts/tests/README.md +0 -241
- package/scripts/tests/benchmark.sh +0 -91
- package/scripts/tests/framework/assertions.sh +0 -283
- package/scripts/tests/framework/mocks.sh +0 -201
- package/scripts/tests/framework/test_runner.sh +0 -189
- package/scripts/tests/integration/test_install.sh +0 -237
- package/scripts/tests/performance/benchmark_runner.sh +0 -156
- package/scripts/tests/performance/regression_check.sh +0 -73
- package/scripts/tests/performance/stress_test.sh +0 -65
- package/scripts/tests/test-docker.sh +0 -48
- package/scripts/tests/unit/test_ai_aliases.sh +0 -158
- package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
- package/scripts/tests/unit/test_backup.sh +0 -227
- package/scripts/tests/unit/test_case_functions.sh +0 -238
- package/scripts/tests/unit/test_cd_aliases.sh +0 -367
- package/scripts/tests/unit/test_dot_cli.sh +0 -217
- package/scripts/tests/unit/test_encode64.sh +0 -67
- package/scripts/tests/unit/test_environment.sh +0 -78
- package/scripts/tests/unit/test_extract.sh +0 -163
- package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
- package/scripts/tests/unit/test_genpass.sh +0 -298
- package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
- package/scripts/tests/unit/test_installers.sh +0 -172
- package/scripts/tests/unit/test_keygen.sh +0 -68
- package/scripts/tests/unit/test_logging.sh +0 -96
- package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
- package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
- package/scripts/tests/unit/test_prependpath.sh +0 -66
- package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
- package/scripts/tests/unit/test_rd.sh +0 -230
- package/scripts/tests/unit/test_security_fixes.sh +0 -130
- package/scripts/tests/unit/test_security_scripts.sh +0 -87
- package/scripts/tests/unit/test_template_validation.sh +0 -238
- package/scripts/tests/unit/test_utility_functions.sh +0 -144
- package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
- package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
- package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
- package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
- package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
- package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
- package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
- package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
- package/scripts/tests/unit/test_zipf.sh +0 -76
- package/scripts/theme/apply-gnome-theme.sh +0 -297
- package/scripts/theme/install-boot-logo.sh +0 -61
- package/scripts/theme/install-catppuccin-themes.sh +0 -346
- package/scripts/theme/install-cursors.sh +0 -24
- package/scripts/theme/install-file-icons.sh +0 -25
- package/scripts/theme/install-grub-theme.sh +0 -51
- package/scripts/theme/install-lock-icon.sh +0 -29
- package/scripts/theme/switch.sh +0 -250
- package/scripts/theme/wallpaper-rotate.sh +0 -82
- package/scripts/theme/wallpaper-sync.sh +0 -42
- package/scripts/tools/cmatrix.sh +0 -20
- package/scripts/tools/emoji-picker.sh +0 -45
- package/scripts/tools/figlet-banner.sh +0 -17
- package/scripts/tools/log-rotate.sh +0 -29
- package/scripts/tools/lolcat-wrap.sh +0 -18
- package/scripts/tools/pipes.sh +0 -47
- package/scripts/tuning/linux.sh +0 -175
- package/scripts/tuning/macos.sh +0 -46
- package/templates/projects/molecule/README.md +0 -7
- package/templates/projects/molecule/converge.yml +0 -7
- package/templates/projects/molecule/molecule.yml +0 -16
- package/templates/projects/packer/README.md +0 -15
- package/templates/projects/packer/main.pkr.hcl +0 -15
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
# standard-benchmarks.sh
|
|
4
|
-
# Measures shell startup time (total and per-component).
|
|
5
|
-
# Optional threshold enforcement via DOTFILES_BENCH_MAX_MS.
|
|
6
|
-
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
|
|
9
|
-
log_info() { echo -e "\n[INFO] $*"; }
|
|
10
|
-
|
|
11
|
-
MAX_MS="${DOTFILES_BENCH_MAX_MS:-}"
|
|
12
|
-
|
|
13
|
-
# ── Section 1: Total startup benchmark ──────────────────────────
|
|
14
|
-
log_info "=== Total Startup Benchmark ==="
|
|
15
|
-
|
|
16
|
-
if command -v hyperfine >/dev/null; then
|
|
17
|
-
log_info "Running benchmark with hyperfine..."
|
|
18
|
-
tmp_json="$(mktemp)"
|
|
19
|
-
hyperfine --warmup 3 --min-runs 10 --export-json "$tmp_json" "zsh -i -c exit"
|
|
20
|
-
|
|
21
|
-
if [[ -n "$MAX_MS" ]] && command -v python3 >/dev/null; then
|
|
22
|
-
python3 - "$tmp_json" "$MAX_MS" <<'PY'
|
|
23
|
-
import json, sys
|
|
24
|
-
path, max_ms = sys.argv[1], float(sys.argv[2])
|
|
25
|
-
with open(path, "r", encoding="utf-8") as f:
|
|
26
|
-
data = json.load(f)
|
|
27
|
-
mean_s = data["results"][0]["mean"]
|
|
28
|
-
mean_ms = mean_s * 1000.0
|
|
29
|
-
print(f"[INFO] Mean startup: {mean_ms:.1f} ms (limit: {max_ms:.1f} ms)")
|
|
30
|
-
if mean_ms > max_ms:
|
|
31
|
-
print(f"[FAIL] Startup time exceeded limit: {mean_ms:.1f} ms > {max_ms:.1f} ms")
|
|
32
|
-
sys.exit(1)
|
|
33
|
-
PY
|
|
34
|
-
fi
|
|
35
|
-
rm -f "$tmp_json"
|
|
36
|
-
else
|
|
37
|
-
log_info "Hyperfine not found. Using simple loop..."
|
|
38
|
-
echo "Running 10 iterations of 'zsh -i -c exit'..."
|
|
39
|
-
for _ in {1..10}; do
|
|
40
|
-
time zsh -i -c exit
|
|
41
|
-
done
|
|
42
|
-
fi
|
|
43
|
-
|
|
44
|
-
# ── Section 2: Component-level profiling ────────────────────────
|
|
45
|
-
log_info "=== Component-Level Profile ==="
|
|
46
|
-
log_info "Profiling individual zshrc components via zsh/zprof..."
|
|
47
|
-
|
|
48
|
-
# Use zsh's built-in zprof module if available
|
|
49
|
-
if command -v zsh >/dev/null; then
|
|
50
|
-
zsh -c '
|
|
51
|
-
zmodload zsh/zprof 2>/dev/null
|
|
52
|
-
# Source the real zshrc (DOTFILES_SOURCED guard is reset in a fresh shell)
|
|
53
|
-
[[ -f "$HOME/.zshrc" ]] && source "$HOME/.zshrc"
|
|
54
|
-
zprof
|
|
55
|
-
' 2>/dev/null | head -40
|
|
56
|
-
|
|
57
|
-
echo ""
|
|
58
|
-
log_info "Component timing (manual measurement):"
|
|
59
|
-
|
|
60
|
-
# Measure key init commands individually
|
|
61
|
-
_bench_component() {
|
|
62
|
-
local label="$1"
|
|
63
|
-
shift
|
|
64
|
-
local start end elapsed
|
|
65
|
-
if command -v perl >/dev/null 2>&1; then
|
|
66
|
-
start=$(perl -MTime::HiRes=time -e "printf \"%.0f\n\", time * 1000")
|
|
67
|
-
zsh -c "$*" >/dev/null 2>&1 || true
|
|
68
|
-
end=$(perl -MTime::HiRes=time -e "printf \"%.0f\n\", time * 1000")
|
|
69
|
-
else
|
|
70
|
-
start=$(($(date +%s) * 1000))
|
|
71
|
-
zsh -c "$*" >/dev/null 2>&1 || true
|
|
72
|
-
end=$(($(date +%s) * 1000))
|
|
73
|
-
fi
|
|
74
|
-
elapsed=$((end - start))
|
|
75
|
-
printf " %-30s %4d ms\n" "$label" "$elapsed"
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
_bench_component "bare zsh (baseline)" "exit"
|
|
79
|
-
_bench_component "zinit + plugins" "source \"\${XDG_DATA_HOME:-\$HOME/.local/share}/zinit/zinit.git/zinit.zsh\" 2>/dev/null; exit"
|
|
80
|
-
_bench_component "compinit" "autoload -Uz compinit && compinit -C; exit"
|
|
81
|
-
_bench_component "starship init" "command -v starship >/dev/null && eval \"\$(starship init zsh)\"; exit"
|
|
82
|
-
_bench_component "atuin init" "command -v atuin >/dev/null && eval \"\$(atuin init zsh)\"; exit"
|
|
83
|
-
_bench_component "zoxide init" "command -v zoxide >/dev/null && eval \"\$(zoxide init zsh)\"; exit"
|
|
84
|
-
_bench_component "fnm env" "command -v fnm >/dev/null && eval \"\$(fnm env --use-on-cd)\"; exit"
|
|
85
|
-
_bench_component "fzf completions" "[[ -f /opt/homebrew/opt/fzf/shell/completion.zsh ]] && source /opt/homebrew/opt/fzf/shell/completion.zsh; exit"
|
|
86
|
-
|
|
87
|
-
echo ""
|
|
88
|
-
log_info "Component profiling complete."
|
|
89
|
-
else
|
|
90
|
-
echo "[WARN] zsh not found, skipping component profiling."
|
|
91
|
-
fi
|
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# shellcheck disable=SC2034
|
|
3
|
-
# Assertion library for shell tests
|
|
4
|
-
# Provides a comprehensive set of assertion functions for testing shell scripts
|
|
5
|
-
#
|
|
6
|
-
# Security note: This file uses eval to execute test commands and conditions.
|
|
7
|
-
# This is intentional and necessary for the test assertion framework to work.
|
|
8
|
-
# These functions are only used in test code and should never be called with
|
|
9
|
-
# untrusted input. All eval calls carry a shellcheck disable directive.
|
|
10
|
-
|
|
11
|
-
TESTS_RUN=0
|
|
12
|
-
TESTS_PASSED=0
|
|
13
|
-
TESTS_FAILED=0
|
|
14
|
-
CURRENT_TEST=""
|
|
15
|
-
|
|
16
|
-
# Colors
|
|
17
|
-
RED='\033[0;31m'
|
|
18
|
-
GREEN='\033[0;32m'
|
|
19
|
-
YELLOW='\033[0;33m'
|
|
20
|
-
NC='\033[0m'
|
|
21
|
-
|
|
22
|
-
# Start a new test case
|
|
23
|
-
test_start() {
|
|
24
|
-
CURRENT_TEST="$1"
|
|
25
|
-
((TESTS_RUN++)) || true
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
# Assert two values are equal
|
|
29
|
-
assert_equals() {
|
|
30
|
-
local expected="$1" actual="$2" msg="${3:-values should be equal}"
|
|
31
|
-
if [[ "$expected" == "$actual" ]]; then
|
|
32
|
-
((TESTS_PASSED++)) || true
|
|
33
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
34
|
-
return 0
|
|
35
|
-
else
|
|
36
|
-
((TESTS_FAILED++)) || true
|
|
37
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
38
|
-
echo -e " Expected: '$expected'"
|
|
39
|
-
echo -e " Actual: '$actual'"
|
|
40
|
-
return 1
|
|
41
|
-
fi
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
# Assert two values are not equal
|
|
45
|
-
assert_not_equals() {
|
|
46
|
-
local unexpected="$1" actual="$2" msg="${3:-values should differ}"
|
|
47
|
-
if [[ "$unexpected" != "$actual" ]]; then
|
|
48
|
-
((TESTS_PASSED++)) || true
|
|
49
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
50
|
-
return 0
|
|
51
|
-
else
|
|
52
|
-
((TESTS_FAILED++)) || true
|
|
53
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
54
|
-
echo -e " Unexpected: '$unexpected'"
|
|
55
|
-
echo -e " Actual: '$actual'"
|
|
56
|
-
return 1
|
|
57
|
-
fi
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
# Assert a command exits with expected code
|
|
61
|
-
assert_exit_code() {
|
|
62
|
-
local expected="$1"
|
|
63
|
-
shift
|
|
64
|
-
local cmd="$*"
|
|
65
|
-
local actual
|
|
66
|
-
set +e
|
|
67
|
-
# shellcheck disable=SC2086
|
|
68
|
-
eval "$cmd" </dev/null >/dev/null 2>&1
|
|
69
|
-
actual=$?
|
|
70
|
-
set -e
|
|
71
|
-
assert_equals "$expected" "$actual" "exit code for: $cmd"
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
# Assert command output contains expected string
|
|
75
|
-
assert_output_contains() {
|
|
76
|
-
local needle="$1"
|
|
77
|
-
shift
|
|
78
|
-
local cmd="$*"
|
|
79
|
-
local output
|
|
80
|
-
# shellcheck disable=SC2086
|
|
81
|
-
output=$(eval "$cmd" 2>&1) || true
|
|
82
|
-
if [[ "$output" == *"$needle"* ]]; then
|
|
83
|
-
((TESTS_PASSED++)) || true
|
|
84
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output contains '$needle'"
|
|
85
|
-
return 0
|
|
86
|
-
else
|
|
87
|
-
((TESTS_FAILED++)) || true
|
|
88
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: output should contain '$needle'"
|
|
89
|
-
echo -e " Actual output: $output"
|
|
90
|
-
return 1
|
|
91
|
-
fi
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
# Assert command output does NOT contain a string
|
|
95
|
-
assert_output_not_contains() {
|
|
96
|
-
local needle="$1"
|
|
97
|
-
shift
|
|
98
|
-
local cmd="$*"
|
|
99
|
-
local output
|
|
100
|
-
# shellcheck disable=SC2086
|
|
101
|
-
output=$(eval "$cmd" 2>&1) || true
|
|
102
|
-
if [[ "$output" != *"$needle"* ]]; then
|
|
103
|
-
((TESTS_PASSED++)) || true
|
|
104
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output does not contain '$needle'"
|
|
105
|
-
return 0
|
|
106
|
-
else
|
|
107
|
-
((TESTS_FAILED++)) || true
|
|
108
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: output should not contain '$needle'"
|
|
109
|
-
echo -e " Actual output: $output"
|
|
110
|
-
return 1
|
|
111
|
-
fi
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
# Assert command output matches regex pattern
|
|
115
|
-
assert_output_matches() {
|
|
116
|
-
local pattern="$1"
|
|
117
|
-
shift
|
|
118
|
-
local cmd="$*"
|
|
119
|
-
local output
|
|
120
|
-
# shellcheck disable=SC2086
|
|
121
|
-
output=$(eval "$cmd" 2>&1) || true
|
|
122
|
-
if [[ "$output" =~ $pattern ]]; then
|
|
123
|
-
((TESTS_PASSED++)) || true
|
|
124
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output matches pattern '$pattern'"
|
|
125
|
-
return 0
|
|
126
|
-
else
|
|
127
|
-
((TESTS_FAILED++)) || true
|
|
128
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: output should match pattern '$pattern'"
|
|
129
|
-
echo -e " Actual output: $output"
|
|
130
|
-
return 1
|
|
131
|
-
fi
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
# Assert file exists
|
|
135
|
-
assert_file_exists() {
|
|
136
|
-
local file="$1" msg="${2:-file should exist}"
|
|
137
|
-
if [[ -f "$file" ]]; then
|
|
138
|
-
((TESTS_PASSED++)) || true
|
|
139
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
140
|
-
return 0
|
|
141
|
-
else
|
|
142
|
-
((TESTS_FAILED++)) || true
|
|
143
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($file not found)"
|
|
144
|
-
return 1
|
|
145
|
-
fi
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
# Assert file does not exist
|
|
149
|
-
assert_file_not_exists() {
|
|
150
|
-
local file="$1" msg="${2:-file should not exist}"
|
|
151
|
-
if [[ ! -f "$file" ]]; then
|
|
152
|
-
((TESTS_PASSED++)) || true
|
|
153
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
154
|
-
return 0
|
|
155
|
-
else
|
|
156
|
-
((TESTS_FAILED++)) || true
|
|
157
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($file exists)"
|
|
158
|
-
return 1
|
|
159
|
-
fi
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
# Assert directory exists
|
|
163
|
-
assert_dir_exists() {
|
|
164
|
-
local dir="$1" msg="${2:-directory should exist}"
|
|
165
|
-
if [[ -d "$dir" ]]; then
|
|
166
|
-
((TESTS_PASSED++)) || true
|
|
167
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
168
|
-
return 0
|
|
169
|
-
else
|
|
170
|
-
((TESTS_FAILED++)) || true
|
|
171
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($dir not found)"
|
|
172
|
-
return 1
|
|
173
|
-
fi
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
# Assert directory does not exist
|
|
177
|
-
assert_dir_not_exists() {
|
|
178
|
-
local dir="$1" msg="${2:-directory should not exist}"
|
|
179
|
-
if [[ ! -d "$dir" ]]; then
|
|
180
|
-
((TESTS_PASSED++)) || true
|
|
181
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
182
|
-
return 0
|
|
183
|
-
else
|
|
184
|
-
((TESTS_FAILED++)) || true
|
|
185
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg ($dir exists)"
|
|
186
|
-
return 1
|
|
187
|
-
fi
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
# Assert a condition is true
|
|
191
|
-
assert_true() {
|
|
192
|
-
local condition="$1" msg="${2:-condition should be true}"
|
|
193
|
-
# shellcheck disable=SC2086
|
|
194
|
-
if eval "$condition"; then
|
|
195
|
-
((TESTS_PASSED++)) || true
|
|
196
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
197
|
-
return 0
|
|
198
|
-
else
|
|
199
|
-
((TESTS_FAILED++)) || true
|
|
200
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
201
|
-
return 1
|
|
202
|
-
fi
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
# Assert a condition is false
|
|
206
|
-
assert_false() {
|
|
207
|
-
local condition="$1" msg="${2:-condition should be false}"
|
|
208
|
-
# shellcheck disable=SC2086
|
|
209
|
-
if ! eval "$condition"; then
|
|
210
|
-
((TESTS_PASSED++)) || true
|
|
211
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
212
|
-
return 0
|
|
213
|
-
else
|
|
214
|
-
((TESTS_FAILED++)) || true
|
|
215
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
216
|
-
return 1
|
|
217
|
-
fi
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
# Assert string is empty
|
|
221
|
-
assert_empty() {
|
|
222
|
-
local value="$1" msg="${2:-value should be empty}"
|
|
223
|
-
if [[ -z "$value" ]]; then
|
|
224
|
-
((TESTS_PASSED++)) || true
|
|
225
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
226
|
-
return 0
|
|
227
|
-
else
|
|
228
|
-
((TESTS_FAILED++)) || true
|
|
229
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
230
|
-
echo -e " Actual: '$value'"
|
|
231
|
-
return 1
|
|
232
|
-
fi
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
# Assert string is not empty
|
|
236
|
-
assert_not_empty() {
|
|
237
|
-
local value="$1" msg="${2:-value should not be empty}"
|
|
238
|
-
if [[ -n "$value" ]]; then
|
|
239
|
-
((TESTS_PASSED++)) || true
|
|
240
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
241
|
-
return 0
|
|
242
|
-
else
|
|
243
|
-
((TESTS_FAILED++)) || true
|
|
244
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
245
|
-
return 1
|
|
246
|
-
fi
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
# Assert file contains text (uses fixed-string matching for safety)
|
|
250
|
-
assert_file_contains() {
|
|
251
|
-
local file="$1" needle="$2" msg="${3:-file should contain text}"
|
|
252
|
-
if [[ -z "$file" ]]; then
|
|
253
|
-
((TESTS_FAILED++)) || true
|
|
254
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg (no file path provided)"
|
|
255
|
-
return 1
|
|
256
|
-
fi
|
|
257
|
-
if [[ -f "$file" ]] && grep -qF "$needle" "$file"; then
|
|
258
|
-
((TESTS_PASSED++)) || true
|
|
259
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: $msg"
|
|
260
|
-
return 0
|
|
261
|
-
else
|
|
262
|
-
((TESTS_FAILED++)) || true
|
|
263
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: $msg"
|
|
264
|
-
return 1
|
|
265
|
-
fi
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
# Print test summary
|
|
269
|
-
print_summary() {
|
|
270
|
-
echo ""
|
|
271
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
272
|
-
echo -e "Tests run: $TESTS_RUN"
|
|
273
|
-
echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
|
|
274
|
-
echo -e "${RED}Failed: $TESTS_FAILED${NC}"
|
|
275
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
276
|
-
# Output machine-readable results for test_runner.sh
|
|
277
|
-
echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"
|
|
278
|
-
|
|
279
|
-
if [[ $TESTS_FAILED -gt 0 ]]; then
|
|
280
|
-
return 1
|
|
281
|
-
fi
|
|
282
|
-
return 0
|
|
283
|
-
}
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# shellcheck disable=SC2034
|
|
3
|
-
# Mock utilities for shell testing
|
|
4
|
-
# Provides functions to create mock commands, files, and directories
|
|
5
|
-
|
|
6
|
-
# Track created mocks for cleanup
|
|
7
|
-
MOCK_COMMANDS=()
|
|
8
|
-
MOCK_FILES=()
|
|
9
|
-
MOCK_DIRS=()
|
|
10
|
-
ORIGINAL_PATH="$PATH"
|
|
11
|
-
MOCK_BIN_DIR=""
|
|
12
|
-
|
|
13
|
-
# Initialize mock environment
|
|
14
|
-
mock_init() {
|
|
15
|
-
MOCK_BIN_DIR=$(mktemp -d)
|
|
16
|
-
export MOCK_BIN_DIR
|
|
17
|
-
export PATH="$MOCK_BIN_DIR:$PATH"
|
|
18
|
-
MOCK_COMMANDS=()
|
|
19
|
-
MOCK_FILES=()
|
|
20
|
-
MOCK_DIRS=()
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
# Create a mock command
|
|
24
|
-
# Usage: mock_command "command_name" "output" [exit_code]
|
|
25
|
-
mock_command() {
|
|
26
|
-
local cmd_name="$1"
|
|
27
|
-
local output="$2"
|
|
28
|
-
local exit_code="${3:-0}"
|
|
29
|
-
|
|
30
|
-
if [[ -z "$MOCK_BIN_DIR" ]]; then
|
|
31
|
-
mock_init
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
local mock_script="$MOCK_BIN_DIR/$cmd_name"
|
|
35
|
-
cat >"$mock_script" <<EOF
|
|
36
|
-
#!/usr/bin/env bash
|
|
37
|
-
echo "$output"
|
|
38
|
-
exit $exit_code
|
|
39
|
-
EOF
|
|
40
|
-
chmod +x "$mock_script"
|
|
41
|
-
MOCK_COMMANDS+=("$mock_script")
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
# Create a mock command that records arguments
|
|
45
|
-
# Usage: mock_command_spy "command_name" [output] [exit_code]
|
|
46
|
-
mock_command_spy() {
|
|
47
|
-
local cmd_name="$1"
|
|
48
|
-
local output="${2:-}"
|
|
49
|
-
local exit_code="${3:-0}"
|
|
50
|
-
|
|
51
|
-
if [[ -z "$MOCK_BIN_DIR" ]]; then
|
|
52
|
-
mock_init
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
local mock_script="$MOCK_BIN_DIR/$cmd_name"
|
|
56
|
-
local spy_file="$MOCK_BIN_DIR/${cmd_name}.spy"
|
|
57
|
-
|
|
58
|
-
cat >"$mock_script" <<EOF
|
|
59
|
-
#!/usr/bin/env bash
|
|
60
|
-
echo "\$@" >> "$spy_file"
|
|
61
|
-
echo "$output"
|
|
62
|
-
exit $exit_code
|
|
63
|
-
EOF
|
|
64
|
-
chmod +x "$mock_script"
|
|
65
|
-
touch "$spy_file"
|
|
66
|
-
MOCK_COMMANDS+=("$mock_script")
|
|
67
|
-
MOCK_FILES+=("$spy_file")
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
# Get spy call history
|
|
71
|
-
# Usage: mock_get_calls "command_name"
|
|
72
|
-
mock_get_calls() {
|
|
73
|
-
local cmd_name="$1"
|
|
74
|
-
local spy_file="$MOCK_BIN_DIR/${cmd_name}.spy"
|
|
75
|
-
if [[ -f "$spy_file" ]]; then
|
|
76
|
-
cat "$spy_file"
|
|
77
|
-
fi
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
# Get spy call count
|
|
81
|
-
# Usage: mock_call_count "command_name"
|
|
82
|
-
mock_call_count() {
|
|
83
|
-
local cmd_name="$1"
|
|
84
|
-
local spy_file="$MOCK_BIN_DIR/${cmd_name}.spy"
|
|
85
|
-
if [[ -f "$spy_file" ]]; then
|
|
86
|
-
wc -l <"$spy_file" | tr -d ' '
|
|
87
|
-
else
|
|
88
|
-
echo "0"
|
|
89
|
-
fi
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
# Create a temporary file with content
|
|
93
|
-
# Usage: mock_file "content" [filename]
|
|
94
|
-
mock_file() {
|
|
95
|
-
local content="$1"
|
|
96
|
-
local filename="${2:-}"
|
|
97
|
-
local file
|
|
98
|
-
|
|
99
|
-
if [[ -n "$filename" ]]; then
|
|
100
|
-
file=$(mktemp -t "$filename.XXXXXX")
|
|
101
|
-
else
|
|
102
|
-
file=$(mktemp)
|
|
103
|
-
fi
|
|
104
|
-
|
|
105
|
-
echo "$content" >"$file"
|
|
106
|
-
MOCK_FILES+=("$file")
|
|
107
|
-
echo "$file"
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
# Create a temporary directory
|
|
111
|
-
# Usage: mock_dir [prefix]
|
|
112
|
-
mock_dir() {
|
|
113
|
-
local prefix="${1:-mock}"
|
|
114
|
-
local dir
|
|
115
|
-
dir=$(mktemp -d -t "${prefix}.XXXXXX")
|
|
116
|
-
MOCK_DIRS+=("$dir")
|
|
117
|
-
echo "$dir"
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
# Create a mock archive file
|
|
121
|
-
# Usage: mock_archive "type" [content_file]
|
|
122
|
-
mock_archive() {
|
|
123
|
-
local type="$1"
|
|
124
|
-
local content="${2:-test content}"
|
|
125
|
-
local temp_dir
|
|
126
|
-
temp_dir=$(mktemp -d)
|
|
127
|
-
local temp_file="$temp_dir/test_file.txt"
|
|
128
|
-
local archive
|
|
129
|
-
|
|
130
|
-
echo "$content" >"$temp_file"
|
|
131
|
-
|
|
132
|
-
case "$type" in
|
|
133
|
-
tar)
|
|
134
|
-
archive=$(mktemp -t archive.XXXXXX.tar)
|
|
135
|
-
tar cf "$archive" -C "$temp_dir" test_file.txt
|
|
136
|
-
;;
|
|
137
|
-
tar.gz | tgz)
|
|
138
|
-
archive=$(mktemp -t archive.XXXXXX.tar.gz)
|
|
139
|
-
tar czf "$archive" -C "$temp_dir" test_file.txt
|
|
140
|
-
;;
|
|
141
|
-
zip)
|
|
142
|
-
archive=$(mktemp -t archive.XXXXXX.zip)
|
|
143
|
-
(cd "$temp_dir" && zip -q "$archive" test_file.txt)
|
|
144
|
-
;;
|
|
145
|
-
gz)
|
|
146
|
-
archive=$(mktemp -t archive.XXXXXX.gz)
|
|
147
|
-
gzip -c "$temp_file" >"$archive"
|
|
148
|
-
;;
|
|
149
|
-
*)
|
|
150
|
-
echo "Unsupported archive type: $type" >&2
|
|
151
|
-
rm -rf "$temp_dir"
|
|
152
|
-
return 1
|
|
153
|
-
;;
|
|
154
|
-
esac
|
|
155
|
-
|
|
156
|
-
rm -rf "$temp_dir"
|
|
157
|
-
MOCK_FILES+=("$archive")
|
|
158
|
-
echo "$archive"
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
# Restore original environment variable
|
|
162
|
-
# Usage: mock_env "VAR_NAME" "value"
|
|
163
|
-
mock_env() {
|
|
164
|
-
local var_name="$1"
|
|
165
|
-
local value="$2"
|
|
166
|
-
export "$var_name=$value"
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
# Clean up all mocks
|
|
170
|
-
mock_cleanup() {
|
|
171
|
-
# Restore PATH
|
|
172
|
-
export PATH="$ORIGINAL_PATH"
|
|
173
|
-
|
|
174
|
-
# Remove mock commands
|
|
175
|
-
for cmd in "${MOCK_COMMANDS[@]}"; do
|
|
176
|
-
rm -f "$cmd" 2>/dev/null
|
|
177
|
-
done
|
|
178
|
-
|
|
179
|
-
# Remove mock files
|
|
180
|
-
for file in "${MOCK_FILES[@]}"; do
|
|
181
|
-
rm -f "$file" 2>/dev/null
|
|
182
|
-
done
|
|
183
|
-
|
|
184
|
-
# Remove mock directories
|
|
185
|
-
for dir in "${MOCK_DIRS[@]}"; do
|
|
186
|
-
rm -rf "$dir" 2>/dev/null
|
|
187
|
-
done
|
|
188
|
-
|
|
189
|
-
# Remove mock bin directory
|
|
190
|
-
if [[ -n "$MOCK_BIN_DIR" && -d "$MOCK_BIN_DIR" ]]; then
|
|
191
|
-
rm -rf "$MOCK_BIN_DIR"
|
|
192
|
-
fi
|
|
193
|
-
|
|
194
|
-
MOCK_BIN_DIR=""
|
|
195
|
-
MOCK_COMMANDS=()
|
|
196
|
-
MOCK_FILES=()
|
|
197
|
-
MOCK_DIRS=()
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
# Setup trap to cleanup on exit
|
|
201
|
-
trap mock_cleanup EXIT
|