Files
dotfiles/chezmoi/.chezmoiscripts/run_before_10-migrate-gitconfig.ps1
T
ddadminandClaude Opus 4.6 21a6494cc4 fix(chezmoi): кириллица в PS-скриптах ломала парсер на Windows
- Зачем:
  - PS 5.1 читает UTF-8 без BOM как системную кодовую страницу;
    байт 0x91 из «Бэкап» интерпретировался как кавычка, ломая парсер.
- Что:
  - заменена кириллица в Write-Host/Write-Warning на английский текст
    в run_20-configure-windows-terminal.ps1 и run_before_10-migrate-gitconfig.ps1.
  - комментарии на русском оставлены (парсер их не обрабатывает).
- Проверка:
  - chezmoi -S "$HOME\dotfiles\chezmoi" apply (на Windows)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 20:11:32 +03:00

105 lines
3.6 KiB
PowerShell

# Миграция существующего ~/.gitconfig перед тем, как chezmoi подставит managed stub.
#
# Логика:
# 1. Если ~/.gitconfig нет — создаём пустой ~/.gitconfig.local и выходим.
# 2. Если ~/.gitconfig уже содержит managed stub — ничего не делаем.
# 3. Если ~/.gitconfig.local нет — переносим текущий .gitconfig в .local,
# удаляем из .local ключи, которые управляются baseline, и сохраняем бэкап.
# 4. Если ~/.gitconfig.local уже есть — просто бэкапим текущий .gitconfig
# (chezmoi перезапишет его managed stub-ом).
#
# Три варианта ManagedStubs — чтобы распознать и текущий формат,
# и предыдущие итерации (когда baseline жил в ~/.config/git/config).
if (-not ($IsWindows -or $PSVersionTable.PSEdition -eq 'Desktop')) {
return
}
$GlobalConfig = Join-Path $HOME '.gitconfig'
$LocalConfig = Join-Path $HOME '.gitconfig.local'
$BackupPath = '{0}.pre-chezmoi.bak-{1}' -f $GlobalConfig, (Get-Date -Format 'yyyyMMdd-HHmmss')
# Все исторические варианты managed stub (нормализуются без \r и trim).
$ManagedStubs = @(
@'
[core]
autocrlf = false
eol = lf
quotepath = false
longpaths = true
[fetch]
prune = true
[pull]
ff = only
[init]
defaultBranch = main
[include]
path = ~/.gitconfig.local
'@,
@'
[include]
path = ~/.gitconfig.local
'@,
@'
[include]
path = ~/.config/git/config
[include]
path = ~/.gitconfig.local
'@
)
# Ключи baseline, которые нужно удалить из .local при миграции.
$ManagedKeys = @(
'core.autocrlf', 'core.eol', 'core.quotepath', 'core.longpaths',
'fetch.prune', 'pull.ff', 'init.defaultBranch'
)
function Test-IsManagedStub ([string]$Content) {
$Norm = ($Content -replace "`r", '').Trim()
foreach ($Stub in $ManagedStubs) {
if ($Norm -eq ($Stub -replace "`r", '').Trim()) { return $true }
}
return $false
}
# ── Основная логика ──────────────────────────────────────────────────
# Случай 1: .gitconfig отсутствует — chezmoi создаст его сам.
if (-not (Test-Path -LiteralPath $GlobalConfig)) {
if (-not (Test-Path -LiteralPath $LocalConfig)) {
New-Item -ItemType File -Path $LocalConfig -Force | Out-Null
}
return
}
# Случай 2: .gitconfig уже managed — ничего не делаем.
$Content = Get-Content -LiteralPath $GlobalConfig -Raw
if (Test-IsManagedStub $Content) {
if (-not (Test-Path -LiteralPath $LocalConfig)) {
New-Item -ItemType File -Path $LocalConfig -Force | Out-Null
}
return
}
# Случай 3: .gitconfig.local нет — мигрируем.
if (-not (Test-Path -LiteralPath $LocalConfig)) {
Copy-Item -LiteralPath $GlobalConfig -Destination $BackupPath -Force
Copy-Item -LiteralPath $GlobalConfig -Destination $LocalConfig -Force
foreach ($Key in $ManagedKeys) {
git config --file $LocalConfig --unset-all $Key 2>$null
}
Write-Host "Migrated: ~/.gitconfig -> ~/.gitconfig.local"
Write-Host "Backup: $BackupPath"
return
}
# Случай 4: .gitconfig.local уже есть — просто бэкапим.
Copy-Item -LiteralPath $GlobalConfig -Destination $BackupPath -Force
Write-Warning "~/.gitconfig.local already exists; current ~/.gitconfig saved as backup."
Write-Host "Backup: $BackupPath"