@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,185 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# shellcheck shell=bash
|
|
5
|
-
#
|
|
6
|
-
# scripts/dot/commands/init.sh
|
|
7
|
-
#
|
|
8
|
-
# `dot init <github-user>` — bootstrap a foreign dotfiles repo through
|
|
9
|
-
# this framework's harness. The §3 audit roadmap calls for an analogue
|
|
10
|
-
# to `chezmoi init <user>` that turns this tool from "one person's
|
|
11
|
-
# config" into a runtime for any dotfiles user.
|
|
12
|
-
#
|
|
13
|
-
# Behavior:
|
|
14
|
-
# dot init alice # clones github.com/alice/dotfiles via chezmoi,
|
|
15
|
-
# # applies through the dot harness
|
|
16
|
-
# dot init https://... # explicit URL
|
|
17
|
-
# dot init alice --dry-run # preview without writing
|
|
18
|
-
# dot init alice --no-apply # clone only; don't run chezmoi apply
|
|
19
|
-
#
|
|
20
|
-
# Safety:
|
|
21
|
-
# - Refuses to clobber an existing chezmoi source dir without --force.
|
|
22
|
-
# - Disclaims that the target's scripts will run with the user's
|
|
23
|
-
# privileges and prints the source URL for inspection.
|
|
24
|
-
# - Verifies the source URL is HTTPS (no plain git://) so MITM is harder.
|
|
25
|
-
|
|
26
|
-
set -euo pipefail
|
|
27
|
-
|
|
28
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
29
|
-
# shellcheck source=../../../lib/dot/ui.sh disable=SC1091
|
|
30
|
-
source "$SCRIPT_DIR/../../../lib/dot/ui.sh"
|
|
31
|
-
# shellcheck source=../../../lib/dot/utils.sh disable=SC1091
|
|
32
|
-
source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
|
|
33
|
-
|
|
34
|
-
_init_resolve_url() {
|
|
35
|
-
local arg="$1"
|
|
36
|
-
case "$arg" in
|
|
37
|
-
http://*)
|
|
38
|
-
printf "dot init: refusing plain HTTP (use HTTPS or git+ssh)\n" >&2
|
|
39
|
-
return 2
|
|
40
|
-
;;
|
|
41
|
-
https://* | git@*:*)
|
|
42
|
-
# Trust full URLs as-is — these are the user's explicit intent.
|
|
43
|
-
printf "%s\n" "$arg"
|
|
44
|
-
;;
|
|
45
|
-
*/*)
|
|
46
|
-
# owner/repo shorthand: validate before constructing the URL so
|
|
47
|
-
# a crafted argument can't smuggle shell metacharacters into
|
|
48
|
-
# downstream tooling (chezmoi init, git clone).
|
|
49
|
-
if [[ ! "$arg" =~ ^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$ ]]; then
|
|
50
|
-
printf "dot init: invalid owner/repo (only [A-Za-z0-9._-]+/[A-Za-z0-9._-]+ allowed): %s\n" "$arg" >&2
|
|
51
|
-
return 2
|
|
52
|
-
fi
|
|
53
|
-
printf "https://github.com/%s.git\n" "$arg"
|
|
54
|
-
;;
|
|
55
|
-
*)
|
|
56
|
-
# Bare user shorthand: same character whitelist as the path
|
|
57
|
-
# segment of a GitHub URL.
|
|
58
|
-
if [[ ! "$arg" =~ ^[A-Za-z0-9._-]+$ ]]; then
|
|
59
|
-
printf "dot init: invalid user (only [A-Za-z0-9._-] allowed): %s\n" "$arg" >&2
|
|
60
|
-
return 2
|
|
61
|
-
fi
|
|
62
|
-
printf "https://github.com/%s/dotfiles.git\n" "$arg"
|
|
63
|
-
;;
|
|
64
|
-
esac
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
cmd_init() {
|
|
68
|
-
local user_arg="" dry_run=0 apply=1 force=0
|
|
69
|
-
while [[ $# -gt 0 ]]; do
|
|
70
|
-
case "$1" in
|
|
71
|
-
--dry-run | -n)
|
|
72
|
-
dry_run=1
|
|
73
|
-
shift
|
|
74
|
-
;;
|
|
75
|
-
--no-apply)
|
|
76
|
-
apply=0
|
|
77
|
-
shift
|
|
78
|
-
;;
|
|
79
|
-
--force | -f)
|
|
80
|
-
force=1
|
|
81
|
-
shift
|
|
82
|
-
;;
|
|
83
|
-
--help | -h)
|
|
84
|
-
cat <<EOF
|
|
85
|
-
Usage: dot init <github-user|owner/repo|url> [--dry-run] [--no-apply] [--force]
|
|
86
|
-
|
|
87
|
-
Bootstrap a foreign dotfiles repo through chezmoi + the dot harness.
|
|
88
|
-
|
|
89
|
-
Examples:
|
|
90
|
-
dot init alice # github.com/alice/dotfiles
|
|
91
|
-
dot init alice/configs # github.com/alice/configs
|
|
92
|
-
dot init https://example.com/repo.git
|
|
93
|
-
dot init alice --dry-run # preview only
|
|
94
|
-
dot init alice --no-apply # clone but don't apply
|
|
95
|
-
|
|
96
|
-
Flags:
|
|
97
|
-
--dry-run, -n Show resolved URL + target dir without cloning.
|
|
98
|
-
--no-apply Clone the source but skip 'chezmoi apply'.
|
|
99
|
-
--force, -f Overwrite an existing chezmoi source dir.
|
|
100
|
-
EOF
|
|
101
|
-
return 0
|
|
102
|
-
;;
|
|
103
|
-
--)
|
|
104
|
-
shift
|
|
105
|
-
break
|
|
106
|
-
;;
|
|
107
|
-
-*)
|
|
108
|
-
ui_err "Unknown flag" "$1"
|
|
109
|
-
return 1
|
|
110
|
-
;;
|
|
111
|
-
*)
|
|
112
|
-
if [[ -n "$user_arg" ]]; then
|
|
113
|
-
ui_err "Too many arguments" "$1"
|
|
114
|
-
return 1
|
|
115
|
-
fi
|
|
116
|
-
user_arg="$1"
|
|
117
|
-
shift
|
|
118
|
-
;;
|
|
119
|
-
esac
|
|
120
|
-
done
|
|
121
|
-
|
|
122
|
-
[[ -n "$user_arg" ]] || {
|
|
123
|
-
ui_err "init" "missing <user|repo|url>"
|
|
124
|
-
return 1
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
local url
|
|
128
|
-
url="$(_init_resolve_url "$user_arg")" || return $?
|
|
129
|
-
|
|
130
|
-
if ! command -v chezmoi >/dev/null 2>&1; then
|
|
131
|
-
ui_err "chezmoi" "not installed — run install.sh first"
|
|
132
|
-
return 127
|
|
133
|
-
fi
|
|
134
|
-
|
|
135
|
-
local source_dir
|
|
136
|
-
source_dir="${CHEZMOI_SOURCE_DIR:-$(chezmoi source-path 2>/dev/null || echo "$HOME/.local/share/chezmoi")}"
|
|
137
|
-
|
|
138
|
-
ui_header "Bootstrap dotfiles from $user_arg"
|
|
139
|
-
ui_info "Source URL" "$url"
|
|
140
|
-
ui_info "Target dir" "$source_dir"
|
|
141
|
-
local _apply_label="no"
|
|
142
|
-
[[ "$apply" -eq 1 ]] && _apply_label="yes"
|
|
143
|
-
ui_info "Apply after?" "$_apply_label"
|
|
144
|
-
|
|
145
|
-
if [[ "$dry_run" -eq 1 ]]; then
|
|
146
|
-
ui_ok "Dry-run" "no changes made"
|
|
147
|
-
return 0
|
|
148
|
-
fi
|
|
149
|
-
|
|
150
|
-
if [[ -e "$source_dir" ]] && [[ "$force" -ne 1 ]]; then
|
|
151
|
-
ui_err "Refusing" "$source_dir already exists; pass --force to overwrite"
|
|
152
|
-
return 1
|
|
153
|
-
fi
|
|
154
|
-
|
|
155
|
-
ui_warn "Trust" "The target repo's scripts will run with your user privileges."
|
|
156
|
-
ui_warn "Trust" "Inspect $url before proceeding if you don't know the author."
|
|
157
|
-
if [[ -t 0 ]] && [[ "${DOTFILES_NONINTERACTIVE:-0}" != "1" ]]; then
|
|
158
|
-
read -r -p " Continue? [y/N] " resp
|
|
159
|
-
case "$resp" in
|
|
160
|
-
[yY] | [yY][eE][sS]) ;;
|
|
161
|
-
*)
|
|
162
|
-
ui_info "Init" "aborted by user"
|
|
163
|
-
return 1
|
|
164
|
-
;;
|
|
165
|
-
esac
|
|
166
|
-
fi
|
|
167
|
-
|
|
168
|
-
local chezmoi_args=(init --source "$source_dir")
|
|
169
|
-
[[ "$apply" -eq 1 ]] && chezmoi_args+=(--apply)
|
|
170
|
-
chezmoi_args+=("$url")
|
|
171
|
-
|
|
172
|
-
ui_info "chezmoi" "${chezmoi_args[*]}"
|
|
173
|
-
if chezmoi "${chezmoi_args[@]}"; then
|
|
174
|
-
ui_ok "Init" "complete"
|
|
175
|
-
if [[ "$apply" -eq 1 ]]; then
|
|
176
|
-
ui_info "Hint" "run 'dot doctor' to validate the new environment"
|
|
177
|
-
else
|
|
178
|
-
ui_info "Hint" "run 'chezmoi diff' then 'chezmoi apply' when ready"
|
|
179
|
-
fi
|
|
180
|
-
else
|
|
181
|
-
local rc=$?
|
|
182
|
-
ui_err "Init" "chezmoi exited $rc"
|
|
183
|
-
return "$rc"
|
|
184
|
-
fi
|
|
185
|
-
}
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# Dotfiles CLI - Lint Command
|
|
5
|
-
# Wraps shellcheck and shfmt with project-specific flags
|
|
6
|
-
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
|
|
9
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
-
# shellcheck source=../../../lib/dot/utils.sh
|
|
11
|
-
source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
|
|
12
|
-
|
|
13
|
-
dot_ui_command_banner "Lint" "${1:-}"
|
|
14
|
-
|
|
15
|
-
# ── Configuration ────────────────────────────────────────────────────────────
|
|
16
|
-
# Flags from CLAUDE.md conventions:
|
|
17
|
-
# SC flags: --severity=error -e SC1091 -e SC2030 -e SC2031
|
|
18
|
-
# shfmt: -i 2 -ci
|
|
19
|
-
SHELLCHECK_ARGS=(--severity=error -e SC1091 -e SC2030 -e SC2031)
|
|
20
|
-
SHFMT_ARGS=(-i 2 -ci)
|
|
21
|
-
|
|
22
|
-
# True only if the file's shebang names a shell that both shellcheck and shfmt
|
|
23
|
-
# can process. The old `grep -qiE 'shell|bash|sh'` matched loosely — "sh" hit
|
|
24
|
-
# "fish", and `file` output pulled in python3 scripts — so non-shell files
|
|
25
|
-
# landed in the lint set and produced spurious SC1071 / shfmt parse "errors".
|
|
26
|
-
_lint_is_shell() {
|
|
27
|
-
local first interp
|
|
28
|
-
first="$(head -1 "$1" 2>/dev/null)"
|
|
29
|
-
case "$first" in '#!'*) ;; *) return 1 ;; esac
|
|
30
|
-
interp="${first#\#!}"
|
|
31
|
-
interp="${interp#"${interp%%[![:space:]]*}"}" # ltrim
|
|
32
|
-
case "$interp" in
|
|
33
|
-
*/env[[:space:]]*)
|
|
34
|
-
interp="${interp#*/env}"
|
|
35
|
-
interp="${interp#"${interp%%[![:space:]]*}"}"
|
|
36
|
-
interp="${interp%%[[:space:]]*}"
|
|
37
|
-
;;
|
|
38
|
-
*)
|
|
39
|
-
interp="${interp%%[[:space:]]*}"
|
|
40
|
-
interp="${interp##*/}"
|
|
41
|
-
;;
|
|
42
|
-
esac
|
|
43
|
-
case "$interp" in
|
|
44
|
-
sh | bash | dash | ksh | mksh | ash) return 0 ;;
|
|
45
|
-
*) return 1 ;;
|
|
46
|
-
esac
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
cmd_lint() {
|
|
50
|
-
local mode="${1:-all}"
|
|
51
|
-
local src_dir
|
|
52
|
-
src_dir="$(require_source_dir)"
|
|
53
|
-
|
|
54
|
-
# Collect target files
|
|
55
|
-
local -a files=()
|
|
56
|
-
while IFS= read -r -d '' f; do
|
|
57
|
-
files+=("$f")
|
|
58
|
-
done < <(find "$src_dir/scripts" -name '*.sh' -type f -print0 2>/dev/null)
|
|
59
|
-
|
|
60
|
-
# install.sh
|
|
61
|
-
if [[ -f "$src_dir/install.sh" ]]; then
|
|
62
|
-
files+=("$src_dir/install.sh")
|
|
63
|
-
fi
|
|
64
|
-
|
|
65
|
-
# Post-Phase-4b chezmoi-tracked content lives under defaults/.
|
|
66
|
-
local chezmoi_src
|
|
67
|
-
chezmoi_src="$(resolve_chezmoi_source_dir)"
|
|
68
|
-
[[ -z "$chezmoi_src" ]] && chezmoi_src="$src_dir"
|
|
69
|
-
|
|
70
|
-
# dot_local/bin/executable_* scripts — shell scripts only (skip python/zsh/etc
|
|
71
|
-
# by inspecting the shebang, so shellcheck/shfmt never see files they can't parse).
|
|
72
|
-
while IFS= read -r -d '' f; do
|
|
73
|
-
if _lint_is_shell "$f"; then
|
|
74
|
-
files+=("$f")
|
|
75
|
-
fi
|
|
76
|
-
done < <(find "$chezmoi_src/dot_local/bin" -name 'executable_*' -type f -print0 2>/dev/null)
|
|
77
|
-
|
|
78
|
-
# .chezmoitemplates/*.sh (non-.tmpl shell scripts)
|
|
79
|
-
while IFS= read -r -d '' f; do
|
|
80
|
-
files+=("$f")
|
|
81
|
-
done < <(find "$chezmoi_src/.chezmoitemplates" -name '*.sh' -type f -print0 2>/dev/null)
|
|
82
|
-
|
|
83
|
-
local total=${#files[@]}
|
|
84
|
-
if [[ "$total" -eq 0 ]]; then
|
|
85
|
-
ui_warn "No files" "No shell scripts found to lint"
|
|
86
|
-
return 0
|
|
87
|
-
fi
|
|
88
|
-
|
|
89
|
-
local sc_errors=0
|
|
90
|
-
local fmt_errors=0
|
|
91
|
-
|
|
92
|
-
case "$mode" in
|
|
93
|
-
all | check)
|
|
94
|
-
# ── ShellCheck ──────────────────────────────────────────────────────
|
|
95
|
-
if has_command shellcheck; then
|
|
96
|
-
ui_section "ShellCheck"
|
|
97
|
-
echo ""
|
|
98
|
-
# One shellcheck invocation over all files (was one fork per file).
|
|
99
|
-
# gcc format is one line per issue, so failing files = unique paths.
|
|
100
|
-
local sc_out
|
|
101
|
-
sc_out="$(shellcheck -f gcc "${SHELLCHECK_ARGS[@]}" "${files[@]}" 2>/dev/null || true)"
|
|
102
|
-
if [[ -z "$sc_out" ]]; then
|
|
103
|
-
ui_ok "shellcheck" "$total files clean"
|
|
104
|
-
else
|
|
105
|
-
printf '%s\n' "$sc_out"
|
|
106
|
-
sc_errors=$(printf '%s\n' "$sc_out" | cut -d: -f1 | sort -u | grep -c .)
|
|
107
|
-
ui_err "shellcheck" "$sc_errors file(s) with errors"
|
|
108
|
-
fi
|
|
109
|
-
echo ""
|
|
110
|
-
else
|
|
111
|
-
ui_warn "shellcheck" "not installed, skipping"
|
|
112
|
-
echo ""
|
|
113
|
-
fi
|
|
114
|
-
|
|
115
|
-
# ── shfmt ───────────────────────────────────────────────────────────
|
|
116
|
-
if has_command shfmt; then
|
|
117
|
-
ui_section "shfmt"
|
|
118
|
-
echo ""
|
|
119
|
-
# `shfmt -l` lists files needing formatting in one invocation
|
|
120
|
-
# (was `shfmt -d` per file).
|
|
121
|
-
local fmt_list
|
|
122
|
-
fmt_list="$(shfmt "${SHFMT_ARGS[@]}" -l "${files[@]}" 2>/dev/null || true)"
|
|
123
|
-
if [[ -z "$fmt_list" ]]; then
|
|
124
|
-
ui_ok "shfmt" "$total files formatted correctly"
|
|
125
|
-
else
|
|
126
|
-
fmt_errors=$(printf '%s\n' "$fmt_list" | grep -c .)
|
|
127
|
-
ui_err "shfmt" "$fmt_errors file(s) need formatting"
|
|
128
|
-
fi
|
|
129
|
-
echo ""
|
|
130
|
-
else
|
|
131
|
-
ui_warn "shfmt" "not installed, skipping"
|
|
132
|
-
echo ""
|
|
133
|
-
fi
|
|
134
|
-
;;
|
|
135
|
-
|
|
136
|
-
fix)
|
|
137
|
-
# ── Auto-fix with shfmt ─────────────────────────────────────────────
|
|
138
|
-
if ! has_command shfmt; then
|
|
139
|
-
ui_err "shfmt" "not installed — cannot auto-fix"
|
|
140
|
-
exit 1
|
|
141
|
-
fi
|
|
142
|
-
ui_section "Auto-fixing with shfmt"
|
|
143
|
-
echo ""
|
|
144
|
-
# Find files needing formatting in one `shfmt -l` pass, then only
|
|
145
|
-
# rewrite that (usually small) set — was `shfmt -d` per file.
|
|
146
|
-
local fmt_list fixed=0
|
|
147
|
-
fmt_list="$(shfmt "${SHFMT_ARGS[@]}" -l "${files[@]}" 2>/dev/null || true)"
|
|
148
|
-
if [[ -z "$fmt_list" ]]; then
|
|
149
|
-
ui_ok "shfmt" "All files already formatted"
|
|
150
|
-
else
|
|
151
|
-
while IFS= read -r f; do
|
|
152
|
-
[[ -n "$f" ]] || continue
|
|
153
|
-
shfmt "${SHFMT_ARGS[@]}" -w "$f"
|
|
154
|
-
ui_ok "fixed" "${f#"$src_dir/"}"
|
|
155
|
-
fixed=$((fixed + 1))
|
|
156
|
-
done <<<"$fmt_list"
|
|
157
|
-
ui_ok "shfmt" "$fixed file(s) reformatted"
|
|
158
|
-
fi
|
|
159
|
-
echo ""
|
|
160
|
-
;;
|
|
161
|
-
|
|
162
|
-
*)
|
|
163
|
-
ui_err "Unknown lint mode: $mode"
|
|
164
|
-
echo "Usage: dot lint [--fix|-f | --check|-c]"
|
|
165
|
-
exit 1
|
|
166
|
-
;;
|
|
167
|
-
esac
|
|
168
|
-
|
|
169
|
-
# ── Summary ───────────────────────────────────────────────────────────────
|
|
170
|
-
ui_section "Summary"
|
|
171
|
-
echo ""
|
|
172
|
-
ui_info "Files scanned" "$total"
|
|
173
|
-
if [[ "$sc_errors" -gt 0 ]]; then
|
|
174
|
-
ui_err "ShellCheck errors" "$sc_errors"
|
|
175
|
-
fi
|
|
176
|
-
if [[ "$fmt_errors" -gt 0 ]]; then
|
|
177
|
-
ui_err "Formatting issues" "$fmt_errors"
|
|
178
|
-
fi
|
|
179
|
-
if [[ "$sc_errors" -eq 0 ]] && [[ "$fmt_errors" -eq 0 ]]; then
|
|
180
|
-
ui_ok "Result" "All checks passed"
|
|
181
|
-
fi
|
|
182
|
-
echo ""
|
|
183
|
-
|
|
184
|
-
# Exit 1 in check mode if any errors
|
|
185
|
-
if [[ "$mode" == "check" ]] && [[ $((sc_errors + fmt_errors)) -gt 0 ]]; then
|
|
186
|
-
exit 1
|
|
187
|
-
fi
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
# ── Dispatch ─────────────────────────────────────────────────────────────────
|
|
191
|
-
case "${1:-}" in
|
|
192
|
-
lint)
|
|
193
|
-
shift
|
|
194
|
-
case "${1:---}" in
|
|
195
|
-
--fix | -f) cmd_lint "fix" ;;
|
|
196
|
-
--check | -c) cmd_lint "check" ;;
|
|
197
|
-
*) cmd_lint "all" ;;
|
|
198
|
-
esac
|
|
199
|
-
;;
|
|
200
|
-
*)
|
|
201
|
-
# Direct invocation (dot lint)
|
|
202
|
-
case "${1:---}" in
|
|
203
|
-
--fix | -f) cmd_lint "fix" ;;
|
|
204
|
-
--check | -c) cmd_lint "check" ;;
|
|
205
|
-
*) cmd_lint "all" ;;
|
|
206
|
-
esac
|
|
207
|
-
;;
|
|
208
|
-
esac
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Copyright (c) 2015-2026 Sebastien Rousseau
|
|
4
|
-
# dot manual — open or download the dotfiles manual in multiple formats.
|
|
5
|
-
#
|
|
6
|
-
# Usage:
|
|
7
|
-
# dot manual # open HTML manual in browser
|
|
8
|
-
# dot manual html # alias of no-arg
|
|
9
|
-
# dot manual pdf # download + open PDF
|
|
10
|
-
# dot manual epub # download + open EPUB
|
|
11
|
-
# dot manual text # pipe ASCII text to pager
|
|
12
|
-
# dot manual markdown # pipe Markdown source to pager
|
|
13
|
-
# dot manual download <fmt> # save to current directory
|
|
14
|
-
# dot manual --offline # use bundled offline copy
|
|
15
|
-
# dot manual --local # use locally-built _build/manual/
|
|
16
|
-
|
|
17
|
-
set -euo pipefail
|
|
18
|
-
|
|
19
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
20
|
-
# shellcheck source=../../../lib/dot/utils.sh
|
|
21
|
-
source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
|
|
22
|
-
|
|
23
|
-
MANUAL_URL="${DOTFILES_MANUAL_URL:-https://sebastienrousseau.github.io/dotfiles/manual}"
|
|
24
|
-
CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/dotfiles/manual"
|
|
25
|
-
OFFLINE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/manual"
|
|
26
|
-
|
|
27
|
-
MODE="open"
|
|
28
|
-
FORMAT="html"
|
|
29
|
-
USE_LOCAL=false
|
|
30
|
-
USE_OFFLINE=false
|
|
31
|
-
|
|
32
|
-
for arg in "$@"; do
|
|
33
|
-
case "$arg" in
|
|
34
|
-
html | html-multi | pdf | epub | text | markdown) FORMAT="$arg" ;;
|
|
35
|
-
download) MODE="download" ;;
|
|
36
|
-
--offline) USE_OFFLINE=true ;;
|
|
37
|
-
--local) USE_LOCAL=true ;;
|
|
38
|
-
--url=*) MANUAL_URL="${arg#*=}" ;;
|
|
39
|
-
--help | -h)
|
|
40
|
-
sed -n 's/^# //p;s/^#$//p' "$0" | head -20
|
|
41
|
-
exit 0
|
|
42
|
-
;;
|
|
43
|
-
esac
|
|
44
|
-
done
|
|
45
|
-
|
|
46
|
-
format_file() {
|
|
47
|
-
case "$1" in
|
|
48
|
-
html) echo "dotfiles.html" ;;
|
|
49
|
-
html-multi) echo "html/index.html" ;;
|
|
50
|
-
pdf) echo "dotfiles.pdf" ;;
|
|
51
|
-
epub) echo "dotfiles.epub" ;;
|
|
52
|
-
text) echo "dotfiles.txt" ;;
|
|
53
|
-
markdown) echo "dotfiles-md.tar.gz" ;;
|
|
54
|
-
*) return 1 ;;
|
|
55
|
-
esac
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
resolve_source() {
|
|
59
|
-
local fmt="$1"
|
|
60
|
-
local fname
|
|
61
|
-
fname="$(format_file "$fmt")"
|
|
62
|
-
|
|
63
|
-
if $USE_LOCAL; then
|
|
64
|
-
local src_dir
|
|
65
|
-
src_dir="$(require_source_dir)/_build/manual"
|
|
66
|
-
if [[ -f "$src_dir/$fname" ]]; then
|
|
67
|
-
echo "$src_dir/$fname"
|
|
68
|
-
return 0
|
|
69
|
-
fi
|
|
70
|
-
ui_err "manual" "local build not found at $src_dir/$fname — run bash tools/docs/build-manual.sh" >&2
|
|
71
|
-
return 1
|
|
72
|
-
fi
|
|
73
|
-
|
|
74
|
-
if $USE_OFFLINE; then
|
|
75
|
-
if [[ -f "$OFFLINE_DIR/$fname" ]]; then
|
|
76
|
-
echo "$OFFLINE_DIR/$fname"
|
|
77
|
-
return 0
|
|
78
|
-
fi
|
|
79
|
-
ui_err "manual" "offline copy not found at $OFFLINE_DIR/$fname" >&2
|
|
80
|
-
return 1
|
|
81
|
-
fi
|
|
82
|
-
|
|
83
|
-
local cache_path="$CACHE_DIR/$fname"
|
|
84
|
-
if [[ ! -f "$cache_path" ]] || [[ $(find "$cache_path" -mtime +7 -print 2>/dev/null | wc -l) -gt 0 ]]; then
|
|
85
|
-
mkdir -p "$(dirname "$cache_path")"
|
|
86
|
-
local url="$MANUAL_URL/$fname"
|
|
87
|
-
ui_info "manual" "fetching $url" >&2
|
|
88
|
-
if ! curl -fsSL "$url" -o "$cache_path"; then
|
|
89
|
-
ui_err "manual" "failed to download $url" >&2
|
|
90
|
-
return 1
|
|
91
|
-
fi
|
|
92
|
-
fi
|
|
93
|
-
echo "$cache_path"
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
open_file() {
|
|
97
|
-
local path="$1"
|
|
98
|
-
case "$(uname -s)" in
|
|
99
|
-
Darwin)
|
|
100
|
-
# Use the system open explicitly — ~/.local/bin/open is a wrapper
|
|
101
|
-
# that would recurse on itself.
|
|
102
|
-
/usr/bin/open "$path"
|
|
103
|
-
;;
|
|
104
|
-
Linux)
|
|
105
|
-
if command -v xdg-open &>/dev/null; then
|
|
106
|
-
xdg-open "$path"
|
|
107
|
-
elif command -v gio &>/dev/null; then
|
|
108
|
-
gio open "$path"
|
|
109
|
-
else
|
|
110
|
-
ui_err "manual" "no opener found (xdg-open, gio); use file://$path"
|
|
111
|
-
return 1
|
|
112
|
-
fi
|
|
113
|
-
;;
|
|
114
|
-
*)
|
|
115
|
-
ui_info "manual" "saved to: $path"
|
|
116
|
-
;;
|
|
117
|
-
esac
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
cmd_open() {
|
|
121
|
-
local path
|
|
122
|
-
path="$(resolve_source "$FORMAT")"
|
|
123
|
-
[[ -z "$path" ]] && exit 1
|
|
124
|
-
|
|
125
|
-
case "$FORMAT" in
|
|
126
|
-
text)
|
|
127
|
-
${PAGER:-less} "$path"
|
|
128
|
-
;;
|
|
129
|
-
markdown)
|
|
130
|
-
local tmpdir
|
|
131
|
-
tmpdir="$(mktemp -d)"
|
|
132
|
-
tar -xzf "$path" -C "$tmpdir"
|
|
133
|
-
ui_info "manual" "Markdown source extracted to: $tmpdir"
|
|
134
|
-
open_file "$tmpdir" 2>/dev/null || true
|
|
135
|
-
;;
|
|
136
|
-
html)
|
|
137
|
-
if ! $USE_LOCAL && ! $USE_OFFLINE; then
|
|
138
|
-
open_file "$MANUAL_URL/"
|
|
139
|
-
else
|
|
140
|
-
open_file "$path"
|
|
141
|
-
fi
|
|
142
|
-
;;
|
|
143
|
-
html-multi)
|
|
144
|
-
if ! $USE_LOCAL && ! $USE_OFFLINE; then
|
|
145
|
-
open_file "$MANUAL_URL/html/"
|
|
146
|
-
else
|
|
147
|
-
open_file "$path"
|
|
148
|
-
fi
|
|
149
|
-
;;
|
|
150
|
-
*)
|
|
151
|
-
open_file "$path"
|
|
152
|
-
;;
|
|
153
|
-
esac
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
cmd_download() {
|
|
157
|
-
local path
|
|
158
|
-
path="$(resolve_source "$FORMAT")"
|
|
159
|
-
[[ -z "$path" ]] && exit 1
|
|
160
|
-
local dest
|
|
161
|
-
dest="./$(basename "$path")"
|
|
162
|
-
cp "$path" "$dest"
|
|
163
|
-
ui_ok "manual" "saved: $dest"
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
case "$MODE" in
|
|
167
|
-
open) cmd_open ;;
|
|
168
|
-
download) cmd_download ;;
|
|
169
|
-
esac
|