From 4b6ced87c4de38c156c447417f13be1ff1ce59fb Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 19 Jul 2026 12:54:55 +0300 Subject: [PATCH] =?UTF-8?q?feat(cfe-patch-method):=20conflict.md=20?= =?UTF-8?q?=E2=80=94=20=D0=BE=D0=B1=D1=80=D0=B0=D0=BC=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B2=D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=8F=D0=BA=D0=BE=D1=80=D1=8F=D0=BC=D0=B8=20+=20=D0=BD=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20(v2.3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - непереносимый блок показывается в контексте (строки-до/#Вставка/строки-после), вместо раздельных списков «после:/перед:» + «Блок:» - нумерация конфликтов: ### Конфликт №N в conflict.md и // [РЕСИНК-КОНФЛИКТ №N] над припаркованным блоком в .bsl — сопоставление один-к-одному при нескольких конфликтах в одном методе - локатор в модуле — по метке №N (grep-стабильно), без номеров строк - зеркально в .py, снэпшот resync-conflict обновлён Co-Authored-By: Claude Opus 4.8 --- .../scripts/cfe-patch-method.ps1 | 36 +++++++++++------ .../scripts/cfe-patch-method.py | 39 ++++++++++--------- .../CommonModules/РесинкКонфл/Ext/Module.bsl | 4 +- 3 files changed, 48 insertions(+), 31 deletions(-) diff --git a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1 b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1 index afe21e3f..b05bd0a4 100644 --- a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1 +++ b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1 @@ -1,4 +1,4 @@ -# cfe-patch-method v2.2 — Source-aware method interceptor for 1C extension (CFE) +# cfe-patch-method v2.3 — Source-aware method interceptor for 1C extension (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -531,18 +531,25 @@ function Write-ConflictFolder { $md += "Причина: $(Get-ResyncConflictReason $disputed)" $md += "" $md += "## Не размещено — перенести вручную" + $cn = 0 foreach ($d in $disputed) { + $cn++ $md += "" if ($d.Kind -eq 'insert') { - $md += "Вставка. В вашей версии (local) блок стоял по якорю:" - if ($d.Before -and $d.Before.Count -gt 0) { $md += " после:"; foreach ($l in $d.Before) { $md += " $l" } } else { $md += " после: (начало метода)" } - if ($d.After -and $d.After.Count -gt 0) { $md += " перед:"; foreach ($l in $d.After) { $md += " $l" } } else { $md += " перед: (конец метода)" } - $md += "Якорь изменился/исчез в новом оригинале (remote) — потому блок не лёг автоматически (см. дифф base→remote ниже)." - $md += "Куда переносить: если якорного кода в новом методе больше нет — он, вероятно, вынесен/отрефакторен (ищите в диффе новый вызов/процедуру). Размести адаптацию по смыслу: например пост-обработкой после нового вызова, либо в заимствованной процедуре, куда переехал код. При правке файла сохрани кодировку (UTF-8 с BOM). Блок:" + $md += "### Конфликт №$cn — вставка" + $md += "Как блок стоял в вашей версии (local):" + if ($d.Before -and $d.Before.Count -gt 0) { foreach ($l in $d.Before) { $md += $l } } $md += "#Вставка"; foreach ($l in $d.Lines) { $md += $l }; $md += "#КонецВставки" + if ($d.After -and $d.After.Count -gt 0) { foreach ($l in $d.After) { $md += $l } } + $md += "" + $md += "Якорь (строки вокруг #Вставка) изменился/исчез в новом оригинале — блок не лёг автоматически (см. дифф base→remote ниже)." + $md += "В модуле расширения блок припаркован в конце метода под меткой // [РЕСИНК-КОНФЛИКТ №$cn] — найди по ней." + $md += "Куда переносить: если якорного кода в новом методе больше нет — он, вероятно, вынесен/отрефакторен (ищите в диффе новый вызов/процедуру). Размести адаптацию по смыслу: например пост-обработкой после нового вызова, либо в заимствованной процедуре, куда переехал код. При правке файла сохрани кодировку (UTF-8 с BOM)." } else { - $md += "Удаление. Строки для удаления не найдены в новом оригинале (изменились/исчезли):" + $md += "### Конфликт №$cn — удаление" + $md += "Строки для удаления не найдены в новом оригинале (изменились/исчезли):" foreach ($l in $d.Lines) { $md += " - $($l.Trim())" } + $md += "В модуле расширения помечено меткой // [РЕСИНК-КОНФЛИКТ №$cn]." } } $md += "" @@ -628,11 +635,18 @@ function Invoke-Resync { if ($insertAfter.ContainsKey($k)) { foreach ($blk in $insertAfter[$k]) { $newBody += "#Вставка"; foreach ($l in $blk) { $newBody += $l }; $newBody += "#КонецВставки" } } } if ($disputed.Count -gt 0) { - $newBody += "`t// [РЕСИНК-КОНФЛИКТ] перенесите блоки ниже вручную — исходный якорь изменился в новой версии оригинала." - $newBody += "`t// Материалы: см. index.md / conflict.md в merge-воркспейсе (путь в выводе)." + $newBody += "`t// [РЕСИНК-КОНФЛИКТ] блоки ниже не легли автоматически — перенесите вручную (по № см. conflict.md / index.md в merge-воркспейсе, путь в выводе)." + $cn = 0 foreach ($d in $disputed) { - if ($d.Kind -eq 'insert') { $newBody += "#Вставка"; foreach ($l in $d.Lines) { $newBody += $l }; $newBody += "#КонецВставки" } - else { $newBody += "`t// [РЕСИНК-КОНФЛИКТ] не удалось найти для удаления:"; foreach ($l in $d.Lines) { $newBody += ("`t// " + $l.Trim()) } } + $cn++ + if ($d.Kind -eq 'insert') { + $newBody += "`t// [РЕСИНК-КОНФЛИКТ №$cn] вставка — исходный якорь изменён в новом оригинале." + $newBody += "#Вставка"; foreach ($l in $d.Lines) { $newBody += $l }; $newBody += "#КонецВставки" + } + else { + $newBody += "`t// [РЕСИНК-КОНФЛИКТ №$cn] удаление — строки не найдены в новом оригинале:" + foreach ($l in $d.Lines) { $newBody += ("`t// " + $l.Trim()) } + } } } $asyncPrefix = if ($method.IsAsync) { "Асинх " } else { "" } diff --git a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py index 41583bc0..6a3c09ba 100644 --- a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py +++ b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cfe-patch-method v2.2 — Source-aware method interceptor for 1C extension (CFE) +# cfe-patch-method v2.3 — Source-aware method interceptor for 1C extension (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -869,29 +869,30 @@ def write_conflict_folder(folder, method_id, ext_bsl, existing_name, method, v1, md.append("Причина: %s" % conflict_reason(disputed)) md.append("") md.append("## Не размещено — перенести вручную") + cn = 0 for d in disputed: + cn += 1 md.append("") if d["kind"] == "insert": - md.append("Вставка. В вашей версии (local) блок стоял по якорю:") + md.append("### Конфликт №%d — вставка" % cn) + md.append("Как блок стоял в вашей версии (local):") if d.get("before"): - md.append(" после:") for l in d["before"]: - md.append(" " + l) - else: - md.append(" после: (начало метода)") - if d.get("after"): - md.append(" перед:") - for l in d["after"]: - md.append(" " + l) - else: - md.append(" перед: (конец метода)") - md.append("Якорь изменился/исчез в новом оригинале (remote) — потому блок не лёг автоматически (см. дифф base→remote ниже).") - md.append("Куда переносить: если якорного кода в новом методе больше нет — он, вероятно, вынесен/отрефакторен (ищите в диффе новый вызов/процедуру). Размести адаптацию по смыслу: например пост-обработкой после нового вызова, либо в заимствованной процедуре, куда переехал код. При правке файла сохрани кодировку (UTF-8 с BOM). Блок:") + md.append(l) md.append("#Вставка"); md.extend(d["lines"]); md.append("#КонецВставки") + if d.get("after"): + for l in d["after"]: + md.append(l) + md.append("") + md.append("Якорь (строки вокруг #Вставка) изменился/исчез в новом оригинале — блок не лёг автоматически (см. дифф base→remote ниже).") + md.append("В модуле расширения блок припаркован в конце метода под меткой // [РЕСИНК-КОНФЛИКТ №%d] — найди по ней." % cn) + md.append("Куда переносить: если якорного кода в новом методе больше нет — он, вероятно, вынесен/отрефакторен (ищите в диффе новый вызов/процедуру). Размести адаптацию по смыслу: например пост-обработкой после нового вызова, либо в заимствованной процедуре, куда переехал код. При правке файла сохрани кодировку (UTF-8 с BOM).") else: - md.append("Удаление. Строки для удаления не найдены в новом оригинале (изменились/исчезли):") + md.append("### Конфликт №%d — удаление" % cn) + md.append("Строки для удаления не найдены в новом оригинале (изменились/исчезли):") for l in d["lines"]: md.append(" - " + l.strip()) + md.append("В модуле расширения помечено меткой // [РЕСИНК-КОНФЛИКТ №%d]." % cn) md.append("") md.append("## Дифф base→remote (что изменилось в оригинале)") for l in v1: @@ -978,13 +979,15 @@ def resync_one(ext_bsl, ext_lines, dup, method, logical_module, conflict_folder, for blk in insert_after[k]: new_body.append("#Вставка"); new_body.extend(blk); new_body.append("#КонецВставки") if disputed: - new_body.append("\t// [РЕСИНК-КОНФЛИКТ] перенесите блоки ниже вручную — исходный якорь изменился в новой версии оригинала.") - new_body.append("\t// Материалы: см. index.md / conflict.md в merge-воркспейсе (путь в выводе).") + new_body.append("\t// [РЕСИНК-КОНФЛИКТ] блоки ниже не легли автоматически — перенесите вручную (по № см. conflict.md / index.md в merge-воркспейсе, путь в выводе).") + cn = 0 for d in disputed: + cn += 1 if d["kind"] == "insert": + new_body.append("\t// [РЕСИНК-КОНФЛИКТ №%d] вставка — исходный якорь изменён в новом оригинале." % cn) new_body.append("#Вставка"); new_body.extend(d["lines"]); new_body.append("#КонецВставки") else: - new_body.append("\t// [РЕСИНК-КОНФЛИКТ] не удалось найти для удаления:") + new_body.append("\t// [РЕСИНК-КОНФЛИКТ №%d] удаление — строки не найдены в новом оригинале:" % cn) for l in d["lines"]: new_body.append("\t// " + l.strip()) diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/Ext/CommonModules/РесинкКонфл/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/Ext/CommonModules/РесинкКонфл/Ext/Module.bsl index 987ce40d..0d459b85 100644 --- a/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/Ext/CommonModules/РесинкКонфл/Ext/Module.bsl +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/Ext/CommonModules/РесинкКонфл/Ext/Module.bsl @@ -2,8 +2,8 @@ &ИзменениеИКонтроль("Расчёт") Функция Тест_Расчёт(А, Б) Возврат 0; - // [РЕСИНК-КОНФЛИКТ] перенесите блоки ниже вручную — исходный якорь изменился в новой версии оригинала. - // Материалы: см. index.md / conflict.md в merge-воркспейсе (путь в выводе). + // [РЕСИНК-КОНФЛИКТ] блоки ниже не легли автоматически — перенесите вручную (по № см. conflict.md / index.md в merge-воркспейсе, путь в выводе). + // [РЕСИНК-КОНФЛИКТ №1] вставка — исходный якорь изменён в новом оригинале. #Вставка Итог = Итог + Б; #КонецВставки