diff --git a/.ddev/docker-compose.phpmyadmin.yaml b/.ddev/docker-compose.phpmyadmin.yaml index 54f6140e..3958baf3 100644 --- a/.ddev/docker-compose.phpmyadmin.yaml +++ b/.ddev/docker-compose.phpmyadmin.yaml @@ -24,7 +24,7 @@ services: - HTTPS_EXPOSE=8037:80 healthcheck: test: ["CMD-SHELL", "true"] - interval: 120s + interval: 5s timeout: 2s retries: 1 depends_on: diff --git a/src/Command/SyncPackagesCommand.php b/src/Command/SyncPackagesCommand.php index 22926764..207948b8 100644 --- a/src/Command/SyncPackagesCommand.php +++ b/src/Command/SyncPackagesCommand.php @@ -96,8 +96,24 @@ public function execute(Arguments $args, ConsoleIo $io): void $packagesTable = $this->fetchTable('Packages'); $touchedIds = []; - $data = $this->client->all(['type' => 'cakephp-plugin']); - foreach ($data as $package) { + $io->out('Fetching package list from Packagist...'); + $packages = $this->client->all(['type' => 'cakephp-plugin']); + $total = count($packages); + $io->out(sprintf('Found %d packages. Processing...', $total)); + + $saved = 0; + $skipped = 0; + $failed = 0; + $i = 0; + + $progress = $io->helper('Progress'); + $progress->init(['total' => $total, 'width' => 60]); + $io->out('', 0); + + foreach ($packages as $package) { + $i++; + $io->out(sprintf('[%d/%d] %s', $i, $total, $package), 1, ConsoleIo::VERBOSE); + $data = $this->getDataForPackage($package); if ( @@ -106,6 +122,8 @@ public function execute(Arguments $args, ConsoleIo $io): void $data['downloads'] < 10 || !$this->hasExplicitCakePhpDependency($data['tag_list']) ) { + $skipped++; + $progress->increment()->draw(); continue; } @@ -116,26 +134,49 @@ public function execute(Arguments $args, ConsoleIo $io): void $entity = $packagesTable->patchEntity($entity, $data); if (!$packagesTable->save($entity)) { + $failed++; Log::warning('Unable to save package', [ - 'package' => $package->getName(), + 'package' => $package, 'errors' => $entity->getErrors(), ]); + } else { + $saved++; } $touchedIds[] = $entity->id; + $progress->increment()->draw(); } + $io->out(''); + $io->out(sprintf( + 'Sync complete. Saved: %d, Skipped: %d, Failed: %d', + $saved, + $skipped, + $failed, + )); + // Remove packages that were not touched + $io->out('Removing stale packages...'); + $deleted = 0; + $deleteFailed = 0; /** @var \Cake\ORM\ResultSet $toDeletePackages */ $toDeletePackages = $packagesTable->find()->where(['id NOT IN' => $touchedIds])->all(); foreach ($toDeletePackages as $package) { if (!$packagesTable->delete($package)) { + $deleteFailed++; Log::warning('Unable to delete package', [ 'package' => $package->package, 'id' => $package->id, 'errors' => $package->getErrors(), ]); + } else { + $deleted++; } } + $io->out(sprintf( + 'Cleanup complete. Deleted: %d, Failed: %d', + $deleted, + $deleteFailed, + )); } /** diff --git a/templates/element/navbar.php b/templates/element/navbar.php index c2815189..823ce077 100644 --- a/templates/element/navbar.php +++ b/templates/element/navbar.php @@ -50,8 +50,7 @@ - -
  • +
  • Html->link('Sign out', [ 'controller' => 'Users', 'action' => 'logout', @@ -92,8 +91,7 @@
  • Html->link('Docs', 'https://book.cakephp.org/', ['target' => '_blank', 'rel' => 'noopener']) ?>
  • Html->link('API', 'https://api.cakephp.org/', ['target' => '_blank', 'rel' => 'noopener']) ?>
  • Identity->isLoggedIn()) : ?> - -
  • +
  • Form->postLink( 'Sign in with GitHub', [