/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Remote.xml |
---|
New file |
0,0 → 1,109 |
<commands version="1.0"> |
<remote-info> |
<summary>Information About Remote Packages</summary> |
<function>doRemoteInfo</function> |
<shortcut>ri</shortcut> |
<options /> |
<doc><package> |
Get details on a package from the server.</doc> |
</remote-info> |
<list-upgrades> |
<summary>List Available Upgrades</summary> |
<function>doListUpgrades</function> |
<shortcut>lu</shortcut> |
<options> |
<channelinfo> |
<shortopt>i</shortopt> |
<doc>output fully channel-aware data, even on failure</doc> |
</channelinfo> |
</options> |
<doc>[preferred_state] |
List releases on the server of packages you have installed where |
a newer version is available with the same release state (stable etc.) |
or the state passed as the second parameter.</doc> |
</list-upgrades> |
<remote-list> |
<summary>List Remote Packages</summary> |
<function>doRemoteList</function> |
<shortcut>rl</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>specify a channel other than the default channel</doc> |
<arg>CHAN</arg> |
</channel> |
</options> |
<doc> |
Lists the packages available on the configured server along with the |
latest stable release of each package.</doc> |
</remote-list> |
<search> |
<summary>Search remote package database</summary> |
<function>doSearch</function> |
<shortcut>sp</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>specify a channel other than the default channel</doc> |
<arg>CHAN</arg> |
</channel> |
<allchannels> |
<shortopt>a</shortopt> |
<doc>search packages from all known channels</doc> |
</allchannels> |
<channelinfo> |
<shortopt>i</shortopt> |
<doc>output fully channel-aware data, even on failure</doc> |
</channelinfo> |
</options> |
<doc>[packagename] [packageinfo] |
Lists all packages which match the search parameters. The first |
parameter is a fragment of a packagename. The default channel |
will be used unless explicitly overridden. The second parameter |
will be used to match any portion of the summary/description</doc> |
</search> |
<list-all> |
<summary>List All Packages</summary> |
<function>doListAll</function> |
<shortcut>la</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>specify a channel other than the default channel</doc> |
<arg>CHAN</arg> |
</channel> |
<channelinfo> |
<shortopt>i</shortopt> |
<doc>output fully channel-aware data, even on failure</doc> |
</channelinfo> |
</options> |
<doc> |
Lists the packages available on the configured server along with the |
latest stable release of each package.</doc> |
</list-all> |
<download> |
<summary>Download Package</summary> |
<function>doDownload</function> |
<shortcut>d</shortcut> |
<options> |
<nocompress> |
<shortopt>Z</shortopt> |
<doc>download an uncompressed (.tar) file</doc> |
</nocompress> |
</options> |
<doc><package>... |
Download package tarballs. The files will be named as suggested by the |
server, for example if you download the DB package and the latest stable |
version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz.</doc> |
</download> |
<clear-cache> |
<summary>Clear Web Services Cache</summary> |
<function>doClearCache</function> |
<shortcut>cc</shortcut> |
<options /> |
<doc> |
Clear the XML-RPC/REST cache. See also the cache_ttl configuration |
parameter. |
</doc> |
</clear-cache> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Channels.xml |
---|
New file |
0,0 → 1,123 |
<commands version="1.0"> |
<list-channels> |
<summary>List Available Channels</summary> |
<function>doList</function> |
<shortcut>lc</shortcut> |
<options /> |
<doc> |
List all available channels for installation. |
</doc> |
</list-channels> |
<update-channels> |
<summary>Update the Channel List</summary> |
<function>doUpdateAll</function> |
<shortcut>uc</shortcut> |
<options /> |
<doc> |
List all installed packages in all channels. |
</doc> |
</update-channels> |
<channel-delete> |
<summary>Remove a Channel From the List</summary> |
<function>doDelete</function> |
<shortcut>cde</shortcut> |
<options /> |
<doc><channel name> |
Delete a channel from the registry. You may not |
remove any channel that has installed packages. |
</doc> |
</channel-delete> |
<channel-add> |
<summary>Add a Channel</summary> |
<function>doAdd</function> |
<shortcut>ca</shortcut> |
<options /> |
<doc><channel.xml> |
Add a private channel to the channel list. Note that all |
public channels should be synced using "update-channels". |
Parameter may be either a local file or remote URL to a |
channel.xml. |
</doc> |
</channel-add> |
<channel-update> |
<summary>Update an Existing Channel</summary> |
<function>doUpdate</function> |
<shortcut>cu</shortcut> |
<options> |
<force> |
<shortopt>f</shortopt> |
<doc>will force download of new channel.xml if an existing channel name is used</doc> |
</force> |
<channel> |
<shortopt>c</shortopt> |
<doc>will force download of new channel.xml if an existing channel name is used</doc> |
<arg>CHANNEL</arg> |
</channel> |
</options> |
<doc>[<channel.xml>|<channel name>] |
Update a channel in the channel list directly. Note that all |
public channels can be synced using "update-channels". |
Parameter may be a local or remote channel.xml, or the name of |
an existing channel. |
</doc> |
</channel-update> |
<channel-info> |
<summary>Retrieve Information on a Channel</summary> |
<function>doInfo</function> |
<shortcut>ci</shortcut> |
<options /> |
<doc><package> |
List the files in an installed package. |
</doc> |
</channel-info> |
<channel-alias> |
<summary>Specify an alias to a channel name</summary> |
<function>doAlias</function> |
<shortcut>cha</shortcut> |
<options /> |
<doc><channel> <alias> |
Specify a specific alias to use for a channel name. |
The alias may not be an existing channel name or |
alias. |
</doc> |
</channel-alias> |
<channel-discover> |
<summary>Initialize a Channel from its server</summary> |
<function>doDiscover</function> |
<shortcut>di</shortcut> |
<options /> |
<doc>[<channel.xml>|<channel name>] |
Initialize a channel from its server and create a local channel.xml. |
If <channel name> is in the format "<username>:<password>@<channel>" then |
<username> and <password> will be set as the login username/password for |
<channel>. Use caution when passing the username/password in this way, as |
it may allow other users on your computer to briefly view your username/ |
password via the system's process list. |
</doc> |
</channel-discover> |
<channel-login> |
<summary>Connects and authenticates to remote channel server</summary> |
<function>doLogin</function> |
<shortcut>cli</shortcut> |
<options /> |
<doc><channel name> |
Log in to a remote channel server. If <channel name> is not supplied, |
the default channel is used. To use remote functions in the installer |
that require any kind of privileges, you need to log in first. The |
username and password you enter here will be stored in your per-user |
PEAR configuration (~/.pearrc on Unix-like systems). After logging |
in, your username and password will be sent along in subsequent |
operations on the remote server.</doc> |
</channel-login> |
<channel-logout> |
<summary>Logs out from the remote channel server</summary> |
<function>doLogout</function> |
<shortcut>clo</shortcut> |
<options /> |
<doc><channel name> |
Logs out from a remote channel server. If <channel name> is not supplied, |
the default channel is used. This command does not actually connect to the |
remote server, it only deletes the stored username and password from your user |
configuration.</doc> |
</channel-logout> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Package.xml |
---|
New file |
0,0 → 1,237 |
<commands version="1.0"> |
<package> |
<summary>Build Package</summary> |
<function>doPackage</function> |
<shortcut>p</shortcut> |
<options> |
<nocompress> |
<shortopt>Z</shortopt> |
<doc>Do not gzip the package file</doc> |
</nocompress> |
<showname> |
<shortopt>n</shortopt> |
<doc>Print the name of the packaged file.</doc> |
</showname> |
</options> |
<doc>[descfile] [descfile2] |
Creates a PEAR package from its description file (usually called |
package.xml). If a second packagefile is passed in, then |
the packager will check to make sure that one is a package.xml |
version 1.0, and the other is a package.xml version 2.0. The |
package.xml version 1.0 will be saved as "package.xml" in the archive, |
and the other as "package2.xml" in the archive" |
</doc> |
</package> |
<package-validate> |
<summary>Validate Package Consistency</summary> |
<function>doPackageValidate</function> |
<shortcut>pv</shortcut> |
<options /> |
<doc> |
</doc> |
</package-validate> |
<cvsdiff> |
<summary>Run a "cvs diff" for all files in a package</summary> |
<function>doCvsDiff</function> |
<shortcut>cd</shortcut> |
<options> |
<quiet> |
<shortopt>q</shortopt> |
<doc>Be quiet</doc> |
</quiet> |
<reallyquiet> |
<shortopt>Q</shortopt> |
<doc>Be really quiet</doc> |
</reallyquiet> |
<date> |
<shortopt>D</shortopt> |
<doc>Diff against revision of DATE</doc> |
<arg>DATE</arg> |
</date> |
<release> |
<shortopt>R</shortopt> |
<doc>Diff against tag for package release REL</doc> |
<arg>REL</arg> |
</release> |
<revision> |
<shortopt>r</shortopt> |
<doc>Diff against revision REV</doc> |
<arg>REV</arg> |
</revision> |
<context> |
<shortopt>c</shortopt> |
<doc>Generate context diff</doc> |
</context> |
<unified> |
<shortopt>u</shortopt> |
<doc>Generate unified diff</doc> |
</unified> |
<ignore-case> |
<shortopt>i</shortopt> |
<doc>Ignore case, consider upper- and lower-case letters equivalent</doc> |
</ignore-case> |
<ignore-whitespace> |
<shortopt>b</shortopt> |
<doc>Ignore changes in amount of white space</doc> |
</ignore-whitespace> |
<ignore-blank-lines> |
<shortopt>B</shortopt> |
<doc>Ignore changes that insert or delete blank lines</doc> |
</ignore-blank-lines> |
<brief> |
<shortopt></shortopt> |
<doc>Report only whether the files differ, no details</doc> |
</brief> |
<dry-run> |
<shortopt>n</shortopt> |
<doc>Don't do anything, just pretend</doc> |
</dry-run> |
</options> |
<doc><package.xml> |
Compares all the files in a package. Without any options, this |
command will compare the current code with the last checked-in code. |
Using the -r or -R option you may compare the current code with that |
of a specific release. |
</doc> |
</cvsdiff> |
<svntag> |
<summary>Set SVN Release Tag</summary> |
<function>doSvnTag</function> |
<shortcut>sv</shortcut> |
<options> |
<quiet> |
<shortopt>q</shortopt> |
<doc>Be quiet</doc> |
</quiet> |
<slide> |
<shortopt>F</shortopt> |
<doc>Move (slide) tag if it exists</doc> |
</slide> |
<delete> |
<shortopt>d</shortopt> |
<doc>Remove tag</doc> |
</delete> |
<dry-run> |
<shortopt>n</shortopt> |
<doc>Don't do anything, just pretend</doc> |
</dry-run> |
</options> |
<doc><package.xml> [files...] |
Sets a SVN tag on all files in a package. Use this command after you have |
packaged a distribution tarball with the "package" command to tag what |
revisions of what files were in that release. If need to fix something |
after running svntag once, but before the tarball is released to the public, |
use the "slide" option to move the release tag. |
to include files (such as a second package.xml, or tests not included in the |
release), pass them as additional parameters. |
</doc> |
</svntag> |
<cvstag> |
<summary>Set CVS Release Tag</summary> |
<function>doCvsTag</function> |
<shortcut>ct</shortcut> |
<options> |
<quiet> |
<shortopt>q</shortopt> |
<doc>Be quiet</doc> |
</quiet> |
<reallyquiet> |
<shortopt>Q</shortopt> |
<doc>Be really quiet</doc> |
</reallyquiet> |
<slide> |
<shortopt>F</shortopt> |
<doc>Move (slide) tag if it exists</doc> |
</slide> |
<delete> |
<shortopt>d</shortopt> |
<doc>Remove tag</doc> |
</delete> |
<dry-run> |
<shortopt>n</shortopt> |
<doc>Don't do anything, just pretend</doc> |
</dry-run> |
</options> |
<doc><package.xml> [files...] |
Sets a CVS tag on all files in a package. Use this command after you have |
packaged a distribution tarball with the "package" command to tag what |
revisions of what files were in that release. If need to fix something |
after running cvstag once, but before the tarball is released to the public, |
use the "slide" option to move the release tag. |
to include files (such as a second package.xml, or tests not included in the |
release), pass them as additional parameters. |
</doc> |
</cvstag> |
<package-dependencies> |
<summary>Show package dependencies</summary> |
<function>doPackageDependencies</function> |
<shortcut>pd</shortcut> |
<options /> |
<doc><package-file> or <package.xml> or <install-package-name> |
List all dependencies the package has. |
Can take a tgz / tar file, package.xml or a package name of an installed package.</doc> |
</package-dependencies> |
<sign> |
<summary>Sign a package distribution file</summary> |
<function>doSign</function> |
<shortcut>si</shortcut> |
<options> |
<verbose> |
<shortopt>v</shortopt> |
<doc>Display GnuPG output</doc> |
</verbose> |
</options> |
<doc><package-file> |
Signs a package distribution (.tar or .tgz) file with GnuPG.</doc> |
</sign> |
<makerpm> |
<summary>Builds an RPM spec file from a PEAR package</summary> |
<function>doMakeRPM</function> |
<shortcut>rpm</shortcut> |
<options> |
<spec-template> |
<shortopt>t</shortopt> |
<doc>Use FILE as RPM spec file template</doc> |
<arg>FILE</arg> |
</spec-template> |
<rpm-pkgname> |
<shortopt>p</shortopt> |
<doc>Use FORMAT as format string for RPM package name, %s is replaced |
by the PEAR package name, defaults to "PEAR::%s".</doc> |
<arg>FORMAT</arg> |
</rpm-pkgname> |
</options> |
<doc><package-file> |
Creates an RPM .spec file for wrapping a PEAR package inside an RPM |
package. Intended to be used from the SPECS directory, with the PEAR |
package tarball in the SOURCES directory: |
$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz |
Wrote RPM spec file PEAR::Net_Geo-1.0.spec |
$ rpm -bb PEAR::Net_Socket-1.0.spec |
... |
Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm |
</doc> |
</makerpm> |
<convert> |
<summary>Convert a package.xml 1.0 to package.xml 2.0 format</summary> |
<function>doConvert</function> |
<shortcut>c2</shortcut> |
<options> |
<flat> |
<shortopt>f</shortopt> |
<doc>do not beautify the filelist.</doc> |
</flat> |
</options> |
<doc>[descfile] [descfile2] |
Converts a package.xml in 1.0 format into a package.xml |
in 2.0 format. The new file will be named package2.xml by default, |
and package.xml will be used as the old file by default. |
This is not the most intelligent conversion, and should only be |
used for automated conversion or learning the format. |
</doc> |
</convert> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Config.php |
---|
New file |
0,0 → 1,414 |
<?php |
/** |
* PEAR_Command_Config (config-show, config-get, config-set, config-help, config-create commands) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 0.1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
/** |
* PEAR commands for managing configuration data. |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 0.1 |
*/ |
class PEAR_Command_Config extends PEAR_Command_Common |
{ |
var $commands = array( |
'config-show' => array( |
'summary' => 'Show All Settings', |
'function' => 'doConfigShow', |
'shortcut' => 'csh', |
'options' => array( |
'channel' => array( |
'shortopt' => 'c', |
'doc' => 'show configuration variables for another channel', |
'arg' => 'CHAN', |
), |
), |
'doc' => '[layer] |
Displays all configuration values. An optional argument |
may be used to tell which configuration layer to display. Valid |
configuration layers are "user", "system" and "default". To display |
configurations for different channels, set the default_channel |
configuration variable and run config-show again. |
', |
), |
'config-get' => array( |
'summary' => 'Show One Setting', |
'function' => 'doConfigGet', |
'shortcut' => 'cg', |
'options' => array( |
'channel' => array( |
'shortopt' => 'c', |
'doc' => 'show configuration variables for another channel', |
'arg' => 'CHAN', |
), |
), |
'doc' => '<parameter> [layer] |
Displays the value of one configuration parameter. The |
first argument is the name of the parameter, an optional second argument |
may be used to tell which configuration layer to look in. Valid configuration |
layers are "user", "system" and "default". If no layer is specified, a value |
will be picked from the first layer that defines the parameter, in the order |
just specified. The configuration value will be retrieved for the channel |
specified by the default_channel configuration variable. |
', |
), |
'config-set' => array( |
'summary' => 'Change Setting', |
'function' => 'doConfigSet', |
'shortcut' => 'cs', |
'options' => array( |
'channel' => array( |
'shortopt' => 'c', |
'doc' => 'show configuration variables for another channel', |
'arg' => 'CHAN', |
), |
), |
'doc' => '<parameter> <value> [layer] |
Sets the value of one configuration parameter. The first argument is |
the name of the parameter, the second argument is the new value. Some |
parameters are subject to validation, and the command will fail with |
an error message if the new value does not make sense. An optional |
third argument may be used to specify in which layer to set the |
configuration parameter. The default layer is "user". The |
configuration value will be set for the current channel, which |
is controlled by the default_channel configuration variable. |
', |
), |
'config-help' => array( |
'summary' => 'Show Information About Setting', |
'function' => 'doConfigHelp', |
'shortcut' => 'ch', |
'options' => array(), |
'doc' => '[parameter] |
Displays help for a configuration parameter. Without arguments it |
displays help for all configuration parameters. |
', |
), |
'config-create' => array( |
'summary' => 'Create a Default configuration file', |
'function' => 'doConfigCreate', |
'shortcut' => 'coc', |
'options' => array( |
'windows' => array( |
'shortopt' => 'w', |
'doc' => 'create a config file for a windows install', |
), |
), |
'doc' => '<root path> <filename> |
Create a default configuration file with all directory configuration |
variables set to subdirectories of <root path>, and save it as <filename>. |
This is useful especially for creating a configuration file for a remote |
PEAR installation (using the --remoteconfig option of install, upgrade, |
and uninstall). |
', |
), |
); |
/** |
* PEAR_Command_Config constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
function doConfigShow($command, $options, $params) |
{ |
$layer = null; |
if (is_array($params)) { |
$layer = isset($params[0]) ? $params[0] : null; |
} |
// $params[0] -> the layer |
if ($error = $this->_checkLayer($layer)) { |
return $this->raiseError("config-show:$error"); |
} |
$keys = $this->config->getKeys(); |
sort($keys); |
$channel = isset($options['channel']) ? $options['channel'] : |
$this->config->get('default_channel'); |
$reg = &$this->config->getRegistry(); |
if (!$reg->channelExists($channel)) { |
return $this->raiseError('Channel "' . $channel . '" does not exist'); |
} |
$channel = $reg->channelName($channel); |
$data = array('caption' => 'Configuration (channel ' . $channel . '):'); |
foreach ($keys as $key) { |
$type = $this->config->getType($key); |
$value = $this->config->get($key, $layer, $channel); |
if ($type == 'password' && $value) { |
$value = '********'; |
} |
if ($value === false) { |
$value = 'false'; |
} elseif ($value === true) { |
$value = 'true'; |
} |
$data['data'][$this->config->getGroup($key)][] = array($this->config->getPrompt($key) , $key, $value); |
} |
foreach ($this->config->getLayers() as $layer) { |
$data['data']['Config Files'][] = array(ucfirst($layer) . ' Configuration File', 'Filename' , $this->config->getConfFile($layer)); |
} |
$this->ui->outputData($data, $command); |
return true; |
} |
function doConfigGet($command, $options, $params) |
{ |
$args_cnt = is_array($params) ? count($params) : 0; |
switch ($args_cnt) { |
case 1: |
$config_key = $params[0]; |
$layer = null; |
break; |
case 2: |
$config_key = $params[0]; |
$layer = $params[1]; |
if ($error = $this->_checkLayer($layer)) { |
return $this->raiseError("config-get:$error"); |
} |
break; |
case 0: |
default: |
return $this->raiseError("config-get expects 1 or 2 parameters"); |
} |
$reg = &$this->config->getRegistry(); |
$channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel'); |
if (!$reg->channelExists($channel)) { |
return $this->raiseError('Channel "' . $channel . '" does not exist'); |
} |
$channel = $reg->channelName($channel); |
$this->ui->outputData($this->config->get($config_key, $layer, $channel), $command); |
return true; |
} |
function doConfigSet($command, $options, $params) |
{ |
// $param[0] -> a parameter to set |
// $param[1] -> the value for the parameter |
// $param[2] -> the layer |
$failmsg = ''; |
if (count($params) < 2 || count($params) > 3) { |
$failmsg .= "config-set expects 2 or 3 parameters"; |
return PEAR::raiseError($failmsg); |
} |
if (isset($params[2]) && ($error = $this->_checkLayer($params[2]))) { |
$failmsg .= $error; |
return PEAR::raiseError("config-set:$failmsg"); |
} |
$channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel'); |
$reg = &$this->config->getRegistry(); |
if (!$reg->channelExists($channel)) { |
return $this->raiseError('Channel "' . $channel . '" does not exist'); |
} |
$channel = $reg->channelName($channel); |
if ($params[0] == 'default_channel' && !$reg->channelExists($params[1])) { |
return $this->raiseError('Channel "' . $params[1] . '" does not exist'); |
} |
if ($params[0] == 'preferred_mirror' |
&& ( |
!$reg->mirrorExists($channel, $params[1]) && |
(!$reg->channelExists($params[1]) || $channel != $params[1]) |
) |
) { |
$msg = 'Channel Mirror "' . $params[1] . '" does not exist'; |
$msg .= ' in your registry for channel "' . $channel . '".'; |
$msg .= "\n" . 'Attempt to run "pear channel-update ' . $channel .'"'; |
$msg .= ' if you believe this mirror should exist as you may'; |
$msg .= ' have outdated channel information.'; |
return $this->raiseError($msg); |
} |
if (count($params) == 2) { |
array_push($params, 'user'); |
$layer = 'user'; |
} else { |
$layer = $params[2]; |
} |
array_push($params, $channel); |
if (!call_user_func_array(array(&$this->config, 'set'), $params)) { |
array_pop($params); |
$failmsg = "config-set (" . implode(", ", $params) . ") failed, channel $channel"; |
} else { |
$this->config->store($layer); |
} |
if ($failmsg) { |
return $this->raiseError($failmsg); |
} |
$this->ui->outputData('config-set succeeded', $command); |
return true; |
} |
function doConfigHelp($command, $options, $params) |
{ |
if (empty($params)) { |
$params = $this->config->getKeys(); |
} |
$data['caption'] = "Config help" . ((count($params) == 1) ? " for $params[0]" : ''); |
$data['headline'] = array('Name', 'Type', 'Description'); |
$data['border'] = true; |
foreach ($params as $name) { |
$type = $this->config->getType($name); |
$docs = $this->config->getDocs($name); |
if ($type == 'set') { |
$docs = rtrim($docs) . "\nValid set: " . |
implode(' ', $this->config->getSetValues($name)); |
} |
$data['data'][] = array($name, $type, $docs); |
} |
$this->ui->outputData($data, $command); |
} |
function doConfigCreate($command, $options, $params) |
{ |
if (count($params) != 2) { |
return PEAR::raiseError('config-create: must have 2 parameters, root path and ' . |
'filename to save as'); |
} |
$root = $params[0]; |
// Clean up the DIRECTORY_SEPARATOR mess |
$ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; |
$root = preg_replace(array('!\\\\+!', '!/+!', "!$ds2+!"), |
array('/', '/', '/'), |
$root); |
if ($root{0} != '/') { |
if (!isset($options['windows'])) { |
return PEAR::raiseError('Root directory must be an absolute path beginning ' . |
'with "/", was: "' . $root . '"'); |
} |
if (!preg_match('/^[A-Za-z]:/', $root)) { |
return PEAR::raiseError('Root directory must be an absolute path beginning ' . |
'with "\\" or "C:\\", was: "' . $root . '"'); |
} |
} |
$windows = isset($options['windows']); |
if ($windows) { |
$root = str_replace('/', '\\', $root); |
} |
if (!file_exists($params[1]) && !@touch($params[1])) { |
return PEAR::raiseError('Could not create "' . $params[1] . '"'); |
} |
$params[1] = realpath($params[1]); |
$config = new PEAR_Config($params[1], '#no#system#config#', false, false); |
if ($root{strlen($root) - 1} == '/') { |
$root = substr($root, 0, strlen($root) - 1); |
} |
$config->noRegistry(); |
$config->set('php_dir', $windows ? "$root\\pear\\php" : "$root/pear/php", 'user'); |
$config->set('data_dir', $windows ? "$root\\pear\\data" : "$root/pear/data"); |
$config->set('www_dir', $windows ? "$root\\pear\\www" : "$root/pear/www"); |
$config->set('cfg_dir', $windows ? "$root\\pear\\cfg" : "$root/pear/cfg"); |
$config->set('ext_dir', $windows ? "$root\\pear\\ext" : "$root/pear/ext"); |
$config->set('doc_dir', $windows ? "$root\\pear\\docs" : "$root/pear/docs"); |
$config->set('test_dir', $windows ? "$root\\pear\\tests" : "$root/pear/tests"); |
$config->set('cache_dir', $windows ? "$root\\pear\\cache" : "$root/pear/cache"); |
$config->set('download_dir', $windows ? "$root\\pear\\download" : "$root/pear/download"); |
$config->set('temp_dir', $windows ? "$root\\pear\\temp" : "$root/pear/temp"); |
$config->set('bin_dir', $windows ? "$root\\pear" : "$root/pear"); |
$config->set('man_dir', $windows ? "$root\\pear\\man" : "$root/pear/man"); |
$config->writeConfigFile(); |
$this->_showConfig($config); |
$this->ui->outputData('Successfully created default configuration file "' . $params[1] . '"', |
$command); |
} |
function _showConfig(&$config) |
{ |
$params = array('user'); |
$keys = $config->getKeys(); |
sort($keys); |
$channel = 'pear.php.net'; |
$data = array('caption' => 'Configuration (channel ' . $channel . '):'); |
foreach ($keys as $key) { |
$type = $config->getType($key); |
$value = $config->get($key, 'user', $channel); |
if ($type == 'password' && $value) { |
$value = '********'; |
} |
if ($value === false) { |
$value = 'false'; |
} elseif ($value === true) { |
$value = 'true'; |
} |
$data['data'][$config->getGroup($key)][] = |
array($config->getPrompt($key) , $key, $value); |
} |
foreach ($config->getLayers() as $layer) { |
$data['data']['Config Files'][] = |
array(ucfirst($layer) . ' Configuration File', 'Filename' , |
$config->getConfFile($layer)); |
} |
$this->ui->outputData($data, 'config-show'); |
return true; |
} |
/** |
* Checks if a layer is defined or not |
* |
* @param string $layer The layer to search for |
* @return mixed False on no error or the error message |
*/ |
function _checkLayer($layer = null) |
{ |
if (!empty($layer) && $layer != 'default') { |
$layers = $this->config->getLayers(); |
if (!in_array($layer, $layers)) { |
return " only the layers: \"" . implode('" or "', $layers) . "\" are supported"; |
} |
} |
return false; |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Install.php |
---|
New file |
0,0 → 1,1269 |
<?php |
/** |
* PEAR_Command_Install (install, upgrade, upgrade-all, uninstall, bundle, run-scripts commands) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 0.1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
/** |
* PEAR commands for installation or deinstallation/upgrading of |
* packages. |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 0.1 |
*/ |
class PEAR_Command_Install extends PEAR_Command_Common |
{ |
// {{{ properties |
var $commands = array( |
'install' => array( |
'summary' => 'Install Package', |
'function' => 'doInstall', |
'shortcut' => 'i', |
'options' => array( |
'force' => array( |
'shortopt' => 'f', |
'doc' => 'will overwrite newer installed packages', |
), |
'loose' => array( |
'shortopt' => 'l', |
'doc' => 'do not check for recommended dependency version', |
), |
'nodeps' => array( |
'shortopt' => 'n', |
'doc' => 'ignore dependencies, install anyway', |
), |
'register-only' => array( |
'shortopt' => 'r', |
'doc' => 'do not install files, only register the package as installed', |
), |
'soft' => array( |
'shortopt' => 's', |
'doc' => 'soft install, fail silently, or upgrade if already installed', |
), |
'nobuild' => array( |
'shortopt' => 'B', |
'doc' => 'don\'t build C extensions', |
), |
'nocompress' => array( |
'shortopt' => 'Z', |
'doc' => 'request uncompressed files when downloading', |
), |
'installroot' => array( |
'shortopt' => 'R', |
'arg' => 'DIR', |
'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT), use packagingroot for RPM', |
), |
'packagingroot' => array( |
'shortopt' => 'P', |
'arg' => 'DIR', |
'doc' => 'root directory used when packaging files, like RPM packaging', |
), |
'ignore-errors' => array( |
'doc' => 'force install even if there were errors', |
), |
'alldeps' => array( |
'shortopt' => 'a', |
'doc' => 'install all required and optional dependencies', |
), |
'onlyreqdeps' => array( |
'shortopt' => 'o', |
'doc' => 'install all required dependencies', |
), |
'offline' => array( |
'shortopt' => 'O', |
'doc' => 'do not attempt to download any urls or contact channels', |
), |
'pretend' => array( |
'shortopt' => 'p', |
'doc' => 'Only list the packages that would be downloaded', |
), |
), |
'doc' => '[channel/]<package> ... |
Installs one or more PEAR packages. You can specify a package to |
install in four ways: |
"Package-1.0.tgz" : installs from a local file |
"http://example.com/Package-1.0.tgz" : installs from |
anywhere on the net. |
"package.xml" : installs the package described in |
package.xml. Useful for testing, or for wrapping a PEAR package in |
another package manager such as RPM. |
"Package[-version/state][.tar]" : queries your default channel\'s server |
({config master_server}) and downloads the newest package with |
the preferred quality/state ({config preferred_state}). |
To retrieve Package version 1.1, use "Package-1.1," to retrieve |
Package state beta, use "Package-beta." To retrieve an uncompressed |
file, append .tar (make sure there is no file by the same name first) |
To download a package from another channel, prefix with the channel name like |
"channel/Package" |
More than one package may be specified at once. It is ok to mix these |
four ways of specifying packages. |
'), |
'upgrade' => array( |
'summary' => 'Upgrade Package', |
'function' => 'doInstall', |
'shortcut' => 'up', |
'options' => array( |
'channel' => array( |
'shortopt' => 'c', |
'doc' => 'upgrade packages from a specific channel', |
'arg' => 'CHAN', |
), |
'force' => array( |
'shortopt' => 'f', |
'doc' => 'overwrite newer installed packages', |
), |
'loose' => array( |
'shortopt' => 'l', |
'doc' => 'do not check for recommended dependency version', |
), |
'nodeps' => array( |
'shortopt' => 'n', |
'doc' => 'ignore dependencies, upgrade anyway', |
), |
'register-only' => array( |
'shortopt' => 'r', |
'doc' => 'do not install files, only register the package as upgraded', |
), |
'nobuild' => array( |
'shortopt' => 'B', |
'doc' => 'don\'t build C extensions', |
), |
'nocompress' => array( |
'shortopt' => 'Z', |
'doc' => 'request uncompressed files when downloading', |
), |
'installroot' => array( |
'shortopt' => 'R', |
'arg' => 'DIR', |
'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', |
), |
'ignore-errors' => array( |
'doc' => 'force install even if there were errors', |
), |
'alldeps' => array( |
'shortopt' => 'a', |
'doc' => 'install all required and optional dependencies', |
), |
'onlyreqdeps' => array( |
'shortopt' => 'o', |
'doc' => 'install all required dependencies', |
), |
'offline' => array( |
'shortopt' => 'O', |
'doc' => 'do not attempt to download any urls or contact channels', |
), |
'pretend' => array( |
'shortopt' => 'p', |
'doc' => 'Only list the packages that would be downloaded', |
), |
), |
'doc' => '<package> ... |
Upgrades one or more PEAR packages. See documentation for the |
"install" command for ways to specify a package. |
When upgrading, your package will be updated if the provided new |
package has a higher version number (use the -f option if you need to |
upgrade anyway). |
More than one package may be specified at once. |
'), |
'upgrade-all' => array( |
'summary' => 'Upgrade All Packages [Deprecated in favor of calling upgrade with no parameters]', |
'function' => 'doUpgradeAll', |
'shortcut' => 'ua', |
'options' => array( |
'channel' => array( |
'shortopt' => 'c', |
'doc' => 'upgrade packages from a specific channel', |
'arg' => 'CHAN', |
), |
'nodeps' => array( |
'shortopt' => 'n', |
'doc' => 'ignore dependencies, upgrade anyway', |
), |
'register-only' => array( |
'shortopt' => 'r', |
'doc' => 'do not install files, only register the package as upgraded', |
), |
'nobuild' => array( |
'shortopt' => 'B', |
'doc' => 'don\'t build C extensions', |
), |
'nocompress' => array( |
'shortopt' => 'Z', |
'doc' => 'request uncompressed files when downloading', |
), |
'installroot' => array( |
'shortopt' => 'R', |
'arg' => 'DIR', |
'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT), use packagingroot for RPM', |
), |
'ignore-errors' => array( |
'doc' => 'force install even if there were errors', |
), |
'loose' => array( |
'doc' => 'do not check for recommended dependency version', |
), |
), |
'doc' => ' |
WARNING: This function is deprecated in favor of using the upgrade command with no params |
Upgrades all packages that have a newer release available. Upgrades are |
done only if there is a release available of the state specified in |
"preferred_state" (currently {config preferred_state}), or a state considered |
more stable. |
'), |
'uninstall' => array( |
'summary' => 'Un-install Package', |
'function' => 'doUninstall', |
'shortcut' => 'un', |
'options' => array( |
'nodeps' => array( |
'shortopt' => 'n', |
'doc' => 'ignore dependencies, uninstall anyway', |
), |
'register-only' => array( |
'shortopt' => 'r', |
'doc' => 'do not remove files, only register the packages as not installed', |
), |
'installroot' => array( |
'shortopt' => 'R', |
'arg' => 'DIR', |
'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', |
), |
'ignore-errors' => array( |
'doc' => 'force install even if there were errors', |
), |
'offline' => array( |
'shortopt' => 'O', |
'doc' => 'do not attempt to uninstall remotely', |
), |
), |
'doc' => '[channel/]<package> ... |
Uninstalls one or more PEAR packages. More than one package may be |
specified at once. Prefix with channel name to uninstall from a |
channel not in your default channel ({config default_channel}) |
'), |
'bundle' => array( |
'summary' => 'Unpacks a Pecl Package', |
'function' => 'doBundle', |
'shortcut' => 'bun', |
'options' => array( |
'destination' => array( |
'shortopt' => 'd', |
'arg' => 'DIR', |
'doc' => 'Optional destination directory for unpacking (defaults to current path or "ext" if exists)', |
), |
'force' => array( |
'shortopt' => 'f', |
'doc' => 'Force the unpacking even if there were errors in the package', |
), |
), |
'doc' => '<package> |
Unpacks a Pecl Package into the selected location. It will download the |
package if needed. |
'), |
'run-scripts' => array( |
'summary' => 'Run Post-Install Scripts bundled with a package', |
'function' => 'doRunScripts', |
'shortcut' => 'rs', |
'options' => array( |
), |
'doc' => '<package> |
Run post-installation scripts in package <package>, if any exist. |
'), |
); |
// }}} |
// {{{ constructor |
/** |
* PEAR_Command_Install constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
// }}} |
/** |
* For unit testing purposes |
*/ |
function &getDownloader(&$ui, $options, &$config) |
{ |
if (!class_exists('PEAR_Downloader')) { |
require_once 'PEAR/Downloader.php'; |
} |
$a = new PEAR_Downloader($ui, $options, $config); |
return $a; |
} |
/** |
* For unit testing purposes |
*/ |
function &getInstaller(&$ui) |
{ |
if (!class_exists('PEAR_Installer')) { |
require_once 'PEAR/Installer.php'; |
} |
$a = new PEAR_Installer($ui); |
return $a; |
} |
function enableExtension($binaries, $type) |
{ |
if (!($phpini = $this->config->get('php_ini', null, 'pear.php.net'))) { |
return PEAR::raiseError('configuration option "php_ini" is not set to php.ini location'); |
} |
$ini = $this->_parseIni($phpini); |
if (PEAR::isError($ini)) { |
return $ini; |
} |
$line = 0; |
if ($type == 'extsrc' || $type == 'extbin') { |
$search = 'extensions'; |
$enable = 'extension'; |
} else { |
$search = 'zend_extensions'; |
ob_start(); |
phpinfo(INFO_GENERAL); |
$info = ob_get_contents(); |
ob_end_clean(); |
$debug = function_exists('leak') ? '_debug' : ''; |
$ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; |
$enable = 'zend_extension' . $debug . $ts; |
} |
foreach ($ini[$search] as $line => $extension) { |
if (in_array($extension, $binaries, true) || in_array( |
$ini['extension_dir'] . DIRECTORY_SEPARATOR . $extension, $binaries, true)) { |
// already enabled - assume if one is, all are |
return true; |
} |
} |
if ($line) { |
$newini = array_slice($ini['all'], 0, $line); |
} else { |
$newini = array(); |
} |
foreach ($binaries as $binary) { |
if ($ini['extension_dir']) { |
$binary = basename($binary); |
} |
$newini[] = $enable . '="' . $binary . '"' . (OS_UNIX ? "\n" : "\r\n"); |
} |
$newini = array_merge($newini, array_slice($ini['all'], $line)); |
$fp = @fopen($phpini, 'wb'); |
if (!$fp) { |
return PEAR::raiseError('cannot open php.ini "' . $phpini . '" for writing'); |
} |
foreach ($newini as $line) { |
fwrite($fp, $line); |
} |
fclose($fp); |
return true; |
} |
function disableExtension($binaries, $type) |
{ |
if (!($phpini = $this->config->get('php_ini', null, 'pear.php.net'))) { |
return PEAR::raiseError('configuration option "php_ini" is not set to php.ini location'); |
} |
$ini = $this->_parseIni($phpini); |
if (PEAR::isError($ini)) { |
return $ini; |
} |
$line = 0; |
if ($type == 'extsrc' || $type == 'extbin') { |
$search = 'extensions'; |
$enable = 'extension'; |
} else { |
$search = 'zend_extensions'; |
ob_start(); |
phpinfo(INFO_GENERAL); |
$info = ob_get_contents(); |
ob_end_clean(); |
$debug = function_exists('leak') ? '_debug' : ''; |
$ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; |
$enable = 'zend_extension' . $debug . $ts; |
} |
$found = false; |
foreach ($ini[$search] as $line => $extension) { |
if (in_array($extension, $binaries, true) || in_array( |
$ini['extension_dir'] . DIRECTORY_SEPARATOR . $extension, $binaries, true)) { |
$found = true; |
break; |
} |
} |
if (!$found) { |
// not enabled |
return true; |
} |
$fp = @fopen($phpini, 'wb'); |
if (!$fp) { |
return PEAR::raiseError('cannot open php.ini "' . $phpini . '" for writing'); |
} |
if ($line) { |
$newini = array_slice($ini['all'], 0, $line); |
// delete the enable line |
$newini = array_merge($newini, array_slice($ini['all'], $line + 1)); |
} else { |
$newini = array_slice($ini['all'], 1); |
} |
foreach ($newini as $line) { |
fwrite($fp, $line); |
} |
fclose($fp); |
return true; |
} |
function _parseIni($filename) |
{ |
if (!file_exists($filename)) { |
return PEAR::raiseError('php.ini "' . $filename . '" does not exist'); |
} |
if (filesize($filename) > 300000) { |
return PEAR::raiseError('php.ini "' . $filename . '" is too large, aborting'); |
} |
ob_start(); |
phpinfo(INFO_GENERAL); |
$info = ob_get_contents(); |
ob_end_clean(); |
$debug = function_exists('leak') ? '_debug' : ''; |
$ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; |
$zend_extension_line = 'zend_extension' . $debug . $ts; |
$all = @file($filename); |
if ($all === false) { |
return PEAR::raiseError('php.ini "' . $filename .'" could not be read'); |
} |
$zend_extensions = $extensions = array(); |
// assume this is right, but pull from the php.ini if it is found |
$extension_dir = ini_get('extension_dir'); |
foreach ($all as $linenum => $line) { |
$line = trim($line); |
if (!$line) { |
continue; |
} |
if ($line[0] == ';') { |
continue; |
} |
if (strtolower(substr($line, 0, 13)) == 'extension_dir') { |
$line = trim(substr($line, 13)); |
if ($line[0] == '=') { |
$x = trim(substr($line, 1)); |
$x = explode(';', $x); |
$extension_dir = str_replace('"', '', array_shift($x)); |
continue; |
} |
} |
if (strtolower(substr($line, 0, 9)) == 'extension') { |
$line = trim(substr($line, 9)); |
if ($line[0] == '=') { |
$x = trim(substr($line, 1)); |
$x = explode(';', $x); |
$extensions[$linenum] = str_replace('"', '', array_shift($x)); |
continue; |
} |
} |
if (strtolower(substr($line, 0, strlen($zend_extension_line))) == |
$zend_extension_line) { |
$line = trim(substr($line, strlen($zend_extension_line))); |
if ($line[0] == '=') { |
$x = trim(substr($line, 1)); |
$x = explode(';', $x); |
$zend_extensions[$linenum] = str_replace('"', '', array_shift($x)); |
continue; |
} |
} |
} |
return array( |
'extensions' => $extensions, |
'zend_extensions' => $zend_extensions, |
'extension_dir' => $extension_dir, |
'all' => $all, |
); |
} |
// {{{ doInstall() |
function doInstall($command, $options, $params) |
{ |
if (!class_exists('PEAR_PackageFile')) { |
require_once 'PEAR/PackageFile.php'; |
} |
if (isset($options['installroot']) && isset($options['packagingroot'])) { |
return $this->raiseError('ERROR: cannot use both --installroot and --packagingroot'); |
} |
$reg = &$this->config->getRegistry(); |
$channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel'); |
if (!$reg->channelExists($channel)) { |
return $this->raiseError('Channel "' . $channel . '" does not exist'); |
} |
if (empty($this->installer)) { |
$this->installer = &$this->getInstaller($this->ui); |
} |
if ($command == 'upgrade' || $command == 'upgrade-all') { |
// If people run the upgrade command but pass nothing, emulate a upgrade-all |
if ($command == 'upgrade' && empty($params)) { |
return $this->doUpgradeAll($command, $options, $params); |
} |
$options['upgrade'] = true; |
} else { |
$packages = $params; |
} |
$instreg = &$reg; // instreg used to check if package is installed |
if (isset($options['packagingroot']) && !isset($options['upgrade'])) { |
$packrootphp_dir = $this->installer->_prependPath( |
$this->config->get('php_dir', null, 'pear.php.net'), |
$options['packagingroot']); |
$metadata_dir = $this->config->get('metadata_dir', null, 'pear.php.net'); |
if ($metadata_dir) { |
$metadata_dir = $this->installer->_prependPath( |
$metadata_dir, |
$options['packagingroot']); |
} |
$instreg = new PEAR_Registry($packrootphp_dir, false, false, $metadata_dir); // other instreg! |
if ($this->config->get('verbose') > 2) { |
$this->ui->outputData('using package root: ' . $options['packagingroot']); |
} |
} |
$abstractpackages = $otherpackages = array(); |
// parse params |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
foreach ($params as $param) { |
if (strpos($param, 'http://') === 0) { |
$otherpackages[] = $param; |
continue; |
} |
if (strpos($param, 'channel://') === false && @file_exists($param)) { |
if (isset($options['force'])) { |
$otherpackages[] = $param; |
continue; |
} |
$pkg = new PEAR_PackageFile($this->config); |
$pf = $pkg->fromAnyFile($param, PEAR_VALIDATE_DOWNLOADING); |
if (PEAR::isError($pf)) { |
$otherpackages[] = $param; |
continue; |
} |
$exists = $reg->packageExists($pf->getPackage(), $pf->getChannel()); |
$pversion = $reg->packageInfo($pf->getPackage(), 'version', $pf->getChannel()); |
$version_compare = version_compare($pf->getVersion(), $pversion, '<='); |
if ($exists && $version_compare) { |
if ($this->config->get('verbose')) { |
$this->ui->outputData('Ignoring installed package ' . |
$reg->parsedPackageNameToString( |
array('package' => $pf->getPackage(), |
'channel' => $pf->getChannel()), true)); |
} |
continue; |
} |
$otherpackages[] = $param; |
continue; |
} |
$e = $reg->parsePackageName($param, $channel); |
if (PEAR::isError($e)) { |
$otherpackages[] = $param; |
} else { |
$abstractpackages[] = $e; |
} |
} |
PEAR::staticPopErrorHandling(); |
// if there are any local package .tgz or remote static url, we can't |
// filter. The filter only works for abstract packages |
if (count($abstractpackages) && !isset($options['force'])) { |
// when not being forced, only do necessary upgrades/installs |
if (isset($options['upgrade'])) { |
$abstractpackages = $this->_filterUptodatePackages($abstractpackages, $command); |
} else { |
$count = count($abstractpackages); |
foreach ($abstractpackages as $i => $package) { |
if (isset($package['group'])) { |
// do not filter out install groups |
continue; |
} |
if ($instreg->packageExists($package['package'], $package['channel'])) { |
if ($count > 1) { |
if ($this->config->get('verbose')) { |
$this->ui->outputData('Ignoring installed package ' . |
$reg->parsedPackageNameToString($package, true)); |
} |
unset($abstractpackages[$i]); |
} elseif ($count === 1) { |
// Lets try to upgrade it since it's already installed |
$options['upgrade'] = true; |
} |
} |
} |
} |
$abstractpackages = |
array_map(array($reg, 'parsedPackageNameToString'), $abstractpackages); |
} elseif (count($abstractpackages)) { |
$abstractpackages = |
array_map(array($reg, 'parsedPackageNameToString'), $abstractpackages); |
} |
$packages = array_merge($abstractpackages, $otherpackages); |
if (!count($packages)) { |
$c = ''; |
if (isset($options['channel'])){ |
$c .= ' in channel "' . $options['channel'] . '"'; |
} |
$this->ui->outputData('Nothing to ' . $command . $c); |
return true; |
} |
$this->downloader = &$this->getDownloader($this->ui, $options, $this->config); |
$errors = $downloaded = $binaries = array(); |
$downloaded = &$this->downloader->download($packages); |
if (PEAR::isError($downloaded)) { |
return $this->raiseError($downloaded); |
} |
$errors = $this->downloader->getErrorMsgs(); |
if (count($errors)) { |
$err = array(); |
$err['data'] = array(); |
foreach ($errors as $error) { |
if ($error !== null) { |
$err['data'][] = array($error); |
} |
} |
if (!empty($err['data'])) { |
$err['headline'] = 'Install Errors'; |
$this->ui->outputData($err); |
} |
if (!count($downloaded)) { |
return $this->raiseError("$command failed"); |
} |
} |
$data = array( |
'headline' => 'Packages that would be Installed' |
); |
if (isset($options['pretend'])) { |
foreach ($downloaded as $package) { |
$data['data'][] = array($reg->parsedPackageNameToString($package->getParsedPackage())); |
} |
$this->ui->outputData($data, 'pretend'); |
return true; |
} |
$this->installer->setOptions($options); |
$this->installer->sortPackagesForInstall($downloaded); |
if (PEAR::isError($err = $this->installer->setDownloadedPackages($downloaded))) { |
$this->raiseError($err->getMessage()); |
return true; |
} |
$binaries = $extrainfo = array(); |
foreach ($downloaded as $param) { |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$info = $this->installer->install($param, $options); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($info)) { |
$oldinfo = $info; |
$pkg = &$param->getPackageFile(); |
if ($info->getCode() != PEAR_INSTALLER_NOBINARY) { |
if (!($info = $pkg->installBinary($this->installer))) { |
$this->ui->outputData('ERROR: ' .$oldinfo->getMessage()); |
continue; |
} |
// we just installed a different package than requested, |
// let's change the param and info so that the rest of this works |
$param = $info[0]; |
$info = $info[1]; |
} |
} |
if (!is_array($info)) { |
return $this->raiseError("$command failed"); |
} |
if ($param->getPackageType() == 'extsrc' || |
$param->getPackageType() == 'extbin' || |
$param->getPackageType() == 'zendextsrc' || |
$param->getPackageType() == 'zendextbin' |
) { |
$pkg = &$param->getPackageFile(); |
if ($instbin = $pkg->getInstalledBinary()) { |
$instpkg = &$instreg->getPackage($instbin, $pkg->getChannel()); |
} else { |
$instpkg = &$instreg->getPackage($pkg->getPackage(), $pkg->getChannel()); |
} |
foreach ($instpkg->getFilelist() as $name => $atts) { |
$pinfo = pathinfo($atts['installed_as']); |
if (!isset($pinfo['extension']) || |
in_array($pinfo['extension'], array('c', 'h')) |
) { |
continue; // make sure we don't match php_blah.h |
} |
if ((strpos($pinfo['basename'], 'php_') === 0 && |
$pinfo['extension'] == 'dll') || |
// most unices |
$pinfo['extension'] == 'so' || |
// hp-ux |
$pinfo['extension'] == 'sl') { |
$binaries[] = array($atts['installed_as'], $pinfo); |
break; |
} |
} |
if (count($binaries)) { |
foreach ($binaries as $pinfo) { |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$ret = $this->enableExtension(array($pinfo[0]), $param->getPackageType()); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($ret)) { |
$extrainfo[] = $ret->getMessage(); |
if ($param->getPackageType() == 'extsrc' || |
$param->getPackageType() == 'extbin') { |
$exttype = 'extension'; |
$extpath = $pinfo[1]['basename']; |
} else { |
$exttype = 'zend_extension'; |
$extpath = $atts['installed_as']; |
} |
$extrainfo[] = 'You should add "' . $exttype . '=' . |
$extpath . '" to php.ini'; |
} else { |
$extrainfo[] = 'Extension ' . $instpkg->getProvidesExtension() . |
' enabled in php.ini'; |
} |
} |
} |
} |
if ($this->config->get('verbose') > 0) { |
$chan = $param->getChannel(); |
$label = $reg->parsedPackageNameToString( |
array( |
'channel' => $chan, |
'package' => $param->getPackage(), |
'version' => $param->getVersion(), |
)); |
$out = array('data' => "$command ok: $label"); |
if (isset($info['release_warnings'])) { |
$out['release_warnings'] = $info['release_warnings']; |
} |
$this->ui->outputData($out, $command); |
if (!isset($options['register-only']) && !isset($options['offline'])) { |
if ($this->config->isDefinedLayer('ftp')) { |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$info = $this->installer->ftpInstall($param); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($info)) { |
$this->ui->outputData($info->getMessage()); |
$this->ui->outputData("remote install failed: $label"); |
} else { |
$this->ui->outputData("remote install ok: $label"); |
} |
} |
} |
} |
$deps = $param->getDeps(); |
if ($deps) { |
if (isset($deps['group'])) { |
$groups = $deps['group']; |
if (!isset($groups[0])) { |
$groups = array($groups); |
} |
foreach ($groups as $group) { |
if ($group['attribs']['name'] == 'default') { |
// default group is always installed, unless the user |
// explicitly chooses to install another group |
continue; |
} |
$extrainfo[] = $param->getPackage() . ': Optional feature ' . |
$group['attribs']['name'] . ' available (' . |
$group['attribs']['hint'] . ')'; |
} |
$extrainfo[] = $param->getPackage() . |
': To install optional features use "pear install ' . |
$reg->parsedPackageNameToString( |
array('package' => $param->getPackage(), |
'channel' => $param->getChannel()), true) . |
'#featurename"'; |
} |
} |
$pkg = &$instreg->getPackage($param->getPackage(), $param->getChannel()); |
// $pkg may be NULL if install is a 'fake' install via --packagingroot |
if (is_object($pkg)) { |
$pkg->setConfig($this->config); |
if ($list = $pkg->listPostinstallScripts()) { |
$pn = $reg->parsedPackageNameToString(array('channel' => |
$param->getChannel(), 'package' => $param->getPackage()), true); |
$extrainfo[] = $pn . ' has post-install scripts:'; |
foreach ($list as $file) { |
$extrainfo[] = $file; |
} |
$extrainfo[] = $param->getPackage() . |
': Use "pear run-scripts ' . $pn . '" to finish setup.'; |
$extrainfo[] = 'DO NOT RUN SCRIPTS FROM UNTRUSTED SOURCES'; |
} |
} |
} |
if (count($extrainfo)) { |
foreach ($extrainfo as $info) { |
$this->ui->outputData($info); |
} |
} |
return true; |
} |
// }}} |
// {{{ doUpgradeAll() |
function doUpgradeAll($command, $options, $params) |
{ |
$reg = &$this->config->getRegistry(); |
$upgrade = array(); |
if (isset($options['channel'])) { |
$channels = array($options['channel']); |
} else { |
$channels = $reg->listChannels(); |
} |
foreach ($channels as $channel) { |
if ($channel == '__uri') { |
continue; |
} |
// parse name with channel |
foreach ($reg->listPackages($channel) as $name) { |
$upgrade[] = $reg->parsedPackageNameToString(array( |
'channel' => $channel, |
'package' => $name |
)); |
} |
} |
$err = $this->doInstall($command, $options, $upgrade); |
if (PEAR::isError($err)) { |
$this->ui->outputData($err->getMessage(), $command); |
} |
} |
// }}} |
// {{{ doUninstall() |
function doUninstall($command, $options, $params) |
{ |
if (count($params) < 1) { |
return $this->raiseError("Please supply the package(s) you want to uninstall"); |
} |
if (empty($this->installer)) { |
$this->installer = &$this->getInstaller($this->ui); |
} |
if (isset($options['remoteconfig'])) { |
$e = $this->config->readFTPConfigFile($options['remoteconfig']); |
if (!PEAR::isError($e)) { |
$this->installer->setConfig($this->config); |
} |
} |
$reg = &$this->config->getRegistry(); |
$newparams = array(); |
$binaries = array(); |
$badparams = array(); |
foreach ($params as $pkg) { |
$channel = $this->config->get('default_channel'); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$parsed = $reg->parsePackageName($pkg, $channel); |
PEAR::staticPopErrorHandling(); |
if (!$parsed || PEAR::isError($parsed)) { |
$badparams[] = $pkg; |
continue; |
} |
$package = $parsed['package']; |
$channel = $parsed['channel']; |
$info = &$reg->getPackage($package, $channel); |
if ($info === null && |
($channel == 'pear.php.net' || $channel == 'pecl.php.net')) { |
// make sure this isn't a package that has flipped from pear to pecl but |
// used a package.xml 1.0 |
$testc = ($channel == 'pear.php.net') ? 'pecl.php.net' : 'pear.php.net'; |
$info = &$reg->getPackage($package, $testc); |
if ($info !== null) { |
$channel = $testc; |
} |
} |
if ($info === null) { |
$badparams[] = $pkg; |
} else { |
$newparams[] = &$info; |
// check for binary packages (this is an alias for those packages if so) |
if ($installedbinary = $info->getInstalledBinary()) { |
$this->ui->log('adding binary package ' . |
$reg->parsedPackageNameToString(array('channel' => $channel, |
'package' => $installedbinary), true)); |
$newparams[] = &$reg->getPackage($installedbinary, $channel); |
} |
// add the contents of a dependency group to the list of installed packages |
if (isset($parsed['group'])) { |
$group = $info->getDependencyGroup($parsed['group']); |
if ($group) { |
$installed = $reg->getInstalledGroup($group); |
if ($installed) { |
foreach ($installed as $i => $p) { |
$newparams[] = &$installed[$i]; |
} |
} |
} |
} |
} |
} |
$err = $this->installer->sortPackagesForUninstall($newparams); |
if (PEAR::isError($err)) { |
$this->ui->outputData($err->getMessage(), $command); |
return true; |
} |
$params = $newparams; |
// twist this to use it to check on whether dependent packages are also being uninstalled |
// for circular dependencies like subpackages |
$this->installer->setUninstallPackages($newparams); |
$params = array_merge($params, $badparams); |
$binaries = array(); |
foreach ($params as $pkg) { |
$this->installer->pushErrorHandling(PEAR_ERROR_RETURN); |
if ($err = $this->installer->uninstall($pkg, $options)) { |
$this->installer->popErrorHandling(); |
if (PEAR::isError($err)) { |
$this->ui->outputData($err->getMessage(), $command); |
continue; |
} |
if ($pkg->getPackageType() == 'extsrc' || |
$pkg->getPackageType() == 'extbin' || |
$pkg->getPackageType() == 'zendextsrc' || |
$pkg->getPackageType() == 'zendextbin') { |
if ($instbin = $pkg->getInstalledBinary()) { |
continue; // this will be uninstalled later |
} |
foreach ($pkg->getFilelist() as $name => $atts) { |
$pinfo = pathinfo($atts['installed_as']); |
if (!isset($pinfo['extension']) || |
in_array($pinfo['extension'], array('c', 'h'))) { |
continue; // make sure we don't match php_blah.h |
} |
if ((strpos($pinfo['basename'], 'php_') === 0 && |
$pinfo['extension'] == 'dll') || |
// most unices |
$pinfo['extension'] == 'so' || |
// hp-ux |
$pinfo['extension'] == 'sl') { |
$binaries[] = array($atts['installed_as'], $pinfo); |
break; |
} |
} |
if (count($binaries)) { |
foreach ($binaries as $pinfo) { |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$ret = $this->disableExtension(array($pinfo[0]), $pkg->getPackageType()); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($ret)) { |
$extrainfo[] = $ret->getMessage(); |
if ($pkg->getPackageType() == 'extsrc' || |
$pkg->getPackageType() == 'extbin') { |
$exttype = 'extension'; |
} else { |
ob_start(); |
phpinfo(INFO_GENERAL); |
$info = ob_get_contents(); |
ob_end_clean(); |
$debug = function_exists('leak') ? '_debug' : ''; |
$ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; |
$exttype = 'zend_extension' . $debug . $ts; |
} |
$this->ui->outputData('Unable to remove "' . $exttype . '=' . |
$pinfo[1]['basename'] . '" from php.ini', $command); |
} else { |
$this->ui->outputData('Extension ' . $pkg->getProvidesExtension() . |
' disabled in php.ini', $command); |
} |
} |
} |
} |
$savepkg = $pkg; |
if ($this->config->get('verbose') > 0) { |
if (is_object($pkg)) { |
$pkg = $reg->parsedPackageNameToString($pkg); |
} |
$this->ui->outputData("uninstall ok: $pkg", $command); |
} |
if (!isset($options['offline']) && is_object($savepkg) && |
defined('PEAR_REMOTEINSTALL_OK')) { |
if ($this->config->isDefinedLayer('ftp')) { |
$this->installer->pushErrorHandling(PEAR_ERROR_RETURN); |
$info = $this->installer->ftpUninstall($savepkg); |
$this->installer->popErrorHandling(); |
if (PEAR::isError($info)) { |
$this->ui->outputData($info->getMessage()); |
$this->ui->outputData("remote uninstall failed: $pkg"); |
} else { |
$this->ui->outputData("remote uninstall ok: $pkg"); |
} |
} |
} |
} else { |
$this->installer->popErrorHandling(); |
if (!is_object($pkg)) { |
return $this->raiseError("uninstall failed: $pkg"); |
} |
$pkg = $reg->parsedPackageNameToString($pkg); |
} |
} |
return true; |
} |
// }}} |
// }}} |
// {{{ doBundle() |
/* |
(cox) It just downloads and untars the package, does not do |
any check that the PEAR_Installer::_installFile() does. |
*/ |
function doBundle($command, $options, $params) |
{ |
$opts = array( |
'force' => true, |
'nodeps' => true, |
'soft' => true, |
'downloadonly' => true |
); |
$downloader = &$this->getDownloader($this->ui, $opts, $this->config); |
$reg = &$this->config->getRegistry(); |
if (count($params) < 1) { |
return $this->raiseError("Please supply the package you want to bundle"); |
} |
if (isset($options['destination'])) { |
if (!is_dir($options['destination'])) { |
System::mkdir('-p ' . $options['destination']); |
} |
$dest = realpath($options['destination']); |
} else { |
$pwd = getcwd(); |
$dir = $pwd . DIRECTORY_SEPARATOR . 'ext'; |
$dest = is_dir($dir) ? $dir : $pwd; |
} |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$err = $downloader->setDownloadDir($dest); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($err)) { |
return PEAR::raiseError('download directory "' . $dest . |
'" is not writeable.'); |
} |
$result = &$downloader->download(array($params[0])); |
if (PEAR::isError($result)) { |
return $result; |
} |
if (!isset($result[0])) { |
return $this->raiseError('unable to unpack ' . $params[0]); |
} |
$pkgfile = &$result[0]->getPackageFile(); |
$pkgname = $pkgfile->getName(); |
$pkgversion = $pkgfile->getVersion(); |
// Unpacking ------------------------------------------------- |
$dest .= DIRECTORY_SEPARATOR . $pkgname; |
$orig = $pkgname . '-' . $pkgversion; |
$tar = new Archive_Tar($pkgfile->getArchiveFile()); |
if (!$tar->extractModify($dest, $orig)) { |
return $this->raiseError('unable to unpack ' . $pkgfile->getArchiveFile()); |
} |
$this->ui->outputData("Package ready at '$dest'"); |
// }}} |
} |
// }}} |
function doRunScripts($command, $options, $params) |
{ |
if (!isset($params[0])) { |
return $this->raiseError('run-scripts expects 1 parameter: a package name'); |
} |
$reg = &$this->config->getRegistry(); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel')); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($parsed)) { |
return $this->raiseError($parsed); |
} |
$package = &$reg->getPackage($parsed['package'], $parsed['channel']); |
if (!is_object($package)) { |
return $this->raiseError('Could not retrieve package "' . $params[0] . '" from registry'); |
} |
$package->setConfig($this->config); |
$package->runPostinstallScripts(); |
$this->ui->outputData('Install scripts complete', $command); |
return true; |
} |
/** |
* Given a list of packages, filter out those ones that are already up to date |
* |
* @param $packages: packages, in parsed array format ! |
* @return list of packages that can be upgraded |
*/ |
function _filterUptodatePackages($packages, $command) |
{ |
$reg = &$this->config->getRegistry(); |
$latestReleases = array(); |
$ret = array(); |
foreach ($packages as $package) { |
if (isset($package['group'])) { |
$ret[] = $package; |
continue; |
} |
$channel = $package['channel']; |
$name = $package['package']; |
if (!$reg->packageExists($name, $channel)) { |
$ret[] = $package; |
continue; |
} |
if (!isset($latestReleases[$channel])) { |
// fill in cache for this channel |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($chan)) { |
return $this->raiseError($chan); |
} |
$base2 = false; |
$preferred_mirror = $this->config->get('preferred_mirror', null, $channel); |
if ($chan->supportsREST($preferred_mirror) && |
( |
//($base2 = $chan->getBaseURL('REST1.4', $preferred_mirror)) || |
($base = $chan->getBaseURL('REST1.0', $preferred_mirror)) |
) |
) { |
$dorest = true; |
} |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
if (!isset($package['state'])) { |
$state = $this->config->get('preferred_state', null, $channel); |
} else { |
$state = $package['state']; |
} |
if ($dorest) { |
if ($base2) { |
$rest = &$this->config->getREST('1.4', array()); |
$base = $base2; |
} else { |
$rest = &$this->config->getREST('1.0', array()); |
} |
$installed = array_flip($reg->listPackages($channel)); |
$latest = $rest->listLatestUpgrades($base, $state, $installed, $channel, $reg); |
} |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($latest)) { |
$this->ui->outputData('Error getting channel info from ' . $channel . |
': ' . $latest->getMessage()); |
continue; |
} |
$latestReleases[$channel] = array_change_key_case($latest); |
} |
// check package for latest release |
$name_lower = strtolower($name); |
if (isset($latestReleases[$channel][$name_lower])) { |
// if not set, up to date |
$inst_version = $reg->packageInfo($name, 'version', $channel); |
$channel_version = $latestReleases[$channel][$name_lower]['version']; |
if (version_compare($channel_version, $inst_version, 'le')) { |
// installed version is up-to-date |
continue; |
} |
// maintain BC |
if ($command == 'upgrade-all') { |
$this->ui->outputData(array('data' => 'Will upgrade ' . |
$reg->parsedPackageNameToString($package)), $command); |
} |
$ret[] = $package; |
} |
} |
return $ret; |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Pickle.php |
---|
New file |
0,0 → 1,420 |
<?php |
/** |
* PEAR_Command_Pickle (pickle command) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Greg Beaver <cellog@php.net> |
* @copyright 2005-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 1.4.1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
/** |
* PEAR commands for login/logout |
* |
* @category pear |
* @package PEAR |
* @author Greg Beaver <cellog@php.net> |
* @copyright 2005-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 1.4.1 |
*/ |
class PEAR_Command_Pickle extends PEAR_Command_Common |
{ |
var $commands = array( |
'pickle' => array( |
'summary' => 'Build PECL Package', |
'function' => 'doPackage', |
'shortcut' => 'pi', |
'options' => array( |
'nocompress' => array( |
'shortopt' => 'Z', |
'doc' => 'Do not gzip the package file' |
), |
'showname' => array( |
'shortopt' => 'n', |
'doc' => 'Print the name of the packaged file.', |
), |
), |
'doc' => '[descfile] |
Creates a PECL package from its package2.xml file. |
An automatic conversion will be made to a package.xml 1.0 and written out to |
disk in the current directory as "package.xml". Note that |
only simple package.xml 2.0 will be converted. package.xml 2.0 with: |
- dependency types other than required/optional PECL package/ext/php/pearinstaller |
- more than one extsrcrelease or zendextsrcrelease |
- zendextbinrelease, extbinrelease, phprelease, or bundle release type |
- dependency groups |
- ignore tags in release filelist |
- tasks other than replace |
- custom roles |
will cause pickle to fail, and output an error message. If your package2.xml |
uses any of these features, you are best off using PEAR_PackageFileManager to |
generate both package.xml. |
' |
), |
); |
/** |
* PEAR_Command_Package constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
/** |
* For unit-testing ease |
* |
* @return PEAR_Packager |
*/ |
function &getPackager() |
{ |
if (!class_exists('PEAR_Packager')) { |
require_once 'PEAR/Packager.php'; |
} |
$a = new PEAR_Packager; |
return $a; |
} |
/** |
* For unit-testing ease |
* |
* @param PEAR_Config $config |
* @param bool $debug |
* @param string|null $tmpdir |
* @return PEAR_PackageFile |
*/ |
function &getPackageFile($config, $debug = false) |
{ |
if (!class_exists('PEAR_Common')) { |
require_once 'PEAR/Common.php'; |
} |
if (!class_exists('PEAR_PackageFile')) { |
require_once 'PEAR/PackageFile.php'; |
} |
$a = new PEAR_PackageFile($config, $debug); |
$common = new PEAR_Common; |
$common->ui = $this->ui; |
$a->setLogger($common); |
return $a; |
} |
function doPackage($command, $options, $params) |
{ |
$this->output = ''; |
$pkginfofile = isset($params[0]) ? $params[0] : 'package2.xml'; |
$packager = &$this->getPackager(); |
if (PEAR::isError($err = $this->_convertPackage($pkginfofile))) { |
return $err; |
} |
$compress = empty($options['nocompress']) ? true : false; |
$result = $packager->package($pkginfofile, $compress, 'package.xml'); |
if (PEAR::isError($result)) { |
return $this->raiseError($result); |
} |
// Don't want output, only the package file name just created |
if (isset($options['showname'])) { |
$this->ui->outputData($result, $command); |
} |
return true; |
} |
function _convertPackage($packagexml) |
{ |
$pkg = &$this->getPackageFile($this->config); |
$pf2 = &$pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL); |
if (!is_a($pf2, 'PEAR_PackageFile_v2')) { |
return $this->raiseError('Cannot process "' . |
$packagexml . '", is not a package.xml 2.0'); |
} |
require_once 'PEAR/PackageFile/v1.php'; |
$pf = new PEAR_PackageFile_v1; |
$pf->setConfig($this->config); |
if ($pf2->getPackageType() != 'extsrc' && $pf2->getPackageType() != 'zendextsrc') { |
return $this->raiseError('Cannot safely convert "' . $packagexml . |
'", is not an extension source package. Using a PEAR_PackageFileManager-based ' . |
'script is an option'); |
} |
if (is_array($pf2->getUsesRole())) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . |
'", contains custom roles. Using a PEAR_PackageFileManager-based script or ' . |
'the convert command is an option'); |
} |
if (is_array($pf2->getUsesTask())) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . |
'", contains custom tasks. Using a PEAR_PackageFileManager-based script or ' . |
'the convert command is an option'); |
} |
$deps = $pf2->getDependencies(); |
if (isset($deps['group'])) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . |
'", contains dependency groups. Using a PEAR_PackageFileManager-based script ' . |
'or the convert command is an option'); |
} |
if (isset($deps['required']['subpackage']) || |
isset($deps['optional']['subpackage'])) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . |
'", contains subpackage dependencies. Using a PEAR_PackageFileManager-based '. |
'script is an option'); |
} |
if (isset($deps['required']['os'])) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . |
'", contains os dependencies. Using a PEAR_PackageFileManager-based '. |
'script is an option'); |
} |
if (isset($deps['required']['arch'])) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . |
'", contains arch dependencies. Using a PEAR_PackageFileManager-based '. |
'script is an option'); |
} |
$pf->setPackage($pf2->getPackage()); |
$pf->setSummary($pf2->getSummary()); |
$pf->setDescription($pf2->getDescription()); |
foreach ($pf2->getMaintainers() as $maintainer) { |
$pf->addMaintainer($maintainer['role'], $maintainer['handle'], |
$maintainer['name'], $maintainer['email']); |
} |
$pf->setVersion($pf2->getVersion()); |
$pf->setDate($pf2->getDate()); |
$pf->setLicense($pf2->getLicense()); |
$pf->setState($pf2->getState()); |
$pf->setNotes($pf2->getNotes()); |
$pf->addPhpDep($deps['required']['php']['min'], 'ge'); |
if (isset($deps['required']['php']['max'])) { |
$pf->addPhpDep($deps['required']['php']['max'], 'le'); |
} |
if (isset($deps['required']['package'])) { |
if (!isset($deps['required']['package'][0])) { |
$deps['required']['package'] = array($deps['required']['package']); |
} |
foreach ($deps['required']['package'] as $dep) { |
if (!isset($dep['channel'])) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . |
' contains uri-based dependency on a package. Using a ' . |
'PEAR_PackageFileManager-based script is an option'); |
} |
if ($dep['channel'] != 'pear.php.net' |
&& $dep['channel'] != 'pecl.php.net' |
&& $dep['channel'] != 'doc.php.net') { |
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . |
' contains dependency on a non-standard channel package. Using a ' . |
'PEAR_PackageFileManager-based script is an option'); |
} |
if (isset($dep['conflicts'])) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . |
' contains conflicts dependency. Using a ' . |
'PEAR_PackageFileManager-based script is an option'); |
} |
if (isset($dep['exclude'])) { |
$this->ui->outputData('WARNING: exclude tags are ignored in conversion'); |
} |
if (isset($dep['min'])) { |
$pf->addPackageDep($dep['name'], $dep['min'], 'ge'); |
} |
if (isset($dep['max'])) { |
$pf->addPackageDep($dep['name'], $dep['max'], 'le'); |
} |
} |
} |
if (isset($deps['required']['extension'])) { |
if (!isset($deps['required']['extension'][0])) { |
$deps['required']['extension'] = array($deps['required']['extension']); |
} |
foreach ($deps['required']['extension'] as $dep) { |
if (isset($dep['conflicts'])) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . |
' contains conflicts dependency. Using a ' . |
'PEAR_PackageFileManager-based script is an option'); |
} |
if (isset($dep['exclude'])) { |
$this->ui->outputData('WARNING: exclude tags are ignored in conversion'); |
} |
if (isset($dep['min'])) { |
$pf->addExtensionDep($dep['name'], $dep['min'], 'ge'); |
} |
if (isset($dep['max'])) { |
$pf->addExtensionDep($dep['name'], $dep['max'], 'le'); |
} |
} |
} |
if (isset($deps['optional']['package'])) { |
if (!isset($deps['optional']['package'][0])) { |
$deps['optional']['package'] = array($deps['optional']['package']); |
} |
foreach ($deps['optional']['package'] as $dep) { |
if (!isset($dep['channel'])) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . |
' contains uri-based dependency on a package. Using a ' . |
'PEAR_PackageFileManager-based script is an option'); |
} |
if ($dep['channel'] != 'pear.php.net' |
&& $dep['channel'] != 'pecl.php.net' |
&& $dep['channel'] != 'doc.php.net') { |
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' . |
' contains dependency on a non-standard channel package. Using a ' . |
'PEAR_PackageFileManager-based script is an option'); |
} |
if (isset($dep['exclude'])) { |
$this->ui->outputData('WARNING: exclude tags are ignored in conversion'); |
} |
if (isset($dep['min'])) { |
$pf->addPackageDep($dep['name'], $dep['min'], 'ge', 'yes'); |
} |
if (isset($dep['max'])) { |
$pf->addPackageDep($dep['name'], $dep['max'], 'le', 'yes'); |
} |
} |
} |
if (isset($deps['optional']['extension'])) { |
if (!isset($deps['optional']['extension'][0])) { |
$deps['optional']['extension'] = array($deps['optional']['extension']); |
} |
foreach ($deps['optional']['extension'] as $dep) { |
if (isset($dep['exclude'])) { |
$this->ui->outputData('WARNING: exclude tags are ignored in conversion'); |
} |
if (isset($dep['min'])) { |
$pf->addExtensionDep($dep['name'], $dep['min'], 'ge', 'yes'); |
} |
if (isset($dep['max'])) { |
$pf->addExtensionDep($dep['name'], $dep['max'], 'le', 'yes'); |
} |
} |
} |
$contents = $pf2->getContents(); |
$release = $pf2->getReleases(); |
if (isset($releases[0])) { |
return $this->raiseError('Cannot safely process "' . $packagexml . '" contains ' |
. 'multiple extsrcrelease/zendextsrcrelease tags. Using a PEAR_PackageFileManager-based script ' . |
'or the convert command is an option'); |
} |
if ($configoptions = $pf2->getConfigureOptions()) { |
foreach ($configoptions as $option) { |
$default = isset($option['default']) ? $option['default'] : false; |
$pf->addConfigureOption($option['name'], $option['prompt'], $default); |
} |
} |
if (isset($release['filelist']['ignore'])) { |
return $this->raiseError('Cannot safely process "' . $packagexml . '" contains ' |
. 'ignore tags. Using a PEAR_PackageFileManager-based script or the convert' . |
' command is an option'); |
} |
if (isset($release['filelist']['install']) && |
!isset($release['filelist']['install'][0])) { |
$release['filelist']['install'] = array($release['filelist']['install']); |
} |
if (isset($contents['dir']['attribs']['baseinstalldir'])) { |
$baseinstalldir = $contents['dir']['attribs']['baseinstalldir']; |
} else { |
$baseinstalldir = false; |
} |
if (!isset($contents['dir']['file'][0])) { |
$contents['dir']['file'] = array($contents['dir']['file']); |
} |
foreach ($contents['dir']['file'] as $file) { |
if ($baseinstalldir && !isset($file['attribs']['baseinstalldir'])) { |
$file['attribs']['baseinstalldir'] = $baseinstalldir; |
} |
$processFile = $file; |
unset($processFile['attribs']); |
if (count($processFile)) { |
foreach ($processFile as $name => $task) { |
if ($name != $pf2->getTasksNs() . ':replace') { |
return $this->raiseError('Cannot safely process "' . $packagexml . |
'" contains tasks other than replace. Using a ' . |
'PEAR_PackageFileManager-based script is an option.'); |
} |
$file['attribs']['replace'][] = $task; |
} |
} |
if (!in_array($file['attribs']['role'], PEAR_Common::getFileRoles())) { |
return $this->raiseError('Cannot safely convert "' . $packagexml . |
'", contains custom roles. Using a PEAR_PackageFileManager-based script ' . |
'or the convert command is an option'); |
} |
if (isset($release['filelist']['install'])) { |
foreach ($release['filelist']['install'] as $installas) { |
if ($installas['attribs']['name'] == $file['attribs']['name']) { |
$file['attribs']['install-as'] = $installas['attribs']['as']; |
} |
} |
} |
$pf->addFile('/', $file['attribs']['name'], $file['attribs']); |
} |
if ($pf2->getChangeLog()) { |
$this->ui->outputData('WARNING: changelog is not translated to package.xml ' . |
'1.0, use PEAR_PackageFileManager-based script if you need changelog-' . |
'translation for package.xml 1.0'); |
} |
$gen = &$pf->getDefaultGenerator(); |
$gen->toPackageFile('.'); |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Build.xml |
---|
New file |
0,0 → 1,10 |
<commands version="1.0"> |
<build> |
<summary>Build an Extension From C Source</summary> |
<function>doBuild</function> |
<shortcut>b</shortcut> |
<options /> |
<doc>[package.xml] |
Builds one or more extensions contained in a package.</doc> |
</build> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Registry.php |
---|
New file |
0,0 → 1,1144 |
<?php |
/** |
* PEAR_Command_Registry (list, list-files, shell-test, info commands) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 0.1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
/** |
* PEAR commands for registry manipulation |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 0.1 |
*/ |
class PEAR_Command_Registry extends PEAR_Command_Common |
{ |
var $commands = array( |
'list' => array( |
'summary' => 'List Installed Packages In The Default Channel', |
'function' => 'doList', |
'shortcut' => 'l', |
'options' => array( |
'channel' => array( |
'shortopt' => 'c', |
'doc' => 'list installed packages from this channel', |
'arg' => 'CHAN', |
), |
'allchannels' => array( |
'shortopt' => 'a', |
'doc' => 'list installed packages from all channels', |
), |
'channelinfo' => array( |
'shortopt' => 'i', |
'doc' => 'output fully channel-aware data, even on failure', |
), |
), |
'doc' => '<package> |
If invoked without parameters, this command lists the PEAR packages |
installed in your php_dir ({config php_dir}). With a parameter, it |
lists the files in a package. |
', |
), |
'list-files' => array( |
'summary' => 'List Files In Installed Package', |
'function' => 'doFileList', |
'shortcut' => 'fl', |
'options' => array(), |
'doc' => '<package> |
List the files in an installed package. |
' |
), |
'shell-test' => array( |
'summary' => 'Shell Script Test', |
'function' => 'doShellTest', |
'shortcut' => 'st', |
'options' => array(), |
'doc' => '<package> [[relation] version] |
Tests if a package is installed in the system. Will exit(1) if it is not. |
<relation> The version comparison operator. One of: |
<, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne |
<version> The version to compare with |
'), |
'info' => array( |
'summary' => 'Display information about a package', |
'function' => 'doInfo', |
'shortcut' => 'in', |
'options' => array(), |
'doc' => '<package> |
Displays information about a package. The package argument may be a |
local package file, an URL to a package file, or the name of an |
installed package.' |
) |
); |
/** |
* PEAR_Command_Registry constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
function _sortinfo($a, $b) |
{ |
$apackage = isset($a['package']) ? $a['package'] : $a['name']; |
$bpackage = isset($b['package']) ? $b['package'] : $b['name']; |
return strcmp($apackage, $bpackage); |
} |
function doList($command, $options, $params) |
{ |
$reg = &$this->config->getRegistry(); |
$channelinfo = isset($options['channelinfo']); |
if (isset($options['allchannels']) && !$channelinfo) { |
return $this->doListAll($command, array(), $params); |
} |
if (isset($options['allchannels']) && $channelinfo) { |
// allchannels with $channelinfo |
unset($options['allchannels']); |
$channels = $reg->getChannels(); |
$errors = array(); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
foreach ($channels as $channel) { |
$options['channel'] = $channel->getName(); |
$ret = $this->doList($command, $options, $params); |
if (PEAR::isError($ret)) { |
$errors[] = $ret; |
} |
} |
PEAR::staticPopErrorHandling(); |
if (count($errors)) { |
// for now, only give first error |
return PEAR::raiseError($errors[0]); |
} |
return true; |
} |
if (count($params) === 1) { |
return $this->doFileList($command, $options, $params); |
} |
if (isset($options['channel'])) { |
if (!$reg->channelExists($options['channel'])) { |
return $this->raiseError('Channel "' . $options['channel'] .'" does not exist'); |
} |
$channel = $reg->channelName($options['channel']); |
} else { |
$channel = $this->config->get('default_channel'); |
} |
$installed = $reg->packageInfo(null, null, $channel); |
usort($installed, array(&$this, '_sortinfo')); |
$data = array( |
'caption' => 'Installed packages, channel ' . |
$channel . ':', |
'border' => true, |
'headline' => array('Package', 'Version', 'State'), |
'channel' => $channel, |
); |
if ($channelinfo) { |
$data['headline'] = array('Channel', 'Package', 'Version', 'State'); |
} |
if (count($installed) && !isset($data['data'])) { |
$data['data'] = array(); |
} |
foreach ($installed as $package) { |
$pobj = $reg->getPackage(isset($package['package']) ? |
$package['package'] : $package['name'], $channel); |
if ($channelinfo) { |
$packageinfo = array($pobj->getChannel(), $pobj->getPackage(), $pobj->getVersion(), |
$pobj->getState() ? $pobj->getState() : null); |
} else { |
$packageinfo = array($pobj->getPackage(), $pobj->getVersion(), |
$pobj->getState() ? $pobj->getState() : null); |
} |
$data['data'][] = $packageinfo; |
} |
if (count($installed) === 0) { |
if (!$channelinfo) { |
$data = '(no packages installed from channel ' . $channel . ')'; |
} else { |
$data = array( |
'caption' => 'Installed packages, channel ' . |
$channel . ':', |
'border' => true, |
'channel' => $channel, |
'data' => array(array('(no packages installed)')), |
); |
} |
} |
$this->ui->outputData($data, $command); |
return true; |
} |
function doListAll($command, $options, $params) |
{ |
// This duplicate code is deprecated over |
// list --channelinfo, which gives identical |
// output for list and list --allchannels. |
$reg = &$this->config->getRegistry(); |
$installed = $reg->packageInfo(null, null, null); |
foreach ($installed as $channel => $packages) { |
usort($packages, array($this, '_sortinfo')); |
$data = array( |
'caption' => 'Installed packages, channel ' . $channel . ':', |
'border' => true, |
'headline' => array('Package', 'Version', 'State'), |
'channel' => $channel |
); |
foreach ($packages as $package) { |
$p = isset($package['package']) ? $package['package'] : $package['name']; |
$pobj = $reg->getPackage($p, $channel); |
$data['data'][] = array($pobj->getPackage(), $pobj->getVersion(), |
$pobj->getState() ? $pobj->getState() : null); |
} |
// Adds a blank line after each section |
$data['data'][] = array(); |
if (count($packages) === 0) { |
$data = array( |
'caption' => 'Installed packages, channel ' . $channel . ':', |
'border' => true, |
'data' => array(array('(no packages installed)'), array()), |
'channel' => $channel |
); |
} |
$this->ui->outputData($data, $command); |
} |
return true; |
} |
function doFileList($command, $options, $params) |
{ |
if (count($params) !== 1) { |
return $this->raiseError('list-files expects 1 parameter'); |
} |
$reg = &$this->config->getRegistry(); |
$fp = false; |
if (!is_dir($params[0]) && (file_exists($params[0]) || $fp = @fopen($params[0], 'r'))) { |
if ($fp) { |
fclose($fp); |
} |
if (!class_exists('PEAR_PackageFile')) { |
require_once 'PEAR/PackageFile.php'; |
} |
$pkg = new PEAR_PackageFile($this->config, $this->_debug); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$info = &$pkg->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL); |
PEAR::staticPopErrorHandling(); |
$headings = array('Package File', 'Install Path'); |
$installed = false; |
} else { |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel')); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($parsed)) { |
return $this->raiseError($parsed); |
} |
$info = &$reg->getPackage($parsed['package'], $parsed['channel']); |
$headings = array('Type', 'Install Path'); |
$installed = true; |
} |
if (PEAR::isError($info)) { |
return $this->raiseError($info); |
} |
if ($info === null) { |
return $this->raiseError("`$params[0]' not installed"); |
} |
$list = ($info->getPackagexmlVersion() == '1.0' || $installed) ? |
$info->getFilelist() : $info->getContents(); |
if ($installed) { |
$caption = 'Installed Files For ' . $params[0]; |
} else { |
$caption = 'Contents of ' . basename($params[0]); |
} |
$data = array( |
'caption' => $caption, |
'border' => true, |
'headline' => $headings); |
if ($info->getPackagexmlVersion() == '1.0' || $installed) { |
foreach ($list as $file => $att) { |
if ($installed) { |
if (empty($att['installed_as'])) { |
continue; |
} |
$data['data'][] = array($att['role'], $att['installed_as']); |
} else { |
if (isset($att['baseinstalldir']) && !in_array($att['role'], |
array('test', 'data', 'doc'))) { |
$dest = $att['baseinstalldir'] . DIRECTORY_SEPARATOR . |
$file; |
} else { |
$dest = $file; |
} |
switch ($att['role']) { |
case 'test': |
case 'data': |
case 'doc': |
$role = $att['role']; |
if ($role == 'test') { |
$role .= 's'; |
} |
$dest = $this->config->get($role . '_dir') . DIRECTORY_SEPARATOR . |
$info->getPackage() . DIRECTORY_SEPARATOR . $dest; |
break; |
case 'php': |
default: |
$dest = $this->config->get('php_dir') . DIRECTORY_SEPARATOR . |
$dest; |
} |
$ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; |
$dest = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"), |
array(DIRECTORY_SEPARATOR, |
DIRECTORY_SEPARATOR, |
DIRECTORY_SEPARATOR), |
$dest); |
$file = preg_replace('!/+!', '/', $file); |
$data['data'][] = array($file, $dest); |
} |
} |
} else { // package.xml 2.0, not installed |
if (!isset($list['dir']['file'][0])) { |
$list['dir']['file'] = array($list['dir']['file']); |
} |
foreach ($list['dir']['file'] as $att) { |
$att = $att['attribs']; |
$file = $att['name']; |
$role = &PEAR_Installer_Role::factory($info, $att['role'], $this->config); |
$role->setup($this, $info, $att, $file); |
if (!$role->isInstallable()) { |
$dest = '(not installable)'; |
} else { |
$dest = $role->processInstallation($info, $att, $file, ''); |
if (PEAR::isError($dest)) { |
$dest = '(Unknown role "' . $att['role'] . ')'; |
} else { |
list(,, $dest) = $dest; |
} |
} |
$data['data'][] = array($file, $dest); |
} |
} |
$this->ui->outputData($data, $command); |
return true; |
} |
function doShellTest($command, $options, $params) |
{ |
if (count($params) < 1) { |
return PEAR::raiseError('ERROR, usage: pear shell-test packagename [[relation] version]'); |
} |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$reg = &$this->config->getRegistry(); |
$info = $reg->parsePackageName($params[0], $this->config->get('default_channel')); |
if (PEAR::isError($info)) { |
exit(1); // invalid package name |
} |
$package = $info['package']; |
$channel = $info['channel']; |
// "pear shell-test Foo" |
if (!$reg->packageExists($package, $channel)) { |
if ($channel == 'pecl.php.net') { |
if ($reg->packageExists($package, 'pear.php.net')) { |
$channel = 'pear.php.net'; // magically change channels for extensions |
} |
} |
} |
if (count($params) === 1) { |
if (!$reg->packageExists($package, $channel)) { |
exit(1); |
} |
// "pear shell-test Foo 1.0" |
} elseif (count($params) === 2) { |
$v = $reg->packageInfo($package, 'version', $channel); |
if (!$v || !version_compare("$v", "{$params[1]}", "ge")) { |
exit(1); |
} |
// "pear shell-test Foo ge 1.0" |
} elseif (count($params) === 3) { |
$v = $reg->packageInfo($package, 'version', $channel); |
if (!$v || !version_compare("$v", "{$params[2]}", $params[1])) { |
exit(1); |
} |
} else { |
PEAR::staticPopErrorHandling(); |
$this->raiseError("$command: expects 1 to 3 parameters"); |
exit(1); |
} |
} |
function doInfo($command, $options, $params) |
{ |
if (count($params) !== 1) { |
return $this->raiseError('pear info expects 1 parameter'); |
} |
$info = $fp = false; |
$reg = &$this->config->getRegistry(); |
if (is_file($params[0]) && !is_dir($params[0]) && |
(file_exists($params[0]) || $fp = @fopen($params[0], 'r')) |
) { |
if ($fp) { |
fclose($fp); |
} |
if (!class_exists('PEAR_PackageFile')) { |
require_once 'PEAR/PackageFile.php'; |
} |
$pkg = new PEAR_PackageFile($this->config, $this->_debug); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$obj = &$pkg->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($obj)) { |
$uinfo = $obj->getUserInfo(); |
if (is_array($uinfo)) { |
foreach ($uinfo as $message) { |
if (is_array($message)) { |
$message = $message['message']; |
} |
$this->ui->outputData($message); |
} |
} |
return $this->raiseError($obj); |
} |
if ($obj->getPackagexmlVersion() != '1.0') { |
return $this->_doInfo2($command, $options, $params, $obj, false); |
} |
$info = $obj->toArray(); |
} else { |
$parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel')); |
if (PEAR::isError($parsed)) { |
return $this->raiseError($parsed); |
} |
$package = $parsed['package']; |
$channel = $parsed['channel']; |
$info = $reg->packageInfo($package, null, $channel); |
if (isset($info['old'])) { |
$obj = $reg->getPackage($package, $channel); |
return $this->_doInfo2($command, $options, $params, $obj, true); |
} |
} |
if (PEAR::isError($info)) { |
return $info; |
} |
if (empty($info)) { |
$this->raiseError("No information found for `$params[0]'"); |
return; |
} |
unset($info['filelist']); |
unset($info['dirtree']); |
unset($info['changelog']); |
if (isset($info['xsdversion'])) { |
$info['package.xml version'] = $info['xsdversion']; |
unset($info['xsdversion']); |
} |
if (isset($info['packagerversion'])) { |
$info['packaged with PEAR version'] = $info['packagerversion']; |
unset($info['packagerversion']); |
} |
$keys = array_keys($info); |
$longtext = array('description', 'summary'); |
foreach ($keys as $key) { |
if (is_array($info[$key])) { |
switch ($key) { |
case 'maintainers': { |
$i = 0; |
$mstr = ''; |
foreach ($info[$key] as $m) { |
if ($i++ > 0) { |
$mstr .= "\n"; |
} |
$mstr .= $m['name'] . " <"; |
if (isset($m['email'])) { |
$mstr .= $m['email']; |
} else { |
$mstr .= $m['handle'] . '@php.net'; |
} |
$mstr .= "> ($m[role])"; |
} |
$info[$key] = $mstr; |
break; |
} |
case 'release_deps': { |
$i = 0; |
$dstr = ''; |
foreach ($info[$key] as $d) { |
if (isset($this->_deps_rel_trans[$d['rel']])) { |
$rel = $this->_deps_rel_trans[$d['rel']]; |
} else { |
$rel = $d['rel']; |
} |
if (isset($this->_deps_type_trans[$d['type']])) { |
$type = ucfirst($this->_deps_type_trans[$d['type']]); |
} else { |
$type = $d['type']; |
} |
if (isset($d['name'])) { |
$name = $d['name'] . ' '; |
} else { |
$name = ''; |
} |
if (isset($d['version'])) { |
$version = $d['version'] . ' '; |
} else { |
$version = ''; |
} |
if (isset($d['optional']) && $d['optional'] == 'yes') { |
$optional = ' (optional)'; |
} else { |
$optional = ''; |
} |
$dstr .= "$type $name$rel $version$optional\n"; |
} |
$info[$key] = $dstr; |
break; |
} |
case 'provides' : { |
$debug = $this->config->get('verbose'); |
if ($debug < 2) { |
$pstr = 'Classes: '; |
} else { |
$pstr = ''; |
} |
$i = 0; |
foreach ($info[$key] as $p) { |
if ($debug < 2 && $p['type'] != "class") { |
continue; |
} |
// Only print classes when verbosity mode is < 2 |
if ($debug < 2) { |
if ($i++ > 0) { |
$pstr .= ", "; |
} |
$pstr .= $p['name']; |
} else { |
if ($i++ > 0) { |
$pstr .= "\n"; |
} |
$pstr .= ucfirst($p['type']) . " " . $p['name']; |
if (isset($p['explicit']) && $p['explicit'] == 1) { |
$pstr .= " (explicit)"; |
} |
} |
} |
$info[$key] = $pstr; |
break; |
} |
case 'configure_options' : { |
foreach ($info[$key] as $i => $p) { |
$info[$key][$i] = array_map(null, array_keys($p), array_values($p)); |
$info[$key][$i] = array_map(create_function('$a', |
'return join(" = ",$a);'), $info[$key][$i]); |
$info[$key][$i] = implode(', ', $info[$key][$i]); |
} |
$info[$key] = implode("\n", $info[$key]); |
break; |
} |
default: { |
$info[$key] = implode(", ", $info[$key]); |
break; |
} |
} |
} |
if ($key == '_lastmodified') { |
$hdate = date('Y-m-d', $info[$key]); |
unset($info[$key]); |
$info['Last Modified'] = $hdate; |
} elseif ($key == '_lastversion') { |
$info['Previous Installed Version'] = $info[$key] ? $info[$key] : '- None -'; |
unset($info[$key]); |
} else { |
$info[$key] = trim($info[$key]); |
if (in_array($key, $longtext)) { |
$info[$key] = preg_replace('/ +/', ' ', $info[$key]); |
} |
} |
} |
$caption = 'About ' . $info['package'] . '-' . $info['version']; |
$data = array( |
'caption' => $caption, |
'border' => true); |
foreach ($info as $key => $value) { |
$key = ucwords(trim(str_replace('_', ' ', $key))); |
$data['data'][] = array($key, $value); |
} |
$data['raw'] = $info; |
$this->ui->outputData($data, 'package-info'); |
} |
/** |
* @access private |
*/ |
function _doInfo2($command, $options, $params, &$obj, $installed) |
{ |
$reg = &$this->config->getRegistry(); |
$caption = 'About ' . $obj->getChannel() . '/' .$obj->getPackage() . '-' . |
$obj->getVersion(); |
$data = array( |
'caption' => $caption, |
'border' => true); |
switch ($obj->getPackageType()) { |
case 'php' : |
$release = 'PEAR-style PHP-based Package'; |
break; |
case 'extsrc' : |
$release = 'PECL-style PHP extension (source code)'; |
break; |
case 'zendextsrc' : |
$release = 'PECL-style Zend extension (source code)'; |
break; |
case 'extbin' : |
$release = 'PECL-style PHP extension (binary)'; |
break; |
case 'zendextbin' : |
$release = 'PECL-style Zend extension (binary)'; |
break; |
case 'bundle' : |
$release = 'Package bundle (collection of packages)'; |
break; |
} |
$extends = $obj->getExtends(); |
$extends = $extends ? |
$obj->getPackage() . ' (extends ' . $extends . ')' : $obj->getPackage(); |
if ($src = $obj->getSourcePackage()) { |
$extends .= ' (source package ' . $src['channel'] . '/' . $src['package'] . ')'; |
} |
$info = array( |
'Release Type' => $release, |
'Name' => $extends, |
'Channel' => $obj->getChannel(), |
'Summary' => preg_replace('/ +/', ' ', $obj->getSummary()), |
'Description' => preg_replace('/ +/', ' ', $obj->getDescription()), |
); |
$info['Maintainers'] = ''; |
foreach (array('lead', 'developer', 'contributor', 'helper') as $role) { |
$leads = $obj->{"get{$role}s"}(); |
if (!$leads) { |
continue; |
} |
if (isset($leads['active'])) { |
$leads = array($leads); |
} |
foreach ($leads as $lead) { |
if (!empty($info['Maintainers'])) { |
$info['Maintainers'] .= "\n"; |
} |
$active = $lead['active'] == 'no' ? ', inactive' : ''; |
$info['Maintainers'] .= $lead['name'] . ' <'; |
$info['Maintainers'] .= $lead['email'] . "> ($role$active)"; |
} |
} |
$info['Release Date'] = $obj->getDate(); |
if ($time = $obj->getTime()) { |
$info['Release Date'] .= ' ' . $time; |
} |
$info['Release Version'] = $obj->getVersion() . ' (' . $obj->getState() . ')'; |
$info['API Version'] = $obj->getVersion('api') . ' (' . $obj->getState('api') . ')'; |
$info['License'] = $obj->getLicense(); |
$uri = $obj->getLicenseLocation(); |
if ($uri) { |
if (isset($uri['uri'])) { |
$info['License'] .= ' (' . $uri['uri'] . ')'; |
} else { |
$extra = $obj->getInstalledLocation($info['filesource']); |
if ($extra) { |
$info['License'] .= ' (' . $uri['filesource'] . ')'; |
} |
} |
} |
$info['Release Notes'] = $obj->getNotes(); |
if ($compat = $obj->getCompatible()) { |
if (!isset($compat[0])) { |
$compat = array($compat); |
} |
$info['Compatible with'] = ''; |
foreach ($compat as $package) { |
$info['Compatible with'] .= $package['channel'] . '/' . $package['name'] . |
"\nVersions >= " . $package['min'] . ', <= ' . $package['max']; |
if (isset($package['exclude'])) { |
if (is_array($package['exclude'])) { |
$package['exclude'] = implode(', ', $package['exclude']); |
} |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info['Not Compatible with'] .= "\n"; |
} |
$info['Not Compatible with'] .= $package['channel'] . '/' . |
$package['name'] . "\nVersions " . $package['exclude']; |
} |
} |
} |
$usesrole = $obj->getUsesrole(); |
if ($usesrole) { |
if (!isset($usesrole[0])) { |
$usesrole = array($usesrole); |
} |
foreach ($usesrole as $roledata) { |
if (isset($info['Uses Custom Roles'])) { |
$info['Uses Custom Roles'] .= "\n"; |
} else { |
$info['Uses Custom Roles'] = ''; |
} |
if (isset($roledata['package'])) { |
$rolepackage = $reg->parsedPackageNameToString($roledata, true); |
} else { |
$rolepackage = $roledata['uri']; |
} |
$info['Uses Custom Roles'] .= $roledata['role'] . ' (' . $rolepackage . ')'; |
} |
} |
$usestask = $obj->getUsestask(); |
if ($usestask) { |
if (!isset($usestask[0])) { |
$usestask = array($usestask); |
} |
foreach ($usestask as $taskdata) { |
if (isset($info['Uses Custom Tasks'])) { |
$info['Uses Custom Tasks'] .= "\n"; |
} else { |
$info['Uses Custom Tasks'] = ''; |
} |
if (isset($taskdata['package'])) { |
$taskpackage = $reg->parsedPackageNameToString($taskdata, true); |
} else { |
$taskpackage = $taskdata['uri']; |
} |
$info['Uses Custom Tasks'] .= $taskdata['task'] . ' (' . $taskpackage . ')'; |
} |
} |
$deps = $obj->getDependencies(); |
$info['Required Dependencies'] = 'PHP version ' . $deps['required']['php']['min']; |
if (isset($deps['required']['php']['max'])) { |
$info['Required Dependencies'] .= '-' . $deps['required']['php']['max'] . "\n"; |
} else { |
$info['Required Dependencies'] .= "\n"; |
} |
if (isset($deps['required']['php']['exclude'])) { |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info['Not Compatible with'] .= "\n"; |
} |
if (is_array($deps['required']['php']['exclude'])) { |
$deps['required']['php']['exclude'] = |
implode(', ', $deps['required']['php']['exclude']); |
} |
$info['Not Compatible with'] .= "PHP versions\n " . |
$deps['required']['php']['exclude']; |
} |
$info['Required Dependencies'] .= 'PEAR installer version'; |
if (isset($deps['required']['pearinstaller']['max'])) { |
$info['Required Dependencies'] .= 's ' . |
$deps['required']['pearinstaller']['min'] . '-' . |
$deps['required']['pearinstaller']['max']; |
} else { |
$info['Required Dependencies'] .= ' ' . |
$deps['required']['pearinstaller']['min'] . ' or newer'; |
} |
if (isset($deps['required']['pearinstaller']['exclude'])) { |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info['Not Compatible with'] .= "\n"; |
} |
if (is_array($deps['required']['pearinstaller']['exclude'])) { |
$deps['required']['pearinstaller']['exclude'] = |
implode(', ', $deps['required']['pearinstaller']['exclude']); |
} |
$info['Not Compatible with'] .= "PEAR installer\n Versions " . |
$deps['required']['pearinstaller']['exclude']; |
} |
foreach (array('Package', 'Extension') as $type) { |
$index = strtolower($type); |
if (isset($deps['required'][$index])) { |
if (isset($deps['required'][$index]['name'])) { |
$deps['required'][$index] = array($deps['required'][$index]); |
} |
foreach ($deps['required'][$index] as $package) { |
if (isset($package['conflicts'])) { |
$infoindex = 'Not Compatible with'; |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info['Not Compatible with'] .= "\n"; |
} |
} else { |
$infoindex = 'Required Dependencies'; |
$info[$infoindex] .= "\n"; |
} |
if ($index == 'extension') { |
$name = $package['name']; |
} else { |
if (isset($package['channel'])) { |
$name = $package['channel'] . '/' . $package['name']; |
} else { |
$name = '__uri/' . $package['name'] . ' (static URI)'; |
} |
} |
$info[$infoindex] .= "$type $name"; |
if (isset($package['uri'])) { |
$info[$infoindex] .= "\n Download URI: $package[uri]"; |
continue; |
} |
if (isset($package['max']) && isset($package['min'])) { |
$info[$infoindex] .= " \n Versions " . |
$package['min'] . '-' . $package['max']; |
} elseif (isset($package['min'])) { |
$info[$infoindex] .= " \n Version " . |
$package['min'] . ' or newer'; |
} elseif (isset($package['max'])) { |
$info[$infoindex] .= " \n Version " . |
$package['max'] . ' or older'; |
} |
if (isset($package['recommended'])) { |
$info[$infoindex] .= "\n Recommended version: $package[recommended]"; |
} |
if (isset($package['exclude'])) { |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info['Not Compatible with'] .= "\n"; |
} |
if (is_array($package['exclude'])) { |
$package['exclude'] = implode(', ', $package['exclude']); |
} |
$package['package'] = $package['name']; // for parsedPackageNameToString |
if (isset($package['conflicts'])) { |
$info['Not Compatible with'] .= '=> except '; |
} |
$info['Not Compatible with'] .= 'Package ' . |
$reg->parsedPackageNameToString($package, true); |
$info['Not Compatible with'] .= "\n Versions " . $package['exclude']; |
} |
} |
} |
} |
if (isset($deps['required']['os'])) { |
if (isset($deps['required']['os']['name'])) { |
$dep['required']['os']['name'] = array($dep['required']['os']['name']); |
} |
foreach ($dep['required']['os'] as $os) { |
if (isset($os['conflicts']) && $os['conflicts'] == 'yes') { |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info['Not Compatible with'] .= "\n"; |
} |
$info['Not Compatible with'] .= "$os[name] Operating System"; |
} else { |
$info['Required Dependencies'] .= "\n"; |
$info['Required Dependencies'] .= "$os[name] Operating System"; |
} |
} |
} |
if (isset($deps['required']['arch'])) { |
if (isset($deps['required']['arch']['pattern'])) { |
$dep['required']['arch']['pattern'] = array($dep['required']['os']['pattern']); |
} |
foreach ($dep['required']['arch'] as $os) { |
if (isset($os['conflicts']) && $os['conflicts'] == 'yes') { |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info['Not Compatible with'] .= "\n"; |
} |
$info['Not Compatible with'] .= "OS/Arch matching pattern '/$os[pattern]/'"; |
} else { |
$info['Required Dependencies'] .= "\n"; |
$info['Required Dependencies'] .= "OS/Arch matching pattern '/$os[pattern]/'"; |
} |
} |
} |
if (isset($deps['optional'])) { |
foreach (array('Package', 'Extension') as $type) { |
$index = strtolower($type); |
if (isset($deps['optional'][$index])) { |
if (isset($deps['optional'][$index]['name'])) { |
$deps['optional'][$index] = array($deps['optional'][$index]); |
} |
foreach ($deps['optional'][$index] as $package) { |
if (isset($package['conflicts']) && $package['conflicts'] == 'yes') { |
$infoindex = 'Not Compatible with'; |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info['Not Compatible with'] .= "\n"; |
} |
} else { |
$infoindex = 'Optional Dependencies'; |
if (!isset($info['Optional Dependencies'])) { |
$info['Optional Dependencies'] = ''; |
} else { |
$info['Optional Dependencies'] .= "\n"; |
} |
} |
if ($index == 'extension') { |
$name = $package['name']; |
} else { |
if (isset($package['channel'])) { |
$name = $package['channel'] . '/' . $package['name']; |
} else { |
$name = '__uri/' . $package['name'] . ' (static URI)'; |
} |
} |
$info[$infoindex] .= "$type $name"; |
if (isset($package['uri'])) { |
$info[$infoindex] .= "\n Download URI: $package[uri]"; |
continue; |
} |
if ($infoindex == 'Not Compatible with') { |
// conflicts is only used to say that all versions conflict |
continue; |
} |
if (isset($package['max']) && isset($package['min'])) { |
$info[$infoindex] .= " \n Versions " . |
$package['min'] . '-' . $package['max']; |
} elseif (isset($package['min'])) { |
$info[$infoindex] .= " \n Version " . |
$package['min'] . ' or newer'; |
} elseif (isset($package['max'])) { |
$info[$infoindex] .= " \n Version " . |
$package['min'] . ' or older'; |
} |
if (isset($package['recommended'])) { |
$info[$infoindex] .= "\n Recommended version: $package[recommended]"; |
} |
if (isset($package['exclude'])) { |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info['Not Compatible with'] .= "\n"; |
} |
if (is_array($package['exclude'])) { |
$package['exclude'] = implode(', ', $package['exclude']); |
} |
$info['Not Compatible with'] .= "Package $package\n Versions " . |
$package['exclude']; |
} |
} |
} |
} |
} |
if (isset($deps['group'])) { |
if (!isset($deps['group'][0])) { |
$deps['group'] = array($deps['group']); |
} |
foreach ($deps['group'] as $group) { |
$info['Dependency Group ' . $group['attribs']['name']] = $group['attribs']['hint']; |
$groupindex = $group['attribs']['name'] . ' Contents'; |
$info[$groupindex] = ''; |
foreach (array('Package', 'Extension') as $type) { |
$index = strtolower($type); |
if (isset($group[$index])) { |
if (isset($group[$index]['name'])) { |
$group[$index] = array($group[$index]); |
} |
foreach ($group[$index] as $package) { |
if (!empty($info[$groupindex])) { |
$info[$groupindex] .= "\n"; |
} |
if ($index == 'extension') { |
$name = $package['name']; |
} else { |
if (isset($package['channel'])) { |
$name = $package['channel'] . '/' . $package['name']; |
} else { |
$name = '__uri/' . $package['name'] . ' (static URI)'; |
} |
} |
if (isset($package['uri'])) { |
if (isset($package['conflicts']) && $package['conflicts'] == 'yes') { |
$info[$groupindex] .= "Not Compatible with $type $name"; |
} else { |
$info[$groupindex] .= "$type $name"; |
} |
$info[$groupindex] .= "\n Download URI: $package[uri]"; |
continue; |
} |
if (isset($package['conflicts']) && $package['conflicts'] == 'yes') { |
$info[$groupindex] .= "Not Compatible with $type $name"; |
continue; |
} |
$info[$groupindex] .= "$type $name"; |
if (isset($package['max']) && isset($package['min'])) { |
$info[$groupindex] .= " \n Versions " . |
$package['min'] . '-' . $package['max']; |
} elseif (isset($package['min'])) { |
$info[$groupindex] .= " \n Version " . |
$package['min'] . ' or newer'; |
} elseif (isset($package['max'])) { |
$info[$groupindex] .= " \n Version " . |
$package['min'] . ' or older'; |
} |
if (isset($package['recommended'])) { |
$info[$groupindex] .= "\n Recommended version: $package[recommended]"; |
} |
if (isset($package['exclude'])) { |
if (!isset($info['Not Compatible with'])) { |
$info['Not Compatible with'] = ''; |
} else { |
$info[$groupindex] .= "Not Compatible with\n"; |
} |
if (is_array($package['exclude'])) { |
$package['exclude'] = implode(', ', $package['exclude']); |
} |
$info[$groupindex] .= " Package $package\n Versions " . |
$package['exclude']; |
} |
} |
} |
} |
} |
} |
if ($obj->getPackageType() == 'bundle') { |
$info['Bundled Packages'] = ''; |
foreach ($obj->getBundledPackages() as $package) { |
if (!empty($info['Bundled Packages'])) { |
$info['Bundled Packages'] .= "\n"; |
} |
if (isset($package['uri'])) { |
$info['Bundled Packages'] .= '__uri/' . $package['name']; |
$info['Bundled Packages'] .= "\n (URI: $package[uri]"; |
} else { |
$info['Bundled Packages'] .= $package['channel'] . '/' . $package['name']; |
} |
} |
} |
$info['package.xml version'] = '2.0'; |
if ($installed) { |
if ($obj->getLastModified()) { |
$info['Last Modified'] = date('Y-m-d H:i', $obj->getLastModified()); |
} |
$v = $obj->getLastInstalledVersion(); |
$info['Previous Installed Version'] = $v ? $v : '- None -'; |
} |
foreach ($info as $key => $value) { |
$data['data'][] = array($key, $value); |
} |
$data['raw'] = $obj->getArray(); // no validation needed |
$this->ui->outputData($data, 'package-info'); |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Mirror.php |
---|
New file |
0,0 → 1,138 |
<?php |
/** |
* PEAR_Command_Mirror (download-all command) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Alexander Merz <alexmerz@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 1.2.0 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
/** |
* PEAR commands for providing file mirrors |
* |
* @category pear |
* @package PEAR |
* @author Alexander Merz <alexmerz@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 1.2.0 |
*/ |
class PEAR_Command_Mirror extends PEAR_Command_Common |
{ |
var $commands = array( |
'download-all' => array( |
'summary' => 'Downloads each available package from the default channel', |
'function' => 'doDownloadAll', |
'shortcut' => 'da', |
'options' => array( |
'channel' => |
array( |
'shortopt' => 'c', |
'doc' => 'specify a channel other than the default channel', |
'arg' => 'CHAN', |
), |
), |
'doc' => ' |
Requests a list of available packages from the default channel ({config default_channel}) |
and downloads them to current working directory. Note: only |
packages within preferred_state ({config preferred_state}) will be downloaded' |
), |
); |
/** |
* PEAR_Command_Mirror constructor. |
* |
* @access public |
* @param object PEAR_Frontend a reference to an frontend |
* @param object PEAR_Config a reference to the configuration data |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
/** |
* For unit-testing |
*/ |
function &factory($a) |
{ |
$a = &PEAR_Command::factory($a, $this->config); |
return $a; |
} |
/** |
* retrieves a list of avaible Packages from master server |
* and downloads them |
* |
* @access public |
* @param string $command the command |
* @param array $options the command options before the command |
* @param array $params the stuff after the command name |
* @return bool true if successful |
* @throw PEAR_Error |
*/ |
function doDownloadAll($command, $options, $params) |
{ |
$savechannel = $this->config->get('default_channel'); |
$reg = &$this->config->getRegistry(); |
$channel = isset($options['channel']) ? $options['channel'] : |
$this->config->get('default_channel'); |
if (!$reg->channelExists($channel)) { |
$this->config->set('default_channel', $savechannel); |
return $this->raiseError('Channel "' . $channel . '" does not exist'); |
} |
$this->config->set('default_channel', $channel); |
$this->ui->outputData('Using Channel ' . $this->config->get('default_channel')); |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($chan)) { |
return $this->raiseError($chan); |
} |
if ($chan->supportsREST($this->config->get('preferred_mirror')) && |
$base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) { |
$rest = &$this->config->getREST('1.0', array()); |
$remoteInfo = array_flip($rest->listPackages($base, $channel)); |
} |
if (PEAR::isError($remoteInfo)) { |
return $remoteInfo; |
} |
$cmd = &$this->factory("download"); |
if (PEAR::isError($cmd)) { |
return $cmd; |
} |
$this->ui->outputData('Using Preferred State of ' . |
$this->config->get('preferred_state')); |
$this->ui->outputData('Gathering release information, please wait...'); |
/** |
* Error handling not necessary, because already done by |
* the download command |
*/ |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$err = $cmd->run('download', array('downloadonly' => true), array_keys($remoteInfo)); |
PEAR::staticPopErrorHandling(); |
$this->config->set('default_channel', $savechannel); |
if (PEAR::isError($err)) { |
$this->ui->outputData($err->getMessage()); |
} |
return true; |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Auth.xml |
---|
New file |
0,0 → 1,30 |
<commands version="1.0"> |
<login> |
<summary>Connects and authenticates to remote server [Deprecated in favor of channel-login]</summary> |
<function>doLogin</function> |
<shortcut>li</shortcut> |
<options /> |
<doc><channel name> |
WARNING: This function is deprecated in favor of using channel-login |
Log in to a remote channel server. If <channel name> is not supplied, |
the default channel is used. To use remote functions in the installer |
that require any kind of privileges, you need to log in first. The |
username and password you enter here will be stored in your per-user |
PEAR configuration (~/.pearrc on Unix-like systems). After logging |
in, your username and password will be sent along in subsequent |
operations on the remote server.</doc> |
</login> |
<logout> |
<summary>Logs out from the remote server [Deprecated in favor of channel-logout]</summary> |
<function>doLogout</function> |
<shortcut>lo</shortcut> |
<options /> |
<doc> |
WARNING: This function is deprecated in favor of using channel-logout |
Logs out from the remote server. This command does not actually |
connect to the remote server, it only deletes the stored username and |
password from your user configuration.</doc> |
</logout> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Config.xml |
---|
New file |
0,0 → 1,92 |
<commands version="1.0"> |
<config-show> |
<summary>Show All Settings</summary> |
<function>doConfigShow</function> |
<shortcut>csh</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>show configuration variables for another channel</doc> |
<arg>CHAN</arg> |
</channel> |
</options> |
<doc>[layer] |
Displays all configuration values. An optional argument |
may be used to tell which configuration layer to display. Valid |
configuration layers are "user", "system" and "default". To display |
configurations for different channels, set the default_channel |
configuration variable and run config-show again. |
</doc> |
</config-show> |
<config-get> |
<summary>Show One Setting</summary> |
<function>doConfigGet</function> |
<shortcut>cg</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>show configuration variables for another channel</doc> |
<arg>CHAN</arg> |
</channel> |
</options> |
<doc><parameter> [layer] |
Displays the value of one configuration parameter. The |
first argument is the name of the parameter, an optional second argument |
may be used to tell which configuration layer to look in. Valid configuration |
layers are "user", "system" and "default". If no layer is specified, a value |
will be picked from the first layer that defines the parameter, in the order |
just specified. The configuration value will be retrieved for the channel |
specified by the default_channel configuration variable. |
</doc> |
</config-get> |
<config-set> |
<summary>Change Setting</summary> |
<function>doConfigSet</function> |
<shortcut>cs</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>show configuration variables for another channel</doc> |
<arg>CHAN</arg> |
</channel> |
</options> |
<doc><parameter> <value> [layer] |
Sets the value of one configuration parameter. The first argument is |
the name of the parameter, the second argument is the new value. Some |
parameters are subject to validation, and the command will fail with |
an error message if the new value does not make sense. An optional |
third argument may be used to specify in which layer to set the |
configuration parameter. The default layer is "user". The |
configuration value will be set for the current channel, which |
is controlled by the default_channel configuration variable. |
</doc> |
</config-set> |
<config-help> |
<summary>Show Information About Setting</summary> |
<function>doConfigHelp</function> |
<shortcut>ch</shortcut> |
<options /> |
<doc>[parameter] |
Displays help for a configuration parameter. Without arguments it |
displays help for all configuration parameters. |
</doc> |
</config-help> |
<config-create> |
<summary>Create a Default configuration file</summary> |
<function>doConfigCreate</function> |
<shortcut>coc</shortcut> |
<options> |
<windows> |
<shortopt>w</shortopt> |
<doc>create a config file for a windows install</doc> |
</windows> |
</options> |
<doc><root path> <filename> |
Create a default configuration file with all directory configuration |
variables set to subdirectories of <root path>, and save it as <filename>. |
This is useful especially for creating a configuration file for a remote |
PEAR installation (using the --remoteconfig option of install, upgrade, |
and uninstall). |
</doc> |
</config-create> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Install.xml |
---|
New file |
0,0 → 1,276 |
<commands version="1.0"> |
<install> |
<summary>Install Package</summary> |
<function>doInstall</function> |
<shortcut>i</shortcut> |
<options> |
<force> |
<shortopt>f</shortopt> |
<doc>will overwrite newer installed packages</doc> |
</force> |
<loose> |
<shortopt>l</shortopt> |
<doc>do not check for recommended dependency version</doc> |
</loose> |
<nodeps> |
<shortopt>n</shortopt> |
<doc>ignore dependencies, install anyway</doc> |
</nodeps> |
<register-only> |
<shortopt>r</shortopt> |
<doc>do not install files, only register the package as installed</doc> |
</register-only> |
<soft> |
<shortopt>s</shortopt> |
<doc>soft install, fail silently, or upgrade if already installed</doc> |
</soft> |
<nobuild> |
<shortopt>B</shortopt> |
<doc>don't build C extensions</doc> |
</nobuild> |
<nocompress> |
<shortopt>Z</shortopt> |
<doc>request uncompressed files when downloading</doc> |
</nocompress> |
<installroot> |
<shortopt>R</shortopt> |
<doc>root directory used when installing files (ala PHP's INSTALL_ROOT), use packagingroot for RPM</doc> |
<arg>DIR</arg> |
</installroot> |
<packagingroot> |
<shortopt>P</shortopt> |
<doc>root directory used when packaging files, like RPM packaging</doc> |
<arg>DIR</arg> |
</packagingroot> |
<ignore-errors> |
<shortopt></shortopt> |
<doc>force install even if there were errors</doc> |
</ignore-errors> |
<alldeps> |
<shortopt>a</shortopt> |
<doc>install all required and optional dependencies</doc> |
</alldeps> |
<onlyreqdeps> |
<shortopt>o</shortopt> |
<doc>install all required dependencies</doc> |
</onlyreqdeps> |
<offline> |
<shortopt>O</shortopt> |
<doc>do not attempt to download any urls or contact channels</doc> |
</offline> |
<pretend> |
<shortopt>p</shortopt> |
<doc>Only list the packages that would be downloaded</doc> |
</pretend> |
</options> |
<doc>[channel/]<package> ... |
Installs one or more PEAR packages. You can specify a package to |
install in four ways: |
"Package-1.0.tgz" : installs from a local file |
"http://example.com/Package-1.0.tgz" : installs from |
anywhere on the net. |
"package.xml" : installs the package described in |
package.xml. Useful for testing, or for wrapping a PEAR package in |
another package manager such as RPM. |
"Package[-version/state][.tar]" : queries your default channel's server |
({config master_server}) and downloads the newest package with |
the preferred quality/state ({config preferred_state}). |
To retrieve Package version 1.1, use "Package-1.1," to retrieve |
Package state beta, use "Package-beta." To retrieve an uncompressed |
file, append .tar (make sure there is no file by the same name first) |
To download a package from another channel, prefix with the channel name like |
"channel/Package" |
More than one package may be specified at once. It is ok to mix these |
four ways of specifying packages. |
</doc> |
</install> |
<upgrade> |
<summary>Upgrade Package</summary> |
<function>doInstall</function> |
<shortcut>up</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>upgrade packages from a specific channel</doc> |
<arg>CHAN</arg> |
</channel> |
<force> |
<shortopt>f</shortopt> |
<doc>overwrite newer installed packages</doc> |
</force> |
<loose> |
<shortopt>l</shortopt> |
<doc>do not check for recommended dependency version</doc> |
</loose> |
<nodeps> |
<shortopt>n</shortopt> |
<doc>ignore dependencies, upgrade anyway</doc> |
</nodeps> |
<register-only> |
<shortopt>r</shortopt> |
<doc>do not install files, only register the package as upgraded</doc> |
</register-only> |
<nobuild> |
<shortopt>B</shortopt> |
<doc>don't build C extensions</doc> |
</nobuild> |
<nocompress> |
<shortopt>Z</shortopt> |
<doc>request uncompressed files when downloading</doc> |
</nocompress> |
<installroot> |
<shortopt>R</shortopt> |
<doc>root directory used when installing files (ala PHP's INSTALL_ROOT)</doc> |
<arg>DIR</arg> |
</installroot> |
<ignore-errors> |
<shortopt></shortopt> |
<doc>force install even if there were errors</doc> |
</ignore-errors> |
<alldeps> |
<shortopt>a</shortopt> |
<doc>install all required and optional dependencies</doc> |
</alldeps> |
<onlyreqdeps> |
<shortopt>o</shortopt> |
<doc>install all required dependencies</doc> |
</onlyreqdeps> |
<offline> |
<shortopt>O</shortopt> |
<doc>do not attempt to download any urls or contact channels</doc> |
</offline> |
<pretend> |
<shortopt>p</shortopt> |
<doc>Only list the packages that would be downloaded</doc> |
</pretend> |
</options> |
<doc><package> ... |
Upgrades one or more PEAR packages. See documentation for the |
"install" command for ways to specify a package. |
When upgrading, your package will be updated if the provided new |
package has a higher version number (use the -f option if you need to |
upgrade anyway). |
More than one package may be specified at once. |
</doc> |
</upgrade> |
<upgrade-all> |
<summary>Upgrade All Packages [Deprecated in favor of calling upgrade with no parameters]</summary> |
<function>doUpgradeAll</function> |
<shortcut>ua</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>upgrade packages from a specific channel</doc> |
<arg>CHAN</arg> |
</channel> |
<nodeps> |
<shortopt>n</shortopt> |
<doc>ignore dependencies, upgrade anyway</doc> |
</nodeps> |
<register-only> |
<shortopt>r</shortopt> |
<doc>do not install files, only register the package as upgraded</doc> |
</register-only> |
<nobuild> |
<shortopt>B</shortopt> |
<doc>don't build C extensions</doc> |
</nobuild> |
<nocompress> |
<shortopt>Z</shortopt> |
<doc>request uncompressed files when downloading</doc> |
</nocompress> |
<installroot> |
<shortopt>R</shortopt> |
<doc>root directory used when installing files (ala PHP's INSTALL_ROOT), use packagingroot for RPM</doc> |
<arg>DIR</arg> |
</installroot> |
<ignore-errors> |
<shortopt></shortopt> |
<doc>force install even if there were errors</doc> |
</ignore-errors> |
<loose> |
<shortopt></shortopt> |
<doc>do not check for recommended dependency version</doc> |
</loose> |
</options> |
<doc> |
WARNING: This function is deprecated in favor of using the upgrade command with no params |
Upgrades all packages that have a newer release available. Upgrades are |
done only if there is a release available of the state specified in |
"preferred_state" (currently {config preferred_state}), or a state considered |
more stable. |
</doc> |
</upgrade-all> |
<uninstall> |
<summary>Un-install Package</summary> |
<function>doUninstall</function> |
<shortcut>un</shortcut> |
<options> |
<nodeps> |
<shortopt>n</shortopt> |
<doc>ignore dependencies, uninstall anyway</doc> |
</nodeps> |
<register-only> |
<shortopt>r</shortopt> |
<doc>do not remove files, only register the packages as not installed</doc> |
</register-only> |
<installroot> |
<shortopt>R</shortopt> |
<doc>root directory used when installing files (ala PHP's INSTALL_ROOT)</doc> |
<arg>DIR</arg> |
</installroot> |
<ignore-errors> |
<shortopt></shortopt> |
<doc>force install even if there were errors</doc> |
</ignore-errors> |
<offline> |
<shortopt>O</shortopt> |
<doc>do not attempt to uninstall remotely</doc> |
</offline> |
</options> |
<doc>[channel/]<package> ... |
Uninstalls one or more PEAR packages. More than one package may be |
specified at once. Prefix with channel name to uninstall from a |
channel not in your default channel ({config default_channel}) |
</doc> |
</uninstall> |
<bundle> |
<summary>Unpacks a Pecl Package</summary> |
<function>doBundle</function> |
<shortcut>bun</shortcut> |
<options> |
<destination> |
<shortopt>d</shortopt> |
<doc>Optional destination directory for unpacking (defaults to current path or "ext" if exists)</doc> |
<arg>DIR</arg> |
</destination> |
<force> |
<shortopt>f</shortopt> |
<doc>Force the unpacking even if there were errors in the package</doc> |
</force> |
</options> |
<doc><package> |
Unpacks a Pecl Package into the selected location. It will download the |
package if needed. |
</doc> |
</bundle> |
<run-scripts> |
<summary>Run Post-Install Scripts bundled with a package</summary> |
<function>doRunScripts</function> |
<shortcut>rs</shortcut> |
<options /> |
<doc><package> |
Run post-installation scripts in package <package>, if any exist. |
</doc> |
</run-scripts> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Test.php |
---|
New file |
0,0 → 1,343 |
<?php |
/** |
* PEAR_Command_Test (run-tests) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Martin Jansen <mj@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 0.1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
/** |
* PEAR commands for login/logout |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Martin Jansen <mj@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 0.1 |
*/ |
class PEAR_Command_Test extends PEAR_Command_Common |
{ |
var $commands = array( |
'run-tests' => array( |
'summary' => 'Run Regression Tests', |
'function' => 'doRunTests', |
'shortcut' => 'rt', |
'options' => array( |
'recur' => array( |
'shortopt' => 'r', |
'doc' => 'Run tests in child directories, recursively. 4 dirs deep maximum', |
), |
'ini' => array( |
'shortopt' => 'i', |
'doc' => 'actual string of settings to pass to php in format " -d setting=blah"', |
'arg' => 'SETTINGS' |
), |
'realtimelog' => array( |
'shortopt' => 'l', |
'doc' => 'Log test runs/results as they are run', |
), |
'quiet' => array( |
'shortopt' => 'q', |
'doc' => 'Only display detail for failed tests', |
), |
'simple' => array( |
'shortopt' => 's', |
'doc' => 'Display simple output for all tests', |
), |
'package' => array( |
'shortopt' => 'p', |
'doc' => 'Treat parameters as installed packages from which to run tests', |
), |
'phpunit' => array( |
'shortopt' => 'u', |
'doc' => 'Search parameters for AllTests.php, and use that to run phpunit-based tests |
If none is found, all .phpt tests will be tried instead.', |
), |
'tapoutput' => array( |
'shortopt' => 't', |
'doc' => 'Output run-tests.log in TAP-compliant format', |
), |
'cgi' => array( |
'shortopt' => 'c', |
'doc' => 'CGI php executable (needed for tests with POST/GET section)', |
'arg' => 'PHPCGI', |
), |
'coverage' => array( |
'shortopt' => 'x', |
'doc' => 'Generate a code coverage report (requires Xdebug 2.0.0+)', |
), |
'showdiff' => array( |
'shortopt' => 'd', |
'doc' => 'Output diff on test failure', |
), |
), |
'doc' => '[testfile|dir ...] |
Run regression tests with PHP\'s regression testing script (run-tests.php).', |
), |
); |
var $output; |
/** |
* PEAR_Command_Test constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
function doRunTests($command, $options, $params) |
{ |
if (isset($options['phpunit']) && isset($options['tapoutput'])) { |
return $this->raiseError('ERROR: cannot use both --phpunit and --tapoutput at the same time'); |
} |
require_once 'PEAR/Common.php'; |
require_once 'System.php'; |
$log = new PEAR_Common; |
$log->ui = &$this->ui; // slightly hacky, but it will work |
$tests = array(); |
$depth = isset($options['recur']) ? 14 : 1; |
if (!count($params)) { |
$params[] = '.'; |
} |
if (isset($options['package'])) { |
$oldparams = $params; |
$params = array(); |
$reg = &$this->config->getRegistry(); |
foreach ($oldparams as $param) { |
$pname = $reg->parsePackageName($param, $this->config->get('default_channel')); |
if (PEAR::isError($pname)) { |
return $this->raiseError($pname); |
} |
$package = &$reg->getPackage($pname['package'], $pname['channel']); |
if (!$package) { |
return PEAR::raiseError('Unknown package "' . |
$reg->parsedPackageNameToString($pname) . '"'); |
} |
$filelist = $package->getFilelist(); |
foreach ($filelist as $name => $atts) { |
if (isset($atts['role']) && $atts['role'] != 'test') { |
continue; |
} |
if (isset($options['phpunit']) && preg_match('/AllTests\.php\\z/i', $name)) { |
$params[] = $atts['installed_as']; |
continue; |
} elseif (!preg_match('/\.phpt\\z/', $name)) { |
continue; |
} |
$params[] = $atts['installed_as']; |
} |
} |
} |
foreach ($params as $p) { |
if (is_dir($p)) { |
if (isset($options['phpunit'])) { |
$dir = System::find(array($p, '-type', 'f', |
'-maxdepth', $depth, |
'-name', 'AllTests.php')); |
if (count($dir)) { |
foreach ($dir as $p) { |
$p = realpath($p); |
if (!count($tests) || |
(count($tests) && strlen($p) < strlen($tests[0]))) { |
// this is in a higher-level directory, use this one instead. |
$tests = array($p); |
} |
} |
} |
continue; |
} |
$args = array($p, '-type', 'f', '-name', '*.phpt'); |
} else { |
if (isset($options['phpunit'])) { |
if (preg_match('/AllTests\.php\\z/i', $p)) { |
$p = realpath($p); |
if (!count($tests) || |
(count($tests) && strlen($p) < strlen($tests[0]))) { |
// this is in a higher-level directory, use this one instead. |
$tests = array($p); |
} |
} |
continue; |
} |
if (file_exists($p) && preg_match('/\.phpt$/', $p)) { |
$tests[] = $p; |
continue; |
} |
if (!preg_match('/\.phpt\\z/', $p)) { |
$p .= '.phpt'; |
} |
$args = array(dirname($p), '-type', 'f', '-name', $p); |
} |
if (!isset($options['recur'])) { |
$args[] = '-maxdepth'; |
$args[] = 1; |
} |
$dir = System::find($args); |
$tests = array_merge($tests, $dir); |
} |
$ini_settings = ''; |
if (isset($options['ini'])) { |
$ini_settings .= $options['ini']; |
} |
if (isset($_ENV['TEST_PHP_INCLUDE_PATH'])) { |
$ini_settings .= " -d include_path={$_ENV['TEST_PHP_INCLUDE_PATH']}"; |
} |
if ($ini_settings) { |
$this->ui->outputData('Using INI settings: "' . $ini_settings . '"'); |
} |
$skipped = $passed = $failed = array(); |
$tests_count = count($tests); |
$this->ui->outputData('Running ' . $tests_count . ' tests', $command); |
$start = time(); |
if (isset($options['realtimelog']) && file_exists('run-tests.log')) { |
unlink('run-tests.log'); |
} |
if (isset($options['tapoutput'])) { |
$tap = '1..' . $tests_count . "\n"; |
} |
require_once 'PEAR/RunTest.php'; |
$run = new PEAR_RunTest($log, $options); |
$run->tests_count = $tests_count; |
if (isset($options['coverage']) && extension_loaded('xdebug')){ |
$run->xdebug_loaded = true; |
} else { |
$run->xdebug_loaded = false; |
} |
$j = $i = 1; |
foreach ($tests as $t) { |
if (isset($options['realtimelog'])) { |
$fp = @fopen('run-tests.log', 'a'); |
if ($fp) { |
fwrite($fp, "Running test [$i / $tests_count] $t..."); |
fclose($fp); |
} |
} |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
if (isset($options['phpunit'])) { |
$result = $run->runPHPUnit($t, $ini_settings); |
} else { |
$result = $run->run($t, $ini_settings, $j); |
} |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($result)) { |
$this->ui->log($result->getMessage()); |
continue; |
} |
if (isset($options['tapoutput'])) { |
$tap .= $result[0] . ' ' . $i . $result[1] . "\n"; |
continue; |
} |
if (isset($options['realtimelog'])) { |
$fp = @fopen('run-tests.log', 'a'); |
if ($fp) { |
fwrite($fp, "$result\n"); |
fclose($fp); |
} |
} |
if ($result == 'FAILED') { |
$failed[] = $t; |
} |
if ($result == 'PASSED') { |
$passed[] = $t; |
} |
if ($result == 'SKIPPED') { |
$skipped[] = $t; |
} |
$j++; |
} |
$total = date('i:s', time() - $start); |
if (isset($options['tapoutput'])) { |
$fp = @fopen('run-tests.log', 'w'); |
if ($fp) { |
fwrite($fp, $tap, strlen($tap)); |
fclose($fp); |
$this->ui->outputData('wrote TAP-format log to "' .realpath('run-tests.log') . |
'"', $command); |
} |
} else { |
if (count($failed)) { |
$output = "TOTAL TIME: $total\n"; |
$output .= count($passed) . " PASSED TESTS\n"; |
$output .= count($skipped) . " SKIPPED TESTS\n"; |
$output .= count($failed) . " FAILED TESTS:\n"; |
foreach ($failed as $failure) { |
$output .= $failure . "\n"; |
} |
$mode = isset($options['realtimelog']) ? 'a' : 'w'; |
$fp = @fopen('run-tests.log', $mode); |
if ($fp) { |
fwrite($fp, $output, strlen($output)); |
fclose($fp); |
$this->ui->outputData('wrote log to "' . realpath('run-tests.log') . '"', $command); |
} |
} elseif (file_exists('run-tests.log') && !is_dir('run-tests.log')) { |
@unlink('run-tests.log'); |
} |
} |
$this->ui->outputData('TOTAL TIME: ' . $total); |
$this->ui->outputData(count($passed) . ' PASSED TESTS', $command); |
$this->ui->outputData(count($skipped) . ' SKIPPED TESTS', $command); |
if (count($failed)) { |
$this->ui->outputData(count($failed) . ' FAILED TESTS:', $command); |
foreach ($failed as $failure) { |
$this->ui->outputData($failure, $command); |
} |
} |
if (count($failed) == 0) { |
return true; |
} |
return $this->raiseError('Some tests failed'); |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Pickle.xml |
---|
New file |
0,0 → 1,36 |
<commands version="1.0"> |
<pickle> |
<summary>Build PECL Package</summary> |
<function>doPackage</function> |
<shortcut>pi</shortcut> |
<options> |
<nocompress> |
<shortopt>Z</shortopt> |
<doc>Do not gzip the package file</doc> |
</nocompress> |
<showname> |
<shortopt>n</shortopt> |
<doc>Print the name of the packaged file.</doc> |
</showname> |
</options> |
<doc>[descfile] |
Creates a PECL package from its package2.xml file. |
An automatic conversion will be made to a package.xml 1.0 and written out to |
disk in the current directory as "package.xml". Note that |
only simple package.xml 2.0 will be converted. package.xml 2.0 with: |
- dependency types other than required/optional PECL package/ext/php/pearinstaller |
- more than one extsrcrelease or zendextsrcrelease |
- zendextbinrelease, extbinrelease, phprelease, or bundle release type |
- dependency groups |
- ignore tags in release filelist |
- tasks other than replace |
- custom roles |
will cause pickle to fail, and output an error message. If your package2.xml |
uses any of these features, you are best off using PEAR_PackageFileManager to |
generate both package.xml. |
</doc> |
</pickle> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Registry.xml |
---|
New file |
0,0 → 1,58 |
<commands version="1.0"> |
<list> |
<summary>List Installed Packages In The Default Channel</summary> |
<function>doList</function> |
<shortcut>l</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>list installed packages from this channel</doc> |
<arg>CHAN</arg> |
</channel> |
<allchannels> |
<shortopt>a</shortopt> |
<doc>list installed packages from all channels</doc> |
</allchannels> |
<channelinfo> |
<shortopt>i</shortopt> |
<doc>output fully channel-aware data, even on failure</doc> |
</channelinfo> |
</options> |
<doc><package> |
If invoked without parameters, this command lists the PEAR packages |
installed in your php_dir ({config php_dir}). With a parameter, it |
lists the files in a package. |
</doc> |
</list> |
<list-files> |
<summary>List Files In Installed Package</summary> |
<function>doFileList</function> |
<shortcut>fl</shortcut> |
<options /> |
<doc><package> |
List the files in an installed package. |
</doc> |
</list-files> |
<shell-test> |
<summary>Shell Script Test</summary> |
<function>doShellTest</function> |
<shortcut>st</shortcut> |
<options /> |
<doc><package> [[relation] version] |
Tests if a package is installed in the system. Will exit(1) if it is not. |
<relation> The version comparison operator. One of: |
<, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne |
<version> The version to compare with |
</doc> |
</shell-test> |
<info> |
<summary>Display information about a package</summary> |
<function>doInfo</function> |
<shortcut>in</shortcut> |
<options /> |
<doc><package> |
Displays information about a package. The package argument may be a |
local package file, an URL to a package file, or the name of an |
installed package.</doc> |
</info> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Mirror.xml |
---|
New file |
0,0 → 1,18 |
<commands version="1.0"> |
<download-all> |
<summary>Downloads each available package from the default channel</summary> |
<function>doDownloadAll</function> |
<shortcut>da</shortcut> |
<options> |
<channel> |
<shortopt>c</shortopt> |
<doc>specify a channel other than the default channel</doc> |
<arg>CHAN</arg> |
</channel> |
</options> |
<doc> |
Requests a list of available packages from the default channel ({config default_channel}) |
and downloads them to current working directory. Note: only |
packages within preferred_state ({config preferred_state}) will be downloaded</doc> |
</download-all> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Test.xml |
---|
New file |
0,0 → 1,54 |
<commands version="1.0"> |
<run-tests> |
<summary>Run Regression Tests</summary> |
<function>doRunTests</function> |
<shortcut>rt</shortcut> |
<options> |
<recur> |
<shortopt>r</shortopt> |
<doc>Run tests in child directories, recursively. 4 dirs deep maximum</doc> |
</recur> |
<ini> |
<shortopt>i</shortopt> |
<doc>actual string of settings to pass to php in format " -d setting=blah"</doc> |
<arg>SETTINGS</arg> |
</ini> |
<realtimelog> |
<shortopt>l</shortopt> |
<doc>Log test runs/results as they are run</doc> |
</realtimelog> |
<quiet> |
<shortopt>q</shortopt> |
<doc>Only display detail for failed tests</doc> |
</quiet> |
<simple> |
<shortopt>s</shortopt> |
<doc>Display simple output for all tests</doc> |
</simple> |
<package> |
<shortopt>p</shortopt> |
<doc>Treat parameters as installed packages from which to run tests</doc> |
</package> |
<phpunit> |
<shortopt>u</shortopt> |
<doc>Search parameters for AllTests.php, and use that to run phpunit-based tests |
If none is found, all .phpt tests will be tried instead.</doc> |
</phpunit> |
<tapoutput> |
<shortopt>t</shortopt> |
<doc>Output run-tests.log in TAP-compliant format</doc> |
</tapoutput> |
<cgi> |
<shortopt>c</shortopt> |
<doc>CGI php executable (needed for tests with POST/GET section)</doc> |
<arg>PHPCGI</arg> |
</cgi> |
<coverage> |
<shortopt>x</shortopt> |
<doc>Generate a code coverage report (requires Xdebug 2.0.0+)</doc> |
</coverage> |
</options> |
<doc>[testfile|dir ...] |
Run regression tests with PHP's regression testing script (run-tests.php).</doc> |
</run-tests> |
</commands> |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Common.php |
---|
New file |
0,0 → 1,272 |
<?php |
/** |
* PEAR_Command_Common base class |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 0.1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR.php'; |
/** |
* PEAR commands base class |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 0.1 |
*/ |
class PEAR_Command_Common extends PEAR |
{ |
/** |
* PEAR_Config object used to pass user system and configuration |
* on when executing commands |
* |
* @var PEAR_Config |
*/ |
var $config; |
/** |
* @var PEAR_Registry |
* @access protected |
*/ |
var $_registry; |
/** |
* User Interface object, for all interaction with the user. |
* @var object |
*/ |
var $ui; |
var $_deps_rel_trans = array( |
'lt' => '<', |
'le' => '<=', |
'eq' => '=', |
'ne' => '!=', |
'gt' => '>', |
'ge' => '>=', |
'has' => '==' |
); |
var $_deps_type_trans = array( |
'pkg' => 'package', |
'ext' => 'extension', |
'php' => 'PHP', |
'prog' => 'external program', |
'ldlib' => 'external library for linking', |
'rtlib' => 'external runtime library', |
'os' => 'operating system', |
'websrv' => 'web server', |
'sapi' => 'SAPI backend' |
); |
/** |
* PEAR_Command_Common constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct(); |
$this->config = &$config; |
$this->ui = &$ui; |
} |
/** |
* Return a list of all the commands defined by this class. |
* @return array list of commands |
* @access public |
*/ |
function getCommands() |
{ |
$ret = array(); |
foreach (array_keys($this->commands) as $command) { |
$ret[$command] = $this->commands[$command]['summary']; |
} |
return $ret; |
} |
/** |
* Return a list of all the command shortcuts defined by this class. |
* @return array shortcut => command |
* @access public |
*/ |
function getShortcuts() |
{ |
$ret = array(); |
foreach (array_keys($this->commands) as $command) { |
if (isset($this->commands[$command]['shortcut'])) { |
$ret[$this->commands[$command]['shortcut']] = $command; |
} |
} |
return $ret; |
} |
function getOptions($command) |
{ |
$shortcuts = $this->getShortcuts(); |
if (isset($shortcuts[$command])) { |
$command = $shortcuts[$command]; |
} |
if (isset($this->commands[$command]) && |
isset($this->commands[$command]['options'])) { |
return $this->commands[$command]['options']; |
} |
return null; |
} |
function getGetoptArgs($command, &$short_args, &$long_args) |
{ |
$short_args = ''; |
$long_args = array(); |
if (empty($this->commands[$command]) || empty($this->commands[$command]['options'])) { |
return; |
} |
reset($this->commands[$command]['options']); |
while (list($option, $info) = each($this->commands[$command]['options'])) { |
$larg = $sarg = ''; |
if (isset($info['arg'])) { |
if ($info['arg']{0} == '(') { |
$larg = '=='; |
$sarg = '::'; |
$arg = substr($info['arg'], 1, -1); |
} else { |
$larg = '='; |
$sarg = ':'; |
$arg = $info['arg']; |
} |
} |
if (isset($info['shortopt'])) { |
$short_args .= $info['shortopt'] . $sarg; |
} |
$long_args[] = $option . $larg; |
} |
} |
/** |
* Returns the help message for the given command |
* |
* @param string $command The command |
* @return mixed A fail string if the command does not have help or |
* a two elements array containing [0]=>help string, |
* [1]=> help string for the accepted cmd args |
*/ |
function getHelp($command) |
{ |
$config = &PEAR_Config::singleton(); |
if (!isset($this->commands[$command])) { |
return "No such command \"$command\""; |
} |
$help = null; |
if (isset($this->commands[$command]['doc'])) { |
$help = $this->commands[$command]['doc']; |
} |
if (empty($help)) { |
// XXX (cox) Fallback to summary if there is no doc (show both?) |
if (!isset($this->commands[$command]['summary'])) { |
return "No help for command \"$command\""; |
} |
$help = $this->commands[$command]['summary']; |
} |
if (preg_match_all('/{config\s+([^\}]+)}/e', $help, $matches)) { |
foreach($matches[0] as $k => $v) { |
$help = preg_replace("/$v/", $config->get($matches[1][$k]), $help); |
} |
} |
return array($help, $this->getHelpArgs($command)); |
} |
/** |
* Returns the help for the accepted arguments of a command |
* |
* @param string $command |
* @return string The help string |
*/ |
function getHelpArgs($command) |
{ |
if (isset($this->commands[$command]['options']) && |
count($this->commands[$command]['options'])) |
{ |
$help = "Options:\n"; |
foreach ($this->commands[$command]['options'] as $k => $v) { |
if (isset($v['arg'])) { |
if ($v['arg'][0] == '(') { |
$arg = substr($v['arg'], 1, -1); |
$sapp = " [$arg]"; |
$lapp = "[=$arg]"; |
} else { |
$sapp = " $v[arg]"; |
$lapp = "=$v[arg]"; |
} |
} else { |
$sapp = $lapp = ""; |
} |
if (isset($v['shortopt'])) { |
$s = $v['shortopt']; |
$help .= " -$s$sapp, --$k$lapp\n"; |
} else { |
$help .= " --$k$lapp\n"; |
} |
$p = " "; |
$doc = rtrim(str_replace("\n", "\n$p", $v['doc'])); |
$help .= " $doc\n"; |
} |
return $help; |
} |
return null; |
} |
function run($command, $options, $params) |
{ |
if (empty($this->commands[$command]['function'])) { |
// look for shortcuts |
foreach (array_keys($this->commands) as $cmd) { |
if (isset($this->commands[$cmd]['shortcut']) && $this->commands[$cmd]['shortcut'] == $command) { |
if (empty($this->commands[$cmd]['function'])) { |
return $this->raiseError("unknown command `$command'"); |
} else { |
$func = $this->commands[$cmd]['function']; |
} |
$command = $cmd; |
//$command = $this->commands[$cmd]['function']; |
break; |
} |
} |
} else { |
$func = $this->commands[$command]['function']; |
} |
return $this->$func($command, $options, $params); |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Remote.php |
---|
New file |
0,0 → 1,809 |
<?php |
/** |
* PEAR_Command_Remote (remote-info, list-upgrades, remote-list, search, list-all, download, |
* clear-cache commands) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 0.1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
require_once 'PEAR/REST.php'; |
/** |
* PEAR commands for remote server querying |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 0.1 |
*/ |
class PEAR_Command_Remote extends PEAR_Command_Common |
{ |
var $commands = array( |
'remote-info' => array( |
'summary' => 'Information About Remote Packages', |
'function' => 'doRemoteInfo', |
'shortcut' => 'ri', |
'options' => array(), |
'doc' => '<package> |
Get details on a package from the server.', |
), |
'list-upgrades' => array( |
'summary' => 'List Available Upgrades', |
'function' => 'doListUpgrades', |
'shortcut' => 'lu', |
'options' => array( |
'channelinfo' => array( |
'shortopt' => 'i', |
'doc' => 'output fully channel-aware data, even on failure', |
), |
), |
'doc' => '[preferred_state] |
List releases on the server of packages you have installed where |
a newer version is available with the same release state (stable etc.) |
or the state passed as the second parameter.' |
), |
'remote-list' => array( |
'summary' => 'List Remote Packages', |
'function' => 'doRemoteList', |
'shortcut' => 'rl', |
'options' => array( |
'channel' => |
array( |
'shortopt' => 'c', |
'doc' => 'specify a channel other than the default channel', |
'arg' => 'CHAN', |
) |
), |
'doc' => ' |
Lists the packages available on the configured server along with the |
latest stable release of each package.', |
), |
'search' => array( |
'summary' => 'Search remote package database', |
'function' => 'doSearch', |
'shortcut' => 'sp', |
'options' => array( |
'channel' => |
array( |
'shortopt' => 'c', |
'doc' => 'specify a channel other than the default channel', |
'arg' => 'CHAN', |
), |
'allchannels' => array( |
'shortopt' => 'a', |
'doc' => 'search packages from all known channels', |
), |
'channelinfo' => array( |
'shortopt' => 'i', |
'doc' => 'output fully channel-aware data, even on failure', |
), |
), |
'doc' => '[packagename] [packageinfo] |
Lists all packages which match the search parameters. The first |
parameter is a fragment of a packagename. The default channel |
will be used unless explicitly overridden. The second parameter |
will be used to match any portion of the summary/description', |
), |
'list-all' => array( |
'summary' => 'List All Packages', |
'function' => 'doListAll', |
'shortcut' => 'la', |
'options' => array( |
'channel' => |
array( |
'shortopt' => 'c', |
'doc' => 'specify a channel other than the default channel', |
'arg' => 'CHAN', |
), |
'channelinfo' => array( |
'shortopt' => 'i', |
'doc' => 'output fully channel-aware data, even on failure', |
), |
), |
'doc' => ' |
Lists the packages available on the configured server along with the |
latest stable release of each package.', |
), |
'download' => array( |
'summary' => 'Download Package', |
'function' => 'doDownload', |
'shortcut' => 'd', |
'options' => array( |
'nocompress' => array( |
'shortopt' => 'Z', |
'doc' => 'download an uncompressed (.tar) file', |
), |
), |
'doc' => '<package>... |
Download package tarballs. The files will be named as suggested by the |
server, for example if you download the DB package and the latest stable |
version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz.', |
), |
'clear-cache' => array( |
'summary' => 'Clear Web Services Cache', |
'function' => 'doClearCache', |
'shortcut' => 'cc', |
'options' => array(), |
'doc' => ' |
Clear the REST cache. See also the cache_ttl configuration |
parameter. |
', |
), |
); |
/** |
* PEAR_Command_Remote constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
function _checkChannelForStatus($channel, $chan) |
{ |
if (PEAR::isError($chan)) { |
$this->raiseError($chan); |
} |
if (!is_a($chan, 'PEAR_ChannelFile')) { |
return $this->raiseError('Internal corruption error: invalid channel "' . |
$channel . '"'); |
} |
$rest = new PEAR_REST($this->config); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$mirror = $this->config->get('preferred_mirror', null, |
$channel); |
$a = $rest->downloadHttp('http://' . $channel . |
'/channel.xml', $chan->lastModified()); |
PEAR::staticPopErrorHandling(); |
if (!PEAR::isError($a) && $a) { |
$this->ui->outputData('WARNING: channel "' . $channel . '" has ' . |
'updated its protocols, use "' . PEAR_RUNTYPE . ' channel-update ' . $channel . |
'" to update'); |
} |
} |
function doRemoteInfo($command, $options, $params) |
{ |
if (sizeof($params) != 1) { |
return $this->raiseError("$command expects one param: the remote package name"); |
} |
$savechannel = $channel = $this->config->get('default_channel'); |
$reg = &$this->config->getRegistry(); |
$package = $params[0]; |
$parsed = $reg->parsePackageName($package, $channel); |
if (PEAR::isError($parsed)) { |
return $this->raiseError('Invalid package name "' . $package . '"'); |
} |
$channel = $parsed['channel']; |
$this->config->set('default_channel', $channel); |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { |
return $e; |
} |
$mirror = $this->config->get('preferred_mirror'); |
if ($chan->supportsREST($mirror) && $base = $chan->getBaseURL('REST1.0', $mirror)) { |
$rest = &$this->config->getREST('1.0', array()); |
$info = $rest->packageInfo($base, $parsed['package'], $channel); |
} |
if (!isset($info)) { |
return $this->raiseError('No supported protocol was found'); |
} |
if (PEAR::isError($info)) { |
$this->config->set('default_channel', $savechannel); |
return $this->raiseError($info); |
} |
if (!isset($info['name'])) { |
return $this->raiseError('No remote package "' . $package . '" was found'); |
} |
$installed = $reg->packageInfo($info['name'], null, $channel); |
$info['installed'] = $installed['version'] ? $installed['version'] : '- no -'; |
if (is_array($info['installed'])) { |
$info['installed'] = $info['installed']['release']; |
} |
$this->ui->outputData($info, $command); |
$this->config->set('default_channel', $savechannel); |
return true; |
} |
function doRemoteList($command, $options, $params) |
{ |
$savechannel = $channel = $this->config->get('default_channel'); |
$reg = &$this->config->getRegistry(); |
if (isset($options['channel'])) { |
$channel = $options['channel']; |
if (!$reg->channelExists($channel)) { |
return $this->raiseError('Channel "' . $channel . '" does not exist'); |
} |
$this->config->set('default_channel', $channel); |
} |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { |
return $e; |
} |
$list_options = false; |
if ($this->config->get('preferred_state') == 'stable') { |
$list_options = true; |
} |
$available = array(); |
if ($chan->supportsREST($this->config->get('preferred_mirror')) && |
$base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror')) |
) { |
// use faster list-all if available |
$rest = &$this->config->getREST('1.1', array()); |
$available = $rest->listAll($base, $list_options, true, false, false, $chan->getName()); |
} elseif ($chan->supportsREST($this->config->get('preferred_mirror')) && |
$base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) { |
$rest = &$this->config->getREST('1.0', array()); |
$available = $rest->listAll($base, $list_options, true, false, false, $chan->getName()); |
} |
if (PEAR::isError($available)) { |
$this->config->set('default_channel', $savechannel); |
return $this->raiseError($available); |
} |
$i = $j = 0; |
$data = array( |
'caption' => 'Channel ' . $channel . ' Available packages:', |
'border' => true, |
'headline' => array('Package', 'Version'), |
'channel' => $channel |
); |
if (count($available) == 0) { |
$data = '(no packages available yet)'; |
} else { |
foreach ($available as $name => $info) { |
$version = (isset($info['stable']) && $info['stable']) ? $info['stable'] : '-n/a-'; |
$data['data'][] = array($name, $version); |
} |
} |
$this->ui->outputData($data, $command); |
$this->config->set('default_channel', $savechannel); |
return true; |
} |
function doListAll($command, $options, $params) |
{ |
$savechannel = $channel = $this->config->get('default_channel'); |
$reg = &$this->config->getRegistry(); |
if (isset($options['channel'])) { |
$channel = $options['channel']; |
if (!$reg->channelExists($channel)) { |
return $this->raiseError("Channel \"$channel\" does not exist"); |
} |
$this->config->set('default_channel', $channel); |
} |
$list_options = false; |
if ($this->config->get('preferred_state') == 'stable') { |
$list_options = true; |
} |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { |
return $e; |
} |
if ($chan->supportsREST($this->config->get('preferred_mirror')) && |
$base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror'))) { |
// use faster list-all if available |
$rest = &$this->config->getREST('1.1', array()); |
$available = $rest->listAll($base, $list_options, false, false, false, $chan->getName()); |
} elseif ($chan->supportsREST($this->config->get('preferred_mirror')) && |
$base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) { |
$rest = &$this->config->getREST('1.0', array()); |
$available = $rest->listAll($base, $list_options, false, false, false, $chan->getName()); |
} |
if (PEAR::isError($available)) { |
$this->config->set('default_channel', $savechannel); |
return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "' . $available->getMessage() . '")'); |
} |
$data = array( |
'caption' => 'All packages [Channel ' . $channel . ']:', |
'border' => true, |
'headline' => array('Package', 'Latest', 'Local'), |
'channel' => $channel, |
); |
if (isset($options['channelinfo'])) { |
// add full channelinfo |
$data['caption'] = 'Channel ' . $channel . ' All packages:'; |
$data['headline'] = array('Channel', 'Package', 'Latest', 'Local', |
'Description', 'Dependencies'); |
} |
$local_pkgs = $reg->listPackages($channel); |
foreach ($available as $name => $info) { |
$installed = $reg->packageInfo($name, null, $channel); |
if (is_array($installed['version'])) { |
$installed['version'] = $installed['version']['release']; |
} |
$desc = $info['summary']; |
if (isset($params[$name])) { |
$desc .= "\n\n".$info['description']; |
} |
if (isset($options['mode'])) |
{ |
if ($options['mode'] == 'installed' && !isset($installed['version'])) { |
continue; |
} |
if ($options['mode'] == 'notinstalled' && isset($installed['version'])) { |
continue; |
} |
if ($options['mode'] == 'upgrades' |
&& (!isset($installed['version']) || version_compare($installed['version'], |
$info['stable'], '>='))) { |
continue; |
} |
} |
$pos = array_search(strtolower($name), $local_pkgs); |
if ($pos !== false) { |
unset($local_pkgs[$pos]); |
} |
if (isset($info['stable']) && !$info['stable']) { |
$info['stable'] = null; |
} |
if (isset($options['channelinfo'])) { |
// add full channelinfo |
if ($info['stable'] === $info['unstable']) { |
$state = $info['state']; |
} else { |
$state = 'stable'; |
} |
$latest = $info['stable'].' ('.$state.')'; |
$local = ''; |
if (isset($installed['version'])) { |
$inst_state = $reg->packageInfo($name, 'release_state', $channel); |
$local = $installed['version'].' ('.$inst_state.')'; |
} |
$packageinfo = array( |
$channel, |
$name, |
$latest, |
$local, |
isset($desc) ? $desc : null, |
isset($info['deps']) ? $info['deps'] : null, |
); |
} else { |
$packageinfo = array( |
$reg->channelAlias($channel) . '/' . $name, |
isset($info['stable']) ? $info['stable'] : null, |
isset($installed['version']) ? $installed['version'] : null, |
isset($desc) ? $desc : null, |
isset($info['deps']) ? $info['deps'] : null, |
); |
} |
$data['data'][$info['category']][] = $packageinfo; |
} |
if (isset($options['mode']) && in_array($options['mode'], array('notinstalled', 'upgrades'))) { |
$this->config->set('default_channel', $savechannel); |
$this->ui->outputData($data, $command); |
return true; |
} |
foreach ($local_pkgs as $name) { |
$info = &$reg->getPackage($name, $channel); |
$data['data']['Local'][] = array( |
$reg->channelAlias($channel) . '/' . $info->getPackage(), |
'', |
$info->getVersion(), |
$info->getSummary(), |
$info->getDeps() |
); |
} |
$this->config->set('default_channel', $savechannel); |
$this->ui->outputData($data, $command); |
return true; |
} |
function doSearch($command, $options, $params) |
{ |
if ((!isset($params[0]) || empty($params[0])) |
&& (!isset($params[1]) || empty($params[1]))) |
{ |
return $this->raiseError('no valid search string supplied'); |
} |
$channelinfo = isset($options['channelinfo']); |
$reg = &$this->config->getRegistry(); |
if (isset($options['allchannels'])) { |
// search all channels |
unset($options['allchannels']); |
$channels = $reg->getChannels(); |
$errors = array(); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
foreach ($channels as $channel) { |
if ($channel->getName() != '__uri') { |
$options['channel'] = $channel->getName(); |
$ret = $this->doSearch($command, $options, $params); |
if (PEAR::isError($ret)) { |
$errors[] = $ret; |
} |
} |
} |
PEAR::staticPopErrorHandling(); |
if (count($errors) !== 0) { |
// for now, only give first error |
return PEAR::raiseError($errors[0]); |
} |
return true; |
} |
$savechannel = $channel = $this->config->get('default_channel'); |
$package = strtolower($params[0]); |
$summary = isset($params[1]) ? $params[1] : false; |
if (isset($options['channel'])) { |
$reg = &$this->config->getRegistry(); |
$channel = $options['channel']; |
if (!$reg->channelExists($channel)) { |
return $this->raiseError('Channel "' . $channel . '" does not exist'); |
} |
$this->config->set('default_channel', $channel); |
} |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { |
return $e; |
} |
if ($chan->supportsREST($this->config->get('preferred_mirror')) && |
$base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) { |
$rest = &$this->config->getREST('1.0', array()); |
$available = $rest->listAll($base, false, false, $package, $summary, $chan->getName()); |
} |
if (PEAR::isError($available)) { |
$this->config->set('default_channel', $savechannel); |
return $this->raiseError($available); |
} |
if (!$available && !$channelinfo) { |
// clean exit when not found, no error ! |
$data = 'no packages found that match pattern "' . $package . '", for channel '.$channel.'.'; |
$this->ui->outputData($data); |
$this->config->set('default_channel', $channel); |
return true; |
} |
if ($channelinfo) { |
$data = array( |
'caption' => 'Matched packages, channel ' . $channel . ':', |
'border' => true, |
'headline' => array('Channel', 'Package', 'Stable/(Latest)', 'Local'), |
'channel' => $channel |
); |
} else { |
$data = array( |
'caption' => 'Matched packages, channel ' . $channel . ':', |
'border' => true, |
'headline' => array('Package', 'Stable/(Latest)', 'Local'), |
'channel' => $channel |
); |
} |
if (!$available && $channelinfo) { |
unset($data['headline']); |
$data['data'] = 'No packages found that match pattern "' . $package . '".'; |
$available = array(); |
} |
foreach ($available as $name => $info) { |
$installed = $reg->packageInfo($name, null, $channel); |
$desc = $info['summary']; |
if (isset($params[$name])) |
$desc .= "\n\n".$info['description']; |
if (!isset($info['stable']) || !$info['stable']) { |
$version_remote = 'none'; |
} else { |
if ($info['unstable']) { |
$version_remote = $info['unstable']; |
} else { |
$version_remote = $info['stable']; |
} |
$version_remote .= ' ('.$info['state'].')'; |
} |
$version = is_array($installed['version']) ? $installed['version']['release'] : |
$installed['version']; |
if ($channelinfo) { |
$packageinfo = array( |
$channel, |
$name, |
$version_remote, |
$version, |
$desc, |
); |
} else { |
$packageinfo = array( |
$name, |
$version_remote, |
$version, |
$desc, |
); |
} |
$data['data'][$info['category']][] = $packageinfo; |
} |
$this->ui->outputData($data, $command); |
$this->config->set('default_channel', $channel); |
return true; |
} |
function &getDownloader($options) |
{ |
if (!class_exists('PEAR_Downloader')) { |
require_once 'PEAR/Downloader.php'; |
} |
$a = new PEAR_Downloader($this->ui, $options, $this->config); |
return $a; |
} |
function doDownload($command, $options, $params) |
{ |
// make certain that dependencies are ignored |
$options['downloadonly'] = 1; |
// eliminate error messages for preferred_state-related errors |
/* TODO: Should be an option, but until now download does respect |
prefered state */ |
/* $options['ignorepreferred_state'] = 1; */ |
// eliminate error messages for preferred_state-related errors |
$downloader = &$this->getDownloader($options); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$e = $downloader->setDownloadDir(getcwd()); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($e)) { |
return $this->raiseError('Current directory is not writeable, cannot download'); |
} |
$errors = array(); |
$downloaded = array(); |
$err = $downloader->download($params); |
if (PEAR::isError($err)) { |
return $err; |
} |
$errors = $downloader->getErrorMsgs(); |
if (count($errors)) { |
foreach ($errors as $error) { |
if ($error !== null) { |
$this->ui->outputData($error); |
} |
} |
return $this->raiseError("$command failed"); |
} |
$downloaded = $downloader->getDownloadedPackages(); |
foreach ($downloaded as $pkg) { |
$this->ui->outputData("File $pkg[file] downloaded", $command); |
} |
return true; |
} |
function downloadCallback($msg, $params = null) |
{ |
if ($msg == 'done') { |
$this->bytes_downloaded = $params; |
} |
} |
function doListUpgrades($command, $options, $params) |
{ |
require_once 'PEAR/Common.php'; |
if (isset($params[0]) && !is_array(PEAR_Common::betterStates($params[0]))) { |
return $this->raiseError($params[0] . ' is not a valid state (stable/beta/alpha/devel/etc.) try "pear help list-upgrades"'); |
} |
$savechannel = $channel = $this->config->get('default_channel'); |
$reg = &$this->config->getRegistry(); |
foreach ($reg->listChannels() as $channel) { |
$inst = array_flip($reg->listPackages($channel)); |
if (!count($inst)) { |
continue; |
} |
if ($channel == '__uri') { |
continue; |
} |
$this->config->set('default_channel', $channel); |
$state = empty($params[0]) ? $this->config->get('preferred_state') : $params[0]; |
$caption = $channel . ' Available Upgrades'; |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) { |
return $e; |
} |
$latest = array(); |
$base2 = false; |
$preferred_mirror = $this->config->get('preferred_mirror'); |
if ($chan->supportsREST($preferred_mirror) && |
( |
($base2 = $chan->getBaseURL('REST1.3', $preferred_mirror)) |
|| ($base = $chan->getBaseURL('REST1.0', $preferred_mirror)) |
) |
) { |
if ($base2) { |
$rest = &$this->config->getREST('1.3', array()); |
$base = $base2; |
} else { |
$rest = &$this->config->getREST('1.0', array()); |
} |
if (empty($state) || $state == 'any') { |
$state = false; |
} else { |
$caption .= ' (' . implode(', ', PEAR_Common::betterStates($state, true)) . ')'; |
} |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$latest = $rest->listLatestUpgrades($base, $state, $inst, $channel, $reg); |
PEAR::staticPopErrorHandling(); |
} |
if (PEAR::isError($latest)) { |
$this->ui->outputData($latest->getMessage()); |
continue; |
} |
$caption .= ':'; |
if (PEAR::isError($latest)) { |
$this->config->set('default_channel', $savechannel); |
return $latest; |
} |
$data = array( |
'caption' => $caption, |
'border' => 1, |
'headline' => array('Channel', 'Package', 'Local', 'Remote', 'Size'), |
'channel' => $channel |
); |
foreach ((array)$latest as $pkg => $info) { |
$package = strtolower($pkg); |
if (!isset($inst[$package])) { |
// skip packages we don't have installed |
continue; |
} |
extract($info); |
$inst_version = $reg->packageInfo($package, 'version', $channel); |
$inst_state = $reg->packageInfo($package, 'release_state', $channel); |
if (version_compare("$version", "$inst_version", "le")) { |
// installed version is up-to-date |
continue; |
} |
if ($filesize >= 20480) { |
$filesize += 1024 - ($filesize % 1024); |
$fs = sprintf("%dkB", $filesize / 1024); |
} elseif ($filesize > 0) { |
$filesize += 103 - ($filesize % 103); |
$fs = sprintf("%.1fkB", $filesize / 1024.0); |
} else { |
$fs = " -"; // XXX center instead |
} |
$data['data'][] = array($channel, $pkg, "$inst_version ($inst_state)", "$version ($state)", $fs); |
} |
if (isset($options['channelinfo'])) { |
if (empty($data['data'])) { |
unset($data['headline']); |
if (count($inst) == 0) { |
$data['data'] = '(no packages installed)'; |
} else { |
$data['data'] = '(no upgrades available)'; |
} |
} |
$this->ui->outputData($data, $command); |
} else { |
if (empty($data['data'])) { |
$this->ui->outputData('Channel ' . $channel . ': No upgrades available'); |
} else { |
$this->ui->outputData($data, $command); |
} |
} |
} |
$this->config->set('default_channel', $savechannel); |
return true; |
} |
function doClearCache($command, $options, $params) |
{ |
$cache_dir = $this->config->get('cache_dir'); |
$verbose = $this->config->get('verbose'); |
$output = ''; |
if (!file_exists($cache_dir) || !is_dir($cache_dir)) { |
return $this->raiseError("$cache_dir does not exist or is not a directory"); |
} |
if (!($dp = @opendir($cache_dir))) { |
return $this->raiseError("opendir($cache_dir) failed: $php_errormsg"); |
} |
if ($verbose >= 1) { |
$output .= "reading directory $cache_dir\n"; |
} |
$num = 0; |
while ($ent = readdir($dp)) { |
if (preg_match('/rest.cache(file|id)\\z/', $ent)) { |
$path = $cache_dir . DIRECTORY_SEPARATOR . $ent; |
if (file_exists($path)) { |
$ok = @unlink($path); |
} else { |
$ok = false; |
$php_errormsg = ''; |
} |
if ($ok) { |
if ($verbose >= 2) { |
$output .= "deleted $path\n"; |
} |
$num++; |
} elseif ($verbose >= 1) { |
$output .= "failed to delete $path $php_errormsg\n"; |
} |
} |
} |
closedir($dp); |
if ($verbose >= 1) { |
$output .= "$num cache entries cleared\n"; |
} |
$this->ui->outputData(rtrim($output), $command); |
return $num; |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Channels.php |
---|
New file |
0,0 → 1,882 |
<?php |
// /* vim: set expandtab tabstop=4 shiftwidth=4: */ |
/** |
* PEAR_Command_Channels (list-channels, update-channels, channel-delete, channel-add, |
* channel-update, channel-info, channel-alias, channel-discover commands) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 1.4.0a1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
define('PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS', -500); |
/** |
* PEAR commands for managing channels. |
* |
* @category pear |
* @package PEAR |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 1.4.0a1 |
*/ |
class PEAR_Command_Channels extends PEAR_Command_Common |
{ |
var $commands = array( |
'list-channels' => array( |
'summary' => 'List Available Channels', |
'function' => 'doList', |
'shortcut' => 'lc', |
'options' => array(), |
'doc' => ' |
List all available channels for installation. |
', |
), |
'update-channels' => array( |
'summary' => 'Update the Channel List', |
'function' => 'doUpdateAll', |
'shortcut' => 'uc', |
'options' => array(), |
'doc' => ' |
List all installed packages in all channels. |
' |
), |
'channel-delete' => array( |
'summary' => 'Remove a Channel From the List', |
'function' => 'doDelete', |
'shortcut' => 'cde', |
'options' => array(), |
'doc' => '<channel name> |
Delete a channel from the registry. You may not |
remove any channel that has installed packages. |
' |
), |
'channel-add' => array( |
'summary' => 'Add a Channel', |
'function' => 'doAdd', |
'shortcut' => 'ca', |
'options' => array(), |
'doc' => '<channel.xml> |
Add a private channel to the channel list. Note that all |
public channels should be synced using "update-channels". |
Parameter may be either a local file or remote URL to a |
channel.xml. |
' |
), |
'channel-update' => array( |
'summary' => 'Update an Existing Channel', |
'function' => 'doUpdate', |
'shortcut' => 'cu', |
'options' => array( |
'force' => array( |
'shortopt' => 'f', |
'doc' => 'will force download of new channel.xml if an existing channel name is used', |
), |
'channel' => array( |
'shortopt' => 'c', |
'arg' => 'CHANNEL', |
'doc' => 'will force download of new channel.xml if an existing channel name is used', |
), |
), |
'doc' => '[<channel.xml>|<channel name>] |
Update a channel in the channel list directly. Note that all |
public channels can be synced using "update-channels". |
Parameter may be a local or remote channel.xml, or the name of |
an existing channel. |
' |
), |
'channel-info' => array( |
'summary' => 'Retrieve Information on a Channel', |
'function' => 'doInfo', |
'shortcut' => 'ci', |
'options' => array(), |
'doc' => '<package> |
List the files in an installed package. |
' |
), |
'channel-alias' => array( |
'summary' => 'Specify an alias to a channel name', |
'function' => 'doAlias', |
'shortcut' => 'cha', |
'options' => array(), |
'doc' => '<channel> <alias> |
Specify a specific alias to use for a channel name. |
The alias may not be an existing channel name or |
alias. |
' |
), |
'channel-discover' => array( |
'summary' => 'Initialize a Channel from its server', |
'function' => 'doDiscover', |
'shortcut' => 'di', |
'options' => array(), |
'doc' => '[<channel.xml>|<channel name>] |
Initialize a channel from its server and create a local channel.xml. |
If <channel name> is in the format "<username>:<password>@<channel>" then |
<username> and <password> will be set as the login username/password for |
<channel>. Use caution when passing the username/password in this way, as |
it may allow other users on your computer to briefly view your username/ |
password via the system\'s process list. |
' |
), |
'channel-login' => array( |
'summary' => 'Connects and authenticates to remote channel server', |
'shortcut' => 'cli', |
'function' => 'doLogin', |
'options' => array(), |
'doc' => '<channel name> |
Log in to a remote channel server. If <channel name> is not supplied, |
the default channel is used. To use remote functions in the installer |
that require any kind of privileges, you need to log in first. The |
username and password you enter here will be stored in your per-user |
PEAR configuration (~/.pearrc on Unix-like systems). After logging |
in, your username and password will be sent along in subsequent |
operations on the remote server.', |
), |
'channel-logout' => array( |
'summary' => 'Logs out from the remote channel server', |
'shortcut' => 'clo', |
'function' => 'doLogout', |
'options' => array(), |
'doc' => '<channel name> |
Logs out from a remote channel server. If <channel name> is not supplied, |
the default channel is used. This command does not actually connect to the |
remote server, it only deletes the stored username and password from your user |
configuration.', |
), |
); |
/** |
* PEAR_Command_Registry constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
function _sortChannels($a, $b) |
{ |
return strnatcasecmp($a->getName(), $b->getName()); |
} |
function doList($command, $options, $params) |
{ |
$reg = &$this->config->getRegistry(); |
$registered = $reg->getChannels(); |
usort($registered, array(&$this, '_sortchannels')); |
$i = $j = 0; |
$data = array( |
'caption' => 'Registered Channels:', |
'border' => true, |
'headline' => array('Channel', 'Alias', 'Summary') |
); |
foreach ($registered as $channel) { |
$data['data'][] = array($channel->getName(), |
$channel->getAlias(), |
$channel->getSummary()); |
} |
if (count($registered) === 0) { |
$data = '(no registered channels)'; |
} |
$this->ui->outputData($data, $command); |
return true; |
} |
function doUpdateAll($command, $options, $params) |
{ |
$reg = &$this->config->getRegistry(); |
$channels = $reg->getChannels(); |
$success = true; |
foreach ($channels as $channel) { |
if ($channel->getName() != '__uri') { |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$err = $this->doUpdate('channel-update', |
$options, |
array($channel->getName())); |
if (PEAR::isError($err)) { |
$this->ui->outputData($err->getMessage(), $command); |
$success = false; |
} else { |
$success &= $err; |
} |
} |
} |
return $success; |
} |
function doInfo($command, $options, $params) |
{ |
if (count($params) !== 1) { |
return $this->raiseError("No channel specified"); |
} |
$reg = &$this->config->getRegistry(); |
$channel = strtolower($params[0]); |
if ($reg->channelExists($channel)) { |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($chan)) { |
return $this->raiseError($chan); |
} |
} else { |
if (strpos($channel, '://')) { |
$downloader = &$this->getDownloader(); |
$tmpdir = $this->config->get('temp_dir'); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$loc = $downloader->downloadHttp($channel, $this->ui, $tmpdir); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($loc)) { |
return $this->raiseError('Cannot open "' . $channel . |
'" (' . $loc->getMessage() . ')'); |
} else { |
$contents = implode('', file($loc)); |
} |
} else { |
if (!file_exists($params[0])) { |
return $this->raiseError('Unknown channel "' . $channel . '"'); |
} |
$fp = fopen($params[0], 'r'); |
if (!$fp) { |
return $this->raiseError('Cannot open "' . $params[0] . '"'); |
} |
$contents = ''; |
while (!feof($fp)) { |
$contents .= fread($fp, 1024); |
} |
fclose($fp); |
} |
if (!class_exists('PEAR_ChannelFile')) { |
require_once 'PEAR/ChannelFile.php'; |
} |
$chan = new PEAR_ChannelFile; |
$chan->fromXmlString($contents); |
$chan->validate(); |
if ($errs = $chan->getErrors(true)) { |
foreach ($errs as $err) { |
$this->ui->outputData($err['level'] . ': ' . $err['message']); |
} |
return $this->raiseError('Channel file "' . $params[0] . '" is not valid'); |
} |
} |
if (!$chan) { |
return $this->raiseError('Serious error: Channel "' . $params[0] . |
'" has a corrupted registry entry'); |
} |
$channel = $chan->getName(); |
$caption = 'Channel ' . $channel . ' Information:'; |
$data1 = array( |
'caption' => $caption, |
'border' => true); |
$data1['data']['server'] = array('Name and Server', $chan->getName()); |
if ($chan->getAlias() != $chan->getName()) { |
$data1['data']['alias'] = array('Alias', $chan->getAlias()); |
} |
$data1['data']['summary'] = array('Summary', $chan->getSummary()); |
$validate = $chan->getValidationPackage(); |
$data1['data']['vpackage'] = array('Validation Package Name', $validate['_content']); |
$data1['data']['vpackageversion'] = |
array('Validation Package Version', $validate['attribs']['version']); |
$d = array(); |
$d['main'] = $data1; |
$data['data'] = array(); |
$data['caption'] = 'Server Capabilities'; |
$data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base'); |
if ($chan->supportsREST()) { |
if ($chan->supportsREST()) { |
$funcs = $chan->getFunctions('rest'); |
if (!isset($funcs[0])) { |
$funcs = array($funcs); |
} |
foreach ($funcs as $protocol) { |
$data['data'][] = array('rest', $protocol['attribs']['type'], |
$protocol['_content']); |
} |
} |
} else { |
$data['data'][] = array('No supported protocols'); |
} |
$d['protocols'] = $data; |
$data['data'] = array(); |
$mirrors = $chan->getMirrors(); |
if ($mirrors) { |
$data['caption'] = 'Channel ' . $channel . ' Mirrors:'; |
unset($data['headline']); |
foreach ($mirrors as $mirror) { |
$data['data'][] = array($mirror['attribs']['host']); |
$d['mirrors'] = $data; |
} |
foreach ($mirrors as $i => $mirror) { |
$data['data'] = array(); |
$data['caption'] = 'Mirror ' . $mirror['attribs']['host'] . ' Capabilities'; |
$data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base'); |
if ($chan->supportsREST($mirror['attribs']['host'])) { |
if ($chan->supportsREST($mirror['attribs']['host'])) { |
$funcs = $chan->getFunctions('rest', $mirror['attribs']['host']); |
if (!isset($funcs[0])) { |
$funcs = array($funcs); |
} |
foreach ($funcs as $protocol) { |
$data['data'][] = array('rest', $protocol['attribs']['type'], |
$protocol['_content']); |
} |
} |
} else { |
$data['data'][] = array('No supported protocols'); |
} |
$d['mirrorprotocols' . $i] = $data; |
} |
} |
$this->ui->outputData($d, 'channel-info'); |
} |
// }}} |
function doDelete($command, $options, $params) |
{ |
if (count($params) !== 1) { |
return $this->raiseError('channel-delete: no channel specified'); |
} |
$reg = &$this->config->getRegistry(); |
if (!$reg->channelExists($params[0])) { |
return $this->raiseError('channel-delete: channel "' . $params[0] . '" does not exist'); |
} |
$channel = $reg->channelName($params[0]); |
if ($channel == 'pear.php.net') { |
return $this->raiseError('Cannot delete the pear.php.net channel'); |
} |
if ($channel == 'pecl.php.net') { |
return $this->raiseError('Cannot delete the pecl.php.net channel'); |
} |
if ($channel == 'doc.php.net') { |
return $this->raiseError('Cannot delete the doc.php.net channel'); |
} |
if ($channel == '__uri') { |
return $this->raiseError('Cannot delete the __uri pseudo-channel'); |
} |
if (PEAR::isError($err = $reg->listPackages($channel))) { |
return $err; |
} |
if (count($err)) { |
return $this->raiseError('Channel "' . $channel . |
'" has installed packages, cannot delete'); |
} |
if (!$reg->deleteChannel($channel)) { |
return $this->raiseError('Channel "' . $channel . '" deletion failed'); |
} else { |
$this->config->deleteChannel($channel); |
$this->ui->outputData('Channel "' . $channel . '" deleted', $command); |
} |
} |
function doAdd($command, $options, $params) |
{ |
if (count($params) !== 1) { |
return $this->raiseError('channel-add: no channel file specified'); |
} |
if (strpos($params[0], '://')) { |
$downloader = &$this->getDownloader(); |
$tmpdir = $this->config->get('temp_dir'); |
if (!file_exists($tmpdir)) { |
require_once 'System.php'; |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$err = System::mkdir(array('-p', $tmpdir)); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($err)) { |
return $this->raiseError('channel-add: temp_dir does not exist: "' . |
$tmpdir . |
'" - You can change this location with "pear config-set temp_dir"'); |
} |
} |
if (!is_writable($tmpdir)) { |
return $this->raiseError('channel-add: temp_dir is not writable: "' . |
$tmpdir . |
'" - You can change this location with "pear config-set temp_dir"'); |
} |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$loc = $downloader->downloadHttp($params[0], $this->ui, $tmpdir, null, false); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($loc)) { |
return $this->raiseError('channel-add: Cannot open "' . $params[0] . |
'" (' . $loc->getMessage() . ')'); |
} |
list($loc, $lastmodified) = $loc; |
$contents = implode('', file($loc)); |
} else { |
$lastmodified = $fp = false; |
if (file_exists($params[0])) { |
$fp = fopen($params[0], 'r'); |
} |
if (!$fp) { |
return $this->raiseError('channel-add: cannot open "' . $params[0] . '"'); |
} |
$contents = ''; |
while (!feof($fp)) { |
$contents .= fread($fp, 1024); |
} |
fclose($fp); |
} |
if (!class_exists('PEAR_ChannelFile')) { |
require_once 'PEAR/ChannelFile.php'; |
} |
$channel = new PEAR_ChannelFile; |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$result = $channel->fromXmlString($contents); |
PEAR::staticPopErrorHandling(); |
if (!$result) { |
$exit = false; |
if (count($errors = $channel->getErrors(true))) { |
foreach ($errors as $error) { |
$this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message'])); |
if (!$exit) { |
$exit = $error['level'] == 'error' ? true : false; |
} |
} |
if ($exit) { |
return $this->raiseError('channel-add: invalid channel.xml file'); |
} |
} |
} |
$reg = &$this->config->getRegistry(); |
if ($reg->channelExists($channel->getName())) { |
return $this->raiseError('channel-add: Channel "' . $channel->getName() . |
'" exists, use channel-update to update entry', PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS); |
} |
$ret = $reg->addChannel($channel, $lastmodified); |
if (PEAR::isError($ret)) { |
return $ret; |
} |
if (!$ret) { |
return $this->raiseError('channel-add: adding Channel "' . $channel->getName() . |
'" to registry failed'); |
} |
$this->config->setChannels($reg->listChannels()); |
$this->config->writeConfigFile(); |
$this->ui->outputData('Adding Channel "' . $channel->getName() . '" succeeded', $command); |
} |
function doUpdate($command, $options, $params) |
{ |
if (count($params) !== 1) { |
return $this->raiseError("No channel file specified"); |
} |
$tmpdir = $this->config->get('temp_dir'); |
if (!file_exists($tmpdir)) { |
require_once 'System.php'; |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$err = System::mkdir(array('-p', $tmpdir)); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($err)) { |
return $this->raiseError('channel-add: temp_dir does not exist: "' . |
$tmpdir . |
'" - You can change this location with "pear config-set temp_dir"'); |
} |
} |
if (!is_writable($tmpdir)) { |
return $this->raiseError('channel-add: temp_dir is not writable: "' . |
$tmpdir . |
'" - You can change this location with "pear config-set temp_dir"'); |
} |
$reg = &$this->config->getRegistry(); |
$lastmodified = false; |
if ((!file_exists($params[0]) || is_dir($params[0])) |
&& $reg->channelExists(strtolower($params[0]))) { |
$c = $reg->getChannel(strtolower($params[0])); |
if (PEAR::isError($c)) { |
return $this->raiseError($c); |
} |
$this->ui->outputData("Updating channel \"$params[0]\"", $command); |
$dl = &$this->getDownloader(array()); |
// if force is specified, use a timestamp of "1" to force retrieval |
$lastmodified = isset($options['force']) ? false : $c->lastModified(); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$contents = $dl->downloadHttp('http://' . $c->getName() . '/channel.xml', |
$this->ui, $tmpdir, null, $lastmodified); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($contents)) { |
// Attempt to fall back to https |
$this->ui->outputData("Channel \"$params[0]\" is not responding over http://, failed with message: " . $contents->getMessage()); |
$this->ui->outputData("Trying channel \"$params[0]\" over https:// instead"); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$contents = $dl->downloadHttp('https://' . $c->getName() . '/channel.xml', |
$this->ui, $tmpdir, null, $lastmodified); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($contents)) { |
return $this->raiseError('Cannot retrieve channel.xml for channel "' . |
$c->getName() . '" (' . $contents->getMessage() . ')'); |
} |
} |
list($contents, $lastmodified) = $contents; |
if (!$contents) { |
$this->ui->outputData("Channel \"$params[0]\" is up to date"); |
return; |
} |
$contents = implode('', file($contents)); |
if (!class_exists('PEAR_ChannelFile')) { |
require_once 'PEAR/ChannelFile.php'; |
} |
$channel = new PEAR_ChannelFile; |
$channel->fromXmlString($contents); |
if (!$channel->getErrors()) { |
// security check: is the downloaded file for the channel we got it from? |
if (strtolower($channel->getName()) != strtolower($c->getName())) { |
if (!isset($options['force'])) { |
return $this->raiseError('ERROR: downloaded channel definition file' . |
' for channel "' . $channel->getName() . '" from channel "' . |
strtolower($c->getName()) . '"'); |
} |
$this->ui->log(0, 'WARNING: downloaded channel definition file' . |
' for channel "' . $channel->getName() . '" from channel "' . |
strtolower($c->getName()) . '"'); |
} |
} |
} else { |
if (strpos($params[0], '://')) { |
$dl = &$this->getDownloader(); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$loc = $dl->downloadHttp($params[0], |
$this->ui, $tmpdir, null, $lastmodified); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($loc)) { |
return $this->raiseError("Cannot open " . $params[0] . |
' (' . $loc->getMessage() . ')'); |
} |
list($loc, $lastmodified) = $loc; |
$contents = implode('', file($loc)); |
} else { |
$fp = false; |
if (file_exists($params[0])) { |
$fp = fopen($params[0], 'r'); |
} |
if (!$fp) { |
return $this->raiseError("Cannot open " . $params[0]); |
} |
$contents = ''; |
while (!feof($fp)) { |
$contents .= fread($fp, 1024); |
} |
fclose($fp); |
} |
if (!class_exists('PEAR_ChannelFile')) { |
require_once 'PEAR/ChannelFile.php'; |
} |
$channel = new PEAR_ChannelFile; |
$channel->fromXmlString($contents); |
} |
$exit = false; |
if (count($errors = $channel->getErrors(true))) { |
foreach ($errors as $error) { |
$this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message'])); |
if (!$exit) { |
$exit = $error['level'] == 'error' ? true : false; |
} |
} |
if ($exit) { |
return $this->raiseError('Invalid channel.xml file'); |
} |
} |
if (!$reg->channelExists($channel->getName())) { |
return $this->raiseError('Error: Channel "' . $channel->getName() . |
'" does not exist, use channel-add to add an entry'); |
} |
$ret = $reg->updateChannel($channel, $lastmodified); |
if (PEAR::isError($ret)) { |
return $ret; |
} |
if (!$ret) { |
return $this->raiseError('Updating Channel "' . $channel->getName() . |
'" in registry failed'); |
} |
$this->config->setChannels($reg->listChannels()); |
$this->config->writeConfigFile(); |
$this->ui->outputData('Update of Channel "' . $channel->getName() . '" succeeded'); |
} |
function &getDownloader() |
{ |
if (!class_exists('PEAR_Downloader')) { |
require_once 'PEAR/Downloader.php'; |
} |
$a = new PEAR_Downloader($this->ui, array(), $this->config); |
return $a; |
} |
function doAlias($command, $options, $params) |
{ |
if (count($params) === 1) { |
return $this->raiseError('No channel alias specified'); |
} |
if (count($params) !== 2 || (!empty($params[1]) && $params[1]{0} == '-')) { |
return $this->raiseError( |
'Invalid format, correct is: channel-alias channel alias'); |
} |
$reg = &$this->config->getRegistry(); |
if (!$reg->channelExists($params[0], true)) { |
$extra = ''; |
if ($reg->isAlias($params[0])) { |
$extra = ' (use "channel-alias ' . $reg->channelName($params[0]) . ' ' . |
strtolower($params[1]) . '")'; |
} |
return $this->raiseError('"' . $params[0] . '" is not a valid channel' . $extra); |
} |
if ($reg->isAlias($params[1])) { |
return $this->raiseError('Channel "' . $reg->channelName($params[1]) . '" is ' . |
'already aliased to "' . strtolower($params[1]) . '", cannot re-alias'); |
} |
$chan = $reg->getChannel($params[0]); |
if (PEAR::isError($chan)) { |
return $this->raiseError('Corrupt registry? Error retrieving channel "' . $params[0] . |
'" information (' . $chan->getMessage() . ')'); |
} |
// make it a local alias |
if (!$chan->setAlias(strtolower($params[1]), true)) { |
return $this->raiseError('Alias "' . strtolower($params[1]) . |
'" is not a valid channel alias'); |
} |
$reg->updateChannel($chan); |
$this->ui->outputData('Channel "' . $chan->getName() . '" aliased successfully to "' . |
strtolower($params[1]) . '"'); |
} |
/** |
* The channel-discover command |
* |
* @param string $command command name |
* @param array $options option_name => value |
* @param array $params list of additional parameters. |
* $params[0] should contain a string with either: |
* - <channel name> or |
* - <username>:<password>@<channel name> |
* @return null|PEAR_Error |
*/ |
function doDiscover($command, $options, $params) |
{ |
if (count($params) !== 1) { |
return $this->raiseError("No channel server specified"); |
} |
// Look for the possible input format "<username>:<password>@<channel>" |
if (preg_match('/^(.+):(.+)@(.+)\\z/', $params[0], $matches)) { |
$username = $matches[1]; |
$password = $matches[2]; |
$channel = $matches[3]; |
} else { |
$channel = $params[0]; |
} |
$reg = &$this->config->getRegistry(); |
if ($reg->channelExists($channel)) { |
if (!$reg->isAlias($channel)) { |
return $this->raiseError("Channel \"$channel\" is already initialized", PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS); |
} |
return $this->raiseError("A channel alias named \"$channel\" " . |
'already exists, aliasing channel "' . $reg->channelName($channel) |
. '"'); |
} |
$this->pushErrorHandling(PEAR_ERROR_RETURN); |
$err = $this->doAdd($command, $options, array('http://' . $channel . '/channel.xml')); |
$this->popErrorHandling(); |
if (PEAR::isError($err)) { |
if ($err->getCode() === PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS) { |
return $this->raiseError("Discovery of channel \"$channel\" failed (" . |
$err->getMessage() . ')'); |
} |
// Attempt fetch via https |
$this->ui->outputData("Discovering channel $channel over http:// failed with message: " . $err->getMessage()); |
$this->ui->outputData("Trying to discover channel $channel over https:// instead"); |
$this->pushErrorHandling(PEAR_ERROR_RETURN); |
$err = $this->doAdd($command, $options, array('https://' . $channel . '/channel.xml')); |
$this->popErrorHandling(); |
if (PEAR::isError($err)) { |
return $this->raiseError("Discovery of channel \"$channel\" failed (" . |
$err->getMessage() . ')'); |
} |
} |
// Store username/password if they were given |
// Arguably we should do a logintest on the channel here, but since |
// that's awkward on a REST-based channel (even "pear login" doesn't |
// do it for those), and XML-RPC is deprecated, it's fairly pointless. |
if (isset($username)) { |
$this->config->set('username', $username, 'user', $channel); |
$this->config->set('password', $password, 'user', $channel); |
$this->config->store(); |
$this->ui->outputData("Stored login for channel \"$channel\" using username \"$username\"", $command); |
} |
$this->ui->outputData("Discovery of channel \"$channel\" succeeded", $command); |
} |
/** |
* Execute the 'login' command. |
* |
* @param string $command command name |
* @param array $options option_name => value |
* @param array $params list of additional parameters |
* |
* @return bool TRUE on success or |
* a PEAR error on failure |
* |
* @access public |
*/ |
function doLogin($command, $options, $params) |
{ |
$reg = &$this->config->getRegistry(); |
// If a parameter is supplied, use that as the channel to log in to |
$channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel'); |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($chan)) { |
return $this->raiseError($chan); |
} |
$server = $this->config->get('preferred_mirror', null, $channel); |
$username = $this->config->get('username', null, $channel); |
if (empty($username)) { |
$username = isset($_ENV['USER']) ? $_ENV['USER'] : null; |
} |
$this->ui->outputData("Logging in to $server.", $command); |
list($username, $password) = $this->ui->userDialog( |
$command, |
array('Username', 'Password'), |
array('text', 'password'), |
array($username, '') |
); |
$username = trim($username); |
$password = trim($password); |
$ourfile = $this->config->getConfFile('user'); |
if (!$ourfile) { |
$ourfile = $this->config->getConfFile('system'); |
} |
$this->config->set('username', $username, 'user', $channel); |
$this->config->set('password', $password, 'user', $channel); |
if ($chan->supportsREST()) { |
$ok = true; |
} |
if ($ok !== true) { |
return $this->raiseError('Login failed!'); |
} |
$this->ui->outputData("Logged in.", $command); |
// avoid changing any temporary settings changed with -d |
$ourconfig = new PEAR_Config($ourfile, $ourfile); |
$ourconfig->set('username', $username, 'user', $channel); |
$ourconfig->set('password', $password, 'user', $channel); |
$ourconfig->store(); |
return true; |
} |
/** |
* Execute the 'logout' command. |
* |
* @param string $command command name |
* @param array $options option_name => value |
* @param array $params list of additional parameters |
* |
* @return bool TRUE on success or |
* a PEAR error on failure |
* |
* @access public |
*/ |
function doLogout($command, $options, $params) |
{ |
$reg = &$this->config->getRegistry(); |
// If a parameter is supplied, use that as the channel to log in to |
$channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel'); |
$chan = $reg->getChannel($channel); |
if (PEAR::isError($chan)) { |
return $this->raiseError($chan); |
} |
$server = $this->config->get('preferred_mirror', null, $channel); |
$this->ui->outputData("Logging out from $server.", $command); |
$this->config->remove('username', 'user', $channel); |
$this->config->remove('password', 'user', $channel); |
$this->config->store(); |
return true; |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Package.php |
---|
New file |
0,0 → 1,1123 |
<?php |
/** |
* PEAR_Command_Package (package, package-validate, cvsdiff, cvstag, package-dependencies, |
* sign, makerpm, convert commands) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Martin Jansen <mj@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 0.1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
/** |
* PEAR commands for login/logout |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Martin Jansen <mj@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: @package_version@ |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 0.1 |
*/ |
class PEAR_Command_Package extends PEAR_Command_Common |
{ |
var $commands = array( |
'package' => array( |
'summary' => 'Build Package', |
'function' => 'doPackage', |
'shortcut' => 'p', |
'options' => array( |
'nocompress' => array( |
'shortopt' => 'Z', |
'doc' => 'Do not gzip the package file' |
), |
'showname' => array( |
'shortopt' => 'n', |
'doc' => 'Print the name of the packaged file.', |
), |
), |
'doc' => '[descfile] [descfile2] |
Creates a PEAR package from its description file (usually called |
package.xml). If a second packagefile is passed in, then |
the packager will check to make sure that one is a package.xml |
version 1.0, and the other is a package.xml version 2.0. The |
package.xml version 1.0 will be saved as "package.xml" in the archive, |
and the other as "package2.xml" in the archive" |
' |
), |
'package-validate' => array( |
'summary' => 'Validate Package Consistency', |
'function' => 'doPackageValidate', |
'shortcut' => 'pv', |
'options' => array(), |
'doc' => ' |
', |
), |
'cvsdiff' => array( |
'summary' => 'Run a "cvs diff" for all files in a package', |
'function' => 'doCvsDiff', |
'shortcut' => 'cd', |
'options' => array( |
'quiet' => array( |
'shortopt' => 'q', |
'doc' => 'Be quiet', |
), |
'reallyquiet' => array( |
'shortopt' => 'Q', |
'doc' => 'Be really quiet', |
), |
'date' => array( |
'shortopt' => 'D', |
'doc' => 'Diff against revision of DATE', |
'arg' => 'DATE', |
), |
'release' => array( |
'shortopt' => 'R', |
'doc' => 'Diff against tag for package release REL', |
'arg' => 'REL', |
), |
'revision' => array( |
'shortopt' => 'r', |
'doc' => 'Diff against revision REV', |
'arg' => 'REV', |
), |
'context' => array( |
'shortopt' => 'c', |
'doc' => 'Generate context diff', |
), |
'unified' => array( |
'shortopt' => 'u', |
'doc' => 'Generate unified diff', |
), |
'ignore-case' => array( |
'shortopt' => 'i', |
'doc' => 'Ignore case, consider upper- and lower-case letters equivalent', |
), |
'ignore-whitespace' => array( |
'shortopt' => 'b', |
'doc' => 'Ignore changes in amount of white space', |
), |
'ignore-blank-lines' => array( |
'shortopt' => 'B', |
'doc' => 'Ignore changes that insert or delete blank lines', |
), |
'brief' => array( |
'doc' => 'Report only whether the files differ, no details', |
), |
'dry-run' => array( |
'shortopt' => 'n', |
'doc' => 'Don\'t do anything, just pretend', |
), |
), |
'doc' => '<package.xml> |
Compares all the files in a package. Without any options, this |
command will compare the current code with the last checked-in code. |
Using the -r or -R option you may compare the current code with that |
of a specific release. |
', |
), |
'svntag' => array( |
'summary' => 'Set SVN Release Tag', |
'function' => 'doSvnTag', |
'shortcut' => 'sv', |
'options' => array( |
'quiet' => array( |
'shortopt' => 'q', |
'doc' => 'Be quiet', |
), |
'slide' => array( |
'shortopt' => 'F', |
'doc' => 'Move (slide) tag if it exists', |
), |
'delete' => array( |
'shortopt' => 'd', |
'doc' => 'Remove tag', |
), |
'dry-run' => array( |
'shortopt' => 'n', |
'doc' => 'Don\'t do anything, just pretend', |
), |
), |
'doc' => '<package.xml> [files...] |
Sets a SVN tag on all files in a package. Use this command after you have |
packaged a distribution tarball with the "package" command to tag what |
revisions of what files were in that release. If need to fix something |
after running svntag once, but before the tarball is released to the public, |
use the "slide" option to move the release tag. |
to include files (such as a second package.xml, or tests not included in the |
release), pass them as additional parameters. |
', |
), |
'cvstag' => array( |
'summary' => 'Set CVS Release Tag', |
'function' => 'doCvsTag', |
'shortcut' => 'ct', |
'options' => array( |
'quiet' => array( |
'shortopt' => 'q', |
'doc' => 'Be quiet', |
), |
'reallyquiet' => array( |
'shortopt' => 'Q', |
'doc' => 'Be really quiet', |
), |
'slide' => array( |
'shortopt' => 'F', |
'doc' => 'Move (slide) tag if it exists', |
), |
'delete' => array( |
'shortopt' => 'd', |
'doc' => 'Remove tag', |
), |
'dry-run' => array( |
'shortopt' => 'n', |
'doc' => 'Don\'t do anything, just pretend', |
), |
), |
'doc' => '<package.xml> [files...] |
Sets a CVS tag on all files in a package. Use this command after you have |
packaged a distribution tarball with the "package" command to tag what |
revisions of what files were in that release. If need to fix something |
after running cvstag once, but before the tarball is released to the public, |
use the "slide" option to move the release tag. |
to include files (such as a second package.xml, or tests not included in the |
release), pass them as additional parameters. |
', |
), |
'package-dependencies' => array( |
'summary' => 'Show package dependencies', |
'function' => 'doPackageDependencies', |
'shortcut' => 'pd', |
'options' => array(), |
'doc' => '<package-file> or <package.xml> or <install-package-name> |
List all dependencies the package has. |
Can take a tgz / tar file, package.xml or a package name of an installed package.' |
), |
'sign' => array( |
'summary' => 'Sign a package distribution file', |
'function' => 'doSign', |
'shortcut' => 'si', |
'options' => array( |
'verbose' => array( |
'shortopt' => 'v', |
'doc' => 'Display GnuPG output', |
), |
), |
'doc' => '<package-file> |
Signs a package distribution (.tar or .tgz) file with GnuPG.', |
), |
'makerpm' => array( |
'summary' => 'Builds an RPM spec file from a PEAR package', |
'function' => 'doMakeRPM', |
'shortcut' => 'rpm', |
'options' => array( |
'spec-template' => array( |
'shortopt' => 't', |
'arg' => 'FILE', |
'doc' => 'Use FILE as RPM spec file template' |
), |
'rpm-pkgname' => array( |
'shortopt' => 'p', |
'arg' => 'FORMAT', |
'doc' => 'Use FORMAT as format string for RPM package name, %s is replaced |
by the PEAR package name, defaults to "PEAR::%s".', |
), |
), |
'doc' => '<package-file> |
Creates an RPM .spec file for wrapping a PEAR package inside an RPM |
package. Intended to be used from the SPECS directory, with the PEAR |
package tarball in the SOURCES directory: |
$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz |
Wrote RPM spec file PEAR::Net_Geo-1.0.spec |
$ rpm -bb PEAR::Net_Socket-1.0.spec |
... |
Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm |
', |
), |
'convert' => array( |
'summary' => 'Convert a package.xml 1.0 to package.xml 2.0 format', |
'function' => 'doConvert', |
'shortcut' => 'c2', |
'options' => array( |
'flat' => array( |
'shortopt' => 'f', |
'doc' => 'do not beautify the filelist.', |
), |
), |
'doc' => '[descfile] [descfile2] |
Converts a package.xml in 1.0 format into a package.xml |
in 2.0 format. The new file will be named package2.xml by default, |
and package.xml will be used as the old file by default. |
This is not the most intelligent conversion, and should only be |
used for automated conversion or learning the format. |
' |
), |
); |
var $output; |
/** |
* PEAR_Command_Package constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
function _displayValidationResults($err, $warn, $strict = false) |
{ |
foreach ($err as $e) { |
$this->output .= "Error: $e\n"; |
} |
foreach ($warn as $w) { |
$this->output .= "Warning: $w\n"; |
} |
$this->output .= sprintf('Validation: %d error(s), %d warning(s)'."\n", |
sizeof($err), sizeof($warn)); |
if ($strict && count($err) > 0) { |
$this->output .= "Fix these errors and try again."; |
return false; |
} |
return true; |
} |
function &getPackager() |
{ |
if (!class_exists('PEAR_Packager')) { |
require_once 'PEAR/Packager.php'; |
} |
$a = new PEAR_Packager; |
return $a; |
} |
function &getPackageFile($config, $debug = false) |
{ |
if (!class_exists('PEAR_Common')) { |
require_once 'PEAR/Common.php'; |
} |
if (!class_exists('PEAR_PackageFile')) { |
require_once 'PEAR/PackageFile.php'; |
} |
$a = new PEAR_PackageFile($config, $debug); |
$common = new PEAR_Common; |
$common->ui = $this->ui; |
$a->setLogger($common); |
return $a; |
} |
function doPackage($command, $options, $params) |
{ |
$this->output = ''; |
$pkginfofile = isset($params[0]) ? $params[0] : 'package.xml'; |
$pkg2 = isset($params[1]) ? $params[1] : null; |
if (!$pkg2 && !isset($params[0]) && file_exists('package2.xml')) { |
$pkg2 = 'package2.xml'; |
} |
$packager = &$this->getPackager(); |
$compress = empty($options['nocompress']) ? true : false; |
$result = $packager->package($pkginfofile, $compress, $pkg2); |
if (PEAR::isError($result)) { |
return $this->raiseError($result); |
} |
// Don't want output, only the package file name just created |
if (isset($options['showname'])) { |
$this->output = $result; |
} |
if ($this->output) { |
$this->ui->outputData($this->output, $command); |
} |
return true; |
} |
function doPackageValidate($command, $options, $params) |
{ |
$this->output = ''; |
if (count($params) < 1) { |
$params[0] = 'package.xml'; |
} |
$obj = &$this->getPackageFile($this->config, $this->_debug); |
$obj->rawReturn(); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL); |
if (PEAR::isError($info)) { |
$info = $obj->fromPackageFile($params[0], PEAR_VALIDATE_NORMAL); |
} else { |
$archive = $info->getArchiveFile(); |
$tar = new Archive_Tar($archive); |
$tar->extract(dirname($info->getPackageFile())); |
$info->setPackageFile(dirname($info->getPackageFile()) . DIRECTORY_SEPARATOR . |
$info->getPackage() . '-' . $info->getVersion() . DIRECTORY_SEPARATOR . |
basename($info->getPackageFile())); |
} |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($info)) { |
return $this->raiseError($info); |
} |
$valid = false; |
if ($info->getPackagexmlVersion() == '2.0') { |
if ($valid = $info->validate(PEAR_VALIDATE_NORMAL)) { |
$info->flattenFileList(); |
$valid = $info->validate(PEAR_VALIDATE_PACKAGING); |
} |
} else { |
$valid = $info->validate(PEAR_VALIDATE_PACKAGING); |
} |
$err = $warn = array(); |
if ($errors = $info->getValidationWarnings()) { |
foreach ($errors as $error) { |
if ($error['level'] == 'warning') { |
$warn[] = $error['message']; |
} else { |
$err[] = $error['message']; |
} |
} |
} |
$this->_displayValidationResults($err, $warn); |
$this->ui->outputData($this->output, $command); |
return true; |
} |
function doSvnTag($command, $options, $params) |
{ |
$this->output = ''; |
$_cmd = $command; |
if (count($params) < 1) { |
$help = $this->getHelp($command); |
return $this->raiseError("$command: missing parameter: $help[0]"); |
} |
$packageFile = realpath($params[0]); |
$dir = dirname($packageFile); |
$dir = substr($dir, strrpos($dir, DIRECTORY_SEPARATOR) + 1); |
$obj = &$this->getPackageFile($this->config, $this->_debug); |
$info = $obj->fromAnyFile($packageFile, PEAR_VALIDATE_NORMAL); |
if (PEAR::isError($info)) { |
return $this->raiseError($info); |
} |
$err = $warn = array(); |
if (!$info->validate()) { |
foreach ($info->getValidationWarnings() as $error) { |
if ($error['level'] == 'warning') { |
$warn[] = $error['message']; |
} else { |
$err[] = $error['message']; |
} |
} |
} |
if (!$this->_displayValidationResults($err, $warn, true)) { |
$this->ui->outputData($this->output, $command); |
return $this->raiseError('SVN tag failed'); |
} |
$version = $info->getVersion(); |
$package = $info->getName(); |
$svntag = "$package-$version"; |
if (isset($options['delete'])) { |
return $this->_svnRemoveTag($version, $package, $svntag, $packageFile, $options); |
} |
$path = $this->_svnFindPath($packageFile); |
// Check if there are any modified files |
$fp = popen('svn st --xml ' . dirname($packageFile), "r"); |
$out = ''; |
while ($line = fgets($fp, 1024)) { |
$out .= rtrim($line)."\n"; |
} |
pclose($fp); |
if (!isset($options['quiet']) && strpos($out, 'item="modified"')) { |
$params = array(array( |
'name' => 'modified', |
'type' => 'yesno', |
'default' => 'no', |
'prompt' => 'You have files in your SVN checkout (' . $path['from'] . ') that have been modified but not committed, do you still want to tag ' . $version . '?', |
)); |
$answers = $this->ui->confirmDialog($params); |
if (!in_array($answers['modified'], array('y', 'yes', 'on', '1'))) { |
return true; |
} |
} |
if (isset($options['slide'])) { |
$this->_svnRemoveTag($version, $package, $svntag, $packageFile, $options); |
} |
// Check if tag already exists |
$releaseTag = $path['local']['base'] . 'tags' . DIRECTORY_SEPARATOR . $svntag; |
$existsCommand = 'svn ls ' . $path['base'] . 'tags/'; |
$fp = popen($existsCommand, "r"); |
$out = ''; |
while ($line = fgets($fp, 1024)) { |
$out .= rtrim($line)."\n"; |
} |
pclose($fp); |
if (in_array($svntag . DIRECTORY_SEPARATOR, explode("\n", $out))) { |
$this->ui->outputData($this->output, $command); |
return $this->raiseError('SVN tag ' . $svntag . ' for ' . $package . ' already exists.'); |
} elseif (file_exists($path['local']['base'] . 'tags') === false) { |
return $this->raiseError('Can not locate the tags directory at ' . $path['local']['base'] . 'tags'); |
} elseif (is_writeable($path['local']['base'] . 'tags') === false) { |
return $this->raiseError('Can not write to the tag directory at ' . $path['local']['base'] . 'tags'); |
} else { |
$makeCommand = 'svn mkdir ' . $releaseTag; |
$this->output .= "+ $makeCommand\n"; |
if (empty($options['dry-run'])) { |
// We need to create the tag dir. |
$fp = popen($makeCommand, "r"); |
$out = ''; |
while ($line = fgets($fp, 1024)) { |
$out .= rtrim($line)."\n"; |
} |
pclose($fp); |
$this->output .= "$out\n"; |
} |
} |
$command = 'svn'; |
if (isset($options['quiet'])) { |
$command .= ' -q'; |
} |
$command .= ' copy --parents '; |
$dir = dirname($packageFile); |
$dir = substr($dir, strrpos($dir, DIRECTORY_SEPARATOR) + 1); |
$files = array_keys($info->getFilelist()); |
if (!in_array(basename($packageFile), $files)) { |
$files[] = basename($packageFile); |
} |
array_shift($params); |
if (count($params)) { |
// add in additional files to be tagged (package files and such) |
$files = array_merge($files, $params); |
} |
$commands = array(); |
foreach ($files as $file) { |
if (!file_exists($file)) { |
$file = $dir . DIRECTORY_SEPARATOR . $file; |
} |
$commands[] = $command . ' ' . escapeshellarg($file) . ' ' . |
escapeshellarg($releaseTag . DIRECTORY_SEPARATOR . $file); |
} |
$this->output .= implode("\n", $commands) . "\n"; |
if (empty($options['dry-run'])) { |
foreach ($commands as $command) { |
$fp = popen($command, "r"); |
while ($line = fgets($fp, 1024)) { |
$this->output .= rtrim($line)."\n"; |
} |
pclose($fp); |
} |
} |
$command = 'svn ci -m "Tagging the ' . $version . ' release" ' . $releaseTag . "\n"; |
$this->output .= "+ $command\n"; |
if (empty($options['dry-run'])) { |
$fp = popen($command, "r"); |
while ($line = fgets($fp, 1024)) { |
$this->output .= rtrim($line)."\n"; |
} |
pclose($fp); |
} |
$this->ui->outputData($this->output, $_cmd); |
return true; |
} |
function _svnFindPath($file) |
{ |
$xml = ''; |
$command = "svn info --xml $file"; |
$fp = popen($command, "r"); |
while ($line = fgets($fp, 1024)) { |
$xml .= rtrim($line)."\n"; |
} |
pclose($fp); |
$url_tag = strpos($xml, '<url>'); |
$url = substr($xml, $url_tag + 5, strpos($xml, '</url>', $url_tag + 5) - ($url_tag + 5)); |
$path = array(); |
$path['from'] = substr($url, 0, strrpos($url, '/')); |
$path['base'] = substr($path['from'], 0, strrpos($path['from'], '/') + 1); |
// Figure out the local paths - see http://pear.php.net/bugs/17463 |
$pos = strpos($file, DIRECTORY_SEPARATOR . 'trunk' . DIRECTORY_SEPARATOR); |
if ($pos === false) { |
$pos = strpos($file, DIRECTORY_SEPARATOR . 'branches' . DIRECTORY_SEPARATOR); |
} |
$path['local']['base'] = substr($file, 0, $pos + 1); |
return $path; |
} |
function _svnRemoveTag($version, $package, $tag, $packageFile, $options) |
{ |
$command = 'svn'; |
if (isset($options['quiet'])) { |
$command .= ' -q'; |
} |
$command .= ' remove'; |
$command .= ' -m "Removing tag for the ' . $version . ' release."'; |
$path = $this->_svnFindPath($packageFile); |
$command .= ' ' . $path['base'] . 'tags/' . $tag; |
if ($this->config->get('verbose') > 1) { |
$this->output .= "+ $command\n"; |
} |
$this->output .= "+ $command\n"; |
if (empty($options['dry-run'])) { |
$fp = popen($command, "r"); |
while ($line = fgets($fp, 1024)) { |
$this->output .= rtrim($line)."\n"; |
} |
pclose($fp); |
} |
$this->ui->outputData($this->output, $command); |
return true; |
} |
function doCvsTag($command, $options, $params) |
{ |
$this->output = ''; |
$_cmd = $command; |
if (count($params) < 1) { |
$help = $this->getHelp($command); |
return $this->raiseError("$command: missing parameter: $help[0]"); |
} |
$packageFile = realpath($params[0]); |
$obj = &$this->getPackageFile($this->config, $this->_debug); |
$info = $obj->fromAnyFile($packageFile, PEAR_VALIDATE_NORMAL); |
if (PEAR::isError($info)) { |
return $this->raiseError($info); |
} |
$err = $warn = array(); |
if (!$info->validate()) { |
foreach ($info->getValidationWarnings() as $error) { |
if ($error['level'] == 'warning') { |
$warn[] = $error['message']; |
} else { |
$err[] = $error['message']; |
} |
} |
} |
if (!$this->_displayValidationResults($err, $warn, true)) { |
$this->ui->outputData($this->output, $command); |
return $this->raiseError('CVS tag failed'); |
} |
$version = $info->getVersion(); |
$cvsversion = preg_replace('/[^a-z0-9]/i', '_', $version); |
$cvstag = "RELEASE_$cvsversion"; |
$files = array_keys($info->getFilelist()); |
$command = 'cvs'; |
if (isset($options['quiet'])) { |
$command .= ' -q'; |
} |
if (isset($options['reallyquiet'])) { |
$command .= ' -Q'; |
} |
$command .= ' tag'; |
if (isset($options['slide'])) { |
$command .= ' -F'; |
} |
if (isset($options['delete'])) { |
$command .= ' -d'; |
} |
$command .= ' ' . $cvstag . ' ' . escapeshellarg($params[0]); |
array_shift($params); |
if (count($params)) { |
// add in additional files to be tagged |
$files = array_merge($files, $params); |
} |
$dir = dirname($packageFile); |
$dir = substr($dir, strrpos($dir, '/') + 1); |
foreach ($files as $file) { |
if (!file_exists($file)) { |
$file = $dir . DIRECTORY_SEPARATOR . $file; |
} |
$command .= ' ' . escapeshellarg($file); |
} |
if ($this->config->get('verbose') > 1) { |
$this->output .= "+ $command\n"; |
} |
$this->output .= "+ $command\n"; |
if (empty($options['dry-run'])) { |
$fp = popen($command, "r"); |
while ($line = fgets($fp, 1024)) { |
$this->output .= rtrim($line)."\n"; |
} |
pclose($fp); |
} |
$this->ui->outputData($this->output, $_cmd); |
return true; |
} |
function doCvsDiff($command, $options, $params) |
{ |
$this->output = ''; |
if (sizeof($params) < 1) { |
$help = $this->getHelp($command); |
return $this->raiseError("$command: missing parameter: $help[0]"); |
} |
$file = realpath($params[0]); |
$obj = &$this->getPackageFile($this->config, $this->_debug); |
$info = $obj->fromAnyFile($file, PEAR_VALIDATE_NORMAL); |
if (PEAR::isError($info)) { |
return $this->raiseError($info); |
} |
$err = $warn = array(); |
if (!$info->validate()) { |
foreach ($info->getValidationWarnings() as $error) { |
if ($error['level'] == 'warning') { |
$warn[] = $error['message']; |
} else { |
$err[] = $error['message']; |
} |
} |
} |
if (!$this->_displayValidationResults($err, $warn, true)) { |
$this->ui->outputData($this->output, $command); |
return $this->raiseError('CVS diff failed'); |
} |
$info1 = $info->getFilelist(); |
$files = $info1; |
$cmd = "cvs"; |
if (isset($options['quiet'])) { |
$cmd .= ' -q'; |
unset($options['quiet']); |
} |
if (isset($options['reallyquiet'])) { |
$cmd .= ' -Q'; |
unset($options['reallyquiet']); |
} |
if (isset($options['release'])) { |
$cvsversion = preg_replace('/[^a-z0-9]/i', '_', $options['release']); |
$cvstag = "RELEASE_$cvsversion"; |
$options['revision'] = $cvstag; |
unset($options['release']); |
} |
$execute = true; |
if (isset($options['dry-run'])) { |
$execute = false; |
unset($options['dry-run']); |
} |
$cmd .= ' diff'; |
// the rest of the options are passed right on to "cvs diff" |
foreach ($options as $option => $optarg) { |
$arg = $short = false; |
if (isset($this->commands[$command]['options'][$option])) { |
$arg = $this->commands[$command]['options'][$option]['arg']; |
$short = $this->commands[$command]['options'][$option]['shortopt']; |
} |
$cmd .= $short ? " -$short" : " --$option"; |
if ($arg && $optarg) { |
$cmd .= ($short ? '' : '=') . escapeshellarg($optarg); |
} |
} |
foreach ($files as $file) { |
$cmd .= ' ' . escapeshellarg($file['name']); |
} |
if ($this->config->get('verbose') > 1) { |
$this->output .= "+ $cmd\n"; |
} |
if ($execute) { |
$fp = popen($cmd, "r"); |
while ($line = fgets($fp, 1024)) { |
$this->output .= rtrim($line)."\n"; |
} |
pclose($fp); |
} |
$this->ui->outputData($this->output, $command); |
return true; |
} |
function doPackageDependencies($command, $options, $params) |
{ |
// $params[0] -> the PEAR package to list its information |
if (count($params) !== 1) { |
return $this->raiseError("bad parameter(s), try \"help $command\""); |
} |
$obj = &$this->getPackageFile($this->config, $this->_debug); |
if (is_file($params[0]) || strpos($params[0], '.xml') > 0) { |
$info = $obj->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL); |
} else { |
$reg = $this->config->getRegistry(); |
$info = $obj->fromArray($reg->packageInfo($params[0])); |
} |
if (PEAR::isError($info)) { |
return $this->raiseError($info); |
} |
$deps = $info->getDeps(); |
if (is_array($deps)) { |
if ($info->getPackagexmlVersion() == '1.0') { |
$data = array( |
'caption' => 'Dependencies for pear/' . $info->getPackage(), |
'border' => true, |
'headline' => array("Required?", "Type", "Name", "Relation", "Version"), |
); |
foreach ($deps as $d) { |
if (isset($d['optional'])) { |
if ($d['optional'] == 'yes') { |
$req = 'No'; |
} else { |
$req = 'Yes'; |
} |
} else { |
$req = 'Yes'; |
} |
if (isset($this->_deps_rel_trans[$d['rel']])) { |
$rel = $this->_deps_rel_trans[$d['rel']]; |
} else { |
$rel = $d['rel']; |
} |
if (isset($this->_deps_type_trans[$d['type']])) { |
$type = ucfirst($this->_deps_type_trans[$d['type']]); |
} else { |
$type = $d['type']; |
} |
if (isset($d['name'])) { |
$name = $d['name']; |
} else { |
$name = ''; |
} |
if (isset($d['version'])) { |
$version = $d['version']; |
} else { |
$version = ''; |
} |
$data['data'][] = array($req, $type, $name, $rel, $version); |
} |
} else { // package.xml 2.0 dependencies display |
require_once 'PEAR/Dependency2.php'; |
$deps = $info->getDependencies(); |
$reg = &$this->config->getRegistry(); |
if (is_array($deps)) { |
$d = new PEAR_Dependency2($this->config, array(), ''); |
$data = array( |
'caption' => 'Dependencies for ' . $info->getPackage(), |
'border' => true, |
'headline' => array("Required?", "Type", "Name", 'Versioning', 'Group'), |
); |
foreach ($deps as $type => $subd) { |
$req = ($type == 'required') ? 'Yes' : 'No'; |
if ($type == 'group' && isset($subd['attribs']['name'])) { |
$group = $subd['attribs']['name']; |
} else { |
$group = ''; |
} |
if (!isset($subd[0])) { |
$subd = array($subd); |
} |
foreach ($subd as $groupa) { |
foreach ($groupa as $deptype => $depinfo) { |
if ($deptype == 'attribs') { |
continue; |
} |
if ($deptype == 'pearinstaller') { |
$deptype = 'pear Installer'; |
} |
if (!isset($depinfo[0])) { |
$depinfo = array($depinfo); |
} |
foreach ($depinfo as $inf) { |
$name = ''; |
if (isset($inf['channel'])) { |
$alias = $reg->channelAlias($inf['channel']); |
if (!$alias) { |
$alias = '(channel?) ' .$inf['channel']; |
} |
$name = $alias . '/'; |
} |
if (isset($inf['name'])) { |
$name .= $inf['name']; |
} elseif (isset($inf['pattern'])) { |
$name .= $inf['pattern']; |
} else { |
$name .= ''; |
} |
if (isset($inf['uri'])) { |
$name .= ' [' . $inf['uri'] . ']'; |
} |
if (isset($inf['conflicts'])) { |
$ver = 'conflicts'; |
} else { |
$ver = $d->_getExtraString($inf); |
} |
$data['data'][] = array($req, ucfirst($deptype), $name, |
$ver, $group); |
} |
} |
} |
} |
} |
} |
$this->ui->outputData($data, $command); |
return true; |
} |
// Fallback |
$this->ui->outputData("This package does not have any dependencies.", $command); |
} |
function doSign($command, $options, $params) |
{ |
// should move most of this code into PEAR_Packager |
// so it'll be easy to implement "pear package --sign" |
if (count($params) !== 1) { |
return $this->raiseError("bad parameter(s), try \"help $command\""); |
} |
require_once 'System.php'; |
require_once 'Archive/Tar.php'; |
if (!file_exists($params[0])) { |
return $this->raiseError("file does not exist: $params[0]"); |
} |
$obj = $this->getPackageFile($this->config, $this->_debug); |
$info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL); |
if (PEAR::isError($info)) { |
return $this->raiseError($info); |
} |
$tar = new Archive_Tar($params[0]); |
$tmpdir = $this->config->get('temp_dir'); |
$tmpdir = System::mktemp(' -t "' . $tmpdir . '" -d pearsign'); |
if (!$tar->extractList('package2.xml package.xml package.sig', $tmpdir)) { |
return $this->raiseError("failed to extract tar file"); |
} |
if (file_exists("$tmpdir/package.sig")) { |
return $this->raiseError("package already signed"); |
} |
$packagexml = 'package.xml'; |
if (file_exists("$tmpdir/package2.xml")) { |
$packagexml = 'package2.xml'; |
} |
if (file_exists("$tmpdir/package.sig")) { |
unlink("$tmpdir/package.sig"); |
} |
if (!file_exists("$tmpdir/$packagexml")) { |
return $this->raiseError("Extracted file $tmpdir/$packagexml not found."); |
} |
$input = $this->ui->userDialog($command, |
array('GnuPG Passphrase'), |
array('password')); |
if (!isset($input[0])) { |
//use empty passphrase |
$input[0] = ''; |
} |
$devnull = (isset($options['verbose'])) ? '' : ' 2>/dev/null'; |
$gpg = popen("gpg --batch --passphrase-fd 0 --armor --detach-sign --output $tmpdir/package.sig $tmpdir/$packagexml" . $devnull, "w"); |
if (!$gpg) { |
return $this->raiseError("gpg command failed"); |
} |
fwrite($gpg, "$input[0]\n"); |
if (pclose($gpg) || !file_exists("$tmpdir/package.sig")) { |
return $this->raiseError("gpg sign failed"); |
} |
if (!$tar->addModify("$tmpdir/package.sig", '', $tmpdir)) { |
return $this->raiseError('failed adding signature to file'); |
} |
$this->ui->outputData("Package signed.", $command); |
return true; |
} |
/** |
* For unit testing purposes |
*/ |
function &getInstaller(&$ui) |
{ |
if (!class_exists('PEAR_Installer')) { |
require_once 'PEAR/Installer.php'; |
} |
$a = new PEAR_Installer($ui); |
return $a; |
} |
/** |
* For unit testing purposes |
*/ |
function &getCommandPackaging(&$ui, &$config) |
{ |
if (!class_exists('PEAR_Command_Packaging')) { |
if ($fp = @fopen('PEAR/Command/Packaging.php', 'r', true)) { |
fclose($fp); |
include_once 'PEAR/Command/Packaging.php'; |
} |
} |
if (class_exists('PEAR_Command_Packaging')) { |
$a = new PEAR_Command_Packaging($ui, $config); |
} else { |
$a = null; |
} |
return $a; |
} |
function doMakeRPM($command, $options, $params) |
{ |
// Check to see if PEAR_Command_Packaging is installed, and |
// transparently switch to use the "make-rpm-spec" command from it |
// instead, if it does. Otherwise, continue to use the old version |
// of "makerpm" supplied with this package (PEAR). |
$packaging_cmd = $this->getCommandPackaging($this->ui, $this->config); |
if ($packaging_cmd !== null) { |
$this->ui->outputData('PEAR_Command_Packaging is installed; using '. |
'newer "make-rpm-spec" command instead'); |
return $packaging_cmd->run('make-rpm-spec', $options, $params); |
} |
$this->ui->outputData('WARNING: "pear makerpm" is no longer available; an '. |
'improved version is available via "pear make-rpm-spec", which '. |
'is available by installing PEAR_Command_Packaging'); |
return true; |
} |
function doConvert($command, $options, $params) |
{ |
$packagexml = isset($params[0]) ? $params[0] : 'package.xml'; |
$newpackagexml = isset($params[1]) ? $params[1] : dirname($packagexml) . |
DIRECTORY_SEPARATOR . 'package2.xml'; |
$pkg = &$this->getPackageFile($this->config, $this->_debug); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$pf = $pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($pf)) { |
if (is_array($pf->getUserInfo())) { |
foreach ($pf->getUserInfo() as $warning) { |
$this->ui->outputData($warning['message']); |
} |
} |
return $this->raiseError($pf); |
} |
if (is_a($pf, 'PEAR_PackageFile_v2')) { |
$this->ui->outputData($packagexml . ' is already a package.xml version 2.0'); |
return true; |
} |
$gen = &$pf->getDefaultGenerator(); |
$newpf = &$gen->toV2(); |
$newpf->setPackagefile($newpackagexml); |
$gen = &$newpf->getDefaultGenerator(); |
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); |
$state = (isset($options['flat']) ? PEAR_VALIDATE_PACKAGING : PEAR_VALIDATE_NORMAL); |
$saved = $gen->toPackageFile(dirname($newpackagexml), $state, basename($newpackagexml)); |
PEAR::staticPopErrorHandling(); |
if (PEAR::isError($saved)) { |
if (is_array($saved->getUserInfo())) { |
foreach ($saved->getUserInfo() as $warning) { |
$this->ui->outputData($warning['message']); |
} |
} |
$this->ui->outputData($saved->getMessage()); |
return true; |
} |
$this->ui->outputData('Wrote new version 2.0 package.xml to "' . $saved . '"'); |
return true; |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Build.php |
---|
New file |
0,0 → 1,84 |
<?php |
/** |
* PEAR_Command_Auth (build command) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Tomas V.V.Cox <cox@idecnet.com> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 0.1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Common.php'; |
/** |
* PEAR commands for building extensions. |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Tomas V.V.Cox <cox@idecnet.com> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 0.1 |
*/ |
class PEAR_Command_Build extends PEAR_Command_Common |
{ |
var $commands = array( |
'build' => array( |
'summary' => 'Build an Extension From C Source', |
'function' => 'doBuild', |
'shortcut' => 'b', |
'options' => array(), |
'doc' => '[package.xml] |
Builds one or more extensions contained in a package.' |
), |
); |
/** |
* PEAR_Command_Build constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
function doBuild($command, $options, $params) |
{ |
require_once 'PEAR/Builder.php'; |
if (sizeof($params) < 1) { |
$params[0] = 'package.xml'; |
} |
$builder = new PEAR_Builder($this->ui); |
$this->debug = $this->config->get('verbose'); |
$err = $builder->build($params[0], array(&$this, 'buildCallback')); |
if (PEAR::isError($err)) { |
return $err; |
} |
return true; |
} |
function buildCallback($what, $data) |
{ |
if (($what == 'cmdoutput' && $this->debug > 1) || |
($what == 'output' && $this->debug > 0)) { |
$this->ui->outputData(rtrim($data), 'build'); |
} |
} |
} |
/branches/v1.3-critias/bibliotheque/pear/PEAR/Command/Auth.php |
---|
New file |
0,0 → 1,80 |
<?php |
/** |
* PEAR_Command_Auth (login, logout commands) |
* |
* PHP versions 4 and 5 |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @link http://pear.php.net/package/PEAR |
* @since File available since Release 0.1 |
* @deprecated since 1.8.0alpha1 |
*/ |
/** |
* base class |
*/ |
require_once 'PEAR/Command/Channels.php'; |
/** |
* PEAR commands for login/logout |
* |
* @category pear |
* @package PEAR |
* @author Stig Bakken <ssb@php.net> |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2009 The Authors |
* @license http://opensource.org/licenses/bsd-license.php New BSD License |
* @version Release: 1.10.1 |
* @link http://pear.php.net/package/PEAR |
* @since Class available since Release 0.1 |
* @deprecated since 1.8.0alpha1 |
*/ |
class PEAR_Command_Auth extends PEAR_Command_Channels |
{ |
var $commands = array( |
'login' => array( |
'summary' => 'Connects and authenticates to remote server [Deprecated in favor of channel-login]', |
'shortcut' => 'li', |
'function' => 'doLogin', |
'options' => array(), |
'doc' => '<channel name> |
WARNING: This function is deprecated in favor of using channel-login |
Log in to a remote channel server. If <channel name> is not supplied, |
the default channel is used. To use remote functions in the installer |
that require any kind of privileges, you need to log in first. The |
username and password you enter here will be stored in your per-user |
PEAR configuration (~/.pearrc on Unix-like systems). After logging |
in, your username and password will be sent along in subsequent |
operations on the remote server.', |
), |
'logout' => array( |
'summary' => 'Logs out from the remote server [Deprecated in favor of channel-logout]', |
'shortcut' => 'lo', |
'function' => 'doLogout', |
'options' => array(), |
'doc' => ' |
WARNING: This function is deprecated in favor of using channel-logout |
Logs out from the remote server. This command does not actually |
connect to the remote server, it only deletes the stored username and |
password from your user configuration.', |
) |
); |
/** |
* PEAR_Command_Auth constructor. |
* |
* @access public |
*/ |
function __construct(&$ui, &$config) |
{ |
parent::__construct($ui, $config); |
} |
} |