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>
This commit is contained in:
Dmitry DementievandClaude Opus 4.6 committed 2026-03-22 17:59:59 +03:00
1 parent c06ad1ecbb
commit 1963b6a117
3 files changed
+273 -379

No files matched your search

@@ -1,10 +1,25 @@
# Миграция существующего ~/.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
}
$GlobalGitConfig = Join-Path $HOME '.gitconfig'
$LocalGitConfig = Join-Path $HOME '.gitconfig.local'
$BackupPath = '{0}.pre-chezmoi.bak-{1}' -f $GlobalGitConfig, (Get-Date -Format 'yyyyMMdd-HHmmss')
$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]
@@ -38,61 +53,52 @@ $ManagedStubs = @(
'@
)
# Ключи baseline, которые нужно удалить из .local при миграции.
$ManagedKeys = @(
'core.autocrlf',
'core.eol',
'core.quotepath',
'core.longpaths',
'fetch.prune',
'pull.ff',
'init.defaultBranch'
'core.autocrlf', 'core.eol', 'core.quotepath', 'core.longpaths',
'fetch.prune', 'pull.ff', 'init.defaultBranch'
)
function Test-ManagedGitStub {
param(
[Parameter(Mandatory = $true)]
[string]$Content
)
$NormalizedContent = ($Content -replace "`r", '').Trim()
foreach ($ManagedStub in $ManagedStubs) {
$NormalizedStub = ($ManagedStub -replace "`r", '').Trim()
if ($NormalizedContent -eq $NormalizedStub) {
return $true
}
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
}
if (-not (Test-Path -LiteralPath $GlobalGitConfig)) {
if (-not (Test-Path -LiteralPath $LocalGitConfig)) {
New-Item -ItemType File -Path $LocalGitConfig -Force | Out-Null
# ── Основная логика ──────────────────────────────────────────────────
# Случай 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
}
$CurrentContent = Get-Content -LiteralPath $GlobalGitConfig -Raw
if (Test-ManagedGitStub -Content $CurrentContent) {
if (-not (Test-Path -LiteralPath $LocalGitConfig)) {
New-Item -ItemType File -Path $LocalGitConfig -Force | Out-Null
# Случай 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
}
if (-not (Test-Path -LiteralPath $LocalGitConfig)) {
Copy-Item -LiteralPath $GlobalGitConfig -Destination $BackupPath -Force
Copy-Item -LiteralPath $GlobalGitConfig -Destination $LocalGitConfig -Force
# Случай 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 $LocalGitConfig --unset-all $Key 2>$null
git config --file $LocalConfig --unset-all $Key 2>$null
}
Write-Host "Migrated existing ~/.gitconfig to ~/.gitconfig.local"
Write-Host "Backup saved to: $BackupPath"
Write-Host "Мигрировано: ~/.gitconfig -> ~/.gitconfig.local"
Write-Host "Бэкап: $BackupPath"
return
}
Copy-Item -LiteralPath $GlobalGitConfig -Destination $BackupPath -Force
Write-Warning "~/.gitconfig.local already exists; current ~/.gitconfig was backed up before managed stub overwrite."
Write-Host "Backup saved to: $BackupPath"
# Случай 4: .gitconfig.local уже есть — просто бэкапим.
Copy-Item -LiteralPath $GlobalConfig -Destination $BackupPath -Force
Write-Warning "~/.gitconfig.local уже существует; текущий ~/.gitconfig сохранён в бэкап."
Write-Host "Бэкап: $BackupPath"