From 24b2283b318fb0e68342e77c13ab220f77db4de1 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Tue, 28 Jul 2026 08:17:31 +0200 Subject: bootstrap: git.sh und git.ps1 hinzugefuegt (git + delta), Doku angepasst --- bootstrap-win/git.ps1 | 75 +++++++++++++++++++++++++++++++++++++++++++++++ bootstrap/git.sh | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ neovim-windows-setup.md | 10 ++++--- readme.md | 7 +++++ 4 files changed, 166 insertions(+), 4 deletions(-) create mode 100644 bootstrap-win/git.ps1 create mode 100755 bootstrap/git.sh diff --git a/bootstrap-win/git.ps1 b/bootstrap-win/git.ps1 new file mode 100644 index 0000000..41a3112 --- /dev/null +++ b/bootstrap-win/git.ps1 @@ -0,0 +1,75 @@ +#Requires -Version 5.1 +<# + Installiert Git und delta (Pager fuer git/config) per winget. + + Aufruf (keine Admin-Rechte noetig): + .\bootstrap-win\git.ps1 +#> + +$ErrorActionPreference = "Stop" +$script:Failures = @() + +function Write-Ok($msg) { + Write-Host "OK $msg" -ForegroundColor Green +} + +function Write-Step($msg) { + Write-Host "==> $msg" -ForegroundColor Cyan +} + +function Write-Skip($msg) { + Write-Host "- $msg bereits vorhanden" -ForegroundColor DarkGray +} + +function Write-Warn($msg) { + Write-Host "! $msg" -ForegroundColor Yellow + $script:Failures += $msg +} + +function Test-CommandExists([string]$Name) { + return [bool](Get-Command $Name -ErrorAction SilentlyContinue) +} + +function Install-WingetPackage([string]$Binary, [string]$Id) { + if (Test-CommandExists $Binary) { + Write-Skip $Binary + return + } + + Write-Step "winget install $Id" + $output = winget install --id $Id -e --source winget --accept-package-agreements --accept-source-agreements --silent 2>&1 + + if ($LASTEXITCODE -ne 0) { + $lastLine = ($output | Select-Object -Last 3) -join " / " + Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden): $lastLine -- Pruefen mit: winget search $Id" + return + } + + Write-Ok $Id +} + +function Test-Prerequisites { + if (-not (Test-CommandExists "winget")) { + Write-Host "Fehler: winget wurde nicht gefunden. 'App Installer' aus dem Microsoft Store installieren." -ForegroundColor Red + exit 1 + } +} + +function Main { + Test-Prerequisites + + Install-WingetPackage -Binary "git" -Id "Git.Git" + Install-WingetPackage -Binary "delta" -Id "dandavison.delta" + + Write-Host "" + if ($script:Failures.Count -eq 0) { + Write-Host "Bootstrap abgeschlossen." -ForegroundColor Green + } else { + Write-Host "Bootstrap abgeschlossen, mit $($script:Failures.Count) Warnung(en):" -ForegroundColor Yellow + foreach ($f in $script:Failures) { + Write-Host " - $f" -ForegroundColor Yellow + } + } +} + +Main diff --git a/bootstrap/git.sh b/bootstrap/git.sh new file mode 100755 index 0000000..36d7067 --- /dev/null +++ b/bootstrap/git.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +set -eu + +OS="$(uname -s)" + +die() { + printf 'Fehler: %s\n' "$*" >&2 + exit 1 +} + +have() { + command -v "$1" >/dev/null 2>&1 +} + +check_prerequisites() { + case "$OS" in + Darwin) + if ! have brew; then + die "Homebrew ist nicht installiert." + fi + ;; + FreeBSD) + if ! have doas; then + die "doas ist nicht installiert." + fi + ;; + *) + die "Nicht unterstütztes Betriebssystem: $OS" + ;; + esac +} + +setup_homebrew_env() { + case "$OS" in + Darwin) + export HOMEBREW_NO_AUTO_UPDATE=1 + export HOMEBREW_NO_INSTALL_CLEANUP=1 + ;; + esac +} + +install_pkg() { + binary="$1" + package="$2" + + if have "$binary"; then + printf "✓ %-32s vorhanden\n" "$binary" + return + fi + + printf "→ Installiere %s\n" "$package" + + case "$OS" in + Darwin) + brew install "$package" + ;; + FreeBSD) + doas pkg install -y "$package" + ;; + esac +} + +install_prerequisites() { + install_pkg git git + install_pkg delta git-delta +} + +main() { + check_prerequisites + setup_homebrew_env + + install_prerequisites + + printf "\nBootstrap abgeschlossen.\n" +} + +main "$@" diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index c925f59..0fbeefe 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -10,7 +10,7 @@ Alle Windows-Skripte in diesem Repo sind reines PowerShell (kein Git Bash, kein - **Nach jedem Skript-Lauf ein neues Terminal öffnen**, bevor `nvim` das erste Mal gestartet wird. PATH-Änderungen (durch winget/npm-Installer oder `install-win.ps1`) landen in der Registry, aber die aktuell offene Shell bekommt das nicht automatisch mit. - **PATH-Registrierung stichprobenartig prüfen** – manche winget-Pakete tragen sich nicht automatisch in den PATH ein (im Praxistest z. B. `LLVM.LLVM`: bereits installiert, aber `clangd` nicht im PATH, vermutlich weil der `--silent`-Installer die PATH-Registrierung überspringt). Nach einem neuen Terminal kurz `Get-Command clangd, jq, make` aufrufen; fehlt eins, dessen Installationsordner (bei LLVM z. B. `C:\Program Files\LLVM\bin`) manuell zum User-PATH hinzufügen (gleiches Muster wie `Add-BinToUserPath` in `install-win.ps1`). - **yamlfmt, gawk, xmllint (libxml2) manuell installieren, falls benötigt** – im Praxistest bestätigt, dass es dafür keine winget-Pakete gibt ("Es wurde kein Paket gefunden, das den Eingabekriterien entspricht"), deshalb absichtlich nicht in `bootstrap-win/neovim.ps1` enthalten. Betrifft nur die Formatierung von awk-, xml/xsd- und yaml-Dateien (`conform.nvim` fällt sonst auf LSP-Formatierung zurück). Bekannte Alternativen: yamlfmt via `go install github.com/google/yamlfmt/cmd/yamlfmt@latest` (falls Go installiert) oder Binary von den GitHub-Releases; für gawk/xmllint keine verifizierte Windows-native Quelle gefunden, ggf. `winget search gawk` / `winget search libxml2` selbst prüfen. -- **Reihenfolge**: `install-win.ps1` und `bootstrap-win/neovim.ps1` sind unabhängig voneinander, `bootstrap-win/neovim-dict.ps1` ebenso. Empfehlenswert: erst Neovim/Git/Node (Abschnitt 1) installieren, dann beide Bootstrap-Skripte laufen lassen, dann neues Terminal öffnen, dann `nvim` starten (lädt beim ersten Start automatisch alle Lua-Plugins via `lazy.nvim` – Internetverbindung nötig). +- **Reihenfolge**: `install-win.ps1`, `bootstrap-win/git.ps1`, `bootstrap-win/neovim.ps1` und `bootstrap-win/neovim-dict.ps1` sind unabhängig voneinander. Empfehlenswert: erst Neovim/Node (Abschnitt 1) installieren, dann alle Bootstrap-Skripte laufen lassen, dann neues Terminal öffnen, dann `nvim` starten (lädt beim ersten Start automatisch alle Lua-Plugins via `lazy.nvim` – Internetverbindung nötig). - **Neovim immer aus einer "Developer PowerShell for VS" starten** (Startmenü-Eintrag, den Visual Studio/die Build Tools mitbringen), nicht aus normalem Windows Terminal/PowerShell. `cl.exe` (MSVC) braucht die `INCLUDE`/`LIB`-Umgebungsvariablen aus `vcvarsall.bat`, die nur in dieser Developer-Shell gesetzt sind – siehe Abschnitt 4. ## 1. Grundwerkzeuge installieren @@ -20,12 +20,14 @@ Execution Policy einmalig setzen, sonst starten die `.ps1`-Skripte in diesem Rep ```powershell Set-ExecutionPolicy -Scope CurrentUser RemoteSigned winget install Neovim.Neovim -winget install Git.Git winget install OpenJS.NodeJS.LTS -winget install dandavison.delta ``` -`delta` wird von `git/config` als Pager vorausgesetzt (`pager = delta`, `diffFilter = delta --color-only`). War auch unter macOS/FreeBSD nie Teil von `bootstrap/neovim.sh` – wurde dort offenbar immer manuell installiert. +Git und `delta` (Pager, von `git/config` vorausgesetzt: `pager = delta`, `diffFilter = delta --color-only`) installiert `bootstrap-win/git.ps1`: + +```powershell +.\bootstrap-win\git.ps1 +``` (Kein Python nötig – der Python-Provider ist in `options.lua` deaktiviert. Auch kein separater C-Compiler nötig – MSVC ist auf den Zielsystemen bereits vorhanden, siehe Abschnitt 3 bzw. 4.) diff --git a/readme.md b/readme.md index f4e914e..abeacb7 100644 --- a/readme.md +++ b/readme.md @@ -25,12 +25,19 @@ Bootstrap the zsh environment: ./bootstrap/zsh.sh ``` +Bootstrap the git environment: + +```sh +./bootstrap/git.sh +``` + ### Windows Native PowerShell, no WSL/Git Bash required: ```powershell .\install-win.ps1 +.\bootstrap-win\git.ps1 .\bootstrap-win\neovim.ps1 .\bootstrap-win\neovim-dict.ps1 ``` -- cgit v1.3