cvs: pecl /phar phar_object.c /phar/tests phar_convert_zip.phpt phar_unlinkarchive.phpt

From: Date: Sat, 03 May 2008 02:04:23 +0000
Subject: cvs: pecl /phar phar_object.c /phar/tests phar_convert_zip.phpt phar_unlinkarchive.phpt
Groups: php.pecl.cvs 
Request: Send a blank email to pecl-cvs+get-10692@lists.php.net to get a copy of this message
cellog Sat May 3 02:04:23 2008 UTC Added files: /pecl/phar/tests phar_unlinkarchive.phpt Modified files: /pecl/phar phar_object.c /pecl/phar/tests phar_convert_zip.phpt Log: add Phar::unlinkArchive() to allow complete removal of a parsed phar archive from memory and disk http://cvs.php.net/viewvc.cgi/pecl/phar/phar_object.c?r1=1.254&r2=1.255&diff_format=u Index: pecl/phar/phar_object.c diff -u pecl/phar/phar_object.c:1.254 pecl/phar/phar_object.c:1.255 --- pecl/phar/phar_object.c:1.254 Fri May 2 05:05:54 2008 +++ pecl/phar/phar_object.c Sat May 3 02:04:23 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_object.c,v 1.254 2008/05/02 05:05:54 cellog Exp $ */ +/* $Id: phar_object.c,v 1.255 2008/05/03 02:04:23 cellog Exp $ */ #include "phar_internal.h" #include "func_interceptors.h" @@ -1279,6 +1279,46 @@ } /* }}} */ +/* {{{ proto array Phar::unlinkArchive(string archive) + * Completely remove a phar archive from memory and disk + */ +PHP_METHOD(Phar, unlinkArchive) +{ + char *fname, *error; + int fname_len; + phar_archive_data *phar; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname, &fname_len) == FAILURE) { + RETURN_FALSE; + } + + if (!fname_len) { + zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Unknown phar archive \"\""); + return; + } + + if (FAILURE == phar_open_filename(fname, fname_len, NULL, 0, REPORT_ERRORS, &phar, &error TSRMLS_CC)) { + if (error) { + zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Unknown phar archive \"%s\": %s", fname, error); + efree(error); + } else { + zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Unknown phar archive \"%s\"", fname); + } + return; + } + + if (phar->refcount) { + zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "phar archive \"%s\" has open file handles or objects. fclose() all file handles, and unset() all objects prior to calling unlinkArchive()", fname); + return; + } + fname = estrndup(phar->fname, phar->fname_len); + phar_archive_delref(phar TSRMLS_CC); + unlink(fname); + efree(fname); + RETURN_TRUE; +} +/* }}} */ + #if HAVE_SPL #define PHAR_ARCHIVE_OBJECT() \ @@ -4297,6 +4337,11 @@ ZEND_ARG_INFO(0, retphar) ZEND_END_ARG_INFO(); +static +ZEND_BEGIN_ARG_INFO_EX(arginfo_phar_ua, 0, 0, 1) + ZEND_ARG_INFO(0, archive) +ZEND_END_ARG_INFO(); + #if HAVE_SPL static @@ -4473,6 +4518,7 @@ PHP_ME(Phar, running, arginfo_phar_running, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_FINAL) PHP_ME(Phar, mount, arginfo_phar_mount, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_FINAL) PHP_ME(Phar, mungServer, arginfo_phar_mungServer, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_FINAL) + PHP_ME(Phar, unlinkArchive, arginfo_phar_ua, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_FINAL) PHP_ME(Phar, webPhar, arginfo_phar_webPhar, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_FINAL) {NULL, NULL, NULL} }; http://cvs.php.net/viewvc.cgi/pecl/phar/tests/phar_convert_zip.phpt?r1=1.9&r2=1.10&diff_format=u Index: pecl/phar/tests/phar_convert_zip.phpt diff -u pecl/phar/tests/phar_convert_zip.phpt:1.9 pecl/phar/tests/phar_convert_zip.phpt:1.10 --- pecl/phar/tests/phar_convert_zip.phpt:1.9 Fri May 2 05:05:54 2008 +++ pecl/phar/tests/phar_convert_zip.phpt Sat May 3 02:04:23 2008 @@ -35,7 +35,6 @@ $phar = new Phar($fname3); var_dump($phar->isFileFormat(Phar::ZIP)); var_dump($phar->getStub()); - ?> ===DONE=== --CLEAN-- http://cvs.php.net/viewvc.cgi/pecl/phar/tests/phar_unlinkarchive.phpt?view=markup&rev=1.1 Index: pecl/phar/tests/phar_unlinkarchive.phpt +++ pecl/phar/tests/phar_unlinkarchive.phpt --TEST-- Phar::unlinkArchive() --SKIPIF-- <?php if (!extension_loaded("phar")) die("skip"); ?> --INI-- phar.require_hash=0 phar.readonly=0 --FILE-- <?php try { Phar::unlinkArchive(""); } catch (Exception $e) { echo $e->getMessage(),"\n"; } $fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar'; $pdname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar'; try { Phar::unlinkArchive($fname); } catch (Exception $e) { echo $e->getMessage(),"\n"; } file_put_contents($pdname, 'blahblah'); try { Phar::unlinkArchive($pdname); } catch (Exception $e) { echo $e->getMessage(),"\n"; } Phar::unlinkArchive(array()); $pname = 'phar://' . $fname; $fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip'; $fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.2.phar.zip'; $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'; $phar = new Phar($fname); var_dump($phar->isFileFormat(Phar::ZIP)); var_dump($phar->getStub()); try { Phar::unlinkArchive($fname); } catch (Exception $e) { echo $e->getMessage(),"\n"; } $phar = $phar->convertToExecutable(Phar::ZIP); var_dump($phar->isFileFormat(Phar::ZIP)); var_dump($phar->getStub()); copy($fname2, $fname3); $phar = new Phar($fname3); var_dump($phar->isFileFormat(Phar::ZIP)); var_dump($phar->getStub()); Phar::unlinkArchive($fname); var_dump(file_exists($fname)); $phar = new Phar($fname); var_dump(count($phar)); ?> ===DONE=== --CLEAN-- <?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar'); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar'); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.zip'); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip'); __HALT_COMPILER(); ?> --EXPECTF-- Unknown phar archive "" Unknown phar archive "%sphar_unlinkarchive.phar" Unknown phar archive "%sphar_unlinkarchive.phar.tar": internal corruption of phar "%sphar_unlinkarchive.phar.tar" (truncated entry) Warning: Phar::unlinkArchive() expects parameter 1 to be string, array given in %sphar_unlinkarchive.php on line %d bool(false) string(48) "<?php echo "first stub\n"; __HALT_COMPILER(); ?>" phar archive "%sphar_unlinkarchive.phar" has open file handles or objects. fclose() all file handles, and unset() all objects prior to calling unlinkArchive() bool(true) string(60) "<?php // zip-based phar archive stub file __HALT_COMPILER();" bool(true) string(60) "<?php // zip-based phar archive stub file __HALT_COMPILER();" bool(false) int(0) ===DONE===

« previous php.pecl.cvs (#10692) next »