]> granicus.if.org Git - php/commitdiff
fix commitWrite test, enable creation of Phars with phar object
authorGreg Beaver <cellog@php.net>
Sun, 28 Jan 2007 05:40:18 +0000 (05:40 +0000)
committerGreg Beaver <cellog@php.net>
Sun, 28 Jan 2007 05:40:18 +0000 (05:40 +0000)
ext/phar/phar.c
ext/phar/phar_internal.h
ext/phar/phar_object.c
ext/phar/tests/phar_commitwrite.phpt

index c4398000d064a81108a506b1de59de4fea53d90a..ef6843639d5287959ed4e4a25b5cae015536b35b 100644 (file)
@@ -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)) {
index 2b098bcc5195f84761f1d537292a532eaefa53d7..f0558cdfff5215118cdeaf20cca5d02073c1930a 100755 (executable)
@@ -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
index 58cc6364345d29a9786c731df8f005c849d6215c..bd4002c5525d64f6243a1780c6fe59c2a827987e 100755 (executable)
@@ -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;
index e96daf5999081f20a58b41aba9a7349756ed61dc..890c83de043a4b017a33134a615fdcb435559794 100644 (file)
@@ -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--
\ No newline at end of file
+--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===
\ No newline at end of file