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:
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"
|
||||
Reference in new issue
Block a user