diff --git a/.github/actions/check-migrations.js b/.github/actions/check-migrations.js new file mode 100644 index 0000000000000000000000000000000000000000..8fc2fae46a56fe881a4b9039e610fc5b783ce7ab --- /dev/null +++ b/.github/actions/check-migrations.js @@ -0,0 +1,69 @@ +#!/usr/bin/env node + +// overview: +// 1. List all migrations in packages/loot-core/migrations/* +// 2. Check the commit that created the migration file +// 3. Make sure that newer migrations were committed after older migrations (by date in the migration name) + +const fs = require('fs'); +const path = require('path'); +const { spawnSync } = require('child_process'); + +// Please don’t add to this list, we just can’t change this migration ID since it already happened +const exceptions = ['1679728867040_rules_conditions.sql']; + +const migrationsDir = path.join( + __dirname, + '..', + '..', + 'packages', + 'loot-core', + 'migrations', +); + +const migrations = fs + .readdirSync(migrationsDir) + .filter(file => !file.startsWith('.')) + .map(file => { + const [_, date] = file.match(/^(\d+)_/) || []; + const { stdout } = spawnSync('git', [ + 'log', + '--format=%ct', + '-n', + '1', + path.join(migrationsDir, file), + ]); + return { + migrationDate: parseInt(date), + commitDate: parseInt(stdout) * 1000, + file, + }; + }); + +const sortedMigrations = migrations.sort( + (a, b) => a.migrationDate - b.migrationDate, +); + +let ok = true; +for (let i = sortedMigrations.length - 1; i > 0; i--) { + const migration = sortedMigrations[i]; + const prevMigration = sortedMigrations[i - 1]; + if (migration.commitDate < prevMigration.commitDate) { + if (exceptions.includes(migration.file)) { + continue; + } + console.error( + `error: migration ${migration.file} was committed before ${prevMigration.file}, but it has a later date in the filename`, + ); + ok = false; + } +} + +if (ok) { + console.log('All migration IDs are in order'); +} else { + console.error( + '\nMigrations must be ordered by date or they will fail to apply properly', + ); + process.exit(1); +} diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 20af0f52d54bb83f18fd6647270f70f768af6d11..a840807b27c5e0860062bfa5e49b7e4d9ba0d0e8 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -32,3 +32,13 @@ jobs: uses: ./.github/actions/setup - name: Test run: yarn test + + migrations: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v2 + with: + node-version: '19' + - name: Check migrations + run: node ./.github/actions/check-migrations.js diff --git a/packages/loot-core/migrations/1682265217543_remove_account_type.sql b/packages/loot-core/migrations/1686139660866_remove_account_type.sql similarity index 100% rename from packages/loot-core/migrations/1682265217543_remove_account_type.sql rename to packages/loot-core/migrations/1686139660866_remove_account_type.sql diff --git a/upcoming-release-notes/1109.md b/upcoming-release-notes/1109.md new file mode 100644 index 0000000000000000000000000000000000000000..7fc00e37ac95f1b84112a46da56f335a527d7029 --- /dev/null +++ b/upcoming-release-notes/1109.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [j-f1] +--- + +Fix ID for newly added migration