<?php
-/** @file pharcommand.inc
+/**
+ * @file pharcommand.inc
* @ingroup Phar
* @brief class CLICommand
* @author Marcus Boerger
*
* Phar Command
*/
-
-/** @ingroup Phar
+// {{{ class PharCommand extends CLICommand
+/**
+ * PharCommand class
+ *
+ * This class handles the handling of the phar
+ * commands. It will be used from command line/console
+ * in order to retrieve and execute phar functions.
+ *
+ * @ingroup Phar
* @brief Phar console command implementation
* @author Marcus Boerger
* @version 1.0
*/
class PharCommand extends CLICommand
{
- function cli_get_SP2($l1, $arg_inf)
- {
- return str_repeat(' ', $l1 + 2 + 4 + 9);
- }
-
- function cli_get_SP3($l1, $l2, $arg_inf)
- {
- return str_repeat(' ', $l1 + 2 + 4 + 9 + 2 + $l2 + 2);
- }
-
- static function phar_args($which, $phartyp)
- {
- $phar_args = array(
- 'a' => array(
- 'typ' => 'alias',
- 'val' => NULL,
- 'inf' => '<alias> 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' => '<alias> Provide an alias name for the phar file.'
),
- 'c' => array(
- 'typ' => 'compalg',
- 'val' => NULL,
- 'inf' => '<algo> Compression algorithm.',
+ 'c' => array(
+ 'type' => 'compalg',
+ 'val' => NULL,
+ 'inf' => '<algo> Compression algorithm.',
'select' => array(
'0' => 'No compression',
'none' => 'No compression',
'auto' => 'Automatically select compression algorithm'
)
),
- 'e' => array(
- 'typ' => 'entry',
- 'val' => NULL,
- 'inf' => '<entry> Name of entry to work on (must include PHAR internal directory name if any).'
+ 'e' => array(
+ 'type' => 'entry',
+ 'val' => NULL,
+ 'inf' => '<entry> Name of entry to work on (must include PHAR internal directory name if any).'
),
- 'f' => array(
- 'typ' => $phartyp,
- 'val' => NULL,
- 'inf' => '<file> Specifies the phar file to work on.'
+ 'f' => array(
+ 'type' => $phartype,
+ 'val' => NULL,
+ 'inf' => '<file> Specifies the phar file to work on.'
),
- 'h' => array(
- 'typ' => 'select',
- 'val' => NULL,
- 'inf' => '<method> Selects the hash algorithmn.',
+ 'h' => array(
+ 'type' => 'select',
+ 'val' => NULL,
+ 'inf' => '<method> Selects the hash algorithmn.',
'select' => array('md5' => 'MD5','sha1' => 'SHA1')
),
- 'i' => array(
- 'typ' => 'regex',
- 'val' => NULL,
+ 'i' => array(
+ 'type' => 'regex',
+ 'val' => NULL,
'inf' => '<regex> Specifies a regular expression for input files.'
),
'k' => array(
- 'typ' => 'any',
- 'val' => NULL,
- 'inf' => '<index> Subscription index to work on.',
+ 'type' => 'any',
+ 'val' => NULL,
+ 'inf' => '<index> Subscription index to work on.',
),
'l' => array(
- 'typ' => 'int',
- 'val' => 0,
- 'inf' => '<level> Number of preceeding subdirectories to strip from file entries.',
+ 'type' => 'int',
+ 'val' => 0,
+ 'inf' => '<level> Number of preceeding subdirectories to strip from file entries',
),
- 'm' => array(
- 'typ' => 'any',
- 'val' => NULL,
+ 'm' => array(
+ 'type' => 'any',
+ 'val' => NULL,
'inf' => '<meta> Meta data to store with entry (serialized php data).'
),
'p' => array(
- 'typ' => 'file',
- 'val' => NULL,
- 'inf' => '<loader> 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' => '<loader> Location of PHP_Archive class file (pear list-files PHP_Archive).',
),
- 's' => array(
- 'typ' => 'file',
- 'val' => NULL,
+ 's' => array(
+ 'type' => 'file',
+ 'val' => NULL,
'inf' => '<stub> Select the stub file.'
),
- 'x' => array(
- 'typ' => 'regex',
- 'val' => NULL,
+ 'x' => array(
+ 'type' => 'regex',
+ 'val' => NULL,
'inf' => '<regex> 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 <stub>, 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.= '<?php if (!class_exists("Phar",0) && !class_exists("PHP_Archive")) { ?>';
- $s.= file_get_contents($loader);
- $s.= '<?php class Phar extends PHP_Archive {} } ?>';
- 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:
+ * <code>
+ * $arg = 'pharchive.phar/file.php';
+ * cli_arg_type_pharurl($arg)
+ * </code>
+ *
+ * @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 <stub>, 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 .= '<?php if (!class_exists("Phar",0) && !class_exists("PHP_Archive")) { ?>';
+ $s .= file_get_contents($loader);
+ $s .= '<?php class Phar extends PHP_Archive { } }?>';
+
+ 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";
+ }
+ }
+ // }}}
+}
+// }}}
?>