]> granicus.if.org Git - php/commitdiff
- A bit more work on PharData creation/conversion.
authorSteph Fox <sfox@php.net>
Mon, 3 Mar 2008 08:41:15 +0000 (08:41 +0000)
committerSteph Fox <sfox@php.net>
Mon, 3 Mar 2008 08:41:15 +0000 (08:41 +0000)
- If readonly=0, why not $phardata->convertToPhar()?
- Known issue with directories creating 'as-file' copies within the archive (all formats)
@Greg/Marcus/Tony: This passes all tests on my box, 5.2/5.3/release_ts/debug_ts, and I can't find any more memleaks. Obviously this is too good to be true, so if conversion is still messy elsewhere please feel free to fix, or bug and assign to me.

14 files changed:
ext/phar/phar.c
ext/phar/phar_internal.h
ext/phar/phar_object.c
ext/phar/tar.c
ext/phar/tests/012.phpt
ext/phar/tests/phar_convert_repeated.phpt [new file with mode: 0644]
ext/phar/tests/phar_convert_repeated_b.phpt [new file with mode: 0644]
ext/phar/tests/phar_convert_tar2.phpt
ext/phar/tests/tar/tar_001.phpt
ext/phar/tests/tar/tar_002.phpt
ext/phar/tests/tar/tar_003.phpt
ext/phar/tests/tar/tar_nostub.phpt
ext/phar/tests/zf_test.phpt
ext/phar/zip.c

