Browse Source

Clean up v2 files in gc step

Jordi Boggiano 4 năm trước cách đây
mục cha
commit
d93e9d1aed
1 tập tin đã thay đổi với 30 bổ sung1 xóa
  1. 30 1
      src/Packagist/WebBundle/Package/SymlinkDumper.php

+ 30 - 1
src/Packagist/WebBundle/Package/SymlinkDumper.php

@@ -19,6 +19,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Symfony\Component\Finder\Finder;
 use Packagist\WebBundle\Entity\Version;
 use Packagist\WebBundle\Entity\Package;
+use Packagist\WebBundle\Model\ProviderManager;
 use Doctrine\DBAL\Connection;
 use Packagist\WebBundle\HealthCheck\MetadataDirCheck;
 use Predis\Client;
@@ -117,6 +118,11 @@ class SymlinkDumper
      */
     private $statsd;
 
+    /**
+     * @var ProviderManager
+     */
+    private $providerManager;
+
     /**
      * Constructor
      *
@@ -127,7 +133,7 @@ class SymlinkDumper
      * @param string                $targetDir
      * @param int                   $compress
      */
-    public function __construct(RegistryInterface $doctrine, Filesystem $filesystem, UrlGeneratorInterface $router, Client $redis, $webDir, $targetDir, $compress, $awsMetadata, StatsDClient $statsd)
+    public function __construct(RegistryInterface $doctrine, Filesystem $filesystem, UrlGeneratorInterface $router, Client $redis, $webDir, $targetDir, $compress, $awsMetadata, StatsDClient $statsd, ProviderManager $providerManager)
     {
         $this->doctrine = $doctrine;
         $this->fs = $filesystem;
@@ -139,6 +145,7 @@ class SymlinkDumper
         $this->redis = $redis;
         $this->awsMeta = $awsMetadata;
         $this->statsd = $statsd;
+        $this->providerManager = $providerManager;
     }
 
     /**
@@ -530,6 +537,28 @@ class SymlinkDumper
 
     public function gc()
     {
+        // clean up v2 files for deleted packages
+        if (is_dir($this->buildDir.'/p2')) {
+            $finder = Finder::create()->directories()->ignoreVCS(true)->in($this->buildDir.'/p2');
+            $packageNames = $this->providerManager->getPackageNames();
+
+            foreach ($finder as $vendorDir) {
+                $vendorFiles = Finder::create()->files()->ignoreVCS(true)
+                    ->name('/\.json$/')
+                    ->in((string) $vendorDir);
+
+                foreach ($vendorFiles as $file) {
+                    if (!preg_match('{/([^/]+/[^/]+?)(~dev)?\.json$}', strtr($file, '\\', '/'), $match)) {
+                        throw new \LogicException('Could not match package name from '.$path);
+                    }
+
+                    if (!in_array($match[1], $packageNames, true)) {
+                        unlink((string) $file);
+                    }
+                }
+            }
+        }
+
         // build up array of safe files
         $safeFiles = [];