|
15 | 15 | class LaravelMigrations |
16 | 16 | { |
17 | 17 | public function install(Migrator $migrator): void |
| 18 | + { |
| 19 | + $pendingMigrations = $this->reconcile($migrator); |
| 20 | + |
| 21 | + if (empty($pendingMigrations)) { |
| 22 | + return; |
| 23 | + } |
| 24 | + |
| 25 | + $migrator->run($pendingMigrations); |
| 26 | + } |
| 27 | + |
| 28 | + /** |
| 29 | + * Reconciles already-existing optional Laravel tables with the content |
| 30 | + * migration track and returns any optional Laravel migrations that still |
| 31 | + * need to run. |
| 32 | + * |
| 33 | + * @return string[] |
| 34 | + */ |
| 35 | + public function reconcile(Migrator $migrator): array |
18 | 36 | { |
19 | 37 | $this->publishMigrationFiles(); |
20 | 38 |
|
21 | 39 | $migrationPaths = $this->migrationPaths(); |
22 | 40 |
|
23 | 41 | if (empty($migrationPaths)) { |
24 | | - return; |
| 42 | + return []; |
25 | 43 | } |
26 | 44 |
|
27 | 45 | $originalTrack = $migrator->getTrack(); |
28 | 46 |
|
29 | 47 | try { |
30 | 48 | $migrator->track('content'); |
31 | 49 |
|
32 | | - $pendingMigrations = $migrator->getPendingMigrations($migrationPaths); |
33 | | - $batch = $migrator->getRepository()->getNextBatchNumber(); |
34 | | - |
35 | | - foreach ($pendingMigrations as $key => $path) { |
36 | | - if (! $this->migrationTableExists($path)) { |
37 | | - continue; |
38 | | - } |
39 | | - |
40 | | - $migrator->getRepository()->log($migrator->getMigrationName($path), $batch); |
41 | | - unset($pendingMigrations[$key]); |
42 | | - } |
43 | | - |
44 | | - $pendingMigrations = array_values($pendingMigrations); |
45 | | - |
46 | | - if (empty($pendingMigrations)) { |
47 | | - return; |
48 | | - } |
49 | | - |
50 | | - $migrator->run($pendingMigrations); |
| 50 | + return $this->reconcilePendingMigrations( |
| 51 | + $migrator, |
| 52 | + $migrator->getPendingMigrations($migrationPaths), |
| 53 | + ); |
51 | 54 | } finally { |
52 | 55 | $migrator->track($originalTrack ?? 'content'); |
53 | 56 | } |
@@ -135,6 +138,26 @@ private function migrationFiles(string $pattern): array |
135 | 138 | return File::glob(app()->databasePath("migrations/$pattern")) ?: []; |
136 | 139 | } |
137 | 140 |
|
| 141 | + /** |
| 142 | + * @param string[] $pendingMigrations |
| 143 | + * @return string[] |
| 144 | + */ |
| 145 | + private function reconcilePendingMigrations(Migrator $migrator, array $pendingMigrations): array |
| 146 | + { |
| 147 | + $batch = $migrator->getRepository()->getNextBatchNumber(); |
| 148 | + |
| 149 | + foreach ($pendingMigrations as $key => $path) { |
| 150 | + if (! $this->migrationTableExists($path)) { |
| 151 | + continue; |
| 152 | + } |
| 153 | + |
| 154 | + $migrator->getRepository()->log($migrator->getMigrationName($path), $batch); |
| 155 | + unset($pendingMigrations[$key]); |
| 156 | + } |
| 157 | + |
| 158 | + return array_values($pendingMigrations); |
| 159 | + } |
| 160 | + |
138 | 161 | private function migrationTableExists(string $path): bool |
139 | 162 | { |
140 | 163 | $migrationName = pathinfo($path, PATHINFO_FILENAME); |
|
0 commit comments