cvs: pecl /phar TODO package.xml phar.c phar_internal.h phar_object.c /phar/tests extracted.inc extracted_001.phpt

From: Date: Sun, 25 Mar 2007 19:03:37 +0000
Subject: cvs: pecl /phar TODO package.xml phar.c phar_internal.h phar_object.c /phar/tests extracted.inc extracted_001.phpt
Groups: php.doc php.pecl.cvs 
Request: Send a blank email to phpdoc+get-969375900@lists.php.net to get a copy of this message
helly Sun Mar 25 19:03:37 2007 UTC Added files: /pecl/phar/tests extracted.inc extracted_001.phpt Modified files: /pecl/phar TODO package.xml phar.c phar_internal.h phar_object.c Log: - Add ini: phar.extract_list - Add Phar::getExtractList - Both allow to set a mapping <phar-file> to <extract-dir> [[DOC]]

http://cvs.php.net/viewvc.cgi/pecl/phar/TODO?r1=1.28&r2=1.29&diff_format=u Index: pecl/phar/TODO diff -u pecl/phar/TODO:1.28 pecl/phar/TODO:1.29 --- pecl/phar/TODO:1.28 Sat Feb 3 04:04:16 2007 +++ pecl/phar/TODO Sun Mar 25 19:03:36 2007 @@ -32,9 +32,14 @@ Version 1.1.0 + X Ability connect a phar file 'phar://whatever' to a directory. That way all + access to that phat archive are directed to the extracted directory. This + allows to have the installed files and the archieve keep the same includes. + [Marcus] * ability to have Phar object return file class as offsetGet() result * [optional] Phar->rollback() to abort a write transaction * implement GPG signing + * add SHA-2 support * ability to match files containing a metadata key opendir('phar://a.phar/?mime-type=image/jpeg') or foreach ($p->match('mime-type', 'image/jpeg') as $file) * Phar::copy($from, $to); http://cvs.php.net/viewvc.cgi/pecl/phar/package.xml?r1=1.19&r2=1.20&diff_format=u Index: pecl/phar/package.xml diff -u pecl/phar/package.xml:1.19 pecl/phar/package.xml:1.20 --- pecl/phar/package.xml:1.19 Thu Mar 22 17:12:08 2007 +++ pecl/phar/package.xml Sun Mar 25 19:03:36 2007 @@ -98,6 +98,8 @@ <file name="delete_in_phar.phpt" role="test"/> <file name="delete_in_phar_b.phpt" role="test"/> <file name="delete_in_phar_confirm.phpt" role="test"/> + <file name="extracted.inc" role="test"/> + <file name="extracted_001.phpt" role="test"/> <file name="ini_set.phpt" role="test"/> <file name="ini_set_off.phpt" role="test"/> <file name="metadata_read.phpt" role="test"/> http://cvs.php.net/viewvc.cgi/pecl/phar/phar.c?r1=1.182&r2=1.183&diff_format=u Index: pecl/phar/phar.c diff -u pecl/phar/phar.c:1.182 pecl/phar/phar.c:1.183 --- pecl/phar/phar.c:1.182 Wed Mar 21 17:14:45 2007 +++ pecl/phar/phar.c Sun Mar 25 19:03:36 2007 @@ -17,10 +17,11 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar.c,v 1.182 2007/03/21 17:14:45 cellog Exp $ */ +/* $Id: phar.c,v 1.183 2007/03/25 19:03:36 helly Exp $ */ #define PHAR_MAIN #include "phar_internal.h" +#include "SAPI.h" ZEND_DECLARE_MODULE_GLOBALS(phar) @@ -69,9 +70,98 @@ } /* }}}*/ +static void phar_split_extract_list(TSRMLS_D) +{ + char *tmp = estrdup(PHAR_GLOBALS->extract_list); + char *key; + char *lasts; + char *q; + int keylen; + + zend_hash_clean(&(PHAR_GLOBALS->phar_plain_map)); + + for (key = php_strtok_r(tmp, ",", &lasts); + key; + key = php_strtok_r(NULL, ",", &lasts)) + { + char *val = strchr(key, '='); + + if (val) { + *val++ = '\0'; + for (q = key; *q; q++) { + *q = tolower(*q); + } + keylen = q - key + 1; + zend_hash_add(&(PHAR_GLOBALS->phar_plain_map), key, keylen, val, strlen(val)+1, NULL); + } + } + efree(tmp); +} +/* }}} */ + +ZEND_INI_MH(phar_ini_extract_list) /* {{{ */ +{ + PHAR_G(extract_list) = new_value; + + if (stage == ZEND_INI_STAGE_RUNTIME) { + phar_split_extract_list(TSRMLS_C); + } + + return SUCCESS; +} +/* }}} */ + +ZEND_INI_DISP(phar_ini_extract_list_disp) /*void name(zend_ini_entry *ini_entry, int type) {{{ */ +{ + char *value; + + if (type==ZEND_INI_DISPLAY_ORIG && ini_entry->modified) { + value = ini_entry->orig_value; + } else if (ini_entry->value) { + value = ini_entry->value; + } else { + value = NULL; + } + + if (value) { + char *tmp = strdup(value); + char *key; + char *lasts; + char *q; + + if (!sapi_module.phpinfo_as_text) { + php_printf("<ul>"); + } + for (key = php_strtok_r(tmp, ",", &lasts); + key; + key = php_strtok_r(NULL, ",", &lasts)) + { + char *val = strchr(key, '='); + + if (val) { + *val++ = '\0'; + for (q = key; *q; q++) { + *q = tolower(*q); + } + if (sapi_module.phpinfo_as_text) { + php_printf("%s => %s", key, val); + } else { + php_printf("<li>%s => %s</li>", key, val); + } + } + } + if (!sapi_module.phpinfo_as_text) { + php_printf("</ul>"); + } + free(tmp); + } +} +/* }}} */ + PHP_INI_BEGIN() - STD_PHP_INI_BOOLEAN("phar.readonly", "1", PHP_INI_ALL, phar_ini_modify_handler, readonly, zend_phar_globals, phar_globals) - STD_PHP_INI_BOOLEAN("phar.require_hash", "1", PHP_INI_ALL, phar_ini_modify_handler, require_hash, zend_phar_globals, phar_globals) + STD_PHP_INI_BOOLEAN( "phar.readonly", "1", PHP_INI_ALL, phar_ini_modify_handler, readonly, zend_phar_globals, phar_globals) + STD_PHP_INI_BOOLEAN( "phar.require_hash", "1", PHP_INI_ALL, phar_ini_modify_handler, require_hash, zend_phar_globals, phar_globals) + STD_PHP_INI_ENTRY_EX("phar.extract_list", "", PHP_INI_ALL, phar_ini_extract_list, extract_list, zend_phar_globals, phar_globals, phar_ini_extract_list_disp) PHP_INI_END() /** @@ -774,7 +864,7 @@ return FAILURE; } - sig_len = phar_hex_str(digest, sizeof(digest), &signature); + sig_len = phar_hex_str((const char*)digest, sizeof(digest), &signature); break; } case PHAR_SIG_MD5: { @@ -809,7 +899,7 @@ return FAILURE; } - sig_len = phar_hex_str(digest, sizeof(digest), &signature); + sig_len = phar_hex_str((const char*)digest, sizeof(digest), &signature); break; } default: @@ -1446,6 +1536,7 @@ char *buffer; char *error; char *filter_name; + char *plain_map; char tmpbuf[8]; HashTable *pharcontext; php_url *resource = NULL; @@ -1453,6 +1544,7 @@ php_stream_filter *filter/*, *consumed */; php_uint32 offset, read, total, toread; zval **pzoption, *metadata; + uint host_len; resource = php_url_parse(path); @@ -1473,10 +1565,21 @@ return NULL; } + host_len = strlen(resource->host); + if (zend_hash_find(&(PHAR_GLOBALS->phar_plain_map), resource->host, host_len+1, (void **)&plain_map) == SUCCESS) { + spprintf(&internal_file, 0, "%s%s", plain_map, resource->path); + fp = php_stream_open_wrapper_ex(internal_file, mode, options, opened_path, context); + if (!fp) { + php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: file \"%s\" extracted from \"%s\" could not be opened", internal_file, resource->host); + } + efree(internal_file); + return fp; + } + /* strip leading "/" */ internal_file = estrdup(resource->path + 1); if (mode[0] == 'w' || (mode[0] == 'r' && mode[1] == '+')) { - if (NULL == (idata = phar_get_or_create_entry_data(resource->host, strlen(resource->host), internal_file, strlen(internal_file), mode, &error TSRMLS_CC))) { + if (NULL == (idata = phar_get_or_create_entry_data(resource->host, host_len, internal_file, strlen(internal_file), mode, &error TSRMLS_CC))) { if (error) { php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, error); efree(error); @@ -1518,7 +1621,7 @@ } return fpf; } else { - if ((FAILURE == phar_get_entry_data(&idata, resource->host, strlen(resource->host), internal_file, strlen(internal_file), "r", &error TSRMLS_CC)) || !idata) { + if ((FAILURE == phar_get_entry_data(&idata, resource->host, host_len, internal_file, strlen(internal_file), "r", &error TSRMLS_CC)) || !idata) { if (error) { php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, error); efree(error); @@ -2353,7 +2456,7 @@ PHP_SHA1Final(digest, &context); php_stream_write(newfile, (char *) digest, sizeof(digest)); sig_flags |= PHAR_SIG_SHA1; - archive->sig_len = phar_hex_str(digest, sizeof(digest), &archive->signature); + archive->sig_len = phar_hex_str((const char*)digest, sizeof(digest), &archive->signature); break; } case PHAR_SIG_MD5: { @@ -2367,7 +2470,7 @@ PHP_MD5Final(digest, &context); php_stream_write(newfile, (char *) digest, sizeof(digest)); sig_flags |= PHAR_SIG_MD5; - archive->sig_len = phar_hex_str(digest, sizeof(digest), &archive->signature); + archive->sig_len = phar_hex_str((const char*)digest, sizeof(digest), &archive->signature); break; } } @@ -3128,6 +3231,8 @@ PHAR_GLOBALS->request_done = 0; zend_hash_init(&(PHAR_GLOBALS->phar_fname_map), sizeof(phar_archive_data*), zend_get_hash_value, destroy_phar_data, 0); zend_hash_init(&(PHAR_GLOBALS->phar_alias_map), sizeof(phar_archive_data*), zend_get_hash_value, NULL, 0); + zend_hash_init(&(PHAR_GLOBALS->phar_plain_map), sizeof(const char *), zend_get_hash_value, NULL, 0); + phar_split_extract_list(TSRMLS_C); return SUCCESS; } /* }}} */ @@ -3135,8 +3240,9 @@ PHP_RSHUTDOWN_FUNCTION(phar) /* {{{ */ { zend_hash_destroy(&(PHAR_GLOBALS->phar_alias_map)); - PHAR_GLOBALS->phar_fname_map. pDestructor = destroy_phar_data_only; + PHAR_GLOBALS->phar_fname_map.pDestructor = destroy_phar_data_only; zend_hash_destroy(&(PHAR_GLOBALS->phar_fname_map)); + zend_hash_destroy(&(PHAR_GLOBALS->phar_plain_map)); PHAR_GLOBALS->request_done = 1; return SUCCESS; } @@ -3148,7 +3254,7 @@ php_info_print_table_header(2, "Phar: PHP Archive support", "enabled"); php_info_print_table_row(2, "Phar EXT version", PHAR_EXT_VERSION_STR); php_info_print_table_row(2, "Phar API version", PHAR_API_VERSION_STR); - php_info_print_table_row(2, "CVS revision", "$Revision: 1.182 $"); + php_info_print_table_row(2, "CVS revision", "$Revision: 1.183 $"); php_info_print_table_row(2, "gzip compression", #if HAVE_ZLIB "enabled"); @@ -3161,9 +3267,14 @@ #else "disabled"); #endif - php_info_print_table_row(1, "Phar based on pear/PHP_Archive, original concept by Davey Shafik"); - php_info_print_table_row(1, "Phar fully realized by Gregory Beaver and Marcus Boerger"); php_info_print_table_end(); + + php_info_print_box_start(0); + PUTS("Phar based on pear/PHP_Archive, original concept by Davey Shafik."); + PUTS(!sapi_module.phpinfo_as_text?"<br />":"\n"); + PUTS("Phar fully realized by Gregory Beaver and Marcus Boerger."); + php_info_print_box_end(); + DISPLAY_INI_ENTRIES(); } /* }}} */ http://cvs.php.net/viewvc.cgi/pecl/phar/phar_internal.h?r1=1.24&r2=1.25&diff_format=u Index: pecl/phar/phar_internal.h diff -u pecl/phar/phar_internal.h:1.24 pecl/phar/phar_internal.h:1.25 --- pecl/phar/phar_internal.h:1.24 Thu Feb 8 22:50:14 2007 +++ pecl/phar/phar_internal.h Sun Mar 25 19:03:36 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_internal.h,v 1.24 2007/02/08 22:50:14 helly Exp $ */ +/* $Id: phar_internal.h,v 1.25 2007/03/25 19:03:36 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -98,10 +98,12 @@ ZEND_BEGIN_MODULE_GLOBALS(phar) HashTable phar_fname_map; HashTable phar_alias_map; + HashTable phar_plain_map; + char* extract_list; int readonly; - int require_hash; zend_bool readonly_orig; zend_bool require_hash_orig; + int require_hash; int request_done; ZEND_END_MODULE_GLOBALS(phar) http://cvs.php.net/viewvc.cgi/pecl/phar/phar_object.c?r1=1.41&r2=1.42&diff_format=u Index: pecl/phar/phar_object.c diff -u pecl/phar/phar_object.c:1.41 pecl/phar/phar_object.c:1.42 --- pecl/phar/phar_object.c:1.41 Thu Mar 22 16:31:45 2007 +++ pecl/phar/phar_object.c Sun Mar 25 19:03:36 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_object.c,v 1.41 2007/03/22 16:31:45 cellog Exp $ */ +/* $Id: phar_object.c,v 1.42 2007/03/25 19:03:36 helly Exp $ */ #include "phar_internal.h" @@ -28,6 +28,27 @@ static zend_class_entry *phar_ce_entry; #endif +static int phar_get_extract_list(void *pDest, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */ +{ + zval *return_value = va_arg(args, zval*); + + add_assoc_string_ex(return_value, hash_key->arKey, hash_key->nKeyLength, (char*)pDest, 1); + + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ + +/* {{ proto array Phar::getExtractList() + * Return array of extract list + */ +PHP_METHOD(Phar, getExtractList) +{ + array_init(return_value); + + zend_hash_apply_with_arguments(&PHAR_G(phar_plain_map), phar_get_extract_list, 1, return_value); +} +/* }}} */ + /* {{{ proto mixed Phar::mapPhar([string alias]) * Reads the currently executed file (a phar) and registers its manifest */ PHP_METHOD(Phar, mapPhar) @@ -1177,6 +1198,7 @@ PHP_ME(Phar, canWrite, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_FINAL) PHP_ME(Phar, loadPhar, arginfo_phar_loadPhar, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_FINAL) PHP_ME(Phar, mapPhar, arginfo_phar_mapPhar, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_FINAL) + PHP_ME(Phar, getExtractList, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_FINAL) {NULL, NULL, NULL} }; http://cvs.php.net/viewvc.cgi/pecl/phar/tests/extracted.inc?view=markup&rev=1.1 Index: pecl/phar/tests/extracted.inc +++ pecl/phar/tests/extracted.inc <?php var_dump(__FILE__); ?> http://cvs.php.net/viewvc.cgi/pecl/phar/tests/extracted_001.phpt?view=markup&rev=1.1 Index: pecl/phar/tests/extracted_001.phpt +++ pecl/phar/tests/extracted_001.phpt --TEST-- Phar: extracted --SKIPIF-- <?php if (!extension_loaded("phar")) print "skip"; ?> --INI-- phar.readonly=0 phar.require_hash=0 phar.extract_list="phar_test.phar=test" --FILE-- <?php var_dump(Phar::getExtractList()); ini_set('phar.extract_list', 'phar_test.phar='.dirname(__FILE__)); var_dump(Phar::getExtractList()); $pname = 'phar://phar_test.phar'; var_dump(file_get_contents($pname . '/extracted.inc')); include $pname . '/extracted.inc'; ?> ===DONE=== --EXPECTF-- array(1) { ["phar_test.phar"]=> string(4) "test" } array(1) { ["phar_test.phar"]=> string(%d) "%s" } string(29) "<?php var_dump(__FILE__); ?> " string(%d) "%sextracted.inc" ===DONE===
« previous php.doc (#969375900) next »