diff --git a/docs/GITEA_AUTO_UPDATE.md b/docs/GITEA_AUTO_UPDATE.md index c5d091c..184c866 100644 --- a/docs/GITEA_AUTO_UPDATE.md +++ b/docs/GITEA_AUTO_UPDATE.md @@ -378,6 +378,12 @@ git push origin v1.0.1 --- +## Если push отклонён: `(fetch first)` / `rejected` + +Пока job собирает артефакты, в **`updates`** мог успеть попасть **другой** коммит (второй релиз, ручная выкладка). Скрипт `sync-update-feed.mjs` перед push делает **`git fetch` + `git merge origin/updates`** (и после клона — то же в начале), плюс shallow **глубина по умолчанию 40** (`DND_UPDATES_CLONE_DEPTH`). Не запускайте **два релиза одного и того же репо одновременно** по двум тегам — возможны конфликты merge. + +--- + ## Поведение приложения - Проверка только в **собранной** установке (`app.isPackaged`). diff --git a/package-lock.json b/package-lock.json index 3abe747..cebe7b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "DndGamePlayer", - "version": "1.0.8", + "version": "1.0.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "DndGamePlayer", - "version": "1.0.8", + "version": "1.0.9", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 7a4597c..5c2b71f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "DndGamePlayer", - "version": "1.0.8", + "version": "1.0.9", "description": "DNDGamePlayer — редактор и проигрыватель игр", "main": "dist/main/index.cjs", "scripts": { diff --git a/scripts/sync-update-feed.mjs b/scripts/sync-update-feed.mjs index 3c29174..b6c7ec8 100644 --- a/scripts/sync-update-feed.mjs +++ b/scripts/sync-update-feed.mjs @@ -14,6 +14,7 @@ * ARTIFACT_LINUX — каталог с файлами Linux (AppImage и т.д.) * GIT_COMMIT_TAG — опционально, для сообщения коммита * DND_GIT_PUSH_RETRIES — опционально, число попыток git push (1–5, по умолчанию 3) + * DND_UPDATES_CLONE_DEPTH — опционально, глубина shallow clone (2–200, по умолчанию 40), чтобы merge с remote был надёжнее */ import { execFileSync } from 'node:child_process'; import fs from 'node:fs'; @@ -76,16 +77,23 @@ function sleepSyncSeconds(seconds) { } } +function mergeOriginUpdates(work) { + runGit(['fetch', 'origin', 'updates'], work); + runGit(['merge', '--no-edit', 'origin/updates'], work); +} + function pushUpdatesBranch(work) { const retries = Math.max(1, Math.min(5, Number.parseInt(process.env.DND_GIT_PUSH_RETRIES || '3', 10) || 3)); let lastError; for (let attempt = 1; attempt <= retries; attempt += 1) { try { + console.log(`[sync-update-feed] merge origin/updates before push (attempt ${attempt}/${retries})`); + mergeOriginUpdates(work); runGit(['push', '-u', 'origin', 'updates'], work); return; } catch (err) { lastError = err; - console.warn(`[sync-update-feed] git push failed (attempt ${attempt}/${retries})`); + console.warn(`[sync-update-feed] merge/push failed (attempt ${attempt}/${retries})`); if (attempt < retries) { sleepSyncSeconds(20); } @@ -109,10 +117,17 @@ function main() { const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'dnd-feed-')); const work = path.join(tmp, 'repo'); + const cloneDepth = Math.max( + 2, + Math.min(200, Number.parseInt(process.env.DND_UPDATES_CLONE_DEPTH || '40', 10) || 40), + ); + try { - execFileSync('git', ['clone', '--depth', '1', '-b', 'updates', cloneUrl, work], { stdio: 'inherit' }); + execFileSync('git', ['clone', `--depth=${String(cloneDepth)}`, '-b', 'updates', cloneUrl, work], { + stdio: 'inherit', + }); } catch { - execFileSync('git', ['clone', '--depth', '1', cloneUrl, work], { stdio: 'inherit' }); + execFileSync('git', ['clone', `--depth=${String(cloneDepth)}`, cloneUrl, work], { stdio: 'inherit' }); runGit(['checkout', '-B', 'updates'], work); } @@ -120,6 +135,12 @@ function main() { runGit(['config', 'user.name', 'gitea-actions'], work); configureGitHttpForLargePush(work); + try { + mergeOriginUpdates(work); + } catch { + console.warn('[sync-update-feed] initial merge skipped (новая ветка или пустой remote)'); + } + const copied = copyFlatReleaseFiles(winDir, work) + copyFlatReleaseFiles(macDir, work) +