index 2228530724bbf6acee8443c4e9f6c940cb11153e..b02a693106226c3902ba0539b0b066d934e7b957 100644 (file)
@@ -405,22 +405,34 @@ int phar_open_loaded(char *fname, int fname_len, char *alias, int alias_len, int
                && ((alias && fname_len == phar->fname_len
                && !strncmp(unixfname, phar->fname, fname_len)) || !alias)
        ) {
+               phar_entry_info *stub;
                efree(unixfname);
 #else
        if (SUCCESS == phar_get_archive(&phar, fname, fname_len, alias, alias_len, error TSRMLS_CC)
                && ((alias && fname_len == phar->fname_len
                && !strncmp(fname, phar->fname, fname_len)) || !alias)
        ) {
+               phar_entry_info *stub;
 #endif
                /* logic above is as follows:
                   If an explicit alias was requested, ensure the filename passed in
                   matches the phar's filename.
                   If no alias was passed in, then it can match either and be valid
                 */
+
+               if (!is_data) {
+                       /* prevent any ".phar" without a stub getting through */
+                       if (!phar->halt_offset && !phar->is_brandnew) {
+                               if (FAILURE == zend_hash_find(&(phar->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1, (void **)&stub)) {
+                                       spprintf(error, 0, "'%s' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive", fname);
+                                       return FAILURE;
+                               }
+                       }
+               }
+               phar->is_data = is_data;
                if (pphar) {
                        *pphar = phar;
                }
-               phar->is_data = is_data;
                return SUCCESS;
        } else {
 #ifdef PHP_WIN32
@@ -978,27 +990,30 @@ int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int al
                if (ext_len >= sizeof(".zip")-1 && !memcmp((void *) ext_str, (void *) ".zip", sizeof(".zip")-1)) {
                        zip = 1;
                }
-                       
-               if (ext_len >= sizeof(".tar")-1 && !memcmp((void *) ext_str, (void *) ".tar", sizeof(".tar")-1)) {
+
+               if ((ext_len >= sizeof(".tar")-1 && !memcmp((void *) ext_str, (void *) ".tar", sizeof(".tar")-1)) || (ext_len >= sizeof(".tgz")-1 && !memcmp((void *) ext_str, (void *) ".tgz", sizeof(".tgz")-1))) {
                        tar = 1;
                }
 
                if (tar || zip) {
                        if (objname && strncmp(objname, "PharData", 8) != 0) {
-                               zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Cannot open '%s' as a Phar object. Use PharData::__construct() for a standard zip or tar archive", fname);
+                               /* Nested exception causes memleak here */
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot open '%s' as a Phar object. Use PharData::__construct() for a standard %s archive", fname, tar ? "tar" : "zip");
                                return FAILURE;
                        }
                        is_data = 1;
                } else {
                        if (objname && strncmp(objname, "PharData", 8) == 0) {
-                               zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Cannot open '%s' as a PharData object. Use Phar::__construct() for archives other than .zip and .tar", fname);
+                               /* Nested exception causes memleak here */
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot open '%s' as a PharData object. Use Phar::__construct() for archives named other than .zip or .tar", fname);
                                return FAILURE;
                        }
                }
 
        } else {
 
-               zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Cannot open '%s' as a %s object, file extension (or combination) not recognised", fname, objname);
+               /* Nested exception causes memleak here */
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot open '%s' as a %s object, file extension (or combination) not recognised", fname, objname);
                return FAILURE;
        }
 
@@ -1019,11 +1034,11 @@ int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int al
                return phar_open_or_create_tar(fname, fname_len, alias, alias_len, is_data, options, pphar, error TSRMLS_CC);
        }
 
-       return phar_create_or_parse_filename(fname, fname_len, alias, alias_len, options, pphar, error TSRMLS_CC);
+       return phar_create_or_parse_filename(fname, fname_len, alias, alias_len, is_data, options, pphar, error TSRMLS_CC);
 
 }
 
-int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */
+int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int alias_len, int is_data, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */
 {
        phar_archive_data *mydata;
        int register_alias;
@@ -1052,7 +1067,7 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a
 
        if (fp) {
                if (phar_open_fp(fp, fname, fname_len, alias, alias_len, options, pphar, error TSRMLS_CC) == SUCCESS) {
-                       if (!PHAR_G(readonly)) {
+                       if (is_data || !PHAR_G(readonly)) {
                                (*pphar)->is_writeable = 1;
                        }
                        if (actual) {
@@ -1071,8 +1086,7 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a
                efree(actual);
        }
 
-
-       if (PHAR_G(readonly)) {
+       if (PHAR_G(readonly) && !is_data) {
                if (options & REPORT_ERRORS) {
                        if (error) {
                                spprintf(error, 0, "creating archive \"%s\" disabled by INI setting", fname);
@@ -1098,8 +1112,13 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a
        zend_hash_init(&mydata->mounted_dirs, sizeof(char *),
                zend_get_hash_value, NULL, 0);
        mydata->fname_len = fname_len;
-       mydata->alias = alias ? estrndup(alias, alias_len) : estrndup(mydata->fname, fname_len);
-       mydata->alias_len = alias ? alias_len : fname_len;
+       if (is_data) {
+               alias = NULL;
+               alias_len = 0;
+       } else {
+               mydata->alias = alias ? estrndup(alias, alias_len) : estrndup(mydata->fname, fname_len);
+               mydata->alias_len = alias ? alias_len : fname_len;
+       }
        snprintf(mydata->version, sizeof(mydata->version), "%s", PHAR_API_VERSION_STR);
        mydata->is_temporary_alias = alias ? 0 : 1;
        mydata->internal_file_start = -1;
@@ -1134,13 +1153,17 @@ int phar_open_filename(char *fname, int fname_len, char *alias, int alias_len, i
 {
        php_stream *fp;
        char *actual;
-       int ret;
+       int ret, is_data = 0;
 
        if (error) {
                *error = NULL;
        }
-       
-       if (phar_open_loaded(fname, fname_len, alias, alias_len, 0, options, pphar, error TSRMLS_CC) == SUCCESS) {
+
+       if (!strstr(fname, ".phar")) {
+               is_data = 1;
+       }
+
+       if (phar_open_loaded(fname, fname_len, alias, alias_len, is_data, options, pphar, error TSRMLS_CC) == SUCCESS) {
                return SUCCESS;
        } else if (error && *error) {
                return FAILURE;
@@ -1335,6 +1358,7 @@ int phar_detect_phar_fname_ext(const char *filename, int check_length, char **ex
 {
        char end;
        char *pos_t = strstr(filename, ".tar");
+       char *pos_tgz = strstr(filename, ".tgz");
        char *pos_z = strstr(filename, ".zip");
        char *pos_tg = strstr(filename, ".tar.gz");
        char *pos_tb = strstr(filename, ".tar.bz2");
@@ -1384,6 +1408,9 @@ int phar_detect_phar_fname_ext(const char *filename, int check_length, char **ex
        } else if (pos_z) {
                *ext_str = pos_z;
                *ext_len = 4;
+       } else if (pos_tgz) {
+               *ext_str = pos_tgz;
+               *ext_len = 4;
        } else if (pos_t) {
                *ext_str = pos_t;
                *ext_len = 4;
@@ -1615,7 +1642,7 @@ int phar_open_compiled_file(char *alias, int alias_len, char **error TSRMLS_DC)
        long halt_offset;
        zval *halt_constant;
        php_stream *fp;
-       int fname_len;
+       int fname_len, is_data = 0;
 
        if (error) {
                *error = NULL;
@@ -1623,7 +1650,11 @@ int phar_open_compiled_file(char *alias, int alias_len, char **error TSRMLS_DC)
        fname = zend_get_executed_filename(TSRMLS_C);
        fname_len = strlen(fname);
 
-       if (phar_open_loaded(fname, fname_len, alias, alias_len, 0, REPORT_ERRORS, NULL, 0 TSRMLS_CC) == SUCCESS) {
+       if (!strstr(fname, ".phar")) {
+               is_data = 1;
+       }
+
+       if (phar_open_loaded(fname, fname_len, alias, alias_len, is_data, REPORT_ERRORS, NULL, 0 TSRMLS_CC) == SUCCESS) {
                return SUCCESS;
        }
 
index 7cc44b4fc88ca0fdd5d1928b838979188298769b..54203114ac4f8a91438c4c46fe665b30f8d5a2a8 100755 (executable)
@@ -366,7 +366,7 @@ void phar_object_init(TSRMLS_D);
 int phar_open_entry_file(phar_archive_data *phar, phar_entry_info *entry, char **error TSRMLS_DC);
 int phar_open_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC);
 int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int alias_len, char *objname, int options, phar_archive_data** pphar, char **error TSRMLS_DC);
-int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC);
+int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int alias_len, int is_data, int options, phar_archive_data** pphar, char **error TSRMLS_DC);
 int phar_open_compiled_file(char *alias, int alias_len, char **error TSRMLS_DC);
 int phar_get_archive(phar_archive_data **archive, char *fname, int fname_len, char *alias, int alias_len, char **error TSRMLS_DC);
 int phar_open_loaded(char *fname, int fname_len, char *alias, int alias_len, int is_data, int options, phar_archive_data** pphar, char **error TSRMLS_DC);
index d50cd92ec2d34ccb6ed0ef22f4834c4c0b9a547b..bc1aada5846d538783fdd57eaaf513e6af224728 100755 (executable)
@@ -1108,7 +1108,7 @@ PHP_METHOD(Phar, __construct)
 #if !HAVE_SPL
        zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Cannot instantiate Phar object without SPL extension");
 #else
-       char *fname, *alias = NULL, *error, *arch, *entry = NULL, *save_fname;
+       char *fname, *alias = NULL, *error, *arch, *entry = NULL, *save_fname, *objname;
        int fname_len, alias_len = 0, arch_len, entry_len, is_data;
        long flags = 0;
        phar_archive_object *phar_obj;
@@ -1144,21 +1144,21 @@ PHP_METHOD(Phar, __construct)
 #endif
        }
 
-       if (phar_open_or_create_filename(fname, fname_len, alias, alias_len, phar_obj->std.ce->name, REPORT_ERRORS, &phar_data, &error TSRMLS_CC) == FAILURE) {
+       objname = phar_obj->std.ce->name;
+
+       if (phar_open_or_create_filename(fname, fname_len, alias, alias_len, objname, REPORT_ERRORS, &phar_data, &error TSRMLS_CC) == FAILURE) {
 
                if (fname == arch) {
                        efree(arch);
                        fname = save_fname;
                }
-               if (error) {
+               if (entry) {
                        efree(entry);
+               }
+               if (error) {
                        zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
-                               "Cannot open phar file '%s' with alias '%s': %s", fname, alias, error);
+                               "%s", error);
                        efree(error);
-               } else {
-                       efree(entry);
-                       zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
-                               "Cannot open phar file '%s' with alias '%s'", fname, alias);
                }
                return;
        }
@@ -1864,12 +1864,6 @@ PHP_METHOD(Phar, convertToPhar)
        int ext_len = 0;
        PHAR_ARCHIVE_OBJECT();
 
-       if (phar_obj->arc.archive->is_data) {
-               zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
-                       "A plain %s archive cannot be converted to a Phar archive", phar_obj->arc.archive->is_tar ? "tar" : "zip");
-               return;
-       }
-
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &method, &ext, &ext_len) == FAILURE) {
                return;
        }
@@ -1878,6 +1872,12 @@ PHP_METHOD(Phar, convertToPhar)
                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 write out phar archive, phar is read-only");
+               return;
+       }
+
        switch (method) {
                case 0:
                        flags = PHAR_FILE_COMPRESSED_NONE;
@@ -1904,11 +1904,6 @@ PHP_METHOD(Phar, convertToPhar)
                                "Unknown compression specified, please pass one of Phar::GZ or Phar::BZ2");
                        return;
        }
-       if (PHAR_G(readonly)) {
-               zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
-                       "Cannot write out phar archive, phar is read-only");
-               return;
-       }
 
        if (phar_obj->arc.archive->donotflush) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC,
index f7f8dba3cdbc835267e66037231cce13d1548d59..a30998f96b921d477e782bb4e6d9259389ce40d8 100644 (file)
@@ -119,7 +119,7 @@ int phar_is_tar(char *buf)
 int phar_open_or_create_tar(char *fname, int fname_len, char *alias, int alias_len, int is_data, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */
 {
        phar_archive_data *phar;
-       int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, options, &phar, error TSRMLS_CC);
+       int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, is_data, options, &phar, error TSRMLS_CC);
 
        if (FAILURE == ret) {
                return FAILURE;
@@ -131,12 +131,6 @@ int phar_open_or_create_tar(char *fname, int fname_len, char *alias, int alias_l
 
        phar->is_data = is_data;
 
-       if (is_data) {
-               /* phar->is_writeable; WTF */
-               phar->alias = NULL;
-               phar->alias_len = 0;
-       }
-
        if (phar->is_tar) {
                return ret;
        }
index f6f81f51422da274cabf78905c1219f487f091be..3246eff468ac36a0567a43e5ef3564b5df563395 100644 (file)
@@ -6,6 +6,7 @@ Phar::mapPhar valid file
 phar.require_hash=0
 --FILE--
 <?php
+
 $fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
 $pname = 'phar://' . $fname;
 $file = "<?php
@@ -17,9 +18,11 @@ $files['a'] = 'a';
 
 include 'files/phar_test.inc';
 include $fname;
+
 echo file_get_contents('phar://hio/a');
+
 ?>
 --CLEAN--
 <?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
 --EXPECT--
-a
\ No newline at end of file
+a
diff --git a/ext/phar/tests/phar_convert_repeated.phpt b/ext/phar/tests/phar_convert_repeated.phpt
new file mode 100644 (file)
index 0000000..300a91a
--- /dev/null
@@ -0,0 +1,141 @@
+--TEST--
+Phar::convertToZip|Tar|Phar() repeated (phar_based archives)
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar';
+$pname = 'phar://' . $fname;
+$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip';
+$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar';
+$stub = '<?php echo "first stub\n"; __HALT_COMPILER(); ?>';
+$file = $stub;
+
+$files = array();
+$files['a'] = 'a';
+$files['b'] = 'b';
+$files['c'] = 'c';
+
+include 'files/phar_test.inc';
+
+echo "=================== new Phar() =======================\n";
+$phar = new Phar($fname);
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+echo "================= convertToTar() =====================\n";
+
+$phar->convertToTar();
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+echo "================= convertToZip() =====================\n";
+
+$phar->convertToZip();
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+echo "================= convertToPhar() ====================\n";
+
+$phar->convertToPhar();
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump(strlen($phar->getStub()));
+var_dump($phar->getAlias());
+
+echo "================= convertToZip() =====================\n";
+
+$phar->convertToZip();
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+echo "================= convertToTar() =====================\n";
+
+$phar->convertToTar();
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+echo "================= convertToZip() =====================\n";
+
+$phar->convertToZip();
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip');
+?>
+--EXPECT--
+=================== new Phar() =======================
+bool(true)
+bool(false)
+bool(false)
+string(48) "<?php echo "first stub\n"; __HALT_COMPILER(); ?>"
+string(3) "hio"
+================= convertToTar() =====================
+bool(false)
+bool(true)
+bool(false)
+string(60) "<?php // tar-based phar archive stub file
+__HALT_COMPILER();"
+string(57) "C:/sandbox/pecl/phar/tests/phar_convert_repeated.phar.tar"
+================= convertToZip() =====================
+bool(false)
+bool(false)
+bool(true)
+string(60) "<?php // zip-based phar archive stub file
+__HALT_COMPILER();"
+string(57) "C:/sandbox/pecl/phar/tests/phar_convert_repeated.phar.zip"
+================= convertToPhar() ====================
+bool(true)
+bool(false)
+bool(false)
+int(6573)
+string(53) "C:/sandbox/pecl/phar/tests/phar_convert_repeated.phar"
+================= convertToZip() =====================
+bool(false)
+bool(false)
+bool(true)
+string(60) "<?php // zip-based phar archive stub file
+__HALT_COMPILER();"
+string(57) "C:/sandbox/pecl/phar/tests/phar_convert_repeated.phar.zip"
+================= convertToTar() =====================
+bool(false)
+bool(true)
+bool(false)
+string(60) "<?php // tar-based phar archive stub file
+__HALT_COMPILER();"
+string(57) "C:/sandbox/pecl/phar/tests/phar_convert_repeated.phar.tar"
+================= convertToZip() =====================
+bool(false)
+bool(false)
+bool(true)
+string(60) "<?php // zip-based phar archive stub file
+__HALT_COMPILER();"
+string(57) "C:/sandbox/pecl/phar/tests/phar_convert_repeated.phar.zip"
+===DONE===
diff --git a/ext/phar/tests/phar_convert_repeated_b.phpt b/ext/phar/tests/phar_convert_repeated_b.phpt
new file mode 100644 (file)
index 0000000..2888466
--- /dev/null
@@ -0,0 +1,121 @@
+--TEST--
+PharData::convertToZip|Tar|Phar() repeated (phardata_based archives)
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip';
+
+echo "=================== new PharData() ==================\n";
+$phar = new PharData($fname);
+$phar['a'] = 'a';
+$phar['b'] = 'b';
+$phar['c'] = 'c';
+
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+echo "================= convertToTar() =====================\n";
+
+$phar->convertToTar(Phar::GZ);
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+echo "================= convertToZip() =====================\n";
+
+$phar->convertToZip();
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+echo "================= convertToPhar() ====================\n";
+
+try {
+       $phar->convertToPhar();
+       var_dump($phar->isPhar());
+       var_dump($phar->isTar());
+       var_dump($phar->isZip());
+       var_dump(strlen($phar->getStub()));
+       var_dump($phar->getAlias());
+} catch(Exception $e) {
+       echo $e->getMessage()."\n";
+}
+
+echo "================ convertToTar(GZ) ====================\n";
+
+$phar->convertToTar(Phar::GZ);
+var_dump($phar->isPhar());
+var_dump($phar->isTar());
+var_dump($phar->isZip());
+var_dump($phar->getStub());
+var_dump($phar->getAlias());
+
+echo "================= convertToPhar() ====================\n";
+
+try {
+       $phar->convertToPhar();
+       var_dump($phar->isPhar());
+       var_dump($phar->isTar());
+       var_dump($phar->isZip());
+       var_dump(strlen($phar->getStub()));
+       var_dump($phar->getAlias());
+} catch(Exception $e) {
+       echo $e->getMessage()."\n";
+}
+
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
+?>
+--EXPECT--
+=================== new PharData() ==================
+bool(false)
+bool(false)
+bool(true)
+string(0) ""
+NULL
+================= convertToTar() =====================
+bool(false)
+bool(true)
+bool(false)
+string(0) ""
+NULL
+================= convertToZip() =====================
+bool(false)
+bool(false)
+bool(true)
+string(0) ""
+NULL
+================= convertToPhar() ====================
+bool(true)
+bool(false)
+bool(false)
+int(6573)
+NULL
+================ convertToTar(GZ) ====================
+bool(false)
+bool(true)
+bool(false)
+string(0) ""
+NULL
+================= convertToPhar() ====================
+bool(true)
+bool(false)
+bool(false)
+int(6573)
+NULL
+===DONE===
index 6a8313848adff731faaadc361a6f6adae0b0d2d6..16d3a068e270b2aed27a8671b1882cb86951116d 100644 (file)
@@ -11,8 +11,8 @@ phar.readonly=0
 
 $fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
 $pname = 'phar://' . $fname;
-$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar';
-$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.2.phar.tar';
+$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar.gz';
+$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar';
 $stub = '<?php echo "first stub\n"; __HALT_COMPILER(); ?>';
 $file = $stub;
 
@@ -33,7 +33,7 @@ var_dump($phar->isTar());
 var_dump($phar->isCompressed());
 var_dump($phar->getStub());
 
-copy($fname2 . '.gz', $fname3);
+copy($fname2, $fname3);
 
 $phar = new Phar($fname3);
 var_dump($phar->isTar());
@@ -45,8 +45,7 @@ var_dump($phar->getStub());
 --CLEAN--
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.gz');
-unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.tar');
-__HALT_COMPILER();
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar');
 ?>
 --EXPECT--
 bool(false)
index 801c0d48684712c0f1a05e266a9e788ebabf46e8..5f81c96c382794a8b33cbbd9c558219c0a130ca1 100644 (file)
@@ -26,6 +26,6 @@ try {
 @unlink(dirname(__FILE__) . '/tar_001.phar.tar');
 ?>
 --EXPECTF--
-Warning: fopen(phar://%star_001.phar.tar/tar_001.phpt): failed to open stream: phar error: "%star_001.phar.tar" is a corrupted tar file in %star_001.php on line %d
-Cannot open phar file '%star_001.phar.tar' with alias '(null)': phar error: "%star_001.phar.tar" is a corrupted tar file
-===DONE===
\ No newline at end of file
+Warning: fopen(phar://C:\sandbox\pecl\phar\tests\tar/tar_001.phar.tar/tar_001.phpt): failed to open stream: phar error: "C:\sandbox\pecl\phar\tests\tar\tar_001.phar.tar" is a corrupted tar file in C:\sandbox\pecl\phar\tests\tar\tar_001.php on line 9
+phar error: "C:\sandbox\pecl\phar\tests\tar\tar_001.phar.tar" is a corrupted tar file
+===DONE===
index 2674e416b84a5fd4fc17f775848e0dd23d591a0a..cacc7391a2ebe35fd7aa330b3e6d563e775e2804 100644 (file)
@@ -29,6 +29,6 @@ try {
 @unlink(dirname(__FILE__) . '/tar_002.phar.tar');
 ?>
 --EXPECTF--
-Warning: fopen(phar://%star_002.phar.tar/tar_002.phpt): failed to open stream: phar error: "%star_002.phar.tar" is a corrupted tar file in %star_002.php on line %d
-Cannot open phar file '%star_002.phar.tar' with alias '(null)': phar error: "%star_002.phar.tar" is a corrupted tar file
-===DONE===
\ No newline at end of file
+Warning: fopen(phar://C:\sandbox\pecl\phar\tests\tar/tar_002.phar.tar/tar_002.phpt): failed to open stream: phar error: "C:\sandbox\pecl\phar\tests\tar\tar_002.phar.tar" is a corrupted tar file in C:\sandbox\pecl\phar\tests\tar\tar_002.php on line 9
+phar error: "C:\sandbox\pecl\phar\tests\tar\tar_002.phar.tar" is a corrupted tar file
+===DONE===
index e7beecb55ca1c2c63c47715a2d47da3299873e0d..47f1d6ca9b753112a2eefc50b6c408a72fc20f1f 100644 (file)
@@ -14,6 +14,7 @@ $alias = 'phar://' . $fname;
 
 $tar = new tarmaker($fname, 'none');
 $tar->init();
+$tar->addFile('.phar/stub.php', "<?php // tar-based phar archive stub file\n__HALT_COMPILER();");
 $tar->addFile('tar_003.phpt', $g = fopen(__FILE__, 'r'));
 $tar->addFile('internal/file/here', "hi there!\n");
 $tar->mkDir('internal/dir');
@@ -24,7 +25,11 @@ fclose($g);
 
 echo file_get_contents($alias . '/internal/file/here');
 
+try {
 $tar = opendir($alias . '/');
+} catch (Exception $e) {
+echo $e->getMessage()."\n";
+}
 
 while (false !== ($v = readdir($tar))) {
        echo (is_file($alias . '/' . $v) ? "file\n" : "dir\n");
@@ -50,6 +55,8 @@ closedir($tar);
 --EXPECT--
 hi there!
 dir
+.phar
+dir
 dir
 dir
 internal
@@ -57,9 +64,11 @@ file
 tar_003.phpt
 second round
 dir
+.phar
+dir
 dir
 dir
 internal
 file
 tar_003.phpt
-===DONE===
\ No newline at end of file
+===DONE===
index a30e55b3cf716a9155635d5107d2f6cf84e4ceb4..33b5c5dfaa4a995cdd828f0f618bea9bdf425237 100644 (file)
@@ -10,6 +10,7 @@ phar.readonly=1
 include dirname(__FILE__) . '/files/tarmaker.php.inc';
 $fname = dirname(__FILE__) . '/tar_004.phar.tar';
 $alias = 'phar://' . $fname;
+$fname2 = dirname(__FILE__) . '/tar_004.tar';
 
 $tar = new tarmaker($fname, 'none');
 $tar->init();
@@ -17,15 +18,30 @@ $tar->addFile('tar_004.php', '<?php var_dump(__FILE__);');
 $tar->addFile('internal/file/here', "hi there!\n");
 $tar->close();
 
-$phar = new Phar($fname);
-var_dump($phar->getStub());
+try {
+       $phar = new Phar($fname);
+       var_dump($phar->getStub());
+} catch (Exception $e) {
+       echo $e->getMessage()."\n";
+}
+
+copy($fname, $fname2);
+
+try {
+       $phar = new PharData($fname2);
+       var_dump($phar->getStub());
+} catch (Exception $e) {
+       echo $e->getMessage()."\n";
+}
 
 ?>
 ===DONE===
 --CLEAN--
 <?php
 @unlink(dirname(__FILE__) . '/tar_004.phar.tar');
+@unlink(dirname(__FILE__) . '/tar_004.tar');
 ?>
 --EXPECTF--
+RecursiveDirectoryIterator::__construct(phar://%star_004.phar.tar/): failed to open dir: '%star_004.phar.tar' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive
 string(0) ""
 ===DONE===
index fa898c9a5733566687bb11355a92c4182cfca079..bc3580fb068ae18cb31110ca0fbf8c02327293d7 100644 (file)
@@ -8,12 +8,14 @@ phar.readonly=0
 <?php
 
 $file = "zfapp";
-$tgz_file = dirname(__FILE__) . "/files/$file.tgz";
-chdir(dirname(__FILE__));
+$orig_file = dirname(__FILE__) . "/files/$file.tgz";
+$tgz_file = dirname(__FILE__) . "/$file.tgz";
+$phar_file = dirname(__FILE__) . "/$file.phar";
+copy($orig_file, $tgz_file);
 
-$phar_file = basename(__FILE__, '.php') . '.phar';
-@unlink($phar_file);
-copy($tgz_file, $phar_file);
+$phar = new PharData($tgz_file);
+$phar->convertToPhar();
+$phar->stopBuffering();
 
 $phar = new Phar($phar_file);
 $phar->startBuffering();
@@ -34,14 +36,13 @@ foreach(new RecursiveIteratorIterator($phar) as $path) {
 ===DONE===
 --CLEAN--
 <?php
-unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');
-__HALT_COMPILER();
+unlink(dirname(__FILE__) . '/zfapp.phar');
 ?>
 --EXPECTF--
-phar://%szf_test.phar/application/default/controllers/ErrorController.php
-phar://%szf_test.phar/application/default/controllers/IndexController.php
-phar://%szf_test.phar/application/default/views/scripts/error/error.phtml
-phar://%szf_test.phar/application/default/views/scripts/index/index.phtml
-phar://%szf_test.phar/html/.htaccess
-phar://%szf_test.phar/html/index.php
+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
 ===DONE===
index 9beffedf63ac53b6f9933d00f644cdab3d5425d1..d7d3891b1cc9588ac7d5fb7e8c029080ef64e375 100644 (file)
@@ -377,7 +377,11 @@ foundit:
 int phar_open_or_create_zip(char *fname, int fname_len, char *alias, int alias_len, int is_data, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */
 {
        phar_archive_data *phar;
-       int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, options, &phar, error TSRMLS_CC);
+       int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, is_data, options, &phar, error TSRMLS_CC);
+
+       if (FAILURE == ret) {
+               return FAILURE;
+       }
 
        if (pphar) {
                *pphar = phar;
@@ -385,16 +389,6 @@ int phar_open_or_create_zip(char *fname, int fname_len, char *alias, int alias_l
 
        phar->is_data = is_data;
 
-       if (is_data) {
-               phar->is_writeable = 1;
-               phar->alias = NULL;
-               phar->alias_len = 0;
-       }
-
-       if (FAILURE == ret) {
-               return FAILURE;
-       }
-
        if (phar->is_zip) {
                return ret;
        }