From: David Coallier Date: Thu, 24 May 2007 08:36:13 +0000 (+0000) Subject: - Added comments to each functions X-Git-Tag: RELEASE_1_4~89 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ca5eae898bf3ff3354ee80d390b0b610c6012d1e;p=php - Added comments to each functions - Fixed all the typ[s]*_ to type[s]*_ --- diff --git a/ext/phar/phar/pharcommand.inc b/ext/phar/phar/pharcommand.inc index 057c2d574f..7a33a0d042 100755 --- a/ext/phar/phar/pharcommand.inc +++ b/ext/phar/phar/pharcommand.inc @@ -1,6 +1,7 @@ array( - 'typ' => 'alias', - 'val' => NULL, - 'inf' => ' Provide an alias name for the phar file.' + // {{{ public function cli_get_SP2 + public function cli_get_SP2($l1, $arg_inf) + { + return str_repeat(' ', $l1 + 2 + 4 + 9); + } + // }}} + // {{{ public function cli_get_SP3 + /** + * Cli Get SP3 + * + * @param string $l1 Eleven + * @param string $l2 Twelve + * @param string $arg_inf + * @return string The repeated string. + */ + function cli_get_SP3($l1, $l2, $arg_inf) + { + return str_repeat(' ', $l1 + 2 + 4 + 9 + 2 + $l2 + 2); + } + // }}} + // {{{ static function phar_args + /** + * Phar arguments + * + * This function contains all the phar commands + * + * @param string $which Which argument is chosen. + * @param string $phartype The type of phar, specific file to work on + * @return unknown + */ + static function phar_args($which, $phartype) + { + $phar_args = array( + 'a' => array( + 'type' => 'alias', + 'val' => NULL, + 'inf' => ' Provide an alias name for the phar file.' ), - 'c' => array( - 'typ' => 'compalg', - 'val' => NULL, - 'inf' => ' Compression algorithm.', + 'c' => array( + 'type' => 'compalg', + 'val' => NULL, + 'inf' => ' Compression algorithm.', 'select' => array( '0' => 'No compression', 'none' => 'No compression', 'auto' => 'Automatically select compression algorithm' ) ), - 'e' => array( - 'typ' => 'entry', - 'val' => NULL, - 'inf' => ' Name of entry to work on (must include PHAR internal directory name if any).' + 'e' => array( + 'type' => 'entry', + 'val' => NULL, + 'inf' => ' Name of entry to work on (must include PHAR internal directory name if any).' ), - 'f' => array( - 'typ' => $phartyp, - 'val' => NULL, - 'inf' => ' Specifies the phar file to work on.' + 'f' => array( + 'type' => $phartype, + 'val' => NULL, + 'inf' => ' Specifies the phar file to work on.' ), - 'h' => array( - 'typ' => 'select', - 'val' => NULL, - 'inf' => ' Selects the hash algorithmn.', + 'h' => array( + 'type' => 'select', + 'val' => NULL, + 'inf' => ' Selects the hash algorithmn.', 'select' => array('md5' => 'MD5','sha1' => 'SHA1') ), - 'i' => array( - 'typ' => 'regex', - 'val' => NULL, + 'i' => array( + 'type' => 'regex', + 'val' => NULL, 'inf' => ' Specifies a regular expression for input files.' ), 'k' => array( - 'typ' => 'any', - 'val' => NULL, - 'inf' => ' Subscription index to work on.', + 'type' => 'any', + 'val' => NULL, + 'inf' => ' Subscription index to work on.', ), 'l' => array( - 'typ' => 'int', - 'val' => 0, - 'inf' => ' Number of preceeding subdirectories to strip from file entries.', + 'type' => 'int', + 'val' => 0, + 'inf' => ' Number of preceeding subdirectories to strip from file entries', ), - 'm' => array( - 'typ' => 'any', - 'val' => NULL, + 'm' => array( + 'type' => 'any', + 'val' => NULL, 'inf' => ' Meta data to store with entry (serialized php data).' ), 'p' => array( - 'typ' => 'file', - 'val' => NULL, - 'inf' => ' Location of PHP_Archive class file. To find the file use the ' - .'following: \'pear list-files PHP_Archive|grep Archive.php\'.', + 'type' => 'file', + 'val' => NULL, + 'inf' => ' Location of PHP_Archive class file (pear list-files PHP_Archive).', ), - 's' => array( - 'typ' => 'file', - 'val' => NULL, + 's' => array( + 'type' => 'file', + 'val' => NULL, 'inf' => ' Select the stub file.' ), - 'x' => array( - 'typ' => 'regex', - 'val' => NULL, + 'x' => array( + 'type' => 'regex', + 'val' => NULL, 'inf' => ' Regular expression for input files to exclude.' ), - ); - if (extension_loaded('zlib')) - { - $phar_args['c']['select']['gz'] = 'GZip compression'; - $phar_args['c']['select']['gzip'] = 'GZip compression'; - } - if (extension_loaded('bz2')) - { - $phar_args['c']['select']['bz2'] = 'BZip2 compression'; - $phar_args['c']['select']['bzip2'] = 'BZip2 compression'; - } - $hash_avail = Phar::getSupportedSignatures(); - if (in_array('SHA-256', $hash_avail)) - { - $phar_args['h']['select']['sha256'] = 'SHA256'; - } - if (in_array('SHA-512', Phar::getSupportedSignatures())) - { - $phar_args['h']['select']['sha512'] = 'SHA512'; - } - $args = array(); - foreach($phar_args as $lkey => $cfg) - { - $ukey = strtoupper($lkey); - $required = strpos($which, $ukey) !== false; - $optional = strpos($which, $lkey) !== false; - if ($required || $optional) - { - $args[$lkey] = $cfg; - $args[$lkey]['required'] = $required; - } - } - return $args; - } - - static function strEndsWith($haystack, $needle) - { - return substr($haystack, -strlen($needle)) == $needle; - } - - static function cli_arg_typ_pharnew($arg, $cfg, $key) - { - $arg = self::cli_arg_typ_filenew($arg, $cfg, $key); - if (!Phar::isValidPharFilename($arg)) - { - self::error("Phar files must have file extension '.phar', '.phar.php', '.phar.bz2' or 'phar.gz'.\n"); - } - return $arg; - } - - static function cli_arg_typ_pharfile($arg, $cfg, $key) - { - try - { - $pharfile = self::cli_arg_typ_file($arg, $cfg, $key); - if (!Phar::loadPhar($pharfile)) - { - self::error("Unable to open phar '$arg'\n"); - } - return $pharfile; - } - catch(Exception $e) - { - self::error("Exception while opening phar '$arg':\n" . $e->getMessage() . "\n"); - } - } - - static function cli_arg_typ_pharurl($arg, $cfg, $key) - { - return 'phar://' . self::cli_arg_typ_pharfile($arg, $cfg, $key); - } - - static function cli_arg_typ_phar($arg, $cfg, $key) - { - try - { - return new Phar(self::cli_arg_typ_pharfile($arg, $cfg, $key)); - } - catch(Exception $e) - { - self::error("Exception while opening phar '$argv':\n" . $e->getMessage() . "\n"); - } - } - - static function cli_arg_typ_entry($arg, $cfg, $key) - { - // no further check atm, maybe check for no '/' at beginning - return $arg; - } - - static function cli_arg_typ_compalg($arg, $cfg, $key) - { - $arg = self::cli_arg_typ_select($arg, $cfg, $key); - switch($arg) - { - case 'auto': - if (extension_loaded('zlib')) - { - $arg = 'gz'; - } - else if (extension_loaded('bz2')) - { - $arg = 'bz2'; - } - else - { - $arg = '0'; - } - break; - } - return $arg; - } - - static function cli_cmd_inf_pack() - { - return "Pack files into a PHAR archive.\n" - . "When using -s , then the stub file is being excluded from the list of input files/dirs.\n" - . "To create an archive that contains PEAR class PHP_Archive then point -p argument to PHP/Archive.php.\n" - ; - } - - static function cli_cmd_arg_pack() - { - $args = self::phar_args('acFhilpsx', 'pharnew'); - $args[''] = array('typ'=>'any', 'val'=>NULL, 'required'=>1, 'inf'=>' Any number of input files and directories. If -i is in use then ONLY files and matching thegiven regular expression are being packed. If -x is given then files matching that regular expression are NOT being packed.'); - return $args; - } - - function cli_cmd_run_pack() - { - if (ini_get('phar.readonly')) - { - self::error("Creating phar files is disabled by ini setting 'phar.readonly'.\n"); - } - if (!Phar::canWrite()) - { - self::error("Creating phar files is disabled, Phar::canWrite() returned false.\n"); - } - - $alias = $this->args['a']['val']; - $archive = $this->args['f']['val']; - $hash = $this->args['h']['val']; - $regex = $this->args['i']['val']; - $level = $this->args['l']['val']; - $loader = $this->args['p']['val']; - $stub = $this->args['s']['val']; - $invregex= $this->args['x']['val']; - $input = $this->args['']['val']; - - $phar = new Phar($archive, 0, $alias); - - $phar->startBuffering(); - - if (isset($stub)) - { - if (isset($loader)) - { - $c = file_get_contents($stub); - $s = ''; - if (substr($c,0,2) == '#!') { - $s.= substr($c,0,strpos($c, "\n")+1); - } - $s.= ''; - $s.= file_get_contents($loader); - $s.= ''; - if (substr($c,0,1) == '#') { - $s.= substr($c,strpos($c, "\n")+1); - } - $phar->setStub($s); - } - else - { - $phar->setStub(file_get_contents($stub)); - } - $stub = new SplFileInfo($stub); - } - - if (!is_array($input)) - { - $this->phar_add($phar, $level, $input, $regex, $invregex, $stub, NULL); - } - else - { - foreach($input as $i) - { - $this->phar_add($phar, $level, $i, $regex, $invregex, $stub, NULL); - } - } - - switch($this->args['c']['val']) - { - case 'gz': - case 'gzip': - $phar->compressAllFilesGZ(); - break; - case 'bz2': - case 'bzip2': - $phar->compressAllFilesBZIP2(); - break; - default: - $phar->uncompressAllFiles(); - break; - } - - if ($hash) - { - $phar->setSignatureAlgorithm($hash); - } - - $phar->stopBuffering(); - exit(0); - } - - static function phar_add(Phar $phar, $level, $input, $regex, $invregex, SplFileInfo $stub = NULL, $compress = NULL) - { - if (@is_file($input) && !is_dir($input)) - { - return self::phar_add_file($phar, $level, $input, $input, $compress); - } - $dir = new RecursiveDirectoryIterator($input); - $dir = new RecursiveIteratorIterator($dir); - - if (isset($regex)) - { - $dir = new RegexIterator($dir, $regex); - } - - if (isset($invregex)) - { - $dir = new InvertedRegexIterator($dir, $invregex); - } - - try - { - foreach($dir as $file) - { - if (empty($stub) || $file->getRealPath() != $stub->getRealPath()) - { - self::phar_add_file($phar, $level, $dir->getSubPathName(), $file, $compress); - } - } - } - catch(Excpetion $e) - { - self::error("Unable to complete operation on file '$file'\n" . $e->getMessage() . "\n"); - } - } - - static function phar_add_file(Phar $phar, $level, $entry, $file, $compress) - { - $entry = str_replace('//', '/', $entry); - while($level-- > 0 && ($p = strpos($entry, '/')) !== false) - { - $entry = substr($entry, $p+1); - } - echo "$entry\n"; - $phar[$entry] = file_get_contents($file); - switch($compress) - { - case 'gz': - case 'gzip': - $phar[$entry]->setCompressedGZ(); - break; - case 'bz2': - case 'bzip2': - $phar[$entry]->setCompressedBZIP2(); - break; - default: - break; - } - } - - function phar_dir_echo($pn, $f) - { - echo "$f\n"; - } - - function phar_dir_operation(RecursiveIteratorIterator $dir, $func, array $args = array()) - { - $regex = $this->args['i']['val']; - $invregex= $this->args['x']['val']; - - if (isset($regex)) - { - $dir = new RegexIterator($dir, $regex); - } - - if (isset($invregex)) - { - $dir = new InvertedRegexIterator($dir, $invregex); - } - - foreach($dir as $pn => $f) - { - call_user_func($func, $pn, $f, $args); - } - } - - static function cli_cmd_inf_list() - { - return "List contents of a PHAR archive."; - } - - static function cli_cmd_arg_list() - { - return self::phar_args('Fix', 'pharurl'); - } - - function cli_cmd_run_list() - { - $this->phar_dir_operation(new DirectoryTreeIterator($this->args['f']['val']), array($this, 'phar_dir_echo')); - } - - static function cli_cmd_inf_tree() - { - return "Get a directory tree for a PHAR archive."; - } - - static function cli_cmd_arg_tree() - { - return self::phar_args('Fix', 'pharurl'); - } - - function cli_cmd_run_tree() - { - $this->phar_dir_operation(new DirectoryGraphIterator($this->args['f']['val']), array($this, 'phar_dir_echo')); - } - - static function cli_cmd_inf_extract() - { - return "Extract a PHAR package to a directory."; - } - - static function cli_cmd_arg_extract() - { - $args = self::phar_args('Fix', 'phar'); - $args[''] = array('typ'=>'dir', 'val'=>'.', 'inf'=>' Directory to extract to (defaults to \'.\').'); - return $args; - } - - function cli_cmd_run_extract() - { - $dir = $this->args['']['val']; - if (is_array($dir)) - { - if (count($dir) != 1) - { - self::error("Only one target directory allowed.\n"); - } - else - { - $dir = $dir[0]; - } - } - $phar = $args['f']['val']; - $base = $phar->getPathname(); - $bend = strpos($base, '.phar'); - $bend = strpos($base, '/', $bend); - $base = substr($base, 0, $bend + 1); - $blen = strlen($base); - - $this->phar_dir_operation(new RecursiveIteratorIterator($phar), array($this, 'phar_dir_extract'), array($blen, $dir)); - } - - function phar_dir_extract($pn, $f, $args) - { - $blen = $args[0]; - $dir = $args[1]; - $sub = substr($pn, $blen); - $target = $dir . '/' . $sub; - if (!file_exists(dirname($target))) - { - if (!@mkdir(dirname($target))) - { - echo " ..unable to create dir\n"; - self::error("Operation could not be completed\n"); - } - } - echo "$sub"; - if (!@copy($f, $target)) - { - echo " ...error\n"; - } - else - { - echo " ...ok\n"; - } - } - - static function cli_cmd_inf_delete() - { - return "Delete entry from a PHAR package."; - } - - static function cli_cmd_arg_delete() - { - return self::phar_args('FE', 'phar'); - } - - function cli_cmd_run_delete() - { - $phar = $this->args['f']['val']; - $entry = $this->args['e']['val']; - - $phar->startBuffering(); - unset($phar[$entry]); - $phar->stopBuffering(); - } - - static function cli_cmd_inf_add() - { - return "Add entries to a PHAR package."; - } - - static function cli_cmd_arg_add() - { - $args = self::phar_args('acFilx', 'phar'); - $args[''] = array('typ'=>'any', 'val'=>NULL, 'required'=>1, 'inf'=>' Any number of input files and directories. If -i is in use then ONLY files and matching thegiven regular expression are being packed. If -x is given then files matching that regular expression are NOT being packed.'); - return $args; - } - - function cli_cmd_run_add() - { - $compress= $this->args['c']['val']; - $phar = $this->args['f']['val']; - $regex = $this->args['i']['val']; - $level = $this->args['l']['val']; - $invregex= $this->args['x']['val']; - $input = $this->args['']['val']; - - $phar->startBuffering(); - - if (!is_array($input)) - { - $this->phar_add($phar, $level, $input, $regex, $invregex, NULL, $compress); - } - else - { - foreach($input as $i) - { - $this->phar_add($phar, $level, $i, $regex, $invregex, NULL, $compress); - } - } - $phar->stopBuffering(); - exit(0); - } - - function cli_cmd_inf_stub_set() - { - return "Set the stub of a PHAR file. " - . "If no input file is specified as stub then stdin is being used."; - } - - function cli_cmd_arg_stub_set() - { - $args = self::phar_args('Fs', 'phar'); - $args['s']['val'] = 'php://stdin'; - return $args; - } - - function cli_cmd_run_stub_set() - { - $phar = $this->args['f']['val']; - $stub = $this->args['s']['val']; - - $phar->setStub(file_get_contents($stub)); - } - - function cli_cmd_inf_stub_get() - { - return "Get the stub of a PHAR file. " - . "If no output file is specified as stub then stdout is being used."; - } - - function cli_cmd_arg_stub_get() - { - $args = self::phar_args('Fs', 'phar'); - $args['s']['val'] = 'php://stdin'; - return $args; - } - - function cli_cmd_run_stub_get() - { - $phar = $this->args['f']['val']; - $stub = $this->args['s']['val']; - - file_put_contents($stub, $phar->getStub()); - } - - function cli_cmd_inf_compress() - { - return "Compress or uncompress all files or a selected entry."; - } - - function cli_cmd_arg_compress() - { - return self::phar_args('FCe', 'phar'); - } - - function cli_cmd_run_compress() - { - $phar = $this->args['f']['val']; - $entry = $this->args['e']['val']; - - switch($this->args['c']['val']) - { - case 'gz': - case 'gzip': - if (isset($entry)) - { - $phar[$entry]->setCompressedGZ(); - } - else - { - $phar->compressAllFilesGZ(); - } - break; - case 'bz2': - case 'bzip2': - if (isset($entry)) - { - $phar[$entry]->setCompressedBZIP2(); - } - else - { - $phar->compressAllFilesBZIP2(); - } - break; - default: - if (isset($entry)) - { - $phar[$entry]->setUncompressed(); - } - else - { - $phar->uncompressAllFiles(); - } - break; - } - } - - function cli_cmd_inf_sign() - { - return "Set signature hash algorithm."; - } - - function cli_cmd_arg_sign() - { - return self::phar_args('FH', 'phar'); - } - - function cli_cmd_run_sign() - { - $phar = $this->args['f']['val']; - $hash = $this->args['h']['val']; - - $phar->setSignatureAlgorithm($hash); - } - - function cli_cmd_inf_meta_set() - { - return "Set meta data of a PHAR entry or a PHAR package using serialized input. " - . "If no input file is specified for meta data then stdin is being used.\n" - . "You can also specify a particular index using -k. In that case the metadata is " - . "expected to be an array and the value of the given index is being set. If " - . "the metadata is not present or empty a new array will be created. If the " - . "metadata is present and a flat value then the return value is 1. Also using -k " - . "the input is been taken directly rather then being serialized."; - } - - function cli_cmd_arg_meta_set() - { - return self::phar_args('FekM', 'phar'); - } - - function cli_cmd_run_meta_set() - { - $phar = $this->args['f']['val']; - $entry = $this->args['e']['val']; - $index = $this->args['k']['val']; - $meta = $this->args['m']['val']; - - $phar->startBuffering(); - if (isset($index)) - { - if (isset($entry)) - { - if ($phar[$entry]->hasMetadata()) - { - $old = $phar[$entry]->getMetadata(); - } - else - { - $old = array(); - } - } - else - { - if ($phar->hasMetadata()) - { - $old = $phar->getMetadata(); - } - else - { - $old = array(); - } - } - if (!is_array($old)) - { - self::error('Metadata is a flat value while an index operation was issued.'); - } - $old[$index] = $meta; - $meta = $old; - } - else - { - $meta = unserialize($meta); - } - if (isset($entry)) - { - $phar[$entry]->setMetadata($meta); - } - else - { - $phar->setMetadata($meta); - } - $phar->stopBuffering(); - } - - function cli_cmd_inf_meta_get() - { - return "Get meta information of a PHAR entry or a PHAR package in serialized from. " - . "If no output file is specified for meta data then stdout is being used.\n" - . "You can also specify a particular index using -k. In that case the metadata is " - . "expected to be an array and the value of the given index is returned using echo " - . "rather than using serialize. If that index does not exist or no meta data is " - . "present then the return value is 1."; - } - - function cli_cmd_arg_meta_get() - { - return self::phar_args('Fek', 'phar'); - } - - function cli_cmd_run_meta_get() - { - $phar = $this->args['f']['val']; - $entry = $this->args['e']['val']; - $index = $this->args['k']['val']; - - if (isset($entry)) - { - if (!$phar[$entry]->hasMetadata()) - { - exit(1); - } - $meta = $phar[$entry]->getMetadata(); - } - else - { - if (!$phar->hasMetadata()) - { - exit(1); - } - $meta = $phar->getMetadata(); - } - if (isset($index)) - { - if (isset($meta[$index])) - { - echo $meta[$index]; - exit(0); - } - else - { - exit(1); - } - } - else - { - echo serialize($meta); - } - } - - function cli_cmd_inf_meta_del() - { - return "Delete meta information of a PHAR entry or a PHAR package.\n" - . "If -k is given then the metadata is expected to be an array " - . "and the given index is being deleted.\n" - . "If something was deleted the return value is 0 otherwise it is 1."; - } - - function cli_cmd_arg_meta_del() - { - return self::phar_args('Fek', 'phar'); - } - - function cli_cmd_run_meta_del() - { - $phar = $this->args['f']['val']; - $entry = $this->args['e']['val']; - $index = $this->argr['k']['val']; - - if (isset($entry)) - { - if (isset($index)) - { - if (!$phar[$entry]->hasMetadata()) - { - exit(1); - } - $meta = $phar[$entry]->getMetadata(); - if (!is_array($meta)) - { - exit(1); - } - unset($meta[$index]); - $phar[$entry]->setMetadata($meta); - } - else - { - exit($phar[$entry]->delMetadata() ? 0 : 1); - } - } - else - { - if (isset($index)) - { - if (!$phar->hasMetadata()) - { - exit(1); - } - $meta = $phar->getMetadata(); - if (!is_array($meta)) - { - exit(1); - } - unset($meta[$index]); - $phar->setMetadata($meta); - } - else - { - exit($phar->delMetadata() ? 0 : 1); - } - } - } - - function cli_cmd_inf_info() - { - return "Get information about a PHAR package.\n" - . "Using -k it is possible to return a single value."; - } - - function cli_cmd_arg_info() - { - return self::phar_args('Fk', 'phar'); - } - - function cli_cmd_run_info() - { - $phar = $this->args['f']['val']; - $index = $this->args['k']['val']; - - $hash = $phar->getsignature(); - $infos = array(); - - if ($phar->getAlias()) - { - $infos['Alias'] = $phar->getAlias(); - } - - if (!$hash) - { - $infos['Hash-type'] = 'NONE'; - } - else - { - $infos['Hash-type'] = $hash['hash_type']; - $infos['Hash'] = $hash['hash']; - } - - $csize = 0; - $usize = 0; - $count = 0; - $ccount = 0; - $ucount = 0; - $mcount = 0; - $compalg = array('GZ'=>0, 'BZ2'=>0); - - foreach(new RecursiveIteratorIterator($phar) as $ent) - { - $count++; - if ($ent->isCompressed()) - { - $ccount++; - $csize += $ent->getCompressedSize(); - if ($ent->isCompressedGZ()) - { - $compalg['GZ']++; - } - else if ($ent->isCompressedBZIP2()) - { - $compalg['BZ2']++; - } - } - else - { - $ucount++; - $csize += $ent->getSize(); - } - $usize += $ent->getSize(); - if ($ent->hasMetadata()) - { - $mcount++; - } - } - - $infos['Entries'] = $count; - $infos['Uncompressed-files'] = $ucount; - $infos['Compressed-files'] = $ccount; - $infos['Compressed-gz'] = $compalg['GZ']; - $infos['Compressed-bz2'] = $compalg['BZ2']; - $infos['Uncompressed-size'] = $usize; - $infos['Compressed-size'] = $csize; - $infos['Compression-ratio'] = sprintf('%.3g%%', ($csize * 100) / $usize); - $infos['Metadata-global'] = $phar->hasMetadata()*1; - $infos['Metadata-files'] = $mcount; - - if (isset($index)) - { - if (!isset($infos[$index])) - { - self::error("Requested value '$index' does not exist.\n"); - } - echo $infos[$index]; - exit(0); - } - $l = 0; - foreach($infos as $which => $val) - { - $l = max(strlen($which), $l); - } - foreach($infos as $which => $val) - { - echo $which . ':' . str_repeat(' ', $l + 1 - strlen($which)) . $val . "\n"; - } - } -} + ); + + if (extension_loaded('zlib')) { + $phar_args['c']['select']['gz'] = 'GZip compression'; + $phar_args['c']['select']['gzip'] = 'GZip compression'; + } + + if (extension_loaded('bz2')) { + $phar_args['c']['select']['bz2'] = 'BZip2 compression'; + $phar_args['c']['select']['bzip2'] = 'BZip2 compression'; + } + + $hash_avail = Phar::getSupportedSignatures(); + if (in_array('SHA-256', $hash_avail)) { + $phar_args['h']['select']['sha256'] = 'SHA256'; + } + + if (in_array('SHA-512', Phar::getSupportedSignatures())) { + $phar_args['h']['select']['sha512'] = 'SHA512'; + } + + $args = array(); + + foreach($phar_args as $lkey => $cfg) { + $ukey = strtoupper($lkey); + $required = strpos($which, $ukey) !== false; + $optional = strpos($which, $lkey) !== false; + + if ($required || $optional) { + $args[$lkey] = $cfg; + $args[$lkey]['required'] = $required; + } + } + return $args; + } + // }}} + // {{{ static function strEndsWith + /** + * String Ends With + * + * Wether a string end with another needle. + * + * @param string $haystack The haystack + * @param string $needle The needle. + * @return mixed false if doesn't end with anything, the string + * substr'ed if the string ends with the needle. + */ + static function strEndsWith($haystack, $needle) + { + return substr($haystack, -strlen($needle)) == $needle; + } + // }}} + // {{{ static function cli_arg_type_pharnew + /** + * New phar + * + * @param string $arg The new phar component. + * @param string $cfg Configuration to pass to a new file + * @param string $key The key + * @return string $arg The new argument file. + */ + static function cli_arg_type_pharnew($arg, $cfg, $key) + { + $arg = self::cli_arg_type_filenew($arg, $cfg, $key); + if (!Phar::isValidPharFilename($arg)) { + self::error("Phar files must have file extension '.phar', '.phar.php', '.phar.bz2' or 'phar.gz'.\n"); + } + return $arg; + } + // }}} + // {{{ static function cli_arg_type_pharfile + /** + * Phar file + * + * Return a file from a phar archive. + * + * @param string $arg The file in the phar to open. + * @param string $cfg The configuration information + * @param string $key The key information. + * @return string $pharfile The loaded phar file. + */ + static function cli_arg_type_pharfile($arg, $cfg, $key) + { + try { + $pharfile = self::cli_arg_type_file($arg, $cfg, $key); + + if (!Phar::loadPhar($pharfile)) { + self::error("Unable to open phar '$arg'\n"); + } + + return $pharfile; + } catch(Exception $e) { + self::error("Exception while opening phar '$arg':\n" . $e->getMessage() . "\n"); + } + } + // }}} + // {{{ static function cli_arg_type_pharurl + /** + * Phar url-like + * + * Return a file using a url like call + * + * Ex: + * + * $arg = 'pharchive.phar/file.php'; + * cli_arg_type_pharurl($arg) + * + * + * @param string $arg The url-like phar archive to retrieve. + * @return string The phar file-archive. + */ + static function cli_arg_type_pharurl($arg, $cfg, $key) + { + return 'phar://' . self::cli_arg_type_pharfile($arg, $cfg, $key); + } + // }}} + // {{{ static function cli_arg_type_phar + /** + * Cli type phar + * + * @param string $arg The phar archive to use. + * @return object new Phar of the passed argument. + */ + static function cli_arg_type_phar($arg, $cfg, $key) + { + try { + return new Phar(self::cli_arg_type_pharfile($arg, $cfg, $key)); + } catch(Exception $e) { + self::error("Exception while opening phar '$argv':\n" . $e->getMessage() . "\n"); + } + } + // }}} + // {{{ static function cli_arg_type_entry + /** + * Type Entry + * + * @param string $arg The argument (the entry) + * @return string $arg The entry itself. + */ + static function cli_arg_type_entry($arg, $cfg, $key) + { + // no further check atm, maybe check for no '/' at beginning + return $arg; + } + // }}} + // {{{ static function cli_arg_type_compalg + /** + * Enter description here... + * + * @param string $arg The phar selection + * @param string $cfg The config option. + * @param string $key The key information. + * @return string $arg The phar select + */ + static function cli_arg_type_compalg($arg, $cfg, $key) + { + $arg = self::cli_arg_type_select($arg, $cfg, $key); + + switch($arg) { + case 'auto': + if (extension_loaded('zlib')) { + $arg = 'gz'; + } elseif (extension_loaded('bz2')) { + $arg = 'bz2'; + } else { + $arg = '0'; + } + break; + } + return $arg; + } + // }}} + // {{{ static function cli_cmd_inf_pack + /** + * Information pack + * + * @return string A description about packing files into a Phar archive. + */ + static function cli_cmd_inf_pack() + { + return "Pack files into a PHAR archive.\n" . + "When using -s , then the stub file is being " . + "excluded from the list of input files/dirs." . + "To create an archive that contains PEAR class PHP_Archiave " . + "then point -p argument to PHP/Archive.php.\n"; + } + // }}} + // {{{ static function cli_cmd_arg_pack + /** + * Pack a new phar infos + * + * @return array $args The arguments for a new Phar archive. + */ + static function cli_cmd_arg_pack() + { + $args = self::phar_args('acFhilpsx', 'pharnew'); + + $args[''] = array( + 'type' => 'any', + 'val' => NULL, + 'required' => 1, + 'inf' => ' Any number of input files and directories. If -i is in use then ONLY files and matching thegiven regular expression are being packed. If -x is given then files matching that regular expression are NOT being packed.', + + ); + + return $args; + } + // }}} + // {{{ function cli_cmd_run_pack + /** + * Pack a new Phar + * + * This function will try to pack a new Phar archive. + * + * @see Exit to make sure that we are done. + */ + public function cli_cmd_run_pack() + { + if (ini_get('phar.readonly')) { + self::error("Creating phar files is disabled by ini setting 'phar.readonly'.\n"); + } + + if (!Phar::canWrite()) { + self::error("Creating phar files is disabled, Phar::canWrite() returned false.\n"); + } + + $alias = $this->args['a']['val']; + $archive = $this->args['f']['val']; + $hash = $this->args['h']['val']; + $regex = $this->args['i']['val']; + $level = $this->args['l']['val']; + $loader = $this->args['p']['val']; + $stub = $this->args['s']['val']; + $invregex = $this->args['x']['val']; + $input = $this->args['']['val']; + + $phar = new Phar($archive, 0, $alias); + + $phar->startBuffering(); + + if (isset($stub)) { + if (isset($loader)) { + $c = file_get_contents($stub); + $s = ''; + + if (substr($c, 0, 2) == '#!') { + $s .= substr($c, 0, strpos($c, "\n") + 1); + } + + $s .= ''; + $s .= file_get_contents($loader); + $s .= ''; + + if (substr($c,0,1) == '#') { + $s.= substr($c,strpos($c, "\n")+1); + } + + $phar->setStub($s); + } else { + $phar->setStub(file_get_contents($stub)); + } + $stub = new SplFileInfo($stub); + } + + if (!is_array($input)) { + $this->phar_add($phar, $level, $input, $regex, $invregex, $stub, NULL); + } else { + foreach($input as $i) { + $this->phar_add($phar, $level, $i, $regex, $invregex, $stub); + } + } + + switch($this->args['c']['val']) { + case 'gz': + case 'gzip': + $phar->compressAllFilesGZ(); + break; + case 'bz2': + case 'bzip2': + $phar->compressAllFilesBZIP2(); + break; + default: + $phar->uncompressAllFiles(); + break; + } + + if ($hash) { + $phar->setSignatureAlgorithm($hash); + } + + $phar->stopBuffering(); + exit(0); + } + // }}} + // {{{ static function phar_add + /** + * Add files to a phar archive. + * + * This function will take a directory and iterate through + * it and get the files to insert into the Phar archive. + * + * @param Phar $phar The phar object. + * @param string $input The input directory + * @param string $regex The regex use in RegexIterator. + * @param string $invregex The InvertedRegexIterator expression. + * @param SplFileInfo $stub + */ + static function phar_add(Phar $phar, $level, $input, $regex, $invregex, SplFileInfo $stub = NULL, $compress = NULL) + { + if ($input && is_file($input) && !is_dir($input)) { + return self::phar_add_file($phar, $level, $input, $input, $compress); + } + $dir = new RecursiveDirectoryIterator($input); + $dir = new RecursiveIteratorIterator($dir); + + if (isset($regex)) { + $dir = new RegexIterator($dir, $regex); + } + + if (isset($invregex)) { + $dir = new InvertedRegexIterator($dir, $invregex); + } + + try { + foreach($dir as $file) { + if (empty($stub) || $file->getRealPath() != $stub->getRealPath()) { + self::phar_add_file($phar, $level, $dir->getSubPathName(), $file, $compress); + } + } + } catch(Excpetion $e) { + self::error("Unable to complete operation on file '$file'\n" . $e->getMessage() . "\n"); + } + } + // }}} + // {{{ static function phar_add_file + /** + * Add a phar file + * + * This function adds a file to a phar archive. + * + * @param Phar $phar The phar object + * @param string $level The level of the file. + * @param string $entry The entry point + * @param string $file The file to add to the archive + * @param string $compress The compression scheme for the file. + */ + static function phar_add_file(Phar $phar, $level, $entry, $file, $compress) + { + $entry = str_replace('//', '/', $entry); + while($level-- > 0 && ($p = strpos($entry, '/')) !== false) { + $entry = substr($entry, $p+1); + } + + echo "$entry\n"; + + $phar[$entry] = file_get_contents($file); + switch($compress) { + case 'gz': + case 'gzip': + $phar[$entry]->setCompressedGZ(); + break; + case 'bz2': + case 'bzip2': + $phar[$entry]->setCompressedBZIP2(); + break; + default: + break; + } + } + // }}} + // {{{ public function phar_dir_echo + /** + * Echo directory + * + * @param string $pn + * @param unknown_type $f + */ + public function phar_dir_echo($pn, $f) + { + echo "$f\n"; + } + // }}} + // {{{ public function phar_dir_operation + /** + * Directory operations + * + * Phar directory operations. + * + * @param RecursiveIteratorIterator $dir The recursiveIteratorIterator object. + * @param string $func Function to call on the iterations + * @param array $args Function arguments. + */ + public function phar_dir_operation(RecursiveIteratorIterator $dir, $func, array $args = array()) + { + $regex = $this->args['i']['val']; + $invregex= $this->args['x']['val']; + + if (isset($regex)) { + $dir = new RegexIterator($dir, $regex); + } + + if (isset($invregex)) { + $dir = new InvertedRegexIterator($dir, $invregex); + } + + foreach($dir as $pn => $f) { + call_user_func($func, $pn, $f, $args); + } + } + // {{{ static function cli_cmd_inf_list + /** + * Cli Command Info List + * + * @return string What inf does + */ + static function cli_cmd_inf_list() + { + return "List contents of a PHAR archive."; + } + // }}} + // {{{ static function cli_cmd_arg_list + /** + * Cli Command Argument List + * + * @return arguments list + */ + static function cli_cmd_arg_list() + { + return self::phar_args('Fix', 'pharurl'); + } + // }}} + // {{{ public function cli_cmd_run_list + /** + * Cli Command Run List + * + * @see $this->phar_dir_operation + */ + public function cli_cmd_run_list() + { + $this->phar_dir_operation( + new DirectoryTreeIterator( + $this->args['f']['val']), + array($this, 'phar_dir_echo') + ); + } + // }}} + // {{{ static function cli_command_inf_tree + /** + * Cli Command Inf Tree + * + * @return string The description of a directory tree for a Phar archive. + */ + static function cli_cmd_inf_tree() + { + return "Get a directory tree for a PHAR archive."; + } + // }}} + // {{{ static function cli_cmd_arg_tree + /** + * Cli Command Argument Tree + * + * @return string Arguments in URL format. + */ + static function cli_cmd_arg_tree() + { + return self::phar_args('Fix', 'pharurl'); + } + // }}} + // {{{ public function cli_cmd_run_tree + /** + * Cli Command Run Tree + * + * Set the phar_dir_operation with a directorygraphiterator. + * + * @see DirectoryGraphIterator + * @see $this->phar_dir_operation + * + */ + public function cli_cmd_run_tree() + { + $this->phar_dir_operation( + new DirectoryGraphIterator( + $this->args['f']['val']), + array($this, 'phar_dir_echo') + ); + } + // }}} + // {{{ cli_cmd_inf_extract + /** + * Cli Command Inf Extract + * + * @return string The description of the command extra to a directory. + */ + static function cli_cmd_inf_extract() + { + return "Extract a PHAR package to a directory."; + } + // }}} + // {{{ static function cli_cmd_arg_extract + /** + * Cli Command Arguments Extract + * + * The arguments for the extract function. + * + * @return array The arguments for the extraction. + */ + static function cli_cmd_arg_extract() + { + $args = self::phar_args('Fix', 'phar'); + + $args[''] = array( + 'type' => 'dir', + 'val' => '.', + 'inf' => ' Directory to extract to (defaults to \'.\').', + ); + + return $args; + } + // }}} + // {{{ public function cli_cmd_run_extract + /** + * Run Extract + * + * Run the extraction of a phar Archive. + * + * @see $this->phar_dir_operation + */ + public function cli_cmd_run_extract() + { + $dir = $this->args['']['val']; + + if (is_array($dir)) { + if (count($dir) != 1) { + self::error("Only one target directory allowed.\n"); + } else { + $dir = $dir[0]; + } + } + + $phar = $args['f']['val']; + $base = $phar->getPathname(); + $bend = strpos($base, '.phar'); + $bend = strpos($base, '/', $bend); + $base = substr($base, 0, $bend + 1); + $blen = strlen($base); + + $this->phar_dir_operation( + new RecursiveIteratorIterator($phar), + array($this, 'phar_dir_extract'), + array($blen, $dir) + ); + } + // }}} + // {{{ public function phar_dir_extract + /** + * Extract to a directory + * + * This function will extract the content of a Phar + * to a directory and create new files and directories + * depending on the permissions on that folder. + * + * @param string $pn + * @param string $f The file name + * @param array $args The directory and Blen informations + */ + public function phar_dir_extract($pn, $f, $args) + { + $blen = $args[0]; + $dir = $args[1]; + $sub = substr($pn, $blen); + $target = $dir . '/' . $sub; + + if (!file_exists(dirname($target))) { + if (!is_writable(dirname($target))) { + self::error("Operation could not be completed\n"); + } + + mkdir(dirname($target)); + } + + echo "$sub"; + + if (!@copy($f, $target)) { + echo " ...error\n"; + } else { + echo " ...ok\n"; + } + } + // }}} + // {{{ static function cli_cmd_inf_delete + /** + * Delete an entry from a phar information. + * + * @return string The information + */ + static function cli_cmd_inf_delete() + { + return 'Delete entry from a PHAR archive'; + } + // }}} + // {{{ static function cli_cmd_arg_delete + /** + * The cli command argument for deleting. + * + * @return array informations about the arguments to use. + */ + static function cli_cmd_arg_delete() + { + return self::phar_args('FE', 'phar'); + } + // }}} + // {{{ public function cli_cmd_run_delete + /** + * Deleting execution + * + * Execute the deleting of the file from the phar archive. + */ + public function cli_cmd_run_delete() + { + $phar = $this->args['f']['val']; + $entry = $this->args['e']['val']; + + $phar->startBuffering(); + unset($phar[$entry]); + $phar->stopBuffering(); + } + // }}} + // {{{ static function cli_cmd_inf_add + /** + * Client comment add file information + * + * @return string The description of the feature + */ + static function cli_cmd_inf_add() + { + return "Add entries to a PHAR package."; + } + // }}} + // {{{ static function cli_cmd_arg_add + /** + * Add a file arguments + */ + static function cli_cmd_arg_add() + { + $args = self::phar_args('acFilx', 'phar'); + $args[''] = array( + 'type' => 'any', + 'val' => NULL, + 'required' => 1, + 'inf' => ' Any number of input files and directories. If -i is in use then ONLY files and matching thegiven regular expression are being packed. If -x is given then files matching that regular expression are NOT being packed.', + ); + return $args; + } + // }}} + // {{{ public functio cli_cmd_run_add + /** + * Add a file + * + * Run the action of adding a file to + * a phar archive. + */ + public function cli_cmd_run_add() + { + $compress= $this->args['c']['val']; + $phar = $this->args['f']['val']; + $regex = $this->args['i']['val']; + $level = $this->args['l']['val']; + $invregex= $this->args['x']['val']; + $input = $this->args['']['val']; + + $phar->startBuffering(); + + if (!is_array($input)) { + $this->phar_add($phar, $level, $input, $regex, $invregex, NULL, $compress); + } else { + foreach($input as $i) { + $this->phar_add($phar, $level, $i, $regex, $invregex, NULL, $compress); + } + } + $phar->stopBuffering(); + exit(0); + } + // }}} + // {{{ public function cli_cmd_inf_stub_set + /** + * Set the stup of a phar file. + * + * @return string The stub set description. + */ + public function cli_cmd_inf_stub_set() + { + return "Set the stub of a PHAR file. " . + "If no input file is specified as stub then stdin is being used."; + } + // }}} + // {{{ public function cli_cmd_arg_stub_set + /** + * Set the argument stub + * + * @return string arguments for a stub + */ + public function cli_cmd_arg_stub_set() + { + $args = self::phar_args('Fs', 'phar'); + $args['s']['val'] = 'php://stdin'; + return $args; + } + // }}} + // {{{ public function cli_cmd_run_stub_set + /** + * Cli Command run stub set + * + * @see $phar->setStub() + */ + public function cli_cmd_run_stub_set() + { + $phar = $this->args['f']['val']; + $stub = $this->args['s']['val']; + + $phar->setStub(file_get_contents($stub)); + } + // }}} + // {{{ public function cli_cmd_inf_stub_get + /** + * Get the command stub infos. + * + * @return string a description of the stub of a Phar file. + */ + public function cli_cmd_inf_stub_get() + { + return "Get the stub of a PHAR file. " . + "If no output file is specified as stub then stdout is being used."; + } + // }}} + // {{{ public function cli_cmd_arg_stub_get + /** + * Get the argument stub + * + * @return array $args The arguments passed to the stub. + */ + public function cli_cmd_arg_stub_get() + { + $args = self::phar_args('Fs', 'phar'); + $args['s']['val'] = 'php://stdin'; + return $args; + } + // }}} + // {{{ public function cli_cmd_run_stub_get + /** + * Cli Command Run Stub + * + * Get arguments and store them into a stub. + * + * @param arguments $args + * @see $this->args + */ + public function cli_cmd_run_stub_get($args) + { + $phar = $this->args['f']['val']; + $stub = $this->args['s']['val']; + + file_put_contents($stub, $phar->getStub()); + } + // }}} + // {{{ public function cli_cmd_inf_compress + /** + * Cli Command Inf Compress + * + * Cli Command compress informations + * + * @return string A description of the command. + */ + public function cli_cmd_inf_compress() + { + return "Compress or uncompress all files or a selected entry."; + } + // }}} + // {{{ public function cli_cmd_arg_cmpress + /** + * Cli Command Arg Compress + * + * @return array The arguments for compress + */ + public function cli_cmd_arg_compress() + { + return self::phar_args('FCe', 'phar'); + } + // }}} + // {{{ public function cli_cmd_run_compress + /** + * Cli Command Run Compress + * + * @see $this->args + */ + public function cli_cmd_run_compress() + { + $phar = $this->args['f']['val']; + $entry = $this->args['e']['val']; + + switch($this->args['c']['val']) { + case 'gz': + case 'gzip': + if (isset($entry)) { + $phar[$entry]->setCompressedGZ(); + } else { + $phar->compressAllFilesGZ(); + } + break; + case 'bz2': + case 'bzip2': + if (isset($entry)) { + $phar[$entry]->setCompressedBZIP2(); + } else { + $phar->compressAllFilesBZIP2(); + } + break; + default: + if (isset($entry)) { + $phar[$entry]->setUncompressed(); + } else { + $phar->uncompressAllFiles(); + } + break; + } + } + // }}} + // {{{ public function cli_cmd_inf_sign + /** + * Cli Command Info Signature + * + * @return string A description of the signature arguments. + */ + public function cli_cmd_inf_sign() + { + return "Set signature hash algorithm."; + } + // }}} + // {{{ public function cli_cmd_arg_sign + /** + * Cli Command Argument Sign + * + * @return array Arguments for Signature + */ + public function cli_cmd_arg_sign() + { + return self::phar_args('FH', 'phar'); + } + // }}} + // {{{ public function cli_cmd_run_sign + /** + * Cli Command Run Signature + * + * @see $phar->setSignaturealgorithm + */ + public function cli_cmd_run_sign() + { + $phar = $this->args['f']['val']; + $hash = $this->args['h']['val']; + + $phar->setSignatureAlgorithm($hash); + } + // }}} + // {{{ public function cli_cmd_inf_meta_set + /** + * Cli Command Inf Meta Set + * + * @return string A description + */ + public function cli_cmd_inf_meta_set() + { + return "Set meta data of a PHAR entry or a PHAR package using serialized input. " . + "If no input file is specified for meta data then stdin is being used." . + "You can also specify a particular index using -k. In that case the metadata is " . + "expected to be an array and the value of the given index is being set. If " . + "the metadata is not present or empty a new array will be created. If the " . + "metadata is present and a flat value then the return value is 1. Also using -k " . + "the input is been taken directly rather then being serialized."; + } + // }}} + // {{{ public function cli_cmd_arg_meta_set + /** + * Cli Command Argument Meta Set + * + * @return array The arguments for meta set + */ + public function cli_cmd_arg_meta_set() + { + return self::phar_args('FekM', 'phar'); + } + // }}} + // {{{ public function cli_cmd_run_met_set + /** + * Cli Command Run Metaset + * + * @see $phar->startBuffering + * @see $phar->setMetadata + * @see $phar->stopBuffering + */ + public function cli_cmd_run_meta_set() + { + $phar = $this->args['f']['val']; + $entry = $this->args['e']['val']; + $index = $this->args['k']['val']; + $meta = $this->args['m']['val']; + + $phar->startBuffering(); + + if (isset($index)) { + if (isset($entry)) { + if ($phar[$entry]->hasMetadata()) { + $old = $phar[$entry]->getMetadata(); + } else { + $old = array(); + } + } else { + if ($phar->hasMetadata()) { + $old = $phar->getMetadata(); + } else { + $old = array(); + } + } + + if (!is_array($old)) { + self::error('Metadata is a flat value while an index operation was issued.'); + } + + $old[$index] = $meta; + $meta = $old; + } else { + $meta = unserialize($meta); + } + + if (isset($entry)) { + $phar[$entry]->setMetadata($meta); + } else { + $phar->setMetadata($meta); + } + $phar->stopBuffering(); + } + // }}} + // {{{ public function cli_cmd_inf_met_get + /** + * Cli Command Inf Metaget + * + * @return string A description of the metaget arguments + */ + public function cli_cmd_inf_meta_get() + { + return "Get meta information of a PHAR entry or a PHAR package in serialized from. " . + "If no output file is specified for meta data then stdout is being used.\n" . + "You can also specify a particular index using -k. In that case the metadata is " . + "expected to be an array and the value of the given index is returned using echo " . + "rather than using serialize. If that index does not exist or no meta data is " . + "present then the return value is 1."; + } + // }}} + // {{{ public function cli_cmd_arg_meta_get + /** + * Cli Command arg metaget + * + * @return array The arguments for meta get. + */ + public function cli_cmd_arg_meta_get() + { + return self::phar_args('Fek', 'phar'); + } + // }}} + // {{{ public function cli_cmd_run_meta_get + /** + * Cli Command Run Metaget + * + * @see $this->args + * @see $phar[$x]->hasMetadata() + * @see $phar->getMetadata() + */ + public function cli_cmd_run_meta_get() + { + $phar = $this->args['f']['val']; + $entry = $this->args['e']['val']; + $index = $this->args['k']['val']; + + if (isset($entry)) { + if (!$phar[$entry]->hasMetadata()) { + exit(1); + } + echo serialize($phar[$entry]->getMetadata()); + } else { + if (!$phar->hasMetadata()) { + exit(1); + } + $meta = $phar->getMetadata(); + } + + if (isset($index)) { + if (isset($index)) { + if (isset($meta[$index])) { + echo $meta[$index]; + exit(0); + } else { + exit(1); + } + } else { + echo serialize($meta); + } + } + } + // }}} + // {{{ public function cli_cmd_inf_meta_del + /** + * Cli Command Inf Metadel + * + * @return string A description of the metadel function + */ + public function cli_cmd_inf_meta_del() + { + return "Delete meta information of a PHAR entry or a PHAR package.\n" . + "If -k is given then the metadata is expected to be an array " . + "and the given index is being deleted.\n" . + "If something was deleted the return value is 0 otherwise it is 1."; + } + // }}} + // {{{ public function cli_cmd_arg_meta_del + /** + * CliC ommand Arg Metadelete + * + * @return array The arguments for metadel + */ + public function cli_cmd_arg_meta_del() + { + return self::phar_args('Fek', 'phar'); + } + // }}} + // {{{ public function cli_cmd_run_meta_del + /** + * Cli Command Run MetaDel + * + * @see $phar[$x]->delMetadata() + * @see $phar->delMetadata() + */ + public function cli_cmd_run_meta_del() + { + $phar = $this->args['f']['val']; + $entry = $this->args['e']['val']; + $index = $this->args['k']['val']; + + if (isset($entry)) { + if (isset($index)) { + if (!$phar[$entry]->hasMetadata()) { + exit(1); + } + $meta = $phar[$entry]->getMetadata(); + + // @todo add error message here. + if (!is_array($meta)) { + exit(1); + } + + unset($meta[$index]); + $phar[$entry]->setMetadata($meta); + } else { + exit($phar[$entry]->delMetadata() ? 0 : 1); + } + } else { + if (isset($index)) { + if (!$phar->hasMetadata()) { + exit(1); + } + + $meta = $phar->getMetadata(); + + // @todo Add error message + if (!is_array($meta)) { + exit(1); + } + + unset($meta[$index]); + $phar->setMetadata($meta); + } else { + exit($phar->delMetadata() ? 0 : 1); + } + } + } + // }}} + // {{{ public function cli_cmd_inf_info + /** + * CLi Command Inf Info + * + * @return string A description about the info commands. + */ + public function cli_cmd_inf_info() + { + return "Get information about a PHAR package.\n" . + "By using -k it is possible to return a single value."; + } + // }}} + // {{{ public function cli_cmd_arg_info + /** + * Cli Command Arg Infos + * + * @return array The arguments for info command. + */ + public function cli_cmd_arg_info() + { + return self::phar_args('Fk', 'phar'); + } + // }}} + // {{{ public function cli_cmd_run_info + /** + * Cli Command Run Info + * + * @param args $args + */ + public function cli_cmd_run_info() + { + $phar = $this->args['f']['val']; + $index = $this->args['k']['val']; + + $hash = $phar->getSignature(); + $infos = array(); + + if ($phar->getAlias()) { + $infos['Alias'] = $phar->getAlias(); + } + + if (!$hash) { + $infos['Hash-type'] = 'NONE'; + } else { + $infos['Hash-type'] = $hash['hash_type']; + $infos['Hash'] = $hash['hash']; + } + + $csize = 0; + $usize = 0; + $count = 0; + $ccount = 0; + $ucount = 0; + $mcount = 0; + $compalg = array('GZ'=>0, 'BZ2'=>0); + + foreach(new RecursiveIteratorIterator($phar) as $ent) { + $count++; + if ($ent->isCompressed()) { + $ccount++; + $csize += $ent->getCompressedSize(); + if ($ent->isCompressedGZ()) { + $compalg['GZ']++; + } elseif ($ent->isCompressedBZIP2()) { + $compalg['BZ2']++; + } + } else { + $ucount++; + $csize += $ent->getSize(); + } + + $usize += $ent->getSize(); + + if ($ent->hasMetadata()) { + $mcount++; + } + } + + $infos['Entries'] = $count; + $infos['Uncompressed-files'] = $ucount; + $infos['Compressed-files'] = $ccount; + $infos['Compressed-gz'] = $compalg['GZ']; + $infos['Compressed-bz2'] = $compalg['BZ2']; + $infos['Uncompressed-size'] = $usize; + $infos['Compressed-size'] = $csize; + $infos['Compression-ratio'] = sprintf('%.3g%%', ($csize * 100) / $usize); + $infos['Metadata-global'] = $phar->hasMetadata() * 1; + $infos['Metadata-files'] = $mcount; + + if (isset($index)) { + if (!isset($infos[$index])) { + self::error("Requested value does not exist.\n"); + } + + echo $infos[$index]; + exit(0); + } + + $l = 0; + foreach($infos as $which => $val) { + $l = max(strlen($which), $l); + } + + foreach($infos as $which => $val) { + echo $which . ':' . str_repeat(' ', $l + 1 - strlen($which)) . $val . "\n"; + } + } + // }}} +} +// }}} ?>