|
11 | 11 | use Composer\Repository\ArrayRepository; |
12 | 12 | use Composer\Repository\RepositoryManager; |
13 | 13 | use Composer\Util\ProcessExecutor; |
| 14 | +use Creativestyle\Composer\Patchset\Exception\PatchApplicationFailedException; |
14 | 15 | use Psr\Log\LoggerInterface; |
15 | 16 |
|
16 | 17 | class Patcher |
@@ -290,15 +291,39 @@ private function applyPatches() |
290 | 291 | $packagePatchApplication->getTargetPackage()->getPrettyVersion() |
291 | 292 | )); |
292 | 293 |
|
| 294 | + /** @var PatchApplicationFailedException|null $applicationFailedException */ |
| 295 | + $applicationFailedException = null; |
| 296 | + |
| 297 | + /** @var PatchApplication[] $processedPatchApplications */ |
| 298 | + $processedPatchApplications = []; |
| 299 | + |
293 | 300 | foreach ($packagePatchApplication->getApplications() as $patchApplication) { |
294 | | - $this->applicator->applyPatch( |
295 | | - $patchApplication->getPatch(), |
296 | | - $patchApplication->getSourcePackage(), |
297 | | - $patchApplication->getTargetPackage() |
298 | | - ); |
| 301 | + try { |
| 302 | + $this->applicator->applyPatch( |
| 303 | + $patchApplication->getPatch(), |
| 304 | + $patchApplication->getSourcePackage(), |
| 305 | + $patchApplication->getTargetPackage() |
| 306 | + ); |
| 307 | + } catch (PatchApplicationFailedException $exception) { |
| 308 | + // Break out of the loop to save current state (already applied patches). |
| 309 | + $applicationFailedException = $exception; |
| 310 | + break; |
| 311 | + } |
| 312 | + |
| 313 | + $processedPatchApplications[] = $patchApplication; |
299 | 314 | } |
300 | 315 |
|
301 | | - $this->packageApplicationRepository->savePackageApplication($packagePatchApplication); |
| 316 | + $this->packageApplicationRepository->savePackageApplication( |
| 317 | + new PackagePatchApplication( |
| 318 | + $packagePatchApplication->getTargetPackage(), |
| 319 | + $processedPatchApplications |
| 320 | + ) |
| 321 | + ); |
| 322 | + |
| 323 | + if ($applicationFailedException) { |
| 324 | + // We still rethrow the exception after handling it gracefully |
| 325 | + throw $applicationFailedException; |
| 326 | + } |
302 | 327 | } |
303 | 328 | } |
304 | 329 |
|
|
0 commit comments