From 78b5b73fa7f835462dc4073ae7a9fc841e7c62fb Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 30 Jun 2026 18:33:10 +0300 Subject: [PATCH] =?UTF-8?q?fix(skills):=20db-load-git=20=D0=BA=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=83=D1=82=D0=B8=20(#32)=20+=20img-grid=20=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D1=8F=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #32: git diff/ls-files при дефолтном core.quotePath=true возвращают кириллицу в octal-виде → объект с кириллическим именем не распознавался в partial-load. Все git-вызовы теперь с `-c core.quotePath=false`. PY — в центральном run_git; PS — унифицировал inline-вызовы в хелпер Invoke-GitLines (паритет с py). v1.11. #33: img-grid падал ZeroDivisionError при -c 0 / некорректном -r. Добавлена валидация (cols>0, rows>=0, auto-rows max(1,...)). Pillow задокументирован как runtime-зависимость (README + python-porting-guide). overlay-grid.py получил версионный заголовок (v1.1). Тесты: runner error-кейсы db-dump-dt/db-load-dt/db-load-git (из PR #34). img-grid runner-кейс не вводили (py-only + Pillow-зависимость) — #33 проверен вручную. Closes #32, #33 Co-Authored-By: Korolev Pavel Co-Authored-By: Claude Opus 4.8 (1M context) --- .../db-load-git/scripts/db-load-git.ps1 | 32 ++++++++++--------- .../skills/db-load-git/scripts/db-load-git.py | 4 +-- .../skills/img-grid/scripts/overlay-grid.py | 10 +++++- README.md | 1 + docs/python-porting-guide.md | 2 ++ tests/skills/cases/db-dump-dt/_skill.json | 9 ++++++ .../cases/db-dump-dt/error-no-args.json | 4 +++ tests/skills/cases/db-load-dt/_skill.json | 9 ++++++ .../cases/db-load-dt/error-no-args.json | 4 +++ tests/skills/cases/db-load-git/_skill.json | 9 ++++++ .../db-load-git/error-bad-configdir.json | 5 +++ .../db-load-git/error-commit-no-range.json | 5 +++ 12 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 tests/skills/cases/db-dump-dt/_skill.json create mode 100644 tests/skills/cases/db-dump-dt/error-no-args.json create mode 100644 tests/skills/cases/db-load-dt/_skill.json create mode 100644 tests/skills/cases/db-load-dt/error-no-args.json create mode 100644 tests/skills/cases/db-load-git/_skill.json create mode 100644 tests/skills/cases/db-load-git/error-bad-configdir.json create mode 100644 tests/skills/cases/db-load-git/error-commit-no-range.json diff --git a/.claude/skills/db-load-git/scripts/db-load-git.ps1 b/.claude/skills/db-load-git/scripts/db-load-git.ps1 index 44135e42..ac6a6b88 100644 --- a/.claude/skills/db-load-git/scripts/db-load-git.ps1 +++ b/.claude/skills/db-load-git/scripts/db-load-git.ps1 @@ -1,4 +1,4 @@ -# db-load-git v1.10 — Load Git changes into 1C database +# db-load-git v1.11 — Load Git changes into 1C database # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # NB: *nix-раскладку платформы (/opt/1cv8//1cv8, без .exe) знает только .py-порт — PS на *nix не исполняется. <# @@ -227,6 +227,15 @@ try { } # --- Get changed files from Git --- +# Все git-вызовы для сбора путей идут через один хелпер с -c core.quotePath=false, +# иначе кириллические пути возвращаются в octal-виде и не распознаются (зеркало run_git в .py). +function Invoke-GitLines { + param([string[]]$GitArgs) + $out = git -c core.quotePath=false @GitArgs 2>&1 + if ($LASTEXITCODE -eq 0) { return $out } + return @() +} + $changedFiles = @() $ConfigDir = (Resolve-Path $ConfigDir).Path.TrimEnd('\') $configDirNormalized = $ConfigDir.Replace('\', '/') @@ -236,29 +245,22 @@ try { switch ($Source) { "Staged" { Write-Host "Getting staged changes..." - $raw = git diff --cached --name-only --relative 2>&1 - if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + $changedFiles += Invoke-GitLines -GitArgs @('diff', '--cached', '--name-only', '--relative') } "Unstaged" { Write-Host "Getting unstaged changes..." - $raw = git diff --name-only --relative 2>&1 - if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } - $raw = git ls-files --others --exclude-standard 2>&1 - if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + $changedFiles += Invoke-GitLines -GitArgs @('diff', '--name-only', '--relative') + $changedFiles += Invoke-GitLines -GitArgs @('ls-files', '--others', '--exclude-standard') } "Commit" { Write-Host "Getting changes from $CommitRange..." - $raw = git diff --name-only --relative $CommitRange 2>&1 - if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + $changedFiles += Invoke-GitLines -GitArgs @('diff', '--name-only', '--relative', $CommitRange) } "All" { Write-Host "Getting all uncommitted changes..." - $raw = git diff --cached --name-only --relative 2>&1 - if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } - $raw = git diff --name-only --relative 2>&1 - if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } - $raw = git ls-files --others --exclude-standard 2>&1 - if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + $changedFiles += Invoke-GitLines -GitArgs @('diff', '--cached', '--name-only', '--relative') + $changedFiles += Invoke-GitLines -GitArgs @('diff', '--name-only', '--relative') + $changedFiles += Invoke-GitLines -GitArgs @('ls-files', '--others', '--exclude-standard') } } } finally { diff --git a/.claude/skills/db-load-git/scripts/db-load-git.py b/.claude/skills/db-load-git/scripts/db-load-git.py index 475f993f..3efb0a4e 100644 --- a/.claude/skills/db-load-git/scripts/db-load-git.py +++ b/.claude/skills/db-load-git/scripts/db-load-git.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# db-load-git v1.10 — Load Git changes into 1C database +# db-load-git v1.11 — Load Git changes into 1C database # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -110,7 +110,7 @@ def get_object_xml_from_subfile(relative_path): def run_git(config_dir, git_args): """Run a git command in config_dir and return output lines on success.""" result = subprocess.run( - ["git"] + git_args, + ["git", "-c", "core.quotePath=false"] + git_args, capture_output=True, text=True, encoding="utf-8", diff --git a/.claude/skills/img-grid/scripts/overlay-grid.py b/.claude/skills/img-grid/scripts/overlay-grid.py index 215da925..e0505230 100644 --- a/.claude/skills/img-grid/scripts/overlay-grid.py +++ b/.claude/skills/img-grid/scripts/overlay-grid.py @@ -1,3 +1,6 @@ +#!/usr/bin/env python3 +# img-grid v1.1 — Overlay numbered grid on image +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Overlay a numbered grid on an image to help determine column/row proportions. Usage: python overlay-grid.py [-c COLS] [-r ROWS] [-o OUTPUT] @@ -29,6 +32,11 @@ def main(): parser.add_argument("-o", "--output", help="Output path (default: -grid.)") args = parser.parse_args() + if args.cols <= 0: + parser.error("--cols must be greater than 0") + if args.rows < 0: + parser.error("--rows must be greater than or equal to 0") + src = Image.open(args.image).convert("RGBA") sw, sh = src.size @@ -36,7 +44,7 @@ def main(): step_x = sw / cols rows = args.rows if rows == 0: - rows = round(sh / step_x) + rows = max(1, round(sh / step_x)) step_y = sh / rows # Canvas with margins for labels diff --git a/README.md b/README.md index 71dccda1..3e5864ad 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,7 @@ python scripts/switch.py --runtime powershell # вернуть на PowerShell Дополнительные зависимости Python-рантайма: - `lxml>=4.9.0` — для навыков, работающих с DOM (edit/validate/info) +- `Pillow>=10.0.0` — для `/img-grid` (чтение изображений и наложение сетки) - `psutil>=5.9.0` — для web-навыков (управление Apache) Параметры скриптов идентичны для обоих рантаймов — переключение меняет только интерпретатор в вызовах. Подробнее: [Python Porting Guide](docs/python-porting-guide.md). diff --git a/docs/python-porting-guide.md b/docs/python-porting-guide.md index d025d4f7..1fa7ddf2 100644 --- a/docs/python-porting-guide.md +++ b/docs/python-porting-guide.md @@ -109,10 +109,12 @@ Switch-параметры (`-NoValidate`) → `action='store_true'`. - **Compile/init скрипты** (строковая сборка): только stdlib - **DOM-скрипты** (edit/validate/info): `lxml` с `XMLParser(remove_blank_text=False)` для сохранения whitespace +- **img-grid**: `Pillow` для чтения PNG/JPEG и отрисовки сетки поверх изображения - **Web-скрипты**: `psutil` для работы с процессами Apache Зависимости: - `lxml>=4.9.0` — ~25 DOM-скриптов +- `Pillow>=10.0.0` — `/img-grid` - `psutil>=5.9.0` — 4 web-скрипта ## Работа с BOM (UTF-8) diff --git a/tests/skills/cases/db-dump-dt/_skill.json b/tests/skills/cases/db-dump-dt/_skill.json new file mode 100644 index 00000000..2e8455c8 --- /dev/null +++ b/tests/skills/cases/db-dump-dt/_skill.json @@ -0,0 +1,9 @@ +{ + "script": "db-dump-dt/scripts/db-dump-dt", + "setup": "none", + "args": [], + "snapshot": { + "root": "workDir", + "normalizeUuids": false + } +} diff --git a/tests/skills/cases/db-dump-dt/error-no-args.json b/tests/skills/cases/db-dump-dt/error-no-args.json new file mode 100644 index 00000000..9a3b5491 --- /dev/null +++ b/tests/skills/cases/db-dump-dt/error-no-args.json @@ -0,0 +1,4 @@ +{ + "name": "Ошибка: нет аргументов", + "expectError": true +} diff --git a/tests/skills/cases/db-load-dt/_skill.json b/tests/skills/cases/db-load-dt/_skill.json new file mode 100644 index 00000000..8beafee8 --- /dev/null +++ b/tests/skills/cases/db-load-dt/_skill.json @@ -0,0 +1,9 @@ +{ + "script": "db-load-dt/scripts/db-load-dt", + "setup": "none", + "args": [], + "snapshot": { + "root": "workDir", + "normalizeUuids": false + } +} diff --git a/tests/skills/cases/db-load-dt/error-no-args.json b/tests/skills/cases/db-load-dt/error-no-args.json new file mode 100644 index 00000000..9a3b5491 --- /dev/null +++ b/tests/skills/cases/db-load-dt/error-no-args.json @@ -0,0 +1,4 @@ +{ + "name": "Ошибка: нет аргументов", + "expectError": true +} diff --git a/tests/skills/cases/db-load-git/_skill.json b/tests/skills/cases/db-load-git/_skill.json new file mode 100644 index 00000000..6c17af62 --- /dev/null +++ b/tests/skills/cases/db-load-git/_skill.json @@ -0,0 +1,9 @@ +{ + "script": "db-load-git/scripts/db-load-git", + "setup": "none", + "args": [], + "snapshot": { + "root": "workDir", + "normalizeUuids": false + } +} diff --git a/tests/skills/cases/db-load-git/error-bad-configdir.json b/tests/skills/cases/db-load-git/error-bad-configdir.json new file mode 100644 index 00000000..07ef7b5c --- /dev/null +++ b/tests/skills/cases/db-load-git/error-bad-configdir.json @@ -0,0 +1,5 @@ +{ + "name": "Ошибка: каталог конфигурации не найден", + "args_extra": ["-ConfigDir", "__missing_config_dir__", "-DryRun"], + "expectError": true +} diff --git a/tests/skills/cases/db-load-git/error-commit-no-range.json b/tests/skills/cases/db-load-git/error-commit-no-range.json new file mode 100644 index 00000000..e76dceea --- /dev/null +++ b/tests/skills/cases/db-load-git/error-commit-no-range.json @@ -0,0 +1,5 @@ +{ + "name": "Ошибка: Commit без диапазона", + "args_extra": ["-ConfigDir", ".", "-Source", "Commit", "-DryRun"], + "expectError": true +}