summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Beaver <cellog@php.net>2008-04-11 13:41:59 +0000
committerGreg Beaver <cellog@php.net>2008-04-11 13:41:59 +0000
commitb0f281b1597cd6858642d4c4ea8334029c50d233 (patch)
tree843c34c9c091fb94ba58f3280546079b1b2d9a26
parent8f28d19d4e77f61021de77269ad447a8e4c4c128 (diff)
downloadphp-git-b0f281b1597cd6858642d4c4ea8334029c50d233.tar.gz
restore Phar->compress/decompress() to simplify $phar->convertToExecutable(NULL, Phar::GZ) to $phar->compress(Phar::GZ)
[DOC]
-rwxr-xr-xext/phar/phar_object.c122
-rw-r--r--ext/phar/tests/tar/tar_makebz2.phpt2
-rw-r--r--ext/phar/tests/tar/tar_makegz.phpt2
3 files changed, 124 insertions, 2 deletions
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c
index c7c61eb490..b50d722ae3 100755
--- a/ext/phar/phar_object.c
+++ b/ext/phar/phar_object.c
@@ -2541,6 +2541,115 @@ static int pharobj_cancompress(HashTable *manifest TSRMLS_DC) /* {{{ */
}
/* }}} */
+/* {{{ proto object Phar::compress(int method[, string extension])
+ * Compress a .tar, or .phar.tar with whole-file compression
+ * The parameter can be one of Phar::GZ or Phar::BZ2 to specify
+ * the kind of compression desired
+ */
+PHP_METHOD(Phar, compress)
+{
+ long method = 0;
+ char *ext = NULL;
+ int ext_len;
+ php_uint32 flags;
+ zval *ret;
+ PHAR_ARCHIVE_OBJECT();
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|s", &method, &ext, &ext_len) == FAILURE) {
+ return;
+ }
+
+ if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
+ zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
+ "Cannot compress phar archive, phar is read-only");
+ return;
+ }
+
+ if (phar_obj->arc.archive->is_zip) {
+ zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
+ "Cannot compress zipbased archives with whole-archive compression");
+ return;
+ }
+
+ switch (method) {
+ case 0:
+ flags = PHAR_FILE_COMPRESSED_NONE;
+ break;
+ case PHAR_ENT_COMPRESSED_GZ:
+ if (!phar_has_zlib) {
+ zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
+ "Cannot compress entire archive with gzip, enable ext/zlib in php.ini");
+ return;
+ }
+ flags = PHAR_FILE_COMPRESSED_GZ;
+ break;
+
+ case PHAR_ENT_COMPRESSED_BZ2:
+ if (!phar_has_bz2) {
+ zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
+ "Cannot compress entire archive with bz2, enable ext/bz2 in php.ini");
+ return;
+ }
+ flags = PHAR_FILE_COMPRESSED_BZ2;
+ break;
+ default:
+ zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
+ "Unknown compression specified, please pass one of Phar::GZ or Phar::BZ2");
+ return;
+ }
+
+ if (phar_obj->arc.archive->is_tar) {
+ ret = phar_convert_to_other(phar_obj->arc.archive, PHAR_FORMAT_TAR, ext, flags TSRMLS_CC);
+ } else {
+ ret = phar_convert_to_other(phar_obj->arc.archive, PHAR_FORMAT_PHAR, ext, flags TSRMLS_CC);
+ }
+ if (ret) {
+ RETURN_ZVAL(ret, 1, 1);
+ } else {
+ RETURN_NULL();
+ }
+}
+/* }}} */
+
+/* {{{ proto object Phar::decompress([string extension])
+ * Decompress a .tar, or .phar.tar with whole-file compression
+ */
+PHP_METHOD(Phar, decompress)
+{
+ char *ext = NULL;
+ int ext_len;
+ zval *ret;
+ PHAR_ARCHIVE_OBJECT();
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &ext, &ext_len) == FAILURE) {
+ return;
+ }
+
+ if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
+ zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
+ "Cannot compress phar archive, phar is read-only");
+ return;
+ }
+
+ if (phar_obj->arc.archive->is_zip) {
+ zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
+ "Cannot compress zipbased archives with whole-archive compression");
+ return;
+ }
+
+ if (phar_obj->arc.archive->is_tar) {
+ ret = phar_convert_to_other(phar_obj->arc.archive, PHAR_FORMAT_TAR, ext, PHAR_FILE_COMPRESSED_NONE TSRMLS_CC);
+ } else {
+ ret = phar_convert_to_other(phar_obj->arc.archive, PHAR_FORMAT_PHAR, ext, PHAR_FILE_COMPRESSED_NONE TSRMLS_CC);
+ }
+ if (ret) {
+ RETURN_ZVAL(ret, 1, 1);
+ } else {
+ RETURN_NULL();
+ }
+}
+/* }}} */
+
/* {{{ proto object Phar::compressFiles(int method)
* Compress all files within a phar or zip archive using the specified compression
* The parameter can be one of Phar::GZ or Phar::BZ2 to specify
@@ -3775,6 +3884,17 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_phar_conv, 0, 0, 0)
ZEND_END_ARG_INFO();
static
+ZEND_BEGIN_ARG_INFO_EX(arginfo_phar_comps, 0, 0, 1)
+ ZEND_ARG_INFO(0, compression_type)
+ ZEND_ARG_INFO(0, file_ext)
+ZEND_END_ARG_INFO();
+
+static
+ZEND_BEGIN_ARG_INFO_EX(arginfo_phar_decomp, 0, 0, 0)
+ ZEND_ARG_INFO(0, file_ext)
+ZEND_END_ARG_INFO();
+
+static
ZEND_BEGIN_ARG_INFO_EX(arginfo_phar_comp, 0, 0, 1)
ZEND_ARG_INFO(0, compression_type)
ZEND_END_ARG_INFO();
@@ -3862,6 +3982,8 @@ zend_function_entry php_archive_methods[] = {
PHP_ME(Phar, buildFromIterator, arginfo_phar_build, ZEND_ACC_PUBLIC)
PHP_ME(Phar, compressFiles, arginfo_phar_comp, ZEND_ACC_PUBLIC)
PHP_ME(Phar, decompressFiles, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Phar, compress, arginfo_phar_comps, ZEND_ACC_PUBLIC)
+ PHP_ME(Phar, decompress, arginfo_phar_decomp, ZEND_ACC_PUBLIC)
PHP_ME(Phar, convertToExecutable, arginfo_phar_conv, ZEND_ACC_PUBLIC)
PHP_ME(Phar, convertToData, arginfo_phar_conv, ZEND_ACC_PUBLIC)
PHP_ME(Phar, copy, arginfo_phar_copy, ZEND_ACC_PUBLIC)
diff --git a/ext/phar/tests/tar/tar_makebz2.phpt b/ext/phar/tests/tar/tar_makebz2.phpt
index f81675f8d8..90379fa97a 100644
--- a/ext/phar/tests/tar/tar_makebz2.phpt
+++ b/ext/phar/tests/tar/tar_makebz2.phpt
@@ -16,7 +16,7 @@ $fname3 = dirname(__FILE__) . '/tar_makebz2_b.phar.tar.bz2';
$phar = new Phar($fname);
$phar['test'] = 'hi';
var_dump($phar->isTar());
-$phar = $phar->convertToExecutable(Phar::TAR, Phar::BZ2);
+$phar = $phar->compress(Phar::BZ2);
copy($fname2, $fname3);
diff --git a/ext/phar/tests/tar/tar_makegz.phpt b/ext/phar/tests/tar/tar_makegz.phpt
index 54fd1e4b33..9e2206ecc1 100644
--- a/ext/phar/tests/tar/tar_makegz.phpt
+++ b/ext/phar/tests/tar/tar_makegz.phpt
@@ -16,7 +16,7 @@ $fname3 = dirname(__FILE__) . '/tar_makegz_b.phar.tar.gz';
$phar = new Phar($fname);
$phar['test'] = 'hi';
var_dump($phar->isTar());
-$phar = $phar->convertToExecutable(Phar::TAR, Phar::GZ);
+$phar = $phar->compress(Phar::GZ);
copy($fname2, $fname3);