Browse Source

- A bit more work on PharData creation/conversion.

- 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.
experimental/first_unicode_implementation
Steph Fox 19 years ago
parent
commit
8343d7c139
  1. 67
      ext/phar/phar.c
  2. 2
      ext/phar/phar_internal.h
  3. 33
      ext/phar/phar_object.c
  4. 8
      ext/phar/tar.c
  5. 5
      ext/phar/tests/012.phpt
  6. 141
      ext/phar/tests/phar_convert_repeated.phpt
  7. 121
      ext/phar/tests/phar_convert_repeated_b.phpt
  8. 9
      ext/phar/tests/phar_convert_tar2.phpt
  9. 6
      ext/phar/tests/tar/tar_001.phpt
  10. 6
      ext/phar/tests/tar/tar_002.phpt
  11. 11
      ext/phar/tests/tar/tar_003.phpt
  12. 20
      ext/phar/tests/tar/tar_nostub.phpt
  13. 27
      ext/phar/tests/zf_test.phpt
  14. 16
      ext/phar/zip.c

67
ext/phar/phar.c

@ -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;
}

2
ext/phar/phar_internal.h

@ -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);

33
ext/phar/phar_object.c

@ -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,

8
ext/phar/tar.c

@ -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;
}

5
ext/phar/tests/012.phpt

@ -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
a

141
ext/phar/tests/phar_convert_repeated.phpt

@ -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===

121
ext/phar/tests/phar_convert_repeated_b.phpt

@ -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===

9
ext/phar/tests/phar_convert_tar2.phpt

@ -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)

6
ext/phar/tests/tar/tar_001.phpt

@ -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===
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===

6
ext/phar/tests/tar/tar_002.phpt

@ -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===
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===

11
ext/phar/tests/tar/tar_003.phpt

@ -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===
===DONE===

20
ext/phar/tests/tar/tar_nostub.phpt

@ -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===

27
ext/phar/tests/zf_test.phpt

@ -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===

16
ext/phar/zip.c

@ -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;
}

Loading…
Cancel
Save