diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index e3eee39..3f4f336 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -79,7 +79,29 @@ jobs: - name: Create Gitea release run: | - python3 -c "import json,os; v=os.environ['VERSION']; img=os.environ['IMAGE']; notes=open('/tmp/release_notes.txt').read(); open('/tmp/release_body.json','w').write(json.dumps({'tag_name':'v'+v,'name':'Catalyst v'+v,'body':'### Changes\n\n'+notes+'\n\n### Image\n\n'+img+':'+v,'draft':False,'prerelease':False}))" + cat > /tmp/make_release.py << 'PYEOF' + import json, os + v = os.environ['VERSION'] + img = os.environ['IMAGE'] + raw = open('/tmp/release_notes.txt').read().strip() + feats, fixes = [], [] + for line in raw.splitlines(): + msg = line.lstrip('- ').strip() + if msg.startswith('feat:'): + feats.append('- ' + msg[5:].strip()) + elif msg.startswith('fix:'): + fixes.append('- ' + msg[4:].strip()) + sections = [] + if feats: + sections.append('### New Features\n\n' + '\n'.join(feats)) + if fixes: + sections.append('### Bug Fixes\n\n' + '\n'.join(fixes)) + notes = '\n\n'.join(sections) or '_No changes_' + body = notes + '\n\n### Image\n\n' + img + ':' + v + payload = {'tag_name': 'v'+v, 'name': 'Catalyst v'+v, 'body': body, 'draft': False, 'prerelease': False} + open('/tmp/release_body.json', 'w').write(json.dumps(payload)) + PYEOF + python3 /tmp/make_release.py curl -sf -X POST \ -H "Authorization: token ${{ secrets.TOKEN }}" \ -H "Content-Type: application/json" \ diff --git a/js/version.js b/js/version.js index 538443c..cfcbe6a 100644 --- a/js/version.js +++ b/js/version.js @@ -1 +1 @@ -const VERSION = "1.3.0"; +const VERSION = "1.3.1"; diff --git a/package.json b/package.json index d04ccba..0862dbb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "catalyst", - "version": "1.3.0", + "version": "1.3.1", "type": "module", "scripts": { "start": "node server/server.js", diff --git a/server/db.js b/server/db.js index bf0e99e..1eaf6ab 100644 --- a/server/db.js +++ b/server/db.js @@ -151,11 +151,13 @@ export function updateInstance(vmid, data) { } export function deleteInstance(vmid) { - return db.prepare('DELETE FROM instances WHERE vmid = ?').run(vmid); + db.prepare('DELETE FROM instance_history WHERE vmid = ?').run(vmid); + db.prepare('DELETE FROM instances WHERE vmid = ?').run(vmid); } export function importInstances(rows) { db.exec('BEGIN'); + db.exec('DELETE FROM instance_history'); db.exec('DELETE FROM instances'); const insert = db.prepare(` INSERT INTO instances diff --git a/tests/db.test.js b/tests/db.test.js index de5cef4..ee64d3a 100644 --- a/tests/db.test.js +++ b/tests/db.test.js @@ -164,6 +164,19 @@ describe('deleteInstance', () => { expect(getInstance(1)).toBeNull(); expect(getInstance(2)).not.toBeNull(); }); + + it('clears history for the deleted instance', () => { + createInstance({ ...base, name: 'a', vmid: 1 }); + deleteInstance(1); + expect(getInstanceHistory(1)).toHaveLength(0); + }); + + it('does not clear history for other instances', () => { + createInstance({ ...base, name: 'a', vmid: 1 }); + createInstance({ ...base, name: 'b', vmid: 2 }); + deleteInstance(1); + expect(getInstanceHistory(2).length).toBeGreaterThan(0); + }); }); // ── importInstances ─────────────────────────────────────────────────────────── @@ -183,6 +196,12 @@ describe('importInstances', () => { importInstances([]); expect(getInstances()).toEqual([]); }); + + it('clears history for all replaced instances', () => { + createInstance({ ...base, name: 'old', vmid: 1 }); + importInstances([{ ...base, name: 'new', vmid: 2 }]); + expect(getInstanceHistory(1)).toHaveLength(0); + }); }); // ── instance history ─────────────────────────────────────────────────────────