Browse Source

Merge remote-tracking branch 'hfcorriez/compressed_archiver'

Jordi Boggiano 9 years ago
parent
commit
6eb50623e6
1 changed files with 33 additions and 2 deletions
  1. 33 2
      src/Composer/Package/Archiver/PharArchiver.php

+ 33 - 2
src/Composer/Package/Archiver/PharArchiver.php

@@ -20,8 +20,15 @@ namespace Composer\Package\Archiver;
 class PharArchiver implements ArchiverInterface
 {
     protected static $formats = array(
-        'zip' => \Phar::ZIP,
-        'tar' => \Phar::TAR,
+        'zip'     => \Phar::ZIP,
+        'tar'     => \Phar::TAR,
+        'tar.gz'  => \Phar::TAR,
+        'tar.bz2' => \Phar::TAR
+    );
+
+    protected static $compressFormats = array(
+        'tar.gz'  => \Phar::GZ,
+        'tar.bz2' => \Phar::BZ2
     );
 
     /**
@@ -37,10 +44,34 @@ class PharArchiver implements ArchiverInterface
         }
 
         try {
+            $filename = substr($target, 0, strrpos($target, $format) - 1);
+
+            // Check if compress format
+            if (isset(static::$compressFormats[$format])) {
+                // Current compress format supported base on tar
+                $target = $filename . '.tar';
+            }
+
             $phar = new \PharData($target, null, null, static::$formats[$format]);
             $files = new ArchivableFilesFinder($sources, $excludes);
             $phar->buildFromIterator($files, $sources);
 
+            if (isset(static::$compressFormats[$format])) {
+                // Check can be compressed?
+                if (!$phar->canCompress(static::$compressFormats[$format])) {
+                    throw new \RuntimeException(sprintf('Can not compress to %s format', $format));
+                }
+
+                // Delete old tar
+                unlink($target);
+
+                // Compress the new tar
+                $phar->compress(static::$compressFormats[$format]);
+
+                // Make the correct filename
+                $target = $filename . '.' . $format;
+            }
+
             return $target;
         } catch (\UnexpectedValueException $e) {
             $message = sprintf("Could not create archive '%s' from '%s': %s",