Files
dotfiles/chezmoi/.chezmoiscripts/run_before_10-migrate-gitconfig.ps1
T
Dmitry DementievandClaude Opus 4.6 1963b6a117 refactor(windows): причёсан стиль chezmoi-скриптов и pwsh-профиля
- Зачем:
  - код Codex работал, но был тяжёл для чтения и сопровождения: 4 naming-конвенции, скрытая мутация $script:changed, 298 строк WT-скрипта почти без комментариев.
- Что:
  - profile.ps1: комментарии на русском перед каждой функцией, секционные разделители, wt-here → wt_here (единый snake_case), Get-PublicIp упрощён до Invoke-RestMethod, Chocolatey boilerplate обрезан.
  - WT-скрипт: Set/Remove-Prop возвращают bool вместо мутации $script:changed, naming выровнен в PascalCase, хелперы переименованы (Get-Prop, Set-Prop, Test-IsPS7, Test-IsStockPS7), комментарии к каждому блоку логики, вывод на русском.
  - Git-миграция: блок комментариев с описанием 4 сценариев, пояснение 3 вариантов ManagedStubs, naming выровнен, вывод на русском.
- Проверка:
  - pwsh -NoProfile -Command "[System.Management.Automation.Language.Parser]::ParseFile(...)" — синтаксис всех трёх файлов OK.
  - chezmoi -S "$HOME\dotfiles\chezmoi" apply --dry-run --verbose.

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

105 lines
3.7 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 "Мигрировано: ~/.gitconfig -> ~/.gitconfig.local"
Write-Host "Бэкап: $BackupPath"
return
}
# Случай 4: .gitconfig.local уже есть — просто бэкапим.
Copy-Item -LiteralPath $GlobalConfig -Destination $BackupPath -Force
Write-Warning "~/.gitconfig.local уже существует; текущий ~/.gitconfig сохранён в бэкап."
Write-Host "Бэкап: $BackupPath"