]> granicus.if.org Git - php/commitdiff
fix read/write for PharData object, update tests to current API
authorGreg Beaver <cellog@php.net>
Mon, 24 Mar 2008 03:01:31 +0000 (03:01 +0000)
committerGreg Beaver <cellog@php.net>
Mon, 24 Mar 2008 03:01:31 +0000 (03:01 +0000)
19 files changed:
ext/phar/TODO
ext/phar/dirstream.c
ext/phar/phar.c
ext/phar/phar_object.c
ext/phar/stream.c
ext/phar/tests/phar_convert_repeated.phpt
ext/phar/tests/phar_convert_repeated_b.phpt
ext/phar/tests/phar_convert_tar.phpt
ext/phar/tests/phar_convert_tar2.phpt
ext/phar/tests/phar_convert_tar3.phpt
ext/phar/tests/phar_convert_zip.phpt
ext/phar/tests/tar/phar_convert_phar.phpt
ext/phar/tests/tar/phar_convert_phar2.phpt
ext/phar/tests/tar/phar_convert_phar3.phpt
ext/phar/tests/tar/tar_makebz2.phpt
ext/phar/tests/tar/tar_makegz.phpt
ext/phar/tests/zf_test.phpt
ext/phar/tests/zip/phar_convert_phar.phpt
ext/phar/util.c

index 9f38b059c996c1cfb1f4ca647e13402d81fb100a..945e7a5ccccf5805dc274d3d481451967cf62242 100644 (file)
@@ -86,7 +86,7 @@ Version 2.0.0
  X don't automatically add a stub to .zip or .tar files [Steph]
  X don't allow a stub or alias to be added to a .zip/.tar that does not have
    ".phar" in the filename (or already have stub/alias) [Steph]
- X allow read/write on .tar/.zip files that do not contain a stub or alias [Steph]
+ X allow read/write on .tar/.zip files that do not contain a stub or alias [Steph/Greg]
  X prevent manual addition of stub via $a['.phar/stub.php'] = '<?php my stub'; [Greg]
  * investigate potential collision between SPL's DirectoryIterator flags and
    those in phar_archive_data
index c33b55d292c305e21494917553a3b755a1164b76..14f13f9c6a0d08c01e1f2db30947535e64985226 100644 (file)
@@ -418,13 +418,23 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, char *path, char
 int phar_wrapper_mkdir(php_stream_wrapper *wrapper, char *url_from, int mode, int options, php_stream_context *context TSRMLS_DC) /* {{{ */
 {
        phar_entry_info entry, *e;
-       phar_archive_data *phar;
-       char *error;
+       phar_archive_data *phar = NULL;
+       char *error, *arch, *entry2;
+       int arch_len, entry_len;
        char *plain_map;
        php_url *resource = NULL;
        uint host_len;
 
-       if (PHAR_G(readonly)) {
+       /* pre-readonly check, we need to know if this is a data phar */
+       if (FAILURE == phar_split_fname(url_from, strlen(url_from), &arch, &arch_len, &entry2, &entry_len TSRMLS_CC)) {
+               return FAILURE;
+       }
+       if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL TSRMLS_CC)) {
+               phar = NULL;
+       }
+       efree(arch);
+       efree(entry2);
+       if (PHAR_G(readonly) && (!phar || !phar->is_data)) {
                php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: cannot create directory \"%s\", write operations disabled", url_from);
                return FAILURE;
        }
@@ -519,13 +529,23 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, char *url_from, int mode, in
 int phar_wrapper_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) /* {{{ */
 {
        phar_entry_info *entry;
-       phar_archive_data *phar;
-       char *error;
+       phar_archive_data *phar = NULL;
+       char *error, *arch, *entry2;
+       int arch_len, entry_len;
        char *plain_map;
        php_url *resource = NULL;
        uint host_len;
 
-       if (PHAR_G(readonly)) {
+       /* pre-readonly check, we need to know if this is a data phar */
+       if (FAILURE == phar_split_fname(url, strlen(url), &arch, &arch_len, &entry2, &entry_len TSRMLS_CC)) {
+               return FAILURE;
+       }
+       if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL TSRMLS_CC)) {
+               phar = NULL;
+       }
+       efree(arch);
+       efree(entry2);
+       if (PHAR_G(readonly) && (!phar || !phar->is_data)) {
                php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: cannot rmdir directory \"%s\", write operations disabled", url);
                return FAILURE;
        }
