|
1 | | -import { existsSync, mkdirSync, readdirSync, symlinkSync } from "node:fs"; |
2 | | -import { join, resolve } from "node:path"; |
| 1 | +import { |
| 2 | + existsSync, |
| 3 | + mkdirSync, |
| 4 | + readdirSync, |
| 5 | + symlinkSync, |
| 6 | + writeFileSync, |
| 7 | +} from "node:fs"; |
| 8 | +import { dirname, join, resolve } from "node:path"; |
3 | 9 | import { rm } from "node:fs/promises"; |
4 | 10 | import chalk from "chalk"; |
5 | 11 | import { cliError } from "../error.js"; |
6 | | -import { resolveConfigPath } from "../mops.js"; |
| 12 | +import { getRootDir, resolveConfigPath } from "../mops.js"; |
7 | 13 | import { MigrationsConfig } from "../types.js"; |
8 | 14 |
|
9 | | -const MIGRATIONS_TEMP_DIR = ".mops/.migrations"; |
| 15 | +function stagedMigrationsDir(chainDir: string, canisterName: string): string { |
| 16 | + return join(dirname(chainDir), `.migrations-${canisterName}`); |
| 17 | +} |
10 | 18 |
|
11 | 19 | export interface MigrationArgsResult { |
12 | 20 | migrationArgs: string[]; |
@@ -70,6 +78,21 @@ export function validateMigrationsConfig( |
70 | 78 | ); |
71 | 79 | } |
72 | 80 | } |
| 81 | + if (migrations.next) { |
| 82 | + const parentOf = (p: string) => dirname(resolve(getRootDir(), p)); |
| 83 | + const chainParent = parentOf(migrations.chain); |
| 84 | + const nextParent = parentOf(migrations.next); |
| 85 | + if (chainParent !== nextParent) { |
| 86 | + cliError( |
| 87 | + `[canisters.${canisterName}.migrations] "chain" and "next" must live in the same parent directory.\n` + |
| 88 | + ` chain = "${migrations.chain}" (parent: ${chainParent})\n` + |
| 89 | + ` next = "${migrations.next}" (parent: ${nextParent})\n` + |
| 90 | + "Place them in the same parent directory, e.g.:\n" + |
| 91 | + ' chain = "migrations"\n' + |
| 92 | + ' next = "next-migration"', |
| 93 | + ); |
| 94 | + } |
| 95 | + } |
73 | 96 | } |
74 | 97 |
|
75 | 98 | export async function prepareMigrationArgs( |
@@ -130,9 +153,10 @@ export async function prepareMigrationArgs( |
130 | 153 | }; |
131 | 154 | } |
132 | 155 |
|
133 | | - const tempDir = join(MIGRATIONS_TEMP_DIR, canisterName); |
| 156 | + const tempDir = stagedMigrationsDir(chainDir, canisterName); |
134 | 157 | await rm(tempDir, { recursive: true, force: true }); |
135 | 158 | mkdirSync(tempDir, { recursive: true }); |
| 159 | + writeFileSync(join(tempDir, ".gitignore"), "*\n"); |
136 | 160 |
|
137 | 161 | const filesToInclude = isTrimming |
138 | 162 | ? allMigrations.slice(-limit) |
|
0 commit comments