]> granicus.if.org Git - php/commitdiff
add support for creation of gzipped and bzipped tar-based phars
authorGreg Beaver <cellog@php.net>
Tue, 15 Jan 2008 23:41:44 +0000 (23:41 +0000)
committerGreg Beaver <cellog@php.net>
Tue, 15 Jan 2008 23:41:44 +0000 (23:41 +0000)
ext/phar/phar_object.c
ext/phar/tests/tar/tar_makebz2.phpt [new file with mode: 0644]
ext/phar/tests/tar/tar_makegz.phpt [new file with mode: 0644]

index 87fb6c84cbab122a111458bc3bf6484a66c5326f..7e9d614297356c5234f4bce7db9a6ea20cd68831 100755 (executable)
@@ -1708,11 +1708,6 @@ PHP_METHOD(Phar, compressAllFilesGZ)
 #endif
        PHAR_ARCHIVE_OBJECT();
 
-       if (phar_obj->arc.archive->is_tar) {
-               zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
-                       "Cannot compress all files as Gzip, not possible with tar-based phar archives");
-               return;
-       }
        if (PHAR_G(readonly)) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
                        "Phar is readonly, cannot change compression");
@@ -1729,7 +1724,12 @@ PHP_METHOD(Phar, compressAllFilesGZ)
                        "Cannot compress all files as Gzip, some are compressed as bzip2 and cannot be uncompressed");
                return;
        }
-       pharobj_set_compression(&phar_obj->arc.archive->manifest, PHAR_ENT_COMPRESSED_GZ TSRMLS_CC);
+       if (phar_obj->arc.archive->is_tar) {
+               phar_obj->arc.archive->flags &= ~PHAR_FILE_COMPRESSION_MASK;
+               phar_obj->arc.archive->flags |= PHAR_FILE_COMPRESSED_GZ;
+       } else {
+               pharobj_set_compression(&phar_obj->arc.archive->manifest, PHAR_ENT_COMPRESSED_GZ TSRMLS_CC);
+       }
        phar_obj->arc.archive->is_modified = 1;
        
        phar_flush(phar_obj->arc.archive, 0, 0, &error TSRMLS_CC);
@@ -1754,11 +1754,6 @@ PHP_METHOD(Phar, compressAllFilesBZIP2)
 #endif
        PHAR_ARCHIVE_OBJECT();
 
-       if (phar_obj->arc.archive->is_tar) {
-               zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
-                       "Cannot compress all files as Bzip2, not possible with tar-based phar archives");
-               return;
-       }
        if (phar_obj->arc.archive->is_zip) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
                        "Cannot compress all files as Bzip2, not possible with zip-based phar archives");
@@ -1781,7 +1776,12 @@ PHP_METHOD(Phar, compressAllFilesBZIP2)
                        "Cannot compress all files as Bzip2, some are compressed as gzip and cannot be uncompressed");
                return;
        }
-       pharobj_set_compression(&phar_obj->arc.archive->manifest, PHAR_ENT_COMPRESSED_BZ2 TSRMLS_CC);
+       if (phar_obj->arc.archive->is_tar) {
+               phar_obj->arc.archive->flags &= ~PHAR_FILE_COMPRESSION_MASK;
+               phar_obj->arc.archive->flags |= PHAR_FILE_COMPRESSED_BZ2;
+       } else {
+               pharobj_set_compression(&phar_obj->arc.archive->manifest, PHAR_ENT_COMPRESSED_BZ2 TSRMLS_CC);
+       }
        phar_obj->arc.archive->is_modified = 1;
        
        phar_flush(phar_obj->arc.archive, 0, 0, &error TSRMLS_CC);
diff --git a/ext/phar/tests/tar/tar_makebz2.phpt b/ext/phar/tests/tar/tar_makebz2.phpt
new file mode 100644 (file)
index 0000000..3dd2735
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Phar: tar-based phar, make new bzipped tar
+--SKIPIF--
+<?php if (!extension_loaded('phar')) die('skip'); ?>
+<?php if (!extension_loaded("spl")) die("skip SPL not available"); ?>
+<?php if (!extension_loaded("bz2")) die("skip bz2 not available"); ?>
+--INI--
+phar.readonly=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/tar_makebz2.phar.tar';
+$pname = 'phar://' . $fname;
+$fname2 = dirname(__FILE__) . '/tar_makebz22.phar.tar';
+$pname2 = 'phar://' . $fname2;
+
+$a = new Phar($fname);
+$a['test'] = 'hi';
+var_dump($a->isTar());
+$a->compressAllFilesBZIP2();
+copy($fname, $fname2);
+$b = new Phar($fname2);
+var_dump($b->isTar());
+var_dump($b->isCompressed() == Phar::BZ2);
+?>
+===DONE===
+--CLEAN--
+<?php
+@unlink(dirname(__FILE__) . '/tar_makebz2.phar.tar');
+@unlink(dirname(__FILE__) . '/tar_makebz22.phar.tar');
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+bool(true)
+===DONE===
\ No newline at end of file
diff --git a/ext/phar/tests/tar/tar_makegz.phpt b/ext/phar/tests/tar/tar_makegz.phpt
new file mode 100644 (file)
index 0000000..bf5c065
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Phar: tar-based phar, make new gzipped tar
+--SKIPIF--
+<?php if (!extension_loaded('phar')) die('skip'); ?>
+<?php if (!extension_loaded("spl")) die("skip SPL not available"); ?>
+<?php if (!extension_loaded("zlib")) die("skip zlib not available"); ?>
+--INI--
+phar.readonly=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/tar_makegz.phar.tar';
+$pname = 'phar://' . $fname;
+$fname2 = dirname(__FILE__) . '/tar_makegz2.phar.tar';
+$pname2 = 'phar://' . $fname2;
+
+$a = new Phar($fname);
+$a['test'] = 'hi';
+var_dump($a->isTar());
+$a->compressAllFilesGZ();
+copy($fname, $fname2);
+$b = new Phar($fname2);
+var_dump($b->isTar());
+var_dump($b->isCompressed() == Phar::GZ);
+?>
+===DONE===
+--CLEAN--
+<?php
+@unlink(dirname(__FILE__) . '/tar_makegz.phar.tar');
+@unlink(dirname(__FILE__) . '/tar_makegz2.phar.tar');
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+bool(true)
+===DONE===
\ No newline at end of file