소스 검색

Fix eager pruning of old provider files

Jordi Boggiano 11 년 전
부모
커밋
5d97de6045
1개의 변경된 파일32개의 추가작업 그리고 15개의 파일을 삭제
  1. 32 15
      src/Packagist/WebBundle/Package/Dumper.php

+ 32 - 15
src/Packagist/WebBundle/Package/Dumper.php

@@ -100,6 +100,8 @@ class Dumper
      */
     public function dump(array $packageIds, $force = false, $verbose = false)
     {
+        $cleanUpOldFiles = date('i') == 0;
+
         // prepare build dir
         $webDir = $this->webDir;
         $buildDir = $this->buildDir;
@@ -300,7 +302,7 @@ class Dumper
         }
 
         // run only once an hour
-        if (date('i') == 0) {
+        if ($cleanUpOldFiles) {
             // clean up old files
             $finder = Finder::create()->directories()->ignoreVCS(true)->in($webDir.'/p/');
             foreach ($finder as $vendorDir) {
@@ -316,27 +318,42 @@ class Dumper
                     $hashedByPackage[$package][] = (string) $file;
                 }
 
-                foreach ($hashedByPackage as $package => $files) {
-                    // if multiple hashed files exist for one package, remove all but the newest one
-                    if (count($files) > 1) {
-                        $orderedFiles = array();
-                        foreach ($files as $file) {
-                            $orderedFiles[$file] = filemtime($file);
-                        }
-                        asort($orderedFiles);
-                        array_pop($orderedFiles);
-                        foreach ($orderedFiles as $file => $mtime) {
-                            unlink($file);
-                        }
-                    }
+                foreach ($hashedByPackage as $files) {
+                    $this->pruneToLatestFile($files);
                 }
             }
 
             // clean up old provider listings
             $finder = Finder::create()->depth(0)->files()->name('provider-*.json')->ignoreVCS(true)->in($webDir.'/p/')->date('until 1hour ago');
+            $providerFiles = array();
             foreach ($finder as $provider) {
-                unlink($provider);
+                $list = preg_replace('{.+/([^/$]+?)\$[a-f0-9]+\.json$}', '$1', strtr($provider, '\\', '/'));
+                $providerFiles[$list][] = (string) $provider;
             }
+
+            foreach ($providerFiles as $files) {
+                $this->pruneToLatestFile($files);
+            }
+        }
+    }
+
+    /**
+     * If multiple files exist, remove all but the newest one.
+     */
+    private function pruneToLatestFile($files)
+    {
+        if (count($files) <= 1) {
+            return;
+        }
+
+        $orderedFiles = array();
+        foreach ($files as $file) {
+            $orderedFiles[$file] = filemtime($file);
+        }
+        asort($orderedFiles);
+        array_pop($orderedFiles);
+        foreach ($orderedFiles as $file => $mtime) {
+            unlink($file);
         }
     }