index d94ab50acb5e339a0fe27f28a51cf3f5fd3af383..a8f551a0160ed48570ad5c0ca5567d912cb04168 100644 (file)
@@ -1827,7 +1827,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert,
                *error = NULL;
        }
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar->is_data) {
                return EOF;
        }
 
index a6ae41af4e7c6696fd6800cc93a798bb4fe91c1d..ce2356b5e41a7efd8c73af0611e19ffbc5f26c8e 100755 (executable)
@@ -1496,7 +1496,7 @@ PHP_METHOD(Phar, buildFromIterator)
        } pass;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
                        "Cannot write out phar archive, phar is read-only");
                return;
@@ -1687,12 +1687,19 @@ static zval *phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool c
 
        if (!phar->is_data) {
                if (phar->alias) {
-                       efree(phar->alias);
-                       phar->alias = estrndup(newpath, strlen(newpath));
-                       phar->alias_len = strlen(newpath);
-                       phar->is_temporary_alias = 1;
-                       zend_hash_update(&(PHAR_GLOBALS->phar_alias_map), newpath, phar->fname_len, (void*)&phar, sizeof(phar_archive_data*), NULL);
+                       if (phar->is_temporary_alias) {
+                               phar->alias = NULL;
+                               phar->alias_len = 0;
+                       } else {
+                               phar->alias = estrndup(newpath, strlen(newpath));
+                               phar->alias_len = strlen(newpath);
+                               phar->is_temporary_alias = 1;
+                               zend_hash_update(&(PHAR_GLOBALS->phar_alias_map), newpath, phar->fname_len, (void*)&phar, sizeof(phar_archive_data*), NULL);
+                       }
                }
+       } else {
+               phar->alias = NULL;
+               phar->alias_len = 0;
        }
 
        
@@ -1755,6 +1762,7 @@ static zval *phar_convert_to_other(phar_archive_data *source, int convert, char
        phar->fname = source->fname;
        phar->fname_len = source->fname_len;
        phar->is_temporary_alias = source->is_temporary_alias;
+       phar->alias = source->alias;
        /* first copy each file's uncompressed contents to a temporary file and set per-file flags */
        for (zend_hash_internal_pointer_reset(&source->manifest); SUCCESS == zend_hash_has_more_elements(&source->manifest); zend_hash_move_forward(&source->manifest)) {
 
@@ -1824,7 +1832,7 @@ static zval *phar_convert_to_other(phar_archive_data *source, int convert, char
 PHP_METHOD(Phar, convertToTar)
 {
        char *ext = NULL;
-       int ext_len = 0;
+       int ext_len = 0, save;
        zval *ret;
        PHAR_ARCHIVE_OBJECT();
 
@@ -1836,12 +1844,12 @@ PHP_METHOD(Phar, convertToTar)
                RETURN_TRUE;
        }
        if (PHAR_G(readonly)) {
-               zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
-                       "Cannot write out phar archive, phar is read-only");
-               return;
+               save = phar_obj->arc.archive->is_data;
+               phar_obj->arc.archive->is_data = 1;
        }
 
        ret = phar_convert_to_other(phar_obj->arc.archive, 1, ext, phar_obj->arc.archive->flags TSRMLS_CC);
+       phar_obj->arc.archive->is_data = save;
        if (ret) {
                RETURN_ZVAL(ret, 1, 1);
        } else {
@@ -1858,7 +1866,7 @@ PHP_METHOD(Phar, convertToTar)
 PHP_METHOD(Phar, convertToZip)
 {
        char *ext = NULL;
-       int ext_len = 0;
+       int ext_len = 0, save;
        zval *ret;
        PHAR_ARCHIVE_OBJECT();
 
@@ -1871,12 +1879,12 @@ PHP_METHOD(Phar, convertToZip)
        }
 
        if (PHAR_G(readonly)) {
-               zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
-                       "Cannot write out phar archive, phar is read-only");
-               return;
+               save = phar_obj->arc.archive->is_data;
+               phar_obj->arc.archive->is_data = 1;
        }
 
        ret = phar_convert_to_other(phar_obj->arc.archive, 2, ext, PHAR_FILE_COMPRESSED_NONE TSRMLS_CC);
+       phar_obj->arc.archive->is_data = save;
        if (ret) {
                RETURN_ZVAL(ret, 1, 1);
        } else {
@@ -2054,12 +2062,6 @@ PHP_METHOD(Phar, convertToData)
                RETURN_TRUE;
        }
 
-       if (PHAR_G(readonly)) { /* Don't override this one for is_data */
-               zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
-                       "Cannot convert phar archive to executable format, phar is read-only");
-               return;
-       }
-
        phar_obj->arc.archive->is_data = 1;
        if (phar_obj->arc.archive->is_tar) {
                ret = phar_convert_to_other(phar_obj->arc.archive, 1, ext, phar_obj->arc.archive->flags TSRMLS_CC);
@@ -2103,7 +2105,7 @@ PHP_METHOD(Phar, delete)
        phar_entry_info *entry;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
                        "Cannot write out phar archive, phar is read-only");
                return;
@@ -2174,7 +2176,7 @@ PHP_METHOD(Phar, setAlias)
        int alias_len, oldalias_len, old_temp, readd = 0;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
                        "Cannot write out phar archive, phar is read-only");
                RETURN_FALSE;
