@sebastienrousseau/dotfiles 0.2.519 → 0.2.521
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/CHANGELOG.md +200 -0
- package/LICENSE-APACHE +190 -0
- package/{LICENSE → LICENSE-MIT} +1 -1
- package/README.md +1172 -166
- package/install.sh +77 -11
- package/package.json +8 -8
- package/tools/README.md +49 -0
- package/tools/ci/install-chezmoi-verified.sh +68 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
- package/docs/AI.md +0 -179
- package/docs/CNAME +0 -1
- package/docs/CONFIG_STRATEGY.md +0 -124
- package/docs/COPYRIGHT +0 -7
- package/docs/GOVERNANCE.md +0 -98
- package/docs/MAINTAINERS.md +0 -41
- package/docs/NAMING_CONVENTIONS.md +0 -102
- package/docs/OPENCODE.md +0 -127
- package/docs/README.md +0 -84
- package/docs/STRUCTURE.md +0 -102
- package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
- package/docs/adr/ADR-002-shell-performance.md +0 -130
- package/docs/adr/ADR-003-security-first.md +0 -158
- package/docs/adr/ADR-004-cli-architecture.md +0 -171
- package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
- package/docs/adr/ADR-006-shell-selection.md +0 -124
- package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
- package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
- package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
- package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
- package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
- package/docs/adr/README.md +0 -40
- package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
- package/docs/architecture/ARCHITECTURE.md +0 -117
- package/docs/architecture/INTEROP.md +0 -44
- package/docs/architecture/REPO_LAYOUT.md +0 -241
- package/docs/architecture/WALKTHROUGH.md +0 -86
- package/docs/architecture/fleet-deployment.md +0 -77
- package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
- package/docs/archive/LEGACY_ROADMAP.md +0 -6
- package/docs/archive/MILESTONE_v0.2.493.md +0 -47
- package/docs/archive/PLAN.md +0 -199
- package/docs/archive/REPO_AUDIT.md +0 -31
- package/docs/articles/.pages +0 -6
- package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
- package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
- package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
- package/docs/articles/index.md +0 -36
- package/docs/guides/INSTALL.md +0 -144
- package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
- package/docs/guides/THEMING.md +0 -230
- package/docs/guides/TROUBLESHOOTING.md +0 -176
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
- package/docs/index.md +0 -132
- package/docs/interop/A2A.md +0 -39
- package/docs/interop/POWERSHELL.md +0 -102
- package/docs/manual/00-introduction.md +0 -89
- package/docs/manual/01-concepts/01-architecture.md +0 -138
- package/docs/manual/01-concepts/02-trust-model.md +0 -183
- package/docs/manual/01-concepts/03-theme-engine.md +0 -186
- package/docs/manual/01-concepts/04-fleet.md +0 -148
- package/docs/manual/01-concepts/05-self-healing.md +0 -204
- package/docs/manual/02-tutorials/01-first-install.md +0 -197
- package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
- package/docs/manual/02-tutorials/03-create-profile.md +0 -244
- package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
- package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
- package/docs/manual/03-reference/01-dot-cli.md +0 -450
- package/docs/manual/03-reference/02-config-files.md +0 -265
- package/docs/manual/03-reference/03-environment.md +0 -124
- package/docs/manual/03-reference/04-templates.md +0 -190
- package/docs/manual/03-reference/05-feature-flags.md +0 -187
- package/docs/manual/04-cookbook/01-recipes.md +0 -285
- package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
- package/docs/manual/04-cookbook/03-faq.md +0 -175
- package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
- package/docs/manual/05-appendices/B-security-checklist.md +0 -85
- package/docs/manual/05-appendices/C-glossary.md +0 -40
- package/docs/manual/05-appendices/D-bibliography.md +0 -58
- package/docs/manual/05-appendices/E-license.md +0 -38
- package/docs/manual/_toc.yml +0 -58
- package/docs/manual/command-index.md +0 -155
- package/docs/manual/concept-index.md +0 -168
- package/docs/manual/index.md +0 -66
- package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
- package/docs/operations/ATTESTATION.md +0 -44
- package/docs/operations/CI_CADENCE.md +0 -107
- package/docs/operations/CI_COMPOSITES.md +0 -156
- package/docs/operations/COMPLETIONS.md +0 -123
- package/docs/operations/COVERAGE.md +0 -204
- package/docs/operations/DRIFT.md +0 -107
- package/docs/operations/HARD_AUDIT_2026.md +0 -631
- package/docs/operations/MAINTENANCE.md +0 -63
- package/docs/operations/MANIFEST.md +0 -127
- package/docs/operations/MIGRATION.md +0 -109
- package/docs/operations/OPERATIONS.md +0 -188
- package/docs/operations/PERFORMANCE.md +0 -133
- package/docs/operations/REGISTRY.md +0 -90
- package/docs/operations/RELEASE_PIPELINE.md +0 -128
- package/docs/operations/RELIABILITY.md +0 -122
- package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
- package/docs/operations/ROADMAP.md +0 -10
- package/docs/operations/ROADMAP_2026.md +0 -7
- package/docs/operations/ROADMAP_V0_2_503.md +0 -10
- package/docs/operations/TESTING.md +0 -216
- package/docs/operations/TRACEABILITY.md +0 -43
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
- package/docs/operations/VERSION_SYNC.md +0 -393
- package/docs/reference/ALIASES.md +0 -131
- package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
- package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
- package/docs/reference/FEATURES.md +0 -66
- package/docs/reference/FONTS.md +0 -112
- package/docs/reference/POWERSHELL_PARITY.md +0 -82
- package/docs/reference/PROFILES.md +0 -69
- package/docs/reference/SCREENSHOTS.md +0 -121
- package/docs/reference/SCRIPTS.md +0 -71
- package/docs/reference/SUPPORT_MATRIX.md +0 -80
- package/docs/reference/THEMES.md +0 -117
- package/docs/reference/TOOLS.md +0 -110
- package/docs/reference/UTILS.md +0 -242
- package/docs/registry.json +0 -6
- package/docs/schema/dot-env-v1.json +0 -110
- package/docs/schema/dot-registry-v1.json +0 -33
- package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
- package/docs/security/AUDIT_BYPASS.md +0 -103
- package/docs/security/AUTOMATION_SECRETS.md +0 -26
- package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
- package/docs/security/CI_PINNING.md +0 -129
- package/docs/security/COMMIT_SIGNING.md +0 -138
- package/docs/security/COMPLIANCE.md +0 -458
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
- package/docs/security/DISCLOSURE.md +0 -130
- package/docs/security/ENCRYPTION.md +0 -57
- package/docs/security/FMEA.md +0 -159
- package/docs/security/FUZZING.md +0 -114
- package/docs/security/HISTORY_FILTERING.md +0 -132
- package/docs/security/INCIDENT_RESPONSE.md +0 -579
- package/docs/security/INSTALL_VERIFICATION.md +0 -122
- package/docs/security/KEYS.md +0 -49
- package/docs/security/KEY_ROTATION.md +0 -303
- package/docs/security/MCP_POLICY.md +0 -78
- package/docs/security/POLICY_RELEASES.md +0 -37
- package/docs/security/README.md +0 -28
- package/docs/security/SCORECARD.md +0 -195
- package/docs/security/SECRETS.md +0 -158
- package/docs/security/SECURITY.md +0 -45
- package/docs/security/SECURITY_CHECKLIST.md +0 -55
- package/docs/security/SHELL_EXEMPTIONS.md +0 -145
- package/docs/security/SOUP_REGISTER.md +0 -36
- package/docs/security/THREAT_MODEL.md +0 -130
- package/docs/security/VERIFICATION_VALIDATION.md +0 -228
- package/docs/security/VERIFY_RELEASE.md +0 -201
- package/docs/security/security-pubkey.asc +0 -15
- package/docs/stylesheets/extra.css +0 -444
- package/docs/themes/README.md +0 -10
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
- package/docs/themes/hero-shot.svg +0 -78
- package/scripts/README.md +0 -123
- package/scripts/ci/check-copyright-headers.sh +0 -8
- package/scripts/ci/check-shell-preamble.sh +0 -8
- package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
- package/scripts/demo/record.sh +0 -43
- package/scripts/diagnostics/a2a-conformance.sh +0 -163
- package/scripts/diagnostics/alias-governance.sh +0 -138
- package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
- package/scripts/diagnostics/aliases-manifest.sh +0 -77
- package/scripts/diagnostics/benchmark.sh +0 -408
- package/scripts/diagnostics/conflicts.sh +0 -73
- package/scripts/diagnostics/doctor-unified.sh +0 -39
- package/scripts/diagnostics/doctor.sh +0 -751
- package/scripts/diagnostics/drift-dashboard.sh +0 -202
- package/scripts/diagnostics/health.sh +0 -623
- package/scripts/diagnostics/history-analysis.sh +0 -86
- package/scripts/diagnostics/mcp-doctor.sh +0 -582
- package/scripts/diagnostics/perf.sh +0 -453
- package/scripts/diagnostics/scorecard.sh +0 -119
- package/scripts/diagnostics/secret-governance.sh +0 -65
- package/scripts/diagnostics/security-score.sh +0 -467
- package/scripts/diagnostics/smoke-test.sh +0 -88
- package/scripts/diagnostics/snapshot.sh +0 -90
- package/scripts/diagnostics/verify.sh +0 -108
- package/scripts/diagnostics/verify_state.sh +0 -73
- package/scripts/diagnostics/version-locks.sh +0 -94
- package/scripts/diagnostics/workstation-attestation.sh +0 -187
- package/scripts/dot/commands/agent.sh +0 -485
- package/scripts/dot/commands/agents.sh +0 -336
- package/scripts/dot/commands/ai.sh +0 -587
- package/scripts/dot/commands/aliases.sh +0 -277
- package/scripts/dot/commands/appearance.sh +0 -110
- package/scripts/dot/commands/completion.sh +0 -134
- package/scripts/dot/commands/core.sh +0 -217
- package/scripts/dot/commands/diagnostics.sh +0 -265
- package/scripts/dot/commands/env-emit.sh +0 -203
- package/scripts/dot/commands/fleet.sh +0 -688
- package/scripts/dot/commands/init.sh +0 -185
- package/scripts/dot/commands/lint.sh +0 -208
- package/scripts/dot/commands/manual.sh +0 -169
- package/scripts/dot/commands/meta.sh +0 -333
- package/scripts/dot/commands/patterns.sh +0 -55
- package/scripts/dot/commands/registry.sh +0 -419
- package/scripts/dot/commands/restore.sh +0 -232
- package/scripts/dot/commands/secrets.sh +0 -296
- package/scripts/dot/commands/security.sh +0 -102
- package/scripts/dot/commands/tools.sh +0 -556
- package/scripts/dot/data/alias-deprecations.tsv +0 -2
- package/scripts/dot/powershell/Dot.psm1 +0 -319
- package/scripts/fonts/install-nerd-fonts.sh +0 -75
- package/scripts/fonts/patch-fonts.sh +0 -36
- package/scripts/git-hooks/install.sh +0 -12
- package/scripts/git-hooks/pre-commit +0 -12
- package/scripts/git-hooks/pre-commit-audit.sh +0 -146
- package/scripts/git-hooks/pre-push +0 -105
- package/scripts/git-hooks/prepare-commit-msg +0 -29
- package/scripts/lib/secrets_provider.sh +0 -185
- package/scripts/ops/ai-setup.sh +0 -71
- package/scripts/ops/bundle.sh +0 -104
- package/scripts/ops/chaos.sh +0 -50
- package/scripts/ops/chezmoi-apply.sh +0 -333
- package/scripts/ops/chezmoi-diff.sh +0 -16
- package/scripts/ops/chezmoi-remove.sh +0 -46
- package/scripts/ops/chezmoi-update.sh +0 -63
- package/scripts/ops/heal-chezmoi.sh +0 -87
- package/scripts/ops/heal-system.sh +0 -129
- package/scripts/ops/heal-tools.sh +0 -297
- package/scripts/ops/heal.sh +0 -223
- package/scripts/ops/post-apply-repair.sh +0 -107
- package/scripts/ops/prewarm.sh +0 -128
- package/scripts/ops/release.sh +0 -262
- package/scripts/ops/rollback.sh +0 -604
- package/scripts/ops/setup.sh +0 -138
- package/scripts/ops/teleport.sh +0 -34
- package/scripts/qa/check-version-consistency.sh +0 -124
- package/scripts/qa/coverage-baseline.sh +0 -61
- package/scripts/qa/docs-coverage.sh +0 -112
- package/scripts/qa/examples-coverage.sh +0 -94
- package/scripts/qa/powershell-contract.ps1 +0 -95
- package/scripts/qa/reliability-audit.sh +0 -139
- package/scripts/qa/scorecard-snapshot.sh +0 -128
- package/scripts/qa/traceability-coverage.sh +0 -117
- package/scripts/qa/validate-examples.sh +0 -27
- package/scripts/qa/wsl-contract.sh +0 -12
- package/scripts/secrets/age-init.sh +0 -82
- package/scripts/secrets/create-secrets-file.sh +0 -46
- package/scripts/secrets/encrypt-ssh-key.sh +0 -44
- package/scripts/security/backup.sh +0 -58
- package/scripts/security/check-disclosure-key-expiry.sh +0 -111
- package/scripts/security/dns-doh.sh +0 -52
- package/scripts/security/encryption-check.sh +0 -55
- package/scripts/security/enforce-policies.sh +0 -335
- package/scripts/security/firewall.sh +0 -91
- package/scripts/security/lock-configs.sh +0 -67
- package/scripts/security/lock-screen.sh +0 -56
- package/scripts/security/manage-secrets.sh +0 -429
- package/scripts/security/ssh-cert.sh +0 -204
- package/scripts/security/telemetry-kill.sh +0 -51
- package/scripts/security/usb-safety.sh +0 -52
- package/scripts/theme/apply-gnome-theme.sh +0 -333
- package/scripts/theme/extract-heic-frames.sh +0 -115
- package/scripts/theme/extract-theme.py +0 -742
- package/scripts/theme/install-boot-logo.sh +0 -63
- package/scripts/theme/install-catppuccin-themes.sh +0 -371
- package/scripts/theme/install-cursors.sh +0 -26
- package/scripts/theme/install-file-icons.sh +0 -27
- package/scripts/theme/install-grub-theme.sh +0 -62
- package/scripts/theme/install-lock-icon.sh +0 -31
- package/scripts/theme/merge-wallpaper.sh +0 -146
- package/scripts/theme/rebuild-themes.sh +0 -544
- package/scripts/theme/switch.sh +0 -449
- package/scripts/theme/wallpaper-rotate.sh +0 -137
- package/scripts/theme/wallpaper-sync.sh +0 -690
- package/scripts/tools/cmatrix.sh +0 -22
- package/scripts/tools/detect-collisions.py +0 -103
- package/scripts/tools/emoji-picker.sh +0 -49
- package/scripts/tools/figlet-banner.sh +0 -19
- package/scripts/tools/log-rotate.sh +0 -31
- package/scripts/tools/lolcat-wrap.sh +0 -20
- package/scripts/tools/pipes.sh +0 -49
- package/scripts/tuning/linux.sh +0 -186
- package/scripts/tuning/macos.sh +0 -56
- package/scripts/uninstall.sh +0 -86
- package/scripts/version-sync.sh +0 -654
- package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
- package/templates/chezmoi-data/mac-m1.toml.example +0 -16
- package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
- package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
- package/templates/projects/go/.github/workflows/ci.yml +0 -31
- package/templates/projects/go/README.md +0 -7
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
- package/templates/projects/go/go.mod +0 -3
- package/templates/projects/go/go.sum +0 -0
- 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/node/.github/workflows/ci.yml +0 -30
- package/templates/projects/node/README.md +0 -7
- package/templates/projects/node/package-lock.json +0 -12
- package/templates/projects/node/package.json +0 -10
- package/templates/projects/node/src/index.js +0 -3
- package/templates/projects/packer/README.md +0 -15
- package/templates/projects/packer/main.pkr.hcl +0 -15
- package/templates/projects/python/.github/workflows/ci.yml +0 -34
- package/templates/projects/python/README.md +0 -7
- package/templates/projects/python/pyproject.toml +0 -25
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
- package/templates/projects/python/tests/test_basic.py +0 -3
|
@@ -1,408 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
## Shell Performance Benchmark.
|
|
5
|
-
##
|
|
6
|
-
## Measures shell startup time with per-component profiling. Uses hyperfine
|
|
7
|
-
## for statistical accuracy or falls back to basic timing. Tracks history
|
|
8
|
-
## for regression detection.
|
|
9
|
-
##
|
|
10
|
-
## # Usage
|
|
11
|
-
## dot benchmark # Basic startup timing
|
|
12
|
-
## dot benchmark --detailed # Per-component breakdown
|
|
13
|
-
## dot benchmark --profile # zprof analysis
|
|
14
|
-
## dot benchmark --compare # Compare with history
|
|
15
|
-
## dot benchmark --waterfall # ASCII waterfall chart of component timings
|
|
16
|
-
##
|
|
17
|
-
## # Dependencies
|
|
18
|
-
## - python3: Millisecond timing (required)
|
|
19
|
-
## - hyperfine: Statistical benchmarking (optional, falls back to basic)
|
|
20
|
-
## - jq: JSON parsing for results (optional)
|
|
21
|
-
## - zsh: Target shell (required)
|
|
22
|
-
##
|
|
23
|
-
## # Metrics
|
|
24
|
-
## | Rating | Threshold | Description |
|
|
25
|
-
## |--------|-----------|-------------|
|
|
26
|
-
## | Excellent | <100ms | Instant response |
|
|
27
|
-
## | Good | <200ms | Responsive |
|
|
28
|
-
## | Acceptable | <500ms | Noticeable delay |
|
|
29
|
-
## | Slow | >500ms | Optimization needed |
|
|
30
|
-
##
|
|
31
|
-
## # Platform Notes
|
|
32
|
-
## - macOS: Full support
|
|
33
|
-
## - Linux: Full support
|
|
34
|
-
## - WSL: May show higher times due to filesystem overhead
|
|
35
|
-
##
|
|
36
|
-
## # Output Files
|
|
37
|
-
## Benchmarks saved to ~/.local/share/dotfiles/benchmarks/
|
|
38
|
-
##
|
|
39
|
-
## # Idempotency
|
|
40
|
-
## Safe to run repeatedly. Creates timestamped history files.
|
|
41
|
-
|
|
42
|
-
set -euo pipefail
|
|
43
|
-
|
|
44
|
-
_cleanup_files=()
|
|
45
|
-
trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
|
|
46
|
-
|
|
47
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
48
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
49
|
-
# shellcheck disable=SC1091
|
|
50
|
-
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
51
|
-
# shellcheck source=../../lib/dot/log.sh
|
|
52
|
-
# shellcheck disable=SC1091
|
|
53
|
-
source "$SCRIPT_DIR/../../lib/dot/log.sh"
|
|
54
|
-
export DOT_COMMAND="benchmark"
|
|
55
|
-
|
|
56
|
-
BENCHMARK_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/benchmarks"
|
|
57
|
-
mkdir -p "$BENCHMARK_DIR"
|
|
58
|
-
|
|
59
|
-
usage() {
|
|
60
|
-
cat <<'EOF'
|
|
61
|
-
Usage: dot benchmark [--detailed] [--profile] [--compare] [--waterfall]
|
|
62
|
-
|
|
63
|
-
Options:
|
|
64
|
-
-d, --detailed Show per-component timing before the benchmark
|
|
65
|
-
-p, --profile Run zsh zprof analysis
|
|
66
|
-
-c, --compare Compare recent benchmark history
|
|
67
|
-
-w, --waterfall Show an ASCII component waterfall
|
|
68
|
-
-h, --help Show this help
|
|
69
|
-
EOF
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
# Parse arguments
|
|
73
|
-
DETAILED=false
|
|
74
|
-
PROFILE=false
|
|
75
|
-
COMPARE=false
|
|
76
|
-
WATERFALL=false
|
|
77
|
-
while [[ $# -gt 0 ]]; do
|
|
78
|
-
case "$1" in
|
|
79
|
-
--detailed | -d)
|
|
80
|
-
DETAILED=true
|
|
81
|
-
shift
|
|
82
|
-
;;
|
|
83
|
-
--profile | -p)
|
|
84
|
-
PROFILE=true
|
|
85
|
-
shift
|
|
86
|
-
;;
|
|
87
|
-
--compare | -c)
|
|
88
|
-
COMPARE=true
|
|
89
|
-
shift
|
|
90
|
-
;;
|
|
91
|
-
--waterfall | -w)
|
|
92
|
-
WATERFALL=true
|
|
93
|
-
shift
|
|
94
|
-
;;
|
|
95
|
-
--help | -h)
|
|
96
|
-
usage
|
|
97
|
-
exit 0
|
|
98
|
-
;;
|
|
99
|
-
*)
|
|
100
|
-
printf 'Unknown option: %s\n' "$1" >&2
|
|
101
|
-
usage >&2
|
|
102
|
-
exit 2
|
|
103
|
-
;;
|
|
104
|
-
esac
|
|
105
|
-
done
|
|
106
|
-
|
|
107
|
-
ui_init
|
|
108
|
-
GREEN="${GREEN:-}"
|
|
109
|
-
YELLOW="${YELLOW:-}"
|
|
110
|
-
RED="${RED:-}"
|
|
111
|
-
CYAN="${CYAN:-}"
|
|
112
|
-
NC="${NC:-}"
|
|
113
|
-
|
|
114
|
-
print_header() {
|
|
115
|
-
echo ""
|
|
116
|
-
ui_dot_banner "Diagnostics"
|
|
117
|
-
ui_header "Shell Performance Benchmark"
|
|
118
|
-
echo ""
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
# Basic timing function
|
|
122
|
-
time_command() {
|
|
123
|
-
local start end
|
|
124
|
-
start=$(python3 -c 'import time; print(int(time.time() * 1000))')
|
|
125
|
-
eval "$1" >/dev/null 2>&1
|
|
126
|
-
end=$(python3 -c 'import time; print(int(time.time() * 1000))')
|
|
127
|
-
echo $((end - start))
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
# Per-component profiling using zprof
|
|
131
|
-
run_zsh_profile() {
|
|
132
|
-
ui_header "Zsh profiler (zprof)"
|
|
133
|
-
echo ""
|
|
134
|
-
|
|
135
|
-
zsh -c '
|
|
136
|
-
zmodload zsh/zprof
|
|
137
|
-
# shellcheck disable=SC1091
|
|
138
|
-
source ~/.zshenv 2>/dev/null
|
|
139
|
-
# shellcheck disable=SC1091
|
|
140
|
-
source ~/.config/zsh/.zshrc 2>/dev/null
|
|
141
|
-
zprof
|
|
142
|
-
' 2>/dev/null | head -30
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
# Benchmark individual components
|
|
146
|
-
benchmark_components() {
|
|
147
|
-
ui_header "Per-Component Timing"
|
|
148
|
-
echo ""
|
|
149
|
-
printf "%-35s %8s\n" "Component" "Time (ms)"
|
|
150
|
-
echo "───────────────────────────────────────────────"
|
|
151
|
-
|
|
152
|
-
# zshenv (bootloader)
|
|
153
|
-
local zshenv_time
|
|
154
|
-
# shellcheck disable=SC1091
|
|
155
|
-
zshenv_time=$(time_command "zsh -c 'source ~/.zshenv 2>/dev/null; exit'")
|
|
156
|
-
printf "%-35s %8s\n" "zshenv (bootloader)" "${zshenv_time}ms"
|
|
157
|
-
|
|
158
|
-
# Core shell options
|
|
159
|
-
local options_time
|
|
160
|
-
# shellcheck disable=SC1091
|
|
161
|
-
options_time=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/30-options.zsh 2>/dev/null; exit'" 2>/dev/null || echo "N/A")
|
|
162
|
-
printf "%-35s %8s\n" "rc.d/30-options.zsh" "${options_time}ms"
|
|
163
|
-
|
|
164
|
-
# Zinit plugins
|
|
165
|
-
local zinit_time
|
|
166
|
-
# shellcheck disable=SC1091
|
|
167
|
-
zinit_time=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/20-zinit.zsh 2>/dev/null; exit'" 2>/dev/null || echo "N/A")
|
|
168
|
-
printf "%-35s %8s\n" "rc.d/20-zinit.zsh (plugins)" "${zinit_time}ms"
|
|
169
|
-
|
|
170
|
-
# Tool initializations
|
|
171
|
-
for tool in starship atuin zoxide fzf direnv; do
|
|
172
|
-
if command -v "$tool" >/dev/null 2>&1; then
|
|
173
|
-
local tool_time
|
|
174
|
-
case "$tool" in
|
|
175
|
-
starship) tool_time=$(time_command "starship init zsh >/dev/null") ;;
|
|
176
|
-
atuin) tool_time=$(time_command "atuin init zsh >/dev/null") ;;
|
|
177
|
-
zoxide) tool_time=$(time_command "zoxide init zsh >/dev/null") ;;
|
|
178
|
-
fzf) tool_time=$(time_command "true") ;; # FZF sourced from file
|
|
179
|
-
direnv) tool_time=$(time_command "direnv hook zsh >/dev/null") ;;
|
|
180
|
-
esac
|
|
181
|
-
printf "%-35s %8s\n" "$tool init" "${tool_time}ms"
|
|
182
|
-
fi
|
|
183
|
-
done
|
|
184
|
-
|
|
185
|
-
echo "───────────────────────────────────────────────"
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
# Render ASCII waterfall chart from component timings
|
|
189
|
-
render_waterfall() {
|
|
190
|
-
ui_header "Startup Waterfall"
|
|
191
|
-
echo ""
|
|
192
|
-
|
|
193
|
-
local -a names=()
|
|
194
|
-
local -a times=()
|
|
195
|
-
local total_time=0
|
|
196
|
-
|
|
197
|
-
# zshenv
|
|
198
|
-
local t
|
|
199
|
-
# shellcheck disable=SC1091
|
|
200
|
-
t=$(time_command "zsh -c 'source ~/.zshenv 2>/dev/null; exit'")
|
|
201
|
-
names+=("zshenv (bootloader)")
|
|
202
|
-
times+=("$t")
|
|
203
|
-
total_time=$((total_time + t))
|
|
204
|
-
|
|
205
|
-
# rc.d modules
|
|
206
|
-
# shellcheck disable=SC1091
|
|
207
|
-
t=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/30-options.zsh 2>/dev/null; exit'" 2>/dev/null || echo 0)
|
|
208
|
-
names+=("rc.d/30-options.zsh")
|
|
209
|
-
times+=("$t")
|
|
210
|
-
total_time=$((total_time + t))
|
|
211
|
-
|
|
212
|
-
# shellcheck disable=SC1091
|
|
213
|
-
t=$(time_command "zsh -c 'source ~/.config/zsh/rc.d/20-zinit.zsh 2>/dev/null; exit'" 2>/dev/null || echo 0)
|
|
214
|
-
names+=("rc.d/20-zinit (plugins)")
|
|
215
|
-
times+=("$t")
|
|
216
|
-
total_time=$((total_time + t))
|
|
217
|
-
|
|
218
|
-
# Tool inits
|
|
219
|
-
for tool in starship atuin zoxide fzf direnv; do
|
|
220
|
-
if command -v "$tool" >/dev/null 2>&1; then
|
|
221
|
-
case "$tool" in
|
|
222
|
-
starship) t=$(time_command "starship init zsh >/dev/null") ;;
|
|
223
|
-
atuin) t=$(time_command "atuin init zsh >/dev/null") ;;
|
|
224
|
-
zoxide) t=$(time_command "zoxide init zsh >/dev/null") ;;
|
|
225
|
-
fzf) t=$(time_command "true") ;;
|
|
226
|
-
direnv) t=$(time_command "direnv hook zsh >/dev/null") ;;
|
|
227
|
-
esac
|
|
228
|
-
names+=("$tool init")
|
|
229
|
-
times+=("$t")
|
|
230
|
-
total_time=$((total_time + t))
|
|
231
|
-
fi
|
|
232
|
-
done
|
|
233
|
-
|
|
234
|
-
if [[ "$total_time" -eq 0 ]]; then
|
|
235
|
-
ui_warn "No timing data" "Could not measure components"
|
|
236
|
-
return
|
|
237
|
-
fi
|
|
238
|
-
|
|
239
|
-
# Render bars
|
|
240
|
-
local bar_width=30
|
|
241
|
-
local i
|
|
242
|
-
for i in "${!names[@]}"; do
|
|
243
|
-
local name="${names[$i]}"
|
|
244
|
-
local ms="${times[$i]}"
|
|
245
|
-
local pct=$((ms * 100 / total_time))
|
|
246
|
-
local filled=$((ms * bar_width / total_time))
|
|
247
|
-
local empty=$((bar_width - filled))
|
|
248
|
-
|
|
249
|
-
local bar=""
|
|
250
|
-
local j
|
|
251
|
-
for ((j = 0; j < filled; j++)); do bar+="$_GL_BAR_FILL"; done
|
|
252
|
-
for ((j = 0; j < empty; j++)); do bar+="$_GL_BAR_EMPTY"; done
|
|
253
|
-
|
|
254
|
-
if [[ "$UI_COLOR" = "1" ]]; then
|
|
255
|
-
printf " %-22s %s%s%s%s%s %4dms (%2d%%)\n" \
|
|
256
|
-
"$name" "$GREEN" "${bar:0:$filled}" "$NORMAL$GRAY" "${bar:$filled}" "$NORMAL" "$ms" "$pct"
|
|
257
|
-
else
|
|
258
|
-
printf " %-22s %s %4dms (%2d%%)\n" "$name" "$bar" "$ms" "$pct"
|
|
259
|
-
fi
|
|
260
|
-
done
|
|
261
|
-
|
|
262
|
-
echo " ──────────────────────────────────────────────────────────"
|
|
263
|
-
printf " %-22s %*s %4dms\n" "Total" "$bar_width" "" "$total_time"
|
|
264
|
-
echo ""
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
# Run hyperfine benchmark
|
|
268
|
-
run_hyperfine() {
|
|
269
|
-
if ! command -v hyperfine >/dev/null 2>&1; then
|
|
270
|
-
if [[ "$UI_ENABLED" = "1" ]]; then
|
|
271
|
-
ui_warn "hyperfine" "not installed, using basic timing"
|
|
272
|
-
else
|
|
273
|
-
printf '%b\n' "${YELLOW}hyperfine not installed. Using basic timing.${NC}"
|
|
274
|
-
fi
|
|
275
|
-
local times=()
|
|
276
|
-
for _ in {1..5}; do
|
|
277
|
-
times+=("$(time_command "zsh -i -c exit")")
|
|
278
|
-
done
|
|
279
|
-
local sum=0
|
|
280
|
-
for t in "${times[@]}"; do sum=$((sum + t)); done
|
|
281
|
-
if [[ "$UI_ENABLED" = "1" ]]; then
|
|
282
|
-
ui_ok "Average startup time" "$((sum / 5))ms"
|
|
283
|
-
else
|
|
284
|
-
printf '%b\n' "\n${GREEN}Average startup time: $((sum / 5))ms${NC}"
|
|
285
|
-
fi
|
|
286
|
-
return
|
|
287
|
-
fi
|
|
288
|
-
|
|
289
|
-
echo ""
|
|
290
|
-
ui_header "Running hyperfine benchmark"
|
|
291
|
-
echo ""
|
|
292
|
-
hyperfine --warmup 3 --runs 10 --shell=none \
|
|
293
|
-
--export-json "$BENCHMARK_DIR/latest.json" \
|
|
294
|
-
'zsh -i -c exit'
|
|
295
|
-
|
|
296
|
-
# Extract and display results
|
|
297
|
-
if [[ -f "$BENCHMARK_DIR/latest.json" ]]; then
|
|
298
|
-
local mean_ms
|
|
299
|
-
mean_ms=$(jq '.results[0].mean * 1000 | floor' "$BENCHMARK_DIR/latest.json")
|
|
300
|
-
local min_ms
|
|
301
|
-
min_ms=$(jq '.results[0].min * 1000 | floor' "$BENCHMARK_DIR/latest.json")
|
|
302
|
-
local max_ms
|
|
303
|
-
max_ms=$(jq '.results[0].max * 1000 | floor' "$BENCHMARK_DIR/latest.json")
|
|
304
|
-
|
|
305
|
-
echo ""
|
|
306
|
-
ui_header "Results"
|
|
307
|
-
if [[ "$UI_ENABLED" = "1" ]]; then
|
|
308
|
-
ui_kv "Mean:" "${mean_ms}ms"
|
|
309
|
-
ui_kv "Min:" "${min_ms}ms"
|
|
310
|
-
ui_kv "Max:" "${max_ms}ms"
|
|
311
|
-
else
|
|
312
|
-
echo " Mean: ${mean_ms}ms"
|
|
313
|
-
echo " Min: ${min_ms}ms"
|
|
314
|
-
echo " Max: ${max_ms}ms"
|
|
315
|
-
fi
|
|
316
|
-
|
|
317
|
-
# Performance rating
|
|
318
|
-
if [[ $mean_ms -lt 100 ]]; then
|
|
319
|
-
if [[ "$UI_ENABLED" = "1" ]]; then
|
|
320
|
-
ui_ok "Performance" "Excellent (<100ms)"
|
|
321
|
-
else
|
|
322
|
-
printf '%b\n' "\n${GREEN}⚡ Excellent (<100ms)${NC}"
|
|
323
|
-
fi
|
|
324
|
-
elif [[ $mean_ms -lt 200 ]]; then
|
|
325
|
-
if [[ "$UI_ENABLED" = "1" ]]; then
|
|
326
|
-
ui_ok "Performance" "Good (<200ms)"
|
|
327
|
-
else
|
|
328
|
-
printf '%b\n' "\n${GREEN}✓ Good (<200ms)${NC}"
|
|
329
|
-
fi
|
|
330
|
-
elif [[ $mean_ms -lt 500 ]]; then
|
|
331
|
-
if [[ "$UI_ENABLED" = "1" ]]; then
|
|
332
|
-
ui_warn "Performance" "Acceptable (<500ms)"
|
|
333
|
-
else
|
|
334
|
-
printf '%b\n' "\n${YELLOW}⚠ Acceptable (<500ms)${NC}"
|
|
335
|
-
fi
|
|
336
|
-
else
|
|
337
|
-
if [[ "$UI_ENABLED" = "1" ]]; then
|
|
338
|
-
ui_err "Performance" "Slow (>500ms)"
|
|
339
|
-
else
|
|
340
|
-
printf '%b\n' "\n${RED}✗ Slow (>500ms) - optimization needed${NC}"
|
|
341
|
-
fi
|
|
342
|
-
fi
|
|
343
|
-
|
|
344
|
-
# Save with timestamp for history
|
|
345
|
-
cp "$BENCHMARK_DIR/latest.json" "$BENCHMARK_DIR/$(date +%Y%m%d_%H%M%S).json"
|
|
346
|
-
dot_log info "benchmark_complete" "mean_ms=$mean_ms" "min_ms=$min_ms" "max_ms=$max_ms"
|
|
347
|
-
dot_metric "shell_startup_mean" "$mean_ms" "ms"
|
|
348
|
-
fi
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
# Compare with previous benchmarks
|
|
352
|
-
compare_benchmarks() {
|
|
353
|
-
ui_header "Benchmark History"
|
|
354
|
-
echo ""
|
|
355
|
-
|
|
356
|
-
local files
|
|
357
|
-
files=$(find "$BENCHMARK_DIR" -name "*.json" -type f | sort -r | head -10)
|
|
358
|
-
|
|
359
|
-
if [[ -z "$files" ]]; then
|
|
360
|
-
echo "No benchmark history found."
|
|
361
|
-
return
|
|
362
|
-
fi
|
|
363
|
-
|
|
364
|
-
printf "%-20s %10s %10s %10s\n" "Date" "Mean" "Min" "Max"
|
|
365
|
-
echo "────────────────────────────────────────────────"
|
|
366
|
-
|
|
367
|
-
for f in $files; do
|
|
368
|
-
local basename
|
|
369
|
-
basename=$(basename "$f" .json)
|
|
370
|
-
if [[ "$basename" == "latest" ]]; then continue; fi
|
|
371
|
-
|
|
372
|
-
local mean min max
|
|
373
|
-
mean=$(jq '.results[0].mean * 1000 | floor' "$f" 2>/dev/null || echo "N/A")
|
|
374
|
-
min=$(jq '.results[0].min * 1000 | floor' "$f" 2>/dev/null || echo "N/A")
|
|
375
|
-
max=$(jq '.results[0].max * 1000 | floor' "$f" 2>/dev/null || echo "N/A")
|
|
376
|
-
|
|
377
|
-
printf "%-20s %10sms %10sms %10sms\n" "$basename" "$mean" "$min" "$max"
|
|
378
|
-
done
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
# Main execution
|
|
382
|
-
print_header
|
|
383
|
-
|
|
384
|
-
if $PROFILE; then
|
|
385
|
-
run_zsh_profile
|
|
386
|
-
elif $COMPARE; then
|
|
387
|
-
compare_benchmarks
|
|
388
|
-
elif $WATERFALL; then
|
|
389
|
-
render_waterfall
|
|
390
|
-
elif $DETAILED; then
|
|
391
|
-
benchmark_components
|
|
392
|
-
echo ""
|
|
393
|
-
run_hyperfine
|
|
394
|
-
else
|
|
395
|
-
run_hyperfine
|
|
396
|
-
fi
|
|
397
|
-
|
|
398
|
-
if [[ "$UI_ENABLED" = "1" ]]; then
|
|
399
|
-
echo ""
|
|
400
|
-
ui_info "Tip" "dot benchmark --detailed"
|
|
401
|
-
ui_info "Tip" "dot benchmark --profile"
|
|
402
|
-
ui_info "Tip" "dot benchmark --waterfall"
|
|
403
|
-
else
|
|
404
|
-
printf '%b\n' "\n${CYAN}Tip: Run 'dot benchmark --detailed' for per-component timing${NC}"
|
|
405
|
-
printf '%b\n' "${CYAN} Run 'dot benchmark --profile' for zprof analysis${NC}"
|
|
406
|
-
printf '%b\n' "${CYAN} Run 'dot benchmark --waterfall' for ASCII waterfall chart${NC}"
|
|
407
|
-
fi
|
|
408
|
-
printf '%b\n' "${CYAN} Run 'dot benchmark --compare' for history${NC}\n"
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# Alias/Command Conflicts Report
|
|
5
|
-
# Usage: dot conflicts
|
|
6
|
-
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
|
|
9
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
11
|
-
# shellcheck disable=SC1091
|
|
12
|
-
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
13
|
-
|
|
14
|
-
ui_init
|
|
15
|
-
|
|
16
|
-
resolve_source_dir() {
|
|
17
|
-
if [[ -n "${CHEZMOI_SOURCE_DIR:-}" && -d "$CHEZMOI_SOURCE_DIR" ]]; then
|
|
18
|
-
printf "%s\n" "$CHEZMOI_SOURCE_DIR"
|
|
19
|
-
return
|
|
20
|
-
fi
|
|
21
|
-
if [[ -d "$HOME/.dotfiles" ]]; then
|
|
22
|
-
printf "%s\n" "$HOME/.dotfiles"
|
|
23
|
-
return
|
|
24
|
-
fi
|
|
25
|
-
if [[ -d "$HOME/.local/share/chezmoi" ]]; then
|
|
26
|
-
printf "%s\n" "$HOME/.local/share/chezmoi"
|
|
27
|
-
return
|
|
28
|
-
fi
|
|
29
|
-
return 1
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
src_dir=$(resolve_source_dir)
|
|
33
|
-
manifest="$src_dir/scripts/diagnostics/aliases-manifest.sh"
|
|
34
|
-
if [[ ! -x "$manifest" ]]; then
|
|
35
|
-
ui_err "Alias manifest" "not found"
|
|
36
|
-
exit 1
|
|
37
|
-
fi
|
|
38
|
-
|
|
39
|
-
tmp_manifest=$(umask 077 && mktemp)
|
|
40
|
-
trap 'rm -f "$tmp_manifest"' EXIT
|
|
41
|
-
bash "$manifest" >"$tmp_manifest"
|
|
42
|
-
|
|
43
|
-
ui_header "Alias & Command Conflicts"
|
|
44
|
-
|
|
45
|
-
ui_section "Duplicate alias definitions"
|
|
46
|
-
|
|
47
|
-
dupes=$(awk -F$'\t' '{print $1}' "$tmp_manifest" | sort | uniq -d)
|
|
48
|
-
if [[ -z "$dupes" ]]; then
|
|
49
|
-
ui_ok "Aliases" "No duplicate alias names"
|
|
50
|
-
else
|
|
51
|
-
while IFS= read -r name; do
|
|
52
|
-
[[ -z "$name" ]] && continue
|
|
53
|
-
ui_warn "Alias" "${name} defined multiple times"
|
|
54
|
-
awk -F$'\t' -v k="$name" '$1==k {printf " - %s (%s:%s)\n", $2, $3, $4}' "$tmp_manifest"
|
|
55
|
-
done <<<"$dupes"
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
ui_section "Alias shadows real commands"
|
|
59
|
-
shadow_found=false
|
|
60
|
-
while IFS=$'\t' read -r name value _; do
|
|
61
|
-
if command -v "$name" >/dev/null 2>&1; then
|
|
62
|
-
shadow_found=true
|
|
63
|
-
ui_warn "Shadow" "${name} -> ${value} (also command)"
|
|
64
|
-
fi
|
|
65
|
-
done <"$tmp_manifest"
|
|
66
|
-
|
|
67
|
-
if ! $shadow_found; then
|
|
68
|
-
ui_ok "Shadowing" "No alias shadows detected"
|
|
69
|
-
fi
|
|
70
|
-
|
|
71
|
-
ui_section "Quick actions"
|
|
72
|
-
ui_info "List aliases" "dot aliases list"
|
|
73
|
-
ui_info "Regenerate cheatsheet" "dot aliases cheatsheet"
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# Unified doctor orchestrator — parses flags and dispatches to existing scripts.
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
_cleanup_files=()
|
|
8
|
-
trap 'set +u; rm -f "${_cleanup_files[@]}" 2>/dev/null; set -u' EXIT
|
|
9
|
-
|
|
10
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
|
-
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
12
|
-
# shellcheck source=../../lib/dot/ui.sh
|
|
13
|
-
# shellcheck disable=SC1091
|
|
14
|
-
source "$SCRIPT_DIR/../../lib/dot/ui.sh"
|
|
15
|
-
ui_init
|
|
16
|
-
|
|
17
|
-
passthrough=()
|
|
18
|
-
target="scripts/diagnostics/doctor.sh"
|
|
19
|
-
|
|
20
|
-
for arg in "$@"; do
|
|
21
|
-
case "$arg" in
|
|
22
|
-
--heal | -H) target="scripts/ops/heal.sh" ;;
|
|
23
|
-
--audit | -a) target="scripts/ops/health-check.sh" ;;
|
|
24
|
-
--score | -s) target="scripts/diagnostics/scorecard.sh" ;;
|
|
25
|
-
--smoke | -m) target="scripts/diagnostics/smoke-test.sh" ;;
|
|
26
|
-
--drift | -d) target="scripts/diagnostics/drift-dashboard.sh" ;;
|
|
27
|
-
--benchmark | -b) target="tests/benchmark.sh" ;;
|
|
28
|
-
--json | -j | --ai | -A) passthrough+=("$arg") ;;
|
|
29
|
-
*) passthrough+=("$arg") ;;
|
|
30
|
-
esac
|
|
31
|
-
done
|
|
32
|
-
|
|
33
|
-
script="$REPO_ROOT/$target"
|
|
34
|
-
if [[ ! -f "$script" ]]; then
|
|
35
|
-
ui_err "Script not found" "$target"
|
|
36
|
-
exit 1
|
|
37
|
-
fi
|
|
38
|
-
|
|
39
|
-
exec bash "$script" "${passthrough[@]+"${passthrough[@]}"}"
|