fix(db-repo): порядок вывода и формулировки подсказок

Прогон всех веток вывода подряд показал, что длинный совет про перевыгрузку
вставал МЕЖДУ фактами и вердиктом: строка «захват не выполнен» терялась в
середине. Совет теперь печатается последним во всех ветках — сначала факты,
затем вердикт.

Убрана мёртвая подсказка про -Yes: флага больше нет. Снято утверждение «по
убыванию частоты» у причин отказа commit — проверить его нечем. Сняты повтор
слова «проверьте» и склонение «объект(ов)». Заголовок «Не были захвачены»
дополнен пояснением, что снимать нечего.

Примеры в шапке скрипта приведены к именованной подкоманде.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-23 13:19:39 +03:00
co-authored by Claude Opus 5
parent 1327b4fc5a
commit 67b8ad5b47
2 changed files with 33 additions and 19 deletions
+18 -11
View File
@@ -23,10 +23,10 @@
Захватывать объект вместе с подчинёнными (формы, макеты, команды) Захватывать объект вместе с подчинёнными (формы, макеты, команды)
.EXAMPLE .EXAMPLE
.\db-repo.ps1 lock -InfoBasePath "C:\Bases\MyDB" -Objects "Справочник.Номенклатура" .\db-repo.ps1 -Command lock -InfoBasePath "C:\Bases\MyDB" -Objects "Справочник.Номенклатура"
.EXAMPLE .EXAMPLE
.\db-repo.ps1 commit -InfoBasePath "C:\Bases\MyDB" -Objects "Справочник.Номенклатура" -Comment "Артикул" .\db-repo.ps1 -Command commit -InfoBasePath "C:\Bases\MyDB" -Objects "Справочник.Номенклатура" -Comment "Артикул"
#> #>
[CmdletBinding(PositionalBinding=$false)] [CmdletBinding(PositionalBinding=$false)]
@@ -717,7 +717,7 @@ function Write-ReceivedWarning {
param([string[]]$Received) param([string[]]$Received)
if (-not $Received -or $Received.Count -eq 0) { return } if (-not $Received -or $Received.Count -eq 0) { return }
Write-Host "" Write-Host ""
Write-Host "[warning] локальная конфигурация изменена: из хранилища получено $($Received.Count) объект(ов):" -ForegroundColor Yellow Write-Host "[warning] локальная конфигурация изменена, получено объектов из хранилища: $($Received.Count)" -ForegroundColor Yellow
foreach ($n in $Received) { Write-Host " $n" -ForegroundColor Yellow } foreach ($n in $Received) { Write-Host " $n" -ForegroundColor Yellow }
$owners = Get-OwnerObjects $Received $owners = Get-OwnerObjects $Received
$hasRoot = @($Received | Where-Object { ($_ -split '\.').Count -eq 1 }).Count -gt 0 $hasRoot = @($Received | Where-Object { ($_ -split '\.').Count -eq 1 }).Count -gt 0
@@ -827,12 +827,13 @@ function Write-RepoVerdict {
switch ($Cmd) { switch ($Cmd) {
'lock' { 'lock' {
# Порядок вывода: факты, затем вердикт, и только потом совет. Совет длинный, и
# между фактами и вердиктом он прятал бы главную строку.
Write-RepoObjects "Захвачено" $Log.Locked Write-RepoObjects "Захвачено" $Log.Locked
if ($Log.LockedByOther.Count -gt 0) { if ($Log.LockedByOther.Count -gt 0) {
Write-Host "Не удалось захватить ($($Log.LockedByOther.Count)):" -ForegroundColor Yellow Write-Host "Не удалось захватить ($($Log.LockedByOther.Count)):" -ForegroundColor Yellow
foreach ($o in $Log.LockedByOther) { Write-Host " $($o.Name) — держит $($o.Holder)" -ForegroundColor Yellow } foreach ($o in $Log.LockedByOther) { Write-Host " $($o.Name) — держит $($o.Holder)" -ForegroundColor Yellow }
} }
Write-ReceivedWarning $Log.Received
if ($Log.Locked.Count -eq 0 -and $Log.LockedByOther.Count -gt 0) { if ($Log.Locked.Count -eq 0 -and $Log.LockedByOther.Count -gt 0) {
# «Уже захвачено мной» платформа не печатает вовсе, поэтому отличить его от # «Уже захвачено мной» платформа не печатает вовсе, поэтому отличить его от
# «не захвачено» по логу нельзя — сверяем с тем, что просили. Заняты ВСЕ # «не захвачено» по логу нельзя — сверяем с тем, что просили. Заняты ВСЕ
@@ -843,26 +844,32 @@ function Write-RepoVerdict {
(@($requestedKeys | Where-Object { $blockedKeys -notcontains $_ }).Count -eq 0) (@($requestedKeys | Where-Object { $blockedKeys -notcontains $_ }).Count -eq 0)
if ($allBlocked) { if ($allBlocked) {
Write-Host "Захват не выполнен: все запрошенные объекты заняты." -ForegroundColor Red Write-Host "Захват не выполнен: все запрошенные объекты заняты." -ForegroundColor Red
Write-ReceivedWarning $Log.Received
return 1 return 1
} }
Write-Host "[warning] часть запрошенного занята другими; остальное уже было захвачено вами." -ForegroundColor Yellow Write-Host "[warning] часть запрошенного занята другими; остальное уже было захвачено вами." -ForegroundColor Yellow
Write-Host " Захваченное можно править: код возврата 0 именно поэтому." -ForegroundColor Yellow Write-Host " Захваченное можно править: код возврата 0 именно поэтому." -ForegroundColor Yellow
Write-ReceivedWarning $Log.Received
return 0 return 0
} }
if ($Log.Locked.Count -eq 0 -and $PlatformExit -eq 0) { if ($Log.Locked.Count -eq 0 -and $PlatformExit -eq 0) {
# Захват уже захваченного СОБОЙ: платформа не печатает ни блока операции, ни строк. # Захват уже захваченного СОБОЙ: платформа не печатает ни блока операции, ни строк.
Write-Host "Объекты уже захвачены вами — изменений не потребовалось." -ForegroundColor Green Write-Host "Объекты уже захвачены вами — изменений не потребовалось." -ForegroundColor Green
Write-ReceivedWarning $Log.Received
return 0 return 0
} }
if ($Log.Locked.Count -eq 0) { if ($Log.Locked.Count -eq 0) {
Write-Host "Захват не выполнен (код $PlatformExit)$(Get-ExitAnnotation $PlatformExit)" -ForegroundColor Red Write-Host "Захват не выполнен (код $PlatformExit)$(Get-ExitAnnotation $PlatformExit)" -ForegroundColor Red
Write-ReceivedWarning $Log.Received
return 1 return 1
} }
if ($Log.LockedByOther.Count -gt 0) { if ($Log.LockedByOther.Count -gt 0) {
Write-Host "[warning] захват выполнен частично — перечисленные выше объекты остались у других пользователей." -ForegroundColor Yellow Write-Host "[warning] захват выполнен частично — перечисленные выше объекты остались у других пользователей." -ForegroundColor Yellow
Write-Host " Захваченное можно править: код возврата 0 именно поэтому." -ForegroundColor Yellow Write-Host " Захваченное можно править: код возврата 0 именно поэтому." -ForegroundColor Yellow
Write-ReceivedWarning $Log.Received
return 0 return 0
} }
Write-ReceivedWarning $Log.Received
return $PlatformExit return $PlatformExit
} }
'unlock' { 'unlock' {
@@ -871,16 +878,16 @@ function Write-RepoVerdict {
if ($Log.Modified.Count -gt 0) { if ($Log.Modified.Count -gt 0) {
Write-Host "Отмена захвата не выполнена: у объектов есть локальные изменения ($($Log.Modified.Count)):" -ForegroundColor Red Write-Host "Отмена захвата не выполнена: у объектов есть локальные изменения ($($Log.Modified.Count)):" -ForegroundColor Red
foreach ($n in $Log.Modified) { Write-Host " $n" -ForegroundColor Red } foreach ($n in $Log.Modified) { Write-Host " $n" -ForegroundColor Red }
Write-Host "Поместите их (/db-repo commit) либо откажитесь от них: -Force -Yes перезапишет объекты версией из хранилища." -ForegroundColor Yellow Write-Host "Поместите их (/db-repo commit) либо откажитесь от них: -Force перезапишет объекты версией из хранилища." -ForegroundColor Yellow
} else { } else {
Write-Host "Отмена захвата не выполнена (код $PlatformExit)$(Get-ExitAnnotation $PlatformExit)" -ForegroundColor Red Write-Host "Отмена захвата не выполнена (код $PlatformExit)$(Get-ExitAnnotation $PlatformExit)" -ForegroundColor Red
} }
return 1 return 1
} }
Write-RepoObjects "Захват отменён" $Log.Unlocked Write-RepoObjects "Захват отменён" $Log.Unlocked
Write-RepoObjects "Не были захвачены" $Log.NotLocked 'Yellow' Write-RepoObjects "Не были захвачены — снимать нечего" $Log.NotLocked 'Yellow'
Write-ReceivedWarning $Log.Received
if ($Log.Unlocked.Count -eq 0) { Write-Host "Изменений не потребовалось." -ForegroundColor Green } if ($Log.Unlocked.Count -eq 0) { Write-Host "Изменений не потребовалось." -ForegroundColor Green }
Write-ReceivedWarning $Log.Received
return 0 return 0
} }
'commit' { 'commit' {
@@ -888,10 +895,10 @@ function Write-RepoVerdict {
# Платформа отдаёт голую «Ошибка помещения изменений объектов в хранилище» — # Платформа отдаёт голую «Ошибка помещения изменений объектов в хранилище» —
# ни объекта, ни причины, одинаково для всех причин. Диагностику даём свою. # ни объекта, ни причины, одинаково для всех причин. Диагностику даём свою.
Write-Host "Помещение не выполнено (код $PlatformExit)$(Get-ExitAnnotation $PlatformExit)" -ForegroundColor Red Write-Host "Помещение не выполнено (код $PlatformExit)$(Get-ExitAnnotation $PlatformExit)" -ForegroundColor Red
Write-Host "Платформа не называет причину. Обычные причины, по убыванию частоты:" -ForegroundColor Yellow Write-Host "Платформа не называет причину. Проверьте:" -ForegroundColor Yellow
Write-Host " - объект не захвачен вами (проверьте: /db-repo lock)" -ForegroundColor Yellow Write-Host " - захвачен ли объект вами: /db-repo lock" -ForegroundColor Yellow
Write-Host " - объект захвачен другим пользователем" -ForegroundColor Yellow Write-Host " - не держит ли его другой пользователь" -ForegroundColor Yellow
Write-Host " - у пользователя хранилища нет права на помещение" -ForegroundColor Yellow Write-Host " - есть ли у пользователя хранилища право на помещение" -ForegroundColor Yellow
return 1 return 1
} }
Write-RepoObjects "Помещено в хранилище" $Log.Committed Write-RepoObjects "Помещено в хранилище" $Log.Committed
+15 -8
View File
@@ -621,7 +621,7 @@ def print_received_warning(received):
if not received: if not received:
return return
print("") print("")
print("[warning] локальная конфигурация изменена: из хранилища получено %d объект(ов):" % len(received)) print("[warning] локальная конфигурация изменена, получено объектов из хранилища: %d" % len(received))
for n in received: for n in received:
print(" %s" % n) print(" %s" % n)
owners = owner_objects(received) owners = owner_objects(received)
@@ -726,12 +726,13 @@ def write_repo_verdict(cmd, log, platform_exit, requested, report_format="", out
return 1 return 1
if cmd == "lock": if cmd == "lock":
# Порядок вывода: факты, затем вердикт, и только потом совет. Совет длинный, и
# между фактами и вердиктом он прятал бы главную строку.
print_repo_objects("Захвачено", log["locked"]) print_repo_objects("Захвачено", log["locked"])
if log["locked_by_other"]: if log["locked_by_other"]:
print("Не удалось захватить (%d):" % len(log["locked_by_other"])) print("Не удалось захватить (%d):" % len(log["locked_by_other"]))
for o in log["locked_by_other"]: for o in log["locked_by_other"]:
print(" %s — держит %s" % (o["name"], o["holder"])) print(" %s — держит %s" % (o["name"], o["holder"]))
print_received_warning(log["received"])
if not log["locked"] and log["locked_by_other"]: if not log["locked"] and log["locked_by_other"]:
# «Уже захвачено мной» платформа не печатает вовсе, поэтому отличить его от # «Уже захвачено мной» платформа не печатает вовсе, поэтому отличить его от
# «не захвачено» по логу нельзя — сверяем с тем, что просили. Заняты ВСЕ # «не захвачено» по логу нельзя — сверяем с тем, что просили. Заняты ВСЕ
@@ -741,21 +742,27 @@ def write_repo_verdict(cmd, log, platform_exit, requested, report_format="", out
all_blocked = (not asked) or all(k in blocked for k in asked) all_blocked = (not asked) or all(k in blocked for k in asked)
if all_blocked: if all_blocked:
print("Захват не выполнен: все запрошенные объекты заняты.") print("Захват не выполнен: все запрошенные объекты заняты.")
print_received_warning(log["received"])
return 1 return 1
print("[warning] часть запрошенного занята другими; остальное уже было захвачено вами.") print("[warning] часть запрошенного занята другими; остальное уже было захвачено вами.")
print(" Захваченное можно править: код возврата 0 именно поэтому.") print(" Захваченное можно править: код возврата 0 именно поэтому.")
print_received_warning(log["received"])
return 0 return 0
if not log["locked"] and platform_exit == 0: if not log["locked"] and platform_exit == 0:
# Захват уже захваченного СОБОЙ: платформа не печатает ни блока операции, ни строк. # Захват уже захваченного СОБОЙ: платформа не печатает ни блока операции, ни строк.
print("Объекты уже захвачены вами — изменений не потребовалось.") print("Объекты уже захвачены вами — изменений не потребовалось.")
print_received_warning(log["received"])
return 0 return 0
if not log["locked"]: if not log["locked"]:
print("Захват не выполнен (код %s)%s" % (platform_exit, describe_exit(platform_exit))) print("Захват не выполнен (код %s)%s" % (platform_exit, describe_exit(platform_exit)))
print_received_warning(log["received"])
return 1 return 1
if log["locked_by_other"]: if log["locked_by_other"]:
print("[warning] захват выполнен частично — перечисленные выше объекты остались у других пользователей.") print("[warning] захват выполнен частично — перечисленные выше объекты остались у других пользователей.")
print(" Захваченное можно править: код возврата 0 именно поэтому.") print(" Захваченное можно править: код возврата 0 именно поэтому.")
print_received_warning(log["received"])
return 0 return 0
print_received_warning(log["received"])
return platform_exit return platform_exit
if cmd == "unlock": if cmd == "unlock":
@@ -771,10 +778,10 @@ def write_repo_verdict(cmd, log, platform_exit, requested, report_format="", out
print("Отмена захвата не выполнена (код %s)%s" % (platform_exit, describe_exit(platform_exit))) print("Отмена захвата не выполнена (код %s)%s" % (platform_exit, describe_exit(platform_exit)))
return 1 return 1
print_repo_objects("Захват отменён", log["unlocked"]) print_repo_objects("Захват отменён", log["unlocked"])
print_repo_objects("Не были захвачены", log["not_locked"]) print_repo_objects("Не были захвачены — снимать нечего", log["not_locked"])
print_received_warning(log["received"])
if not log["unlocked"]: if not log["unlocked"]:
print("Изменений не потребовалось.") print("Изменений не потребовалось.")
print_received_warning(log["received"])
return 0 return 0
if cmd == "commit": if cmd == "commit":
@@ -782,10 +789,10 @@ def write_repo_verdict(cmd, log, platform_exit, requested, report_format="", out
# Платформа отдаёт голую «Ошибка помещения изменений объектов в хранилище» — # Платформа отдаёт голую «Ошибка помещения изменений объектов в хранилище» —
# ни объекта, ни причины, одинаково для всех причин. Диагностику даём свою. # ни объекта, ни причины, одинаково для всех причин. Диагностику даём свою.
print("Помещение не выполнено (код %s)%s" % (platform_exit, describe_exit(platform_exit))) print("Помещение не выполнено (код %s)%s" % (platform_exit, describe_exit(platform_exit)))
print("Платформа не называет причину. Обычные причины, по убыванию частоты:") print("Платформа не называет причину. Проверьте:")
print(" - объект не захвачен вами (проверьте: /db-repo lock)") print(" - захвачен ли объект вами: /db-repo lock")
print(" - объект захвачен другим пользователем") print(" - не держит ли его другой пользователь")
print(" - у пользователя хранилища нет права на помещение") print(" - есть ли у пользователя хранилища право на помещение")
return 1 return 1
print_repo_objects("Помещено в хранилище", log["committed"]) print_repo_objects("Помещено в хранилище", log["committed"])
print_repo_objects("Без изменений — не помещались", log["unchanged"]) print_repo_objects("Без изменений — не помещались", log["unchanged"])