Browse Source

fix commitWrite test, enable creation of Phars with phar object

migration/RELEASE_1_0_0
Greg Beaver 20 years ago
parent
commit
e8cabb46f6
  1. 12
      ext/phar/phar.c
  2. 1
      ext/phar/phar_internal.h
  3. 2
      ext/phar/phar_object.c
  4. 21
      ext/phar/tests/phar_commitwrite.phpt

12
ext/phar/phar.c

@ -901,7 +901,7 @@ int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alias, int
/**
* Create or open a phar for writing
*/
static int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar TSRMLS_DC) /* {{{ */
int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar TSRMLS_DC) /* {{{ */
{
phar_archive_data *mydata;
int register_alias;
@ -942,6 +942,9 @@ static int phar_open_or_create_filename(char *fname, int fname_len, char *alias,
/* set up our manifest */
mydata = ecalloc(sizeof(phar_archive_data), 1);
if (pphar) {
*pphar = mydata;
}
zend_hash_init(&mydata->manifest, sizeof(phar_entry_info),
zend_get_hash_value, destroy_phar_manifest, 0);
mydata->fname = estrndup(fname, fname_len);
@ -2229,7 +2232,7 @@ static void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stre
ssb->sb.st_ctime = phar->max_timestamp;
#endif
}
if (!phar->is_writeable) {
if (PHAR_G(readonly)) {
ssb->sb.st_mode = (ssb->sb.st_mode & 0555) | (ssb->sb.st_mode & ~0777);
}
@ -2426,6 +2429,11 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC)
ALLOC_HASHTABLE(data);
zend_hash_init(data, 64, zend_get_hash_value, NULL, 0);
if (*dir == '/' && dirlen == 1 && (manifest->nNumOfElements == 0)) {
// make empty root directory for empty phar
efree(dir);
return php_stream_alloc(&phar_dir_ops, data, NULL, "r");
}
zend_hash_internal_pointer_reset(manifest);
while (FAILURE != zend_hash_has_more_elements(manifest)) {
if (HASH_KEY_NON_EXISTANT == zend_hash_get_current_key_ex(manifest, &key, &keylen, &unused, 0, NULL)) {

1
ext/phar/phar_internal.h

@ -213,6 +213,7 @@ BEGIN_EXTERN_C()
void phar_object_init(TSRMLS_D);
int phar_open_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar TSRMLS_DC);
int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar TSRMLS_DC);
int phar_open_compiled_file(char *alias, int alias_len TSRMLS_DC);
#ifdef PHAR_MAIN

2
ext/phar/phar_object.c

@ -135,7 +135,7 @@ PHP_METHOD(Phar, __construct)
return;
}
if (phar_open_filename(fname, fname_len, alias, alias_len, REPORT_ERRORS, &phar_data TSRMLS_CC) == FAILURE) {
if (phar_open_or_create_filename(fname, fname_len, alias, alias_len, REPORT_ERRORS, &phar_data TSRMLS_CC) == FAILURE) {
zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
"Cannot open phar file '%s' with alias '%s'", fname, alias);
return;

21
ext/phar/tests/phar_commitwrite.phpt

@ -12,12 +12,12 @@ $p['file1.txt'] = 'hi';
$p->commitWrite();
var_dump($p->getStub());
$p->commitWrite("<?php
function __autoload($class)
function __autoload(\$class)
{
include 'phar://' . str_replace('_', '/', $class);
include 'phar://' . str_replace('_', '/', \$class);
}
Phar::mapPhar('myphar.phar');
include 'phar://myphar.phar/startup.php';
Phar::mapPhar('brandnewphar.phar');
include 'phar://brandnewphar.phar/startup.php';
__HALT_COMPILER();
?>");
var_dump($p->getStub());
@ -27,4 +27,15 @@ var_dump($p->getStub());
<?php
unlink(dirname(__FILE__) . '/brandnewphar.phar');
?>
--EXPECT--
--EXPECT--
string(24) "<?php __HALT_COMPILER();"
string(198) "<?php
function __autoload($class)
{
include 'phar://' . str_replace('_', '/', $class);
}
Phar::mapPhar('brandnewphar.phar');
include 'phar://brandnewphar.phar/startup.php';
__HALT_COMPILER();
?>"
===DONE===
Loading…
Cancel
Save