@@ -2281,7 +2283,7 @@ PHP_METHOD(Phar, stopBuffering)
        char *error;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
                        "Cannot write out phar archive, phar is read-only");
                return;
@@ -2310,7 +2312,7 @@ PHP_METHOD(Phar, setStub)
        php_stream *stream;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
                        "Cannot change stub, phar is read-only");
                return;
@@ -2437,7 +2439,7 @@ PHP_METHOD(Phar, setSignatureAlgorithm)
        char *error;
        PHAR_ARCHIVE_OBJECT();
        
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
                        "Cannot set signature algorithm, phar is read-only");
                return;
@@ -2585,7 +2587,7 @@ PHP_METHOD(Phar, compressAllFilesGZ)
        char *error;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
                        "Phar is readonly, cannot change compression");
                return;
@@ -2625,7 +2627,7 @@ PHP_METHOD(Phar, compressAllFilesBZIP2)
        char *error;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
                        "Phar is readonly, cannot change compression");
                return;
@@ -2665,7 +2667,7 @@ PHP_METHOD(Phar, uncompressAllFiles)
        char *error;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
                        "Phar is readonly, cannot change compression");
                return;
@@ -2707,7 +2709,7 @@ PHP_METHOD(Phar, copy)
                return;
        }
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
                        "Cannot copy \"%s\" to \"%s\", phar is read-only", oldfile, newfile);
                RETURN_FALSE;
@@ -2851,7 +2853,7 @@ PHP_METHOD(Phar, offsetSet)
        php_stream *contents_file;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Write operations disabled by INI setting");
                return;
        }
@@ -2918,7 +2920,7 @@ PHP_METHOD(Phar, offsetUnset)
        phar_entry_info *entry;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Write operations disabled by INI setting");
                return;
        }
@@ -3069,7 +3071,7 @@ PHP_METHOD(Phar, setMetadata)
        zval *metadata;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Write operations disabled by INI setting");
                return;
        }
@@ -3106,10 +3108,15 @@ PHP_METHOD(Phar, delMetadata)
        char *error;
        PHAR_ARCHIVE_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Write operations disabled by INI setting");
                return;
        }
+       if (phar_obj->arc.archive->is_tar) {
+               zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
+                       "Cannot delete metadata, not possible with tar-based phar archives");
+               return;
+       }
        if (phar_obj->arc.archive->metadata) {
                zval_ptr_dtor(&phar_obj->arc.archive->metadata);
                phar_obj->arc.archive->metadata = NULL;
@@ -3321,7 +3328,7 @@ PHP_METHOD(PharFileInfo, chmod)
                        "Phar entry is a directory, cannot chmod"); \
                return;
        }
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !entry_obj->ent.entry->phar->is_data) {
                zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Cannot modify permissions for file \"%s\" in phar \"%s\", write operations are prohibited", entry_obj->ent.entry->filename, entry_obj->ent.entry->phar->fname);
                return;
        }
@@ -3387,7 +3394,7 @@ PHP_METHOD(PharFileInfo, setMetadata)
        zval *metadata;
        PHAR_ENTRY_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !entry_obj->ent.entry->phar->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Write operations disabled by INI setting");
                return;
        }
@@ -3429,10 +3436,15 @@ PHP_METHOD(PharFileInfo, delMetadata)
        char *error;
        PHAR_ENTRY_OBJECT();
 
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !entry_obj->ent.entry->phar->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Write operations disabled by INI setting");
                return;
        }
+       if (entry_obj->ent.entry->is_tar) {
+               zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
+                       "Cannot delete metadata, not possible with tar-based phar archives");
+               return;
+       }
        if (entry_obj->ent.entry->is_temp_dir) {
                RETURN_FALSE;
        }
