Jelajahi Sumber

Fix usage of filemtime/touch

Jordi Boggiano 12 tahun lalu
induk
melakukan
435022c032
1 mengubah file dengan 30 tambahan dan 22 penghapusan
  1. 30 22
      src/Packagist/WebBundle/Package/Dumper.php

+ 30 - 22
src/Packagist/WebBundle/Package/Dumper.php

@@ -225,6 +225,7 @@ class Dumper
         $finder = Finder::create()->files()->ignoreVCS(true)->name('*.json')->in($buildDir.'/p/')->depth('1');
 
         foreach ($finder as $file) {
+            // skipped hashed files
             if (strpos($file, '$')) {
                 continue;
             }
@@ -319,7 +320,7 @@ class Dumper
         // clean up old dir
         $retries = 5;
         do {
-            exec(sprintf('rm -rf %s', escapeshellarg($webDir.'/p-old')));
+            exec(sprintf('rm -rf %s', escapeshellarg($webDir.'/p-old')), $output);
             usleep(200);
             clearstatcache();
         } while (is_dir($webDir.'/p-old') && $retries--);
@@ -331,25 +332,32 @@ class Dumper
         // run only once an hour
         if (date('i') == 0) {
             // clean up old files
-            $finder = Finder::create()->files()->depth('1')->ignoreVCS(true)
-                ->name('/\.files$/')
-                ->date('until 10minutes ago')
-                ->in($webDir.'/p/');
-
-            foreach ($finder as $file) {
-                $package = basename($file, '.files');
-                $files = glob(dirname($file).'/'.$package.'$*');
-
-                // 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);
+            $finder = Finder::create()->directories()->ignoreVCS(true)->in($webDir.'/p/');
+            foreach ($finder as $vendorDir) {
+                $vendorFiles = Finder::create()->files()->ignoreVCS(true)
+                    ->name('/\$[a-f0-9]+\.json$/')
+                    ->date('until 10minutes ago')
+                    ->in((string) $vendorDir);
+
+                $hashedFiles = iterator_to_array($vendorFiles->getIterator());
+                $hashedByPackage = array();
+                foreach ($hashedFiles as $file) {
+                    $package = preg_replace('{.+/([^/$]+?)\$[a-f0-9]+\.json$}', '$1', strtr($file, '\\', '/'));
+                    $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);
+                        }
                     }
                 }
             }
@@ -420,7 +428,7 @@ class Dumper
         $this->fs->mkdir(dirname($path));
 
         file_put_contents($path, json_encode($this->individualFiles[$key]));
-        touch(substr($path, 0, -5).'.files', $this->individualFilesMtime[$key]);
+        touch($path, $this->individualFilesMtime[$key]);
     }
 
     private function dumpVersion(Version $version, $file)
@@ -462,7 +470,7 @@ class Dumper
             $firstOfTheMonth = $date->format('U');
         }
 
-        $mtime = filemtime(substr($file, 0, -5).'.files');
+        $mtime = filemtime($file);
 
         if ($mtime < $firstOfTheMonth - 86400 * 180) {
             return 'providers-archived.json';