From 39fc1b977d9e4236d5960822e8505aab718eae6d Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 18 Jul 2026 17:16:11 +0300 Subject: [PATCH] =?UTF-8?q?feat(cfe-patch-method):=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=B9=D1=87=D0=B8=D0=B2=D1=8B=D0=B9=20=D1=8F=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D1=8C=20=D1=80=D0=B5=D1=81=D0=B8=D0=BD=D0=BA=D0=B0,=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B7=D1=80=D0=B0=D1=87=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=8C,=20merge-=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Упрочнение актуализации &ИзменениеИКонтроль (v2.1): - Якорь вставки теперь двусторонний (контекст до+после, окно 3) с расширением: Тир A — уникальная смежная пара; Тир B — одиночная уникальность before/after. Срезает ложные конфликты, когда строка перед вставкой generic/повторяется (пустая, КонецЦикла;, КонецЕсли; и т.п.), сохраняя безопасность (не уверены → конфликт). - Прозрачность: на [АКТУАЛИЗИРОВАН] и ЧАСТИЧНО печатается сводка перенесённого. - Файлы-версии переименованы в конвенцию git-mergetool: base/local/remote/merged (+diff base->remote) вместо v1/v2/current; merged.bsl добавлен. Комментарий в модуле и SKILL.md обновлены. Тесты: +resync-reanchor (generic-строка -> авто), resync-conflict переделан на настоящий конфликт (окружающий блок исчез). 13 кейсов, оба рантайма зелёные, байтовый паритет ps1<->py включая merge-воркспейс. Co-Authored-By: Claude Opus 4.8 --- .claude/skills/cfe-patch-method/SKILL.md | 4 +- .../scripts/cfe-patch-method.ps1 | 117 ++++++-- .../scripts/cfe-patch-method.py | 105 ++++++-- .../cfe-patch-method/resync-conflict.json | 6 +- .../cfe-patch-method/resync-reanchor.json | 37 +++ .../CommonModules/РесинкКонфл/Ext/Module.bsl | 5 +- .../CommonModules/РесинкКонфл/Ext/Module.bsl | 9 +- .../CommonModules/РеанкорМод.xml | 23 ++ .../CommonModules/РеанкорМод/Ext/Module.bsl | 13 + .../resync-reanchor/Configuration.xml | 252 ++++++++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../Ext/CommonModules/РеанкорМод.xml | 18 ++ .../CommonModules/РеанкорМод/Ext/Module.bsl | 15 ++ .../resync-reanchor/Ext/Configuration.xml | 72 +++++ .../resync-reanchor/Ext/Languages/Русский.xml | 13 + .../Ext/Roles/Тест_ОсновнаяРоль.xml | 10 + .../resync-reanchor/Languages/Русский.xml | 16 ++ 17 files changed, 682 insertions(+), 51 deletions(-) create mode 100644 tests/skills/cases/cfe-patch-method/resync-reanchor.json create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод.xml create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод/Ext/Module.bsl create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Configuration.xml create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод.xml create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод/Ext/Module.bsl create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Configuration.xml create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Languages/Русский.xml create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Roles/Тест_ОсновнаяРоль.xml create mode 100644 tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Languages/Русский.xml diff --git a/.claude/skills/cfe-patch-method/SKILL.md b/.claude/skills/cfe-patch-method/SKILL.md index 0e9ae6cc..0239fcbb 100644 --- a/.claude/skills/cfe-patch-method/SKILL.md +++ b/.claude/skills/cfe-patch-method/SKILL.md @@ -77,8 +77,8 @@ allowed-tools: Если для метода уже есть перехватчик `&ИзменениеИКонтроль`, повторный вызов **актуализирует** его по текущему оригиналу: - `[АКТУАЛЕН]` — оригинал не менялся, изменений нет; -- `[АКТУАЛИЗИРОВАН]` — тело обновлено по новому оригиналу, правки (`#Вставка`/`#Удаление`) перенесены автоматически; -- `[АКТУАЛИЗИРОВАН-ЧАСТИЧНО]` — часть правок не удалось разместить (изменился якорь). Они помечены `// [РЕСИНК-КОНФЛИКТ]` и не потеряны; для анализа выгружаются файлы-версии (`v1.bsl`, `v2.bsl`, `current.bsl`, `diff.txt`) — путь печатается в выводе. Проверь конфликтные блоки и размести вручную. +- `[АКТУАЛИЗИРОВАН]` — тело обновлено по новому оригиналу, правки (`#Вставка`/`#Удаление`) перенесены автоматически (в выводе — сводка перенесённого); +- `[АКТУАЛИЗИРОВАН-ЧАСТИЧНО]` — часть правок не удалось разместить (окружающий контекст изменился). Они помечены `// [РЕСИНК-КОНФЛИКТ]` и не потеряны; в системный temp выгружается merge-воркспейс (`base.bsl` — предок, `local.bsl` — твоя версия с маркерами, `remote.bsl` — новый оригинал, `merged.bsl` — результат, `diff.txt` — base→remote) — путь печатается в выводе. Проверь конфликтные блоки и размести вручную. Повторный вызов `Before`/`After`/`Instead` для уже перехваченного метода не создаёт дубль (`[ПРОПУЩЕН]`). 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 4c083c93..83aa1f13 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.0 — Source-aware method interceptor for 1C extension (CFE) +# cfe-patch-method v2.1 — Source-aware method interceptor for 1C extension (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -419,6 +419,62 @@ function Find-UniqueRun { return $found } +# Resolve where an insertion lands in v2 using two-sided context. +# Returns index to "insert after" (-1 = top of body), or $null if ambiguous/conflict. +function Resolve-InsertionPoint { + param($v2norm, $beforeLines, $afterLines) + $nb = $beforeLines.Count; $na = $afterLines.Count + + # Tier A: adjacent pair (before[-1] immediately followed by after[0] in v2), widening symmetrically + if ($nb -ge 1 -and $na -ge 1) { + $cands = @() + for ($k = 0; $k -lt ($v2norm.Count - 1); $k++) { + if ($v2norm[$k] -eq $beforeLines[$nb - 1] -and $v2norm[$k + 1] -eq $afterLines[0]) { $cands += $k } + } + if ($cands.Count -eq 1) { return $cands[0] } + if ($cands.Count -gt 1) { + $w = 1 + while ($cands.Count -gt 1 -and ($w -lt $nb -or $w -lt $na)) { + $w++ + $filtered = @() + foreach ($k in $cands) { + $ok = $true + if ($w -le $nb) { + if (($k - ($w - 1)) -lt 0 -or $v2norm[$k - ($w - 1)] -ne $beforeLines[$nb - $w]) { $ok = $false } + } + if ($ok -and $w -le $na) { + if (($k + $w) -ge $v2norm.Count -or $v2norm[$k + $w] -ne $afterLines[$w - 1]) { $ok = $false } + } + if ($ok) { $filtered += $k } + } + if ($filtered.Count -eq 0) { break } + $cands = $filtered + } + if ($cands.Count -eq 1) { return $cands[0] } + return $null + } + } + + # Tier B: one side changed -> single-side uniqueness + if ($nb -ge 1) { + $bk = Find-UniqueIndex $v2norm $beforeLines[$nb - 1] + if ($bk -ge 0) { return $bk } + } + if ($na -ge 1) { + $ak = Find-UniqueIndex $v2norm $afterLines[0] + if ($ak -ge 0) { return ($ak - 1) } + } + return $null +} + +# Truncate a line for compact summary output +function Get-Truncated { + param([string]$s, [int]$n = 60) + $t = $s.Trim() + if ($t.Length -gt $n) { return $t.Substring(0, $n) + "…" } + return $t +} + # ============================================================================ # Main # ============================================================================ @@ -556,17 +612,30 @@ if ($dup) { $delStart = @{} # v2 index -> $true $delEnd = @{} $disputed = @() + $transferred = @() # for the summary: @{ Kind; Anchor } foreach ($op in $ops) { if ($op.Kind -eq 'insert') { - if ($op.After -lt 0) { $insertTop += ,$op.Lines; continue } - $anchorKey = $v1norm[$op.After] - $k = Find-UniqueIndex $v2norm $anchorKey - if ($k -ge 0) { + # two-sided context anchor + $beforeLines = @() + if ($op.After -ge 0) { + $bs = [Math]::Max(0, $op.After - 2) + for ($m = $bs; $m -le $op.After; $m++) { $beforeLines += $v1norm[$m] } + } + $afterLines = @() + $ae = [Math]::Min($v1norm.Count - 1, $op.After + 3) + for ($m = $op.After + 1; $m -le $ae; $m++) { $afterLines += $v1norm[$m] } + + $k = Resolve-InsertionPoint $v2norm $beforeLines $afterLines + if ($null -eq $k) { + $disputed += @{ Kind = 'insert'; Lines = $op.Lines } + } elseif ($k -lt 0) { + $insertTop += ,$op.Lines + $transferred += @{ Kind = 'insert'; Anchor = '(в начало метода)' } + } else { if (-not $insertAfter.ContainsKey($k)) { $insertAfter[$k] = @() } $insertAfter[$k] += ,$op.Lines - } else { - $disputed += @{ Kind = 'insert'; Lines = $op.Lines } + $transferred += @{ Kind = 'insert'; Anchor = $v2[$k] } } } else { $keys = @() @@ -575,6 +644,7 @@ if ($dup) { if ($p -ge 0) { $delStart[$p] = $true $delEnd[$p + $keys.Count - 1] = $true + $transferred += @{ Kind = 'delete'; Anchor = $op.Lines[0] } } else { $disputed += @{ Kind = 'delete'; Lines = $op.Lines } } @@ -599,7 +669,7 @@ if ($dup) { # disputed blocks appended with conflict markers (never lost) if ($disputed.Count -gt 0) { $newBody += "`t// [РЕСИНК-КОНФЛИКТ] перенесите блоки ниже вручную — исходный якорь изменился в новой версии оригинала." - $newBody += "`t// Материалы для анализа см. в выводе команды (файлы v1/v2/current/diff)." + $newBody += "`t// Материалы для анализа см. в выводе команды (файлы base/local/remote/merged)." foreach ($d in $disputed) { if ($d.Kind -eq 'insert') { $newBody += "#Вставка"; foreach ($l in $d.Lines) { $newBody += $l }; $newBody += "#КонецВставки" @@ -632,26 +702,37 @@ if ($dup) { [System.IO.File]::WriteAllText($extBsl, (($out -join "`r`n") + "`r`n"), $enc) + # transferred summary (shared by full-auto and partial) + function Write-TransferSummary { + param($items) + foreach ($t in $items) { + if ($t.Kind -eq 'insert') { Write-Host " • вставка после «$(Get-Truncated $t.Anchor)»" } + else { Write-Host " • удаление «$(Get-Truncated $t.Anchor)»" } + } + } + if ($disputed.Count -gt 0) { - # write version files + # merge workspace (git-mergetool convention: base/local/remote/merged) $tmpRoot = Join-Path ([System.IO.Path]::GetTempPath()) ("cfe-resync\" + ($ModulePath -replace '[\\/:*?"<>|]', '_') + "." + $MethodName) if (-not (Test-Path $tmpRoot)) { New-Item -ItemType Directory -Path $tmpRoot -Force | Out-Null } - [System.IO.File]::WriteAllText((Join-Path $tmpRoot "v1.bsl"), (($v1 -join "`r`n") + "`r`n"), $enc) - [System.IO.File]::WriteAllText((Join-Path $tmpRoot "v2.bsl"), (($v2 -join "`r`n") + "`r`n"), $enc) - [System.IO.File]::WriteAllText((Join-Path $tmpRoot "current.bsl"), (($markedBody -join "`r`n") + "`r`n"), $enc) + [System.IO.File]::WriteAllText((Join-Path $tmpRoot "base.bsl"), (($v1 -join "`r`n") + "`r`n"), $enc) + [System.IO.File]::WriteAllText((Join-Path $tmpRoot "local.bsl"), (($markedBody -join "`r`n") + "`r`n"), $enc) + [System.IO.File]::WriteAllText((Join-Path $tmpRoot "remote.bsl"), (($v2 -join "`r`n") + "`r`n"), $enc) + [System.IO.File]::WriteAllText((Join-Path $tmpRoot "merged.bsl"), (($newBlock -join "`r`n") + "`r`n"), $enc) $diff = @() - $diff += "--- v1 (что было скопировано) vs v2 (новый оригинал) ---" + $diff += "--- base -> remote (что изменилось в оригинале) ---" foreach ($l in $v1) { if ($v2norm -notcontains (Get-Normalized $l)) { $diff += "- $l" } } foreach ($l in $v2) { if ($v1norm -notcontains (Get-Normalized $l)) { $diff += "+ $l" } } [System.IO.File]::WriteAllText((Join-Path $tmpRoot "diff.txt"), (($diff -join "`r`n") + "`r`n"), $enc) - Write-Host "[АКТУАЛИЗИРОВАН-ЧАСТИЧНО] &ИзменениеИКонтроль(`"$MethodName`")" - Write-Host " Перенесено автоматически, конфликтов: $($disputed.Count) (помечены // [РЕСИНК-КОНФЛИКТ])" - Write-Host " Файлы-версии для анализа:" + Write-Host "[АКТУАЛИЗИРОВАН-ЧАСТИЧНО] &ИзменениеИКонтроль(`"$MethodName`") — перенесено: $($transferred.Count), конфликтов: $($disputed.Count)" + Write-TransferSummary $transferred + Write-Host " Конфликтные блоки помечены // [РЕСИНК-КОНФЛИКТ] — разместите вручную." + Write-Host " Merge-воркспейс (base/local/remote/merged/diff):" Write-Host " $tmpRoot" - Write-Host " Проверьте конфликтные блоки и разместите их вручную." } else { - Write-Host "[АКТУАЛИЗИРОВАН] &ИзменениеИКонтроль(`"$MethodName`") — тело обновлено по новому оригиналу, правки перенесены." + Write-Host "[АКТУАЛИЗИРОВАН] &ИзменениеИКонтроль(`"$MethodName`") — тело обновлено, перенесено правок: $($transferred.Count)" + Write-TransferSummary $transferred } Write-Host " Файл: $extBsl" exit 0 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 f8f33efb..8a4f6b36 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.0 — Source-aware method interceptor for 1C extension (CFE) +# cfe-patch-method v2.1 — Source-aware method interceptor for 1C extension (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -410,6 +410,57 @@ def find_unique_run(v2norm, keys): return found +def resolve_insertion_point(v2norm, before_lines, after_lines): + """Where an insertion lands in v2 using two-sided context. + Returns index to insert-after (-1 = top), or None if ambiguous/conflict.""" + nb = len(before_lines) + na = len(after_lines) + + # Tier A: adjacent pair (before[-1] then after[0] in v2), widening symmetrically + if nb >= 1 and na >= 1: + cands = [k for k in range(len(v2norm) - 1) + if v2norm[k] == before_lines[-1] and v2norm[k + 1] == after_lines[0]] + if len(cands) == 1: + return cands[0] + if len(cands) > 1: + w = 1 + while len(cands) > 1 and (w < nb or w < na): + w += 1 + filtered = [] + for k in cands: + ok = True + if w <= nb: + if k - (w - 1) < 0 or v2norm[k - (w - 1)] != before_lines[nb - w]: + ok = False + if ok and w <= na: + if k + w >= len(v2norm) or v2norm[k + w] != after_lines[w - 1]: + ok = False + if ok: + filtered.append(k) + if not filtered: + break + cands = filtered + if len(cands) == 1: + return cands[0] + return None + + # Tier B: one side changed -> single-side uniqueness + if nb >= 1: + bk = find_unique_index(v2norm, before_lines[-1]) + if bk >= 0: + return bk + if na >= 1: + ak = find_unique_index(v2norm, after_lines[0]) + if ak >= 0: + return ak - 1 + return None + + +def truncate(s, n=60): + t = s.strip() + return (t[:n] + "…") if len(t) > n else t + + def die(msg): print(msg, file=sys.stderr) sys.exit(1) @@ -677,23 +728,29 @@ def resync(ext_bsl, ext_lines, dup, method, method_name, module_path): del_start = set() del_end = set() disputed = [] + transferred = [] # for the summary: {"kind", "anchor"} for op in ops: if op["kind"] == "insert": - if op["after"] < 0: - insert_top.append(op["lines"]) - continue - k = find_unique_index(v2norm, v1norm[op["after"]]) - if k >= 0: - insert_after.setdefault(k, []).append(op["lines"]) - else: + after = op["after"] + before_lines = v1norm[max(0, after - 2):after + 1] if after >= 0 else [] + after_lines = v1norm[after + 1:after + 4] + k = resolve_insertion_point(v2norm, before_lines, after_lines) + if k is None: disputed.append({"kind": "insert", "lines": op["lines"]}) + elif k < 0: + insert_top.append(op["lines"]) + transferred.append({"kind": "insert", "anchor": "(в начало метода)"}) + else: + insert_after.setdefault(k, []).append(op["lines"]) + transferred.append({"kind": "insert", "anchor": v2[k]}) else: keys = v1norm[op["start"]:op["end"] + 1] p = find_unique_run(v2norm, keys) if p >= 0: del_start.add(p) del_end.add(p + len(keys) - 1) + transferred.append({"kind": "delete", "anchor": op["lines"][0]}) else: disputed.append({"kind": "delete", "lines": op["lines"]}) @@ -716,7 +773,7 @@ def resync(ext_bsl, ext_lines, dup, method, method_name, module_path): if disputed: new_body.append("\t// [РЕСИНК-КОНФЛИКТ] перенесите блоки ниже вручную — исходный якорь изменился в новой версии оригинала.") - new_body.append("\t// Материалы для анализа см. в выводе команды (файлы v1/v2/current/diff).") + new_body.append("\t// Материалы для анализа см. в выводе команды (файлы base/local/remote/merged).") for d in disputed: if d["kind"] == "insert": new_body.append("#Вставка") @@ -747,14 +804,23 @@ def resync(ext_bsl, ext_lines, dup, method, method_name, module_path): out.extend(ext_lines[block_end + 1:]) write_bsl(ext_bsl, out) + def print_transfer_summary(items): + for t in items: + if t["kind"] == "insert": + print(" • вставка после «%s»" % truncate(t["anchor"])) + else: + print(" • удаление «%s»" % truncate(t["anchor"])) + if disputed: + # merge workspace (git-mergetool convention: base/local/remote/merged) safe = re.sub(r'[\\/:*?"<>|]', '_', module_path) tmp_root = os.path.join(tempfile.gettempdir(), "cfe-resync", safe + "." + method_name) os.makedirs(tmp_root, exist_ok=True) - write_bsl(os.path.join(tmp_root, "v1.bsl"), v1) - write_bsl(os.path.join(tmp_root, "v2.bsl"), v2) - write_bsl(os.path.join(tmp_root, "current.bsl"), marked_body) - diff = ["--- v1 (что было скопировано) vs v2 (новый оригинал) ---"] + write_bsl(os.path.join(tmp_root, "base.bsl"), v1) + write_bsl(os.path.join(tmp_root, "local.bsl"), marked_body) + write_bsl(os.path.join(tmp_root, "remote.bsl"), v2) + write_bsl(os.path.join(tmp_root, "merged.bsl"), new_block) + diff = ["--- base -> remote (что изменилось в оригинале) ---"] for l in v1: if normalize(l) not in v2norm: diff.append("- " + l) @@ -763,13 +829,16 @@ def resync(ext_bsl, ext_lines, dup, method, method_name, module_path): diff.append("+ " + l) write_bsl(os.path.join(tmp_root, "diff.txt"), diff) - print('[АКТУАЛИЗИРОВАН-ЧАСТИЧНО] &ИзменениеИКонтроль("%s")' % method_name) - print(" Перенесено автоматически, конфликтов: %d (помечены // [РЕСИНК-КОНФЛИКТ])" % len(disputed)) - print(" Файлы-версии для анализа:") + print('[АКТУАЛИЗИРОВАН-ЧАСТИЧНО] &ИзменениеИКонтроль("%s") — перенесено: %d, конфликтов: %d' + % (method_name, len(transferred), len(disputed))) + print_transfer_summary(transferred) + print(" Конфликтные блоки помечены // [РЕСИНК-КОНФЛИКТ] — разместите вручную.") + print(" Merge-воркспейс (base/local/remote/merged/diff):") print(" %s" % tmp_root) - print(" Проверьте конфликтные блоки и разместите их вручную.") else: - print('[АКТУАЛИЗИРОВАН] &ИзменениеИКонтроль("%s") — тело обновлено по новому оригиналу, правки перенесены.' % method_name) + print('[АКТУАЛИЗИРОВАН] &ИзменениеИКонтроль("%s") — тело обновлено, перенесено правок: %d' + % (method_name, len(transferred))) + print_transfer_summary(transferred) print(" Файл: %s" % ext_bsl) diff --git a/tests/skills/cases/cfe-patch-method/resync-conflict.json b/tests/skills/cases/cfe-patch-method/resync-conflict.json index 8ca4cd52..d7e76d26 100644 --- a/tests/skills/cases/cfe-patch-method/resync-conflict.json +++ b/tests/skills/cases/cfe-patch-method/resync-conflict.json @@ -1,5 +1,5 @@ { - "name": "Ресинк ИзменениеИКонтроль: изменился якорь вставки (конфликт)", + "name": "Ресинк ИзменениеИКонтроль: окружающий блок исчез (настоящий конфликт)", "preRun": [ { "script": "meta-compile/scripts/meta-compile", @@ -9,7 +9,7 @@ { "writeFile": { "path": "CommonModules/РесинкКонфл/Ext/Module.bsl", - "content": "#Область ПрограммныйИнтерфейс\n\nФункция Расчёт(А, Б) Экспорт\n\tИтог = 0.00;\n\tИтог = А + Б;\n\tИтог = ОкруглитьВверх(Итог);\n\tВозврат Итог;\nКонецФункции\n\n#КонецОбласти\n" + "content": "#Область ПрограммныйИнтерфейс\n\nФункция Расчёт(А, Б) Экспорт\n\tВозврат 0;\nКонецФункции\n\n#КонецОбласти\n" } }, { @@ -23,7 +23,7 @@ { "writeFile": { "path": "ext/CommonModules/РесинкКонфл/Ext/Module.bsl", - "content": "#Область ПрограммныйИнтерфейс\n&ИзменениеИКонтроль(\"Расчёт\")\nФункция Тест_Расчёт(А, Б)\n\tИтог = 0;\n#Вставка\n\tИтог = 999;\n#КонецВставки\n\tИтог = А + Б;\n\tВозврат Итог;\nКонецФункции\n#КонецОбласти\n" + "content": "#Область ПрограммныйИнтерфейс\n&ИзменениеИКонтроль(\"Расчёт\")\nФункция Тест_Расчёт(А, Б)\n\tИтог = 0;\n\tДля Сч = 1 По А Цикл\n#Вставка\n\t\tИтог = Итог + Б;\n#КонецВставки\n\t\tИтог = Итог + 1;\n\tКонецЦикла;\n\tВозврат Итог;\nКонецФункции\n#КонецОбласти\n" } } ], diff --git a/tests/skills/cases/cfe-patch-method/resync-reanchor.json b/tests/skills/cases/cfe-patch-method/resync-reanchor.json new file mode 100644 index 00000000..2b9eb271 --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/resync-reanchor.json @@ -0,0 +1,37 @@ +{ + "name": "Ресинк: generic строка перед вставкой — двусторонний якорь размещает автоматически", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "CommonModule", "name": "РеанкорМод", "properties": { "Server": true } }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, + { + "writeFile": { + "path": "CommonModules/РеанкорМод/Ext/Module.bsl", + "content": "#Область ПрограммныйИнтерфейс\n\nПроцедура П(Сп) Экспорт\n\tДля Каждого Э Из Сп Цикл\n\t\tЭ.Обработать();\n\tКонецЦикла;\n\tСообщить(\"A\");\n\tДля Каждого Э Из Сп Цикл\n\t\tЭ.Проверить(Истина);\n\tКонецЦикла;\nКонецПроцедуры\n\n#КонецОбласти\n" + } + }, + { + "script": "cfe-init/scripts/cfe-init", + "args": { "-Name": "Тест", "-OutputDir": "{workDir}/ext", "-ConfigPath": "{workDir}" } + }, + { + "script": "cfe-borrow/scripts/cfe-borrow", + "args": { "-ExtensionPath": "{workDir}/ext", "-ConfigPath": "{workDir}", "-Object": "CommonModule.РеанкорМод" } + }, + { + "writeFile": { + "path": "ext/CommonModules/РеанкорМод/Ext/Module.bsl", + "content": "#Область ПрограммныйИнтерфейс\n&ИзменениеИКонтроль(\"П\")\nПроцедура Тест_П(Сп)\n\tДля Каждого Э Из Сп Цикл\n\t\tЭ.Обработать();\n\tКонецЦикла;\n#Вставка\n\tСообщить(\"вставка\");\n#КонецВставки\n\tСообщить(\"A\");\n\tДля Каждого Э Из Сп Цикл\n\t\tЭ.Проверить();\n\tКонецЦикла;\nКонецПроцедуры\n#КонецОбласти\n" + } + } + ], + "params": { + "extensionPath": "ext", + "modulePath": "CommonModule.РеанкорМод", + "methodName": "П", + "interceptorType": "ModificationAndControl" + }, + "expect": { "stdoutContains": "перенесено правок:" } +} diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/CommonModules/РесинкКонфл/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/CommonModules/РесинкКонфл/Ext/Module.bsl index 18d1baed..a4ca73f3 100644 --- a/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/CommonModules/РесинкКонфл/Ext/Module.bsl +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/CommonModules/РесинкКонфл/Ext/Module.bsl @@ -1,10 +1,7 @@ #Область ПрограммныйИнтерфейс Функция Расчёт(А, Б) Экспорт - Итог = 0.00; - Итог = А + Б; - Итог = ОкруглитьВверх(Итог); - Возврат Итог; + Возврат 0; КонецФункции #КонецОбласти 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 f297bccc..06f77da8 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 @@ -1,14 +1,11 @@ #Область ПрограммныйИнтерфейс &ИзменениеИКонтроль("Расчёт") Функция Тест_Расчёт(А, Б) - Итог = 0.00; - Итог = А + Б; - Итог = ОкруглитьВверх(Итог); - Возврат Итог; + Возврат 0; // [РЕСИНК-КОНФЛИКТ] перенесите блоки ниже вручную — исходный якорь изменился в новой версии оригинала. - // Материалы для анализа см. в выводе команды (файлы v1/v2/current/diff). + // Материалы для анализа см. в выводе команды (файлы base/local/remote/merged). #Вставка - Итог = 999; + Итог = Итог + Б; #КонецВставки КонецФункции #КонецОбласти diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод.xml new file mode 100644 index 00000000..72a3d4be --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод.xml @@ -0,0 +1,23 @@ + + + + + РеанкорМод + + + ru + Реанкор мод + + + + false + false + false + false + false + false + false + DontUse + + + diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод/Ext/Module.bsl new file mode 100644 index 00000000..35dbbe38 --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод/Ext/Module.bsl @@ -0,0 +1,13 @@ +#Область ПрограммныйИнтерфейс + +Процедура П(Сп) Экспорт + Для Каждого Э Из Сп Цикл + Э.Обработать(); + КонецЦикла; + Сообщить("A"); + Для Каждого Э Из Сп Цикл + Э.Проверить(Истина); + КонецЦикла; +КонецПроцедуры + +#КонецОбласти diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Configuration.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Configuration.xml new file mode 100644 index 00000000..6600d990 --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Configuration.xml @@ -0,0 +1,252 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + РеанкорМод + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод.xml new file mode 100644 index 00000000..a73c0d52 --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод.xml @@ -0,0 +1,18 @@ + + + + + + Adopted + РеанкорМод + + UUID-002 + false + false + false + false + false + false + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод/Ext/Module.bsl new file mode 100644 index 00000000..755428aa --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод/Ext/Module.bsl @@ -0,0 +1,15 @@ +#Область ПрограммныйИнтерфейс +&ИзменениеИКонтроль("П") +Процедура Тест_П(Сп) + Для Каждого Э Из Сп Цикл + Э.Обработать(); + КонецЦикла; +#Вставка + Сообщить("вставка"); +#КонецВставки + Сообщить("A"); + Для Каждого Э Из Сп Цикл + Э.Проверить(Истина); + КонецЦикла; +КонецПроцедуры +#КонецОбласти diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Configuration.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Configuration.xml new file mode 100644 index 00000000..5dffb5f7 --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Configuration.xml @@ -0,0 +1,72 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + Adopted + Тест + + + ru + Тест + + + + Customization + true + Тест_ + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + Role.Тест_ОсновнаяРоль + + + + Language.Русский + + + + + + TaxiEnableVersion8_2 + + + Русский + Тест_ОсновнаяРоль + РеанкорМод + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Languages/Русский.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Languages/Русский.xml new file mode 100644 index 00000000..c21624f5 --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Languages/Русский.xml @@ -0,0 +1,13 @@ + + + + + + Adopted + Русский + + UUID-002 + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Roles/Тест_ОсновнаяРоль.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Roles/Тест_ОсновнаяРоль.xml new file mode 100644 index 00000000..ec9dfbaf --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Roles/Тест_ОсновнаяРоль.xml @@ -0,0 +1,10 @@ + + + + + Тест_ОсновнаяРоль + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Languages/Русский.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file