@@ -3476,7 +3488,7 @@ PHP_METHOD(PharFileInfo, setCompressedGZ)
                RETURN_TRUE;
                return;
        }
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !entry_obj->ent.entry->phar->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
                        "Phar is readonly, cannot change compression");
                return;
@@ -3514,11 +3526,6 @@ PHP_METHOD(PharFileInfo, setCompressedBZIP2)
        char *error;
        PHAR_ENTRY_OBJECT();
 
-       if (entry_obj->ent.entry->is_zip) {
-               zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
-                       "Cannot compress with Bzip2 compression, not possible with zip-based phar archives");
-               return;
-       }
        if (entry_obj->ent.entry->is_tar) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
                        "Cannot compress with Bzip2 compression, not possible with tar-based phar archives");
@@ -3537,7 +3544,7 @@ PHP_METHOD(PharFileInfo, setCompressedBZIP2)
        if (entry_obj->ent.entry->flags & PHAR_ENT_COMPRESSED_BZ2) {
                RETURN_TRUE;
        }
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !entry_obj->ent.entry->phar->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
                        "Phar is readonly, cannot change compression");
                return;
@@ -3580,7 +3587,7 @@ PHP_METHOD(PharFileInfo, setUncompressed)
                RETURN_TRUE;
                return;
        }
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !entry_obj->ent.entry->phar->is_data) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
                        "Phar is readonly, cannot change compression");
                return;
index dc32d25ae1a492b24af0d4f0cdcab60036a0955b..0d73908d53029de56beb137c03ded82e7068291e 100644 (file)
@@ -109,7 +109,12 @@ php_url* phar_open_url(php_stream_wrapper *wrapper, char *filename, char *mode,
                        return resource;
                }
                if (mode[0] == 'w' || (mode[0] == 'r' && mode[1] == '+')) {
-                       if (PHAR_G(readonly)) {
+                       phar_archive_data **pphar = NULL;
+
+                       if (PHAR_GLOBALS->request_init && PHAR_GLOBALS->phar_fname_map.arBuckets && FAILURE == zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), arch, arch_len, (void **)&pphar)) {
+                               pphar = NULL;
+                       }
+                       if (PHAR_G(readonly) && (!pphar || !(*pphar)->is_data)) {
                                if (!(options & PHP_STREAM_URL_STAT_QUIET)) {
                                        php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: write operations disabled by INI setting");
                                }
@@ -670,6 +675,7 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, char *url, int optio
        php_url *resource;
        char *internal_file, *error, *plain_map;
        phar_entry_data *idata;
+       phar_archive_data **pphar;
        uint host_len;
        int retval;
 
@@ -703,7 +709,10 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, char *url, int optio
                return retval;
        }
 
