// Publish (git commit + push) command construction and result interpretation // for the Content Editor. Extracted so it is unit-testable in isolation. // // WHY the shell shape: // - `git diff --cached --quiet && echo MARKER || git commit` — commit only when // staged changes exist; a skipped commit must NOT produce a failing exit code // (that was the original bug: "nothing added to commit" surfaced as an error). // - the MARKER echo is the only reliable signal for "no content changes": plain // output matching ("Already up to date", "Everything up-to-date") also appears // after REAL publishes (the pull prints it when the remote did not move), which // used to misclassify genuine publishes as no-ops. // - `git pull --rebase || (git rebase --abort; false)` — a failed rebase must be // aborted, otherwise the repo stays mid-rebase and every later publish fails // with "cannot pull with rebase". const NO_CHANGES_MARKER = '__NO_CONTENT_CHANGES__'; function buildPublishCommand(commitMessage) { return [ 'git add .', `(git diff --cached --quiet && echo ${NO_CHANGES_MARKER} || git commit -m "${commitMessage}")`, '(git pull --rebase origin main || (git rebase --abort; false))', 'git push origin main', ].join(' && '); } function interpretPublishResult(error, stdout, stderr) { const hadChanges = !stdout.includes(NO_CHANGES_MARKER); if (error) { return { ok: false, hadChanges, result: 'error', error: stderr || stdout || error.message }; } return { ok: true, hadChanges, result: hadChanges ? 'ok' : 'no_changes', output: hadChanges ? stdout : 'Nincs új változtatás.', }; } module.exports = { NO_CHANGES_MARKER, buildPublishCommand, interpretPublishResult };