فهرست منبع

Skip directories in zip generation, empty dirs won't get archived

This seems ok as we currently rely on git generating archives which does
not archive empty directories either.
Nils Adermann 12 سال پیش
والد
کامیت
6066359944

+ 17 - 6
src/Composer/Package/Archiver/ArchivableFilesFinder.php

@@ -25,7 +25,7 @@ use Symfony\Component\Finder;
  *
  * @author Nils Adermann <naderman@naderman.de>
  */
-class ArchivableFilesFinder
+class ArchivableFilesFinder extends \IteratorIterator
 {
     /**
      * @var Symfony\Component\Finder\Finder
@@ -66,13 +66,24 @@ class ArchivableFilesFinder
             })
             ->ignoreVCS(true)
             ->ignoreDotFiles(false);
+
+        parent::__construct($this->finder->getIterator());
     }
 
-    /**
-     * @return Symfony\Component\Finder\Finder
-     */
-    public function getIterator()
+    public function next()
+    {
+        do {
+            $this->getInnerIterator()->next();
+        } while ($this->getInnerIterator()->valid() && $this->getInnerIterator()->current()->isDir());
+    }
+
+    public function current()
+    {
+        return $this->getInnerIterator()->current();
+    }
+
+    public function valid()
     {
-        return $this->finder->getIterator();
+        return $this->getInnerIterator()->valid();
     }
 }

+ 1 - 1
src/Composer/Package/Archiver/PharArchiver.php

@@ -37,7 +37,7 @@ class PharArchiver implements ArchiverInterface
         try {
             $phar = new \PharData($target, null, null, static::$formats[$format]);
             $files = new ArchivableFilesFinder($sources, $excludes);
-            $phar->buildFromIterator($files->getIterator(), $sources);
+            $phar->buildFromIterator($files, $sources);
             return $target;
         } catch (\UnexpectedValueException $e) {
             $message = sprintf("Could not create archive '%s' from '%s': %s",

+ 1 - 1
tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php

@@ -169,7 +169,7 @@ class ArchivableFilesFinderTest extends \PHPUnit_Framework_TestCase
     protected function getArchivableFiles()
     {
         $files = array();
-        foreach ($this->finder->getIterator() as $file) {
+        foreach ($this->finder as $file) {
             if (!$file->isDir()) {
                 $files[] = preg_replace('#^'.preg_quote($this->sources, '#').'#', '', $file->getRealPath());
             }