-       if (PHAR_G(readonly)) {
+       if (FAILURE == zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), resource->host, strlen(resource->host), (void **) &pphar)) {
+               pphar = NULL;
+       }
+       if (PHAR_G(readonly) && (!pphar || !(*pphar)->is_data)) {
                php_url_free(resource);
                php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: write operations disabled by INI setting");
                return 0;
@@ -753,15 +762,11 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char
 {
        php_url *resource_from, *resource_to;
        char *error, *plain_map;
-       phar_archive_data *phar;
+       phar_archive_data *phar, *pfrom, *pto;
        phar_entry_info *entry;
        uint host_len;
 
        error = NULL;
-       if (PHAR_G(readonly)) {
-               php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: write operations disabled by INI setting");
-               return 0;
-       }
 
        if ((resource_from = phar_open_url(wrapper, url_from, "r+b", options TSRMLS_CC)) == NULL) {
                return 0;
@@ -772,6 +777,17 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char
                return 0;
        }
 
+       if (SUCCESS != phar_get_archive(&pfrom, resource_from->host, strlen(resource_from->host), NULL, 0, &error TSRMLS_CC)) {
+               pfrom = NULL;
+       }
+       if (SUCCESS != phar_get_archive(&pto, resource_to->host, strlen(resource_to->host), NULL, 0, &error TSRMLS_CC)) {
+               pto = NULL;
+       }
+       if (PHAR_G(readonly) && ((!pfrom || !pfrom->is_data) || (!pto || !pto->is_data))) {
+               php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: write operations disabled by INI setting");
+               return 0;
+       }
+
        /* we must have at the very least phar://alias.phar/internalfile.php */
        if (!resource_from->scheme || !resource_from->host || !resource_from->path) {
                php_url_free(resource_from);
index 480d7900c74c42be81074bdb16206d7a1256b62c..ab6ec8aba687469ae414b8aedf645da6dc48dcab 100644 (file)
@@ -32,7 +32,7 @@ var_dump($phar->getAlias());
 
 echo "================= convertToTar() =====================\n";
 
-$phar->convertToTar();
+$phar = $phar->convertToTar();
 var_dump($phar->isPhar());
 var_dump($phar->isTar());
 var_dump($phar->isZip());
@@ -41,7 +41,7 @@ var_dump($phar->getAlias());
 
 echo "================= convertToZip() =====================\n";
 
-$phar->convertToZip();
+$phar = $phar->convertToZip();
 var_dump($phar->isPhar());
 var_dump($phar->isTar());
 var_dump($phar->isZip());
@@ -50,7 +50,7 @@ var_dump($phar->getAlias());
 
 echo "================= convertToPhar() ====================\n";
 
-$phar->convertToPhar();
+$phar = $phar->convertToPhar('.2.phar');
 var_dump($phar->isPhar());
 var_dump($phar->isTar());
 var_dump($phar->isZip());
@@ -59,7 +59,7 @@ var_dump($phar->getAlias());
 
 echo "================= convertToZip() =====================\n";
 
-$phar->convertToZip();
+$phar = $phar->convertToZip('.2.phar.zip');
 var_dump($phar->isPhar());
 var_dump($phar->isTar());
 var_dump($phar->isZip());
@@ -68,7 +68,7 @@ var_dump($phar->getAlias());
 
 echo "================= convertToTar() =====================\n";
 
-$phar->convertToTar();
+$phar = $phar->convertToTar('2.phar.tar');
 var_dump($phar->isPhar());
 var_dump($phar->isTar());
 var_dump($phar->isZip());
@@ -77,7 +77,7 @@ var_dump($phar->getAlias());
 
 echo "================= convertToZip() =====================\n";
 
-$phar->convertToZip();
+$phar = $phar->convertToZip('3.phar.zip');
 var_dump($phar->isPhar());
 var_dump($phar->isTar());
 var_dump($phar->isZip());
@@ -89,6 +89,14 @@ var_dump($phar->getAlias());
 --CLEAN--
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.zip');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar.zip');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar');
 ?>
 --EXPECTF--
 =================== new Phar() =======================
@@ -110,32 +118,32 @@ bool(false)
 bool(true)
 string(60) "<?php // zip-based phar archive stub file
 __HALT_COMPILER();"
-string(%d) "%sphar_convert_repeated.phar.zip"
+NULL
 ================= convertToPhar() ====================
 bool(true)
 bool(false)
 bool(false)
 int(6651)
-string(%d) "%sphar_convert_repeated.phar"
+NULL
 ================= convertToZip() =====================
 bool(false)
 bool(false)
 bool(true)
 string(60) "<?php // zip-based phar archive stub file
 __HALT_COMPILER();"
-string(%d) "%sphar_convert_repeated.phar.zip"
+NULL
 ================= convertToTar() =====================
 bool(false)
 bool(true)
 bool(false)
 string(60) "<?php // tar-based phar archive stub file
 __HALT_COMPILER();"
-string(%d) "%sphar_convert_repeated.phar.tar"
+NULL
 ================= convertToZip() =====================
 bool(false)
 bool(false)
 bool(true)
 string(60) "<?php // zip-based phar archive stub file
 __HALT_COMPILER();"
-string(%d) "%sphar_convert_repeated.phar.zip"
+NULL
 ===DONE===
index 229d654a0dedab3da303e3d160fa2203560bf0ab..6ed0070270c609b9ab47d7a42033061e6b4a5213 100644 (file)
@@ -3,7 +3,7 @@ PharData::convertToZip|Tar|Phar() repeated (phardata_based archives)
 --SKIPIF--
 <?php if (!extension_loaded("phar")) die("skip"); ?>
 --INI--
-phar.readonly=0
+phar.readonly=1
 --FILE--
 <?php
 
@@ -54,7 +54,7 @@ try {
 
 echo "================ convertToTar(GZ) ====================\n";
 
-$phar = $phar->convertToTar()->compress(Phar::GZ);
+$phar = $phar->convertToTar('.2.tar')->compress(Phar::GZ);
 var_dump($phar->isPhar());
 var_dump($phar->isTar());
 var_dump($phar->isZip());
@@ -78,16 +78,14 @@ try {
 ===DONE===
 --CLEAN--
 <?php 
-unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
-unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar');
-unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.gz');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.gz');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.tar.gz');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.tar');
-unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.zip');
 ?>
---EXPECTF--
+--EXPECT--
 =================== new PharData() ==================
 bool(false)
 bool(false)
@@ -107,23 +105,13 @@ bool(true)
 string(0) ""
 NULL
 ================= convertToPhar() ====================
-bool(true)
-bool(false)
-bool(false)
-int(6651)
-NULL
+Cannot write out phar archive, phar is read-only
 ================ convertToTar(GZ) ====================
 bool(false)
 bool(true)
 bool(false)
-string(60) "<?php // tar-based phar archive stub file
-__HALT_COMPILER();"
+string(0) ""
 NULL
 ================= convertToPhar() ====================
-bool(true)
-bool(false)
-bool(false)
-int(6651)
-NULL
-===DONE===
-
+Cannot write out phar archive, phar is read-only
+===DONE===
\ No newline at end of file
index dc5db0c7afa352d568829cfb697c3f0c1ae8e64f..92ff1e36d785f575b6ee1dd85791a382a821f828 100644 (file)
@@ -26,7 +26,7 @@ $phar = new Phar($fname);
 var_dump($phar->isTar());
 var_dump($phar->getStub());
 
-$phar->convertToTar();
+$phar = $phar->convertToTar();
 var_dump($phar->isTar());
 var_dump($phar->getStub());
 
@@ -41,6 +41,7 @@ var_dump($phar->getStub());
 --CLEAN--
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.tar');
 __HALT_COMPILER();
 ?>
index 16d3a068e270b2aed27a8671b1882cb86951116d..edb2e1eef0a35e48491cc82b22c835c40629d3fa 100644 (file)
@@ -12,7 +12,7 @@ phar.readonly=0
 $fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
 $pname = 'phar://' . $fname;
 $fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar.gz';
-$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar';
+$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.2.phar.tar';
 $stub = '<?php echo "first stub\n"; __HALT_COMPILER(); ?>';
 $file = $stub;
 
@@ -28,7 +28,7 @@ var_dump($phar->isTar());
 var_dump($phar->isCompressed());
 var_dump($phar->getStub());
 
-$phar->convertToTar(Phar::GZ);
+$phar = $phar->convertToTar()->compress(Phar::GZ);
 var_dump($phar->isTar());
 var_dump($phar->isCompressed());
 var_dump($phar->getStub());
@@ -46,6 +46,8 @@ var_dump($phar->getStub());
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.gz');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php');
 ?>
 --EXPECT--
 bool(false)
index 515de3ffb48270e49b3f223ffe26486efd4d3ad0..91e2fc5a36852668ec2ecfa87f69794f97e93d40 100644 (file)
@@ -28,7 +28,7 @@ var_dump($phar->isTar());
 var_dump($phar->isCompressed());
 var_dump($phar->getStub());
 
-$phar->convertToTar(Phar::BZ2);
+$phar = $phar->convertToTar()->compress(Phar::BZ2);
 var_dump($phar->isTar());
 var_dump($phar->isCompressed());
 var_dump($phar->getStub());
@@ -46,6 +46,8 @@ var_dump($phar->getStub());
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.bz2');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php');
 __HALT_COMPILER();
 ?>
 --EXPECT--
index f99bda2d17a8f36df0ebe4fb9a7a215d5f8cbdac..c9e97699171c38c0a2d05ae6b6517f235c14f0e7 100644 (file)
@@ -26,7 +26,7 @@ $phar = new Phar($fname);
 var_dump($phar->isZip());
 var_dump($phar->getStub());
 
-$phar->convertToZip();
+$phar = $phar->convertToZip();
 var_dump($phar->isZip());
 var_dump($phar->getStub());
 
@@ -41,6 +41,7 @@ var_dump($phar->getStub());
 --CLEAN--
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.zip');
 __HALT_COMPILER();
 ?>
index 9697329f1b112ddf47aa43e0109f04a0955ede81..dea5a78af6575318817df57ee42e1824427c9d51 100644 (file)
@@ -10,23 +10,24 @@ phar.readonly=0
 
 $fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar';
 $fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '2.phar';
+$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.3.phar';
 
 $phar = new Phar($fname);
 $phar->stopBuffering();
 var_dump($phar->isTar());
 var_dump(strlen($phar->getStub()));
 
-$phar->convertToTar();
+$phar = $phar->convertToTar();
 var_dump($phar->isTar());
 var_dump($phar->getStub());
 
 $phar['a'] = 'hi there';
 
-$phar->convertToPhar();
+$phar = $phar->convertToPhar('.3.phar');
 var_dump($phar->isPhar());
 var_dump(strlen($phar->getStub()));
 
-copy($fname, $fname2);
+copy($fname3, $fname2);
 
 $phar = new Phar($fname2);
 var_dump($phar->isPhar());
@@ -37,7 +38,10 @@ var_dump(strlen($phar->getStub()));
 --CLEAN--
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
-unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '2.phar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar');
 __HALT_COMPILER();
 ?>
 --EXPECT--
index 4bfda3906982978f045743884e19dd3134a348a2..27113728e10e85621c0cd9286dd6c238c8144b87 100644 (file)
@@ -17,13 +17,13 @@ $phar->stopBuffering();
 var_dump($phar->isTar());
 var_dump(strlen($phar->getStub()));
 
-$phar->convertToTar();
+$phar = $phar->convertToTar();
 var_dump($phar->isTar());
 var_dump($phar->getStub());
 
 $phar['a'] = 'hi there';
 
-$phar->convertToPhar(Phar::GZ);
+$phar = $phar->compress(Phar::GZ)->convertToPhar();
 var_dump($phar->isPhar());
 var_dump($phar->isCompressed());
 var_dump(strlen($phar->getStub()));
@@ -39,7 +39,10 @@ var_dump(strlen($phar->getStub()));
 ===DONE===
 --CLEAN--
 <?php 
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.gz');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.gz');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '2.phar');
 __HALT_COMPILER();
 ?>
index b8b3104a0812f370781d3c9fca1f9235e75c5c18..af2552e31e8ac176a5fd71aba55393667651dd2f 100644 (file)
@@ -17,13 +17,13 @@ $phar->stopBuffering();
 var_dump($phar->isTar());
 var_dump(strlen($phar->getStub()));
 
-$phar->convertToTar();
+$phar = $phar->convertToTar();
 var_dump($phar->isTar());
 var_dump($phar->getStub());
 
 $phar['a'] = 'hi there';
 
-$phar->convertToPhar(Phar::BZ2);
+$phar = $phar->compress(Phar::BZ2)->convertToPhar();
 var_dump($phar->isPhar());
 var_dump($phar->isCompressed());
 var_dump(strlen($phar->getStub()));
@@ -41,6 +41,9 @@ var_dump(strlen($phar->getStub()));
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.bz2');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '2.phar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.bz2');
 __HALT_COMPILER();
 ?>
 --EXPECT--
index f72670f7a1d6696338e6214de726ab3edda69378..90379fa97abb41b747e8b23a89b083ef83153f96 100644 (file)
@@ -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->compressAllFilesBZIP2();
+$phar = $phar->compress(Phar::BZ2);
 
 copy($fname2, $fname3);
 
@@ -28,6 +28,7 @@ var_dump($phar2->isCompressed() == Phar::BZ2);
 ===DONE===
 --CLEAN--
 <?php
+@unlink(dirname(__FILE__) . '/tar_makebz2.phar.tar');
 @unlink(dirname(__FILE__) . '/tar_makebz2.phar.tar.bz2');
 @unlink(dirname(__FILE__) . '/tar_makebz2_b.phar.tar.bz2');
 ?>
index 0d781c7fdd968e48f6ddd2005a1a4b82ebcf2769..805330e4c2799f5c268ce2c4e2b0033b4071e48a 100644 (file)
@@ -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->compressAllFilesGZ();
+$phar = $phar->compress(Phar::GZ);
 
 copy($fname2, $fname3);
 
@@ -28,6 +28,7 @@ var_dump($phar2->isCompressed() == Phar::GZ);
 ===DONE===
 --CLEAN--
 <?php
+@unlink(dirname(__FILE__) . '/tar_makegz.phar.tar');
 @unlink(dirname(__FILE__) . '/tar_makegz.phar.tar.gz');
 @unlink(dirname(__FILE__) . '/tar_makegz_b.phar.tar.gz');
 ?>
index bc3580fb068ae18cb31110ca0fbf8c02327293d7..5d1dbcbc4330edea34a8f506822dc961dbb9b0f6 100644 (file)
@@ -10,12 +10,11 @@ phar.readonly=0
 $file = "zfapp";
 $orig_file = dirname(__FILE__) . "/files/$file.tgz";
 $tgz_file = dirname(__FILE__) . "/$file.tgz";
-$phar_file = dirname(__FILE__) . "/$file.phar";
+$phar_file = dirname(__FILE__) . "/$file.phar.tar.gz";
 copy($orig_file, $tgz_file);
 
 $phar = new PharData($tgz_file);
-$phar->convertToPhar();
-$phar->stopBuffering();
+$phar = $phar->convertToExecutable();
 
 $phar = new Phar($phar_file);
 $phar->startBuffering();
@@ -39,10 +38,11 @@ foreach(new RecursiveIteratorIterator($phar) as $path) {
 unlink(dirname(__FILE__) . '/zfapp.phar');
 ?>
 --EXPECTF--
-phar://%szfapp.phar/application/default/controllers/ErrorController.php
-phar://%szfapp.phar/application/default/controllers/IndexController.php
-phar://%szfapp.phar/application/default/views/scripts/error/error.phtml
-phar://%szfapp.phar/application/default/views/scripts/index/index.phtml
-phar://%szfapp.phar/html/.htaccess
-phar://%szfapp.phar/html/index.php
+phar://%szfapp.phar.tar.gz/.phar/stub.php
+phar://%szfapp.phar.tar.gz/application/default/controllers/ErrorController.php
+phar://%szfapp.phar.tar.gz/application/default/controllers/IndexController.php
+phar://%szfapp.phar.tar.gz/application/default/views/scripts/error/error.phtml
+phar://%szfapp.phar.tar.gz/application/default/views/scripts/index/index.phtml
+phar://%szfapp.phar.tar.gz/html/.htaccess
+phar://%szfapp.phar.tar.gz/html/index.php
 ===DONE===
index 59aad1cdc94fa554e4974ac10ad4eea2676502ef..70ba863a693ab13b64e813be22b351c9be271991 100644 (file)
@@ -10,23 +10,24 @@ phar.readonly=0
 
 $fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar';
 $fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '2.phar';
+$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.3.phar';
 
 $phar = new Phar($fname);
 $phar->stopBuffering();
 var_dump($phar->isZip());
 var_dump(strlen($phar->getStub()));
 
-$phar->convertToZip();
+$phar = $phar->convertToZip();
 var_dump($phar->isZip());
 var_dump($phar->getStub());
 
 $phar['a'] = 'hi there';
 
-$phar->convertToPhar();
+$phar = $phar->convertToPhar('.3.phar');
 var_dump($phar->isPhar());
 var_dump(strlen($phar->getStub()));
 
-copy($fname, $fname2);
+copy($fname3, $fname2);
 
 $phar = new Phar($fname2);
 var_dump($phar->isPhar());
@@ -37,7 +38,9 @@ var_dump(strlen($phar->getStub()));
 --CLEAN--
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip');
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '2.phar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar');
 __HALT_COMPILER();
 ?>
 --EXPECT--
index d3f198c9bedf37b39c80c11b1dae51d38c51326a..6c496650a85c80c63eaf50799cb640d4b7210e48 100644 (file)
@@ -420,15 +420,15 @@ int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char
        if (error) {
                *error = NULL;
        }
-       if (for_write && PHAR_G(readonly)) {
+       if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, error TSRMLS_CC)) {
+               return FAILURE;
+       }
+       if (for_write && PHAR_G(readonly) && !phar->is_data) {
                if (error) {
                        spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for writing, disabled by ini setting", path, fname);
                }
                return FAILURE;
        }
-       if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, error TSRMLS_CC)) {
-               return FAILURE;
-       }
        if (!path_len) {
                if (error) {
                        spprintf(error, 4096, "phar error: file \"\" in phar \"%s\" cannot be empty", fname);
@@ -436,15 +436,15 @@ int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char
                return FAILURE;
        }
        if (allow_dir) {
-               if ((entry = phar_get_entry_info_dir(phar, path, path_len, 2, for_create && !PHAR_G(readonly) ? NULL : error TSRMLS_CC)) == NULL) {
-                       if (for_create && !PHAR_G(readonly)) {
+               if ((entry = phar_get_entry_info_dir(phar, path, path_len, 2, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error TSRMLS_CC)) == NULL) {
+                       if (for_create && (!PHAR_G(readonly) || phar->is_data)) {
                                return SUCCESS;
                        }
                        return FAILURE;
                }
        } else {
-               if ((entry = phar_get_entry_info(phar, path, path_len, for_create && !PHAR_G(readonly) ? NULL : error TSRMLS_CC)) == NULL) {
-                       if (for_create && !PHAR_G(readonly)) {
+               if ((entry = phar_get_entry_info(phar, path, path_len, for_create && !PHAR_G(readonly) && !phar->is_data ? NULL : error TSRMLS_CC)) == NULL) {
+                       if (for_create && (!PHAR_G(readonly) || phar->is_data)) {
                                return SUCCESS;
                        }
                        return FAILURE;