[ Index ]
 

Code source de PHP PEAR 1.4.5

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/PEAR/Command/ -> Package.php (source)

   1  <?php
   2  /**
   3   * PEAR_Command_Package (package, package-validate, cvsdiff, cvstag, package-dependencies,
   4   * sign, makerpm, convert commands)
   5   *
   6   * PHP versions 4 and 5
   7   *
   8   * LICENSE: This source file is subject to version 3.0 of the PHP license
   9   * that is available through the world-wide-web at the following URI:
  10   * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  11   * the PHP License and are unable to obtain it through the web, please
  12   * send a note to license@php.net so we can mail you a copy immediately.
  13   *
  14   * @category   pear
  15   * @package    PEAR
  16   * @author     Stig Bakken <ssb@php.net>
  17   * @author     Martin Jansen <mj@php.net>
  18   * @author     Greg Beaver <cellog@php.net>
  19   * @copyright  1997-2006 The PHP Group
  20   * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  21   * @version    CVS: $Id: Package.php,v 1.122 2006/06/07 23:38:14 pajoye Exp $
  22   * @link       http://pear.php.net/package/PEAR
  23   * @since      File available since Release 0.1
  24   */
  25  
  26  /**
  27   * base class
  28   */
  29  require_once  'PEAR/Command/Common.php';
  30  
  31  /**
  32   * PEAR commands for login/logout
  33   *
  34   * @category   pear
  35   * @package    PEAR
  36   * @author     Stig Bakken <ssb@php.net>
  37   * @author     Martin Jansen <mj@php.net>
  38   * @author     Greg Beaver <cellog@php.net>
  39   * @copyright  1997-2006 The PHP Group
  40   * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  41   * @version    Release: 1.5.0
  42   * @link       http://pear.php.net/package/PEAR
  43   * @since      Class available since Release 0.1
  44   */
  45  
  46  class PEAR_Command_Package extends PEAR_Command_Common
  47  {
  48      // {{{ properties
  49  
  50      var $commands = array(
  51          'package' => array(
  52              'summary' => 'Build Package',
  53              'function' => 'doPackage',
  54              'shortcut' => 'p',
  55              'options' => array(
  56                  'nocompress' => array(
  57                      'shortopt' => 'Z',
  58                      'doc' => 'Do not gzip the package file'
  59                      ),
  60                  'showname' => array(
  61                      'shortopt' => 'n',
  62                      'doc' => 'Print the name of the packaged file.',
  63                      ),
  64                  ),
  65              'doc' => '[descfile] [descfile2]
  66  Creates a PEAR package from its description file (usually called
  67  package.xml).  If a second packagefile is passed in, then
  68  the packager will check to make sure that one is a package.xml
  69  version 1.0, and the other is a package.xml version 2.0.  The
  70  package.xml version 1.0 will be saved as "package.xml" in the archive,
  71  and the other as "package2.xml" in the archive"
  72  '
  73              ),
  74          'package-validate' => array(
  75              'summary' => 'Validate Package Consistency',
  76              'function' => 'doPackageValidate',
  77              'shortcut' => 'pv',
  78              'options' => array(),
  79              'doc' => '
  80  ',
  81              ),
  82          'cvsdiff' => array(
  83              'summary' => 'Run a "cvs diff" for all files in a package',
  84              'function' => 'doCvsDiff',
  85              'shortcut' => 'cd',
  86              'options' => array(
  87                  'quiet' => array(
  88                      'shortopt' => 'q',
  89                      'doc' => 'Be quiet',
  90                      ),
  91                  'reallyquiet' => array(
  92                      'shortopt' => 'Q',
  93                      'doc' => 'Be really quiet',
  94                      ),
  95                  'date' => array(
  96                      'shortopt' => 'D',
  97                      'doc' => 'Diff against revision of DATE',
  98                      'arg' => 'DATE',
  99                      ),
 100                  'release' => array(
 101                      'shortopt' => 'R',
 102                      'doc' => 'Diff against tag for package release REL',
 103                      'arg' => 'REL',
 104                      ),
 105                  'revision' => array(
 106                      'shortopt' => 'r',
 107                      'doc' => 'Diff against revision REV',
 108                      'arg' => 'REV',
 109                      ),
 110                  'context' => array(
 111                      'shortopt' => 'c',
 112                      'doc' => 'Generate context diff',
 113                      ),
 114                  'unified' => array(
 115                      'shortopt' => 'u',
 116                      'doc' => 'Generate unified diff',
 117                      ),
 118                  'ignore-case' => array(
 119                      'shortopt' => 'i',
 120                      'doc' => 'Ignore case, consider upper- and lower-case letters equivalent',
 121                      ),
 122                  'ignore-whitespace' => array(
 123                      'shortopt' => 'b',
 124                      'doc' => 'Ignore changes in amount of white space',
 125                      ),
 126                  'ignore-blank-lines' => array(
 127                      'shortopt' => 'B',
 128                      'doc' => 'Ignore changes that insert or delete blank lines',
 129                      ),
 130                  'brief' => array(
 131                      'doc' => 'Report only whether the files differ, no details',
 132                      ),
 133                  'dry-run' => array(
 134                      'shortopt' => 'n',
 135                      'doc' => 'Don\'t do anything, just pretend',
 136                      ),
 137                  ),
 138              'doc' => '<package.xml>
 139  Compares all the files in a package.  Without any options, this
 140  command will compare the current code with the last checked-in code.
 141  Using the -r or -R option you may compare the current code with that
 142  of a specific release.
 143  ',
 144              ),
 145          'cvstag' => array(
 146              'summary' => 'Set CVS Release Tag',
 147              'function' => 'doCvsTag',
 148              'shortcut' => 'ct',
 149              'options' => array(
 150                  'quiet' => array(
 151                      'shortopt' => 'q',
 152                      'doc' => 'Be quiet',
 153                      ),
 154                  'reallyquiet' => array(
 155                      'shortopt' => 'Q',
 156                      'doc' => 'Be really quiet',
 157                      ),
 158                  'slide' => array(
 159                      'shortopt' => 'F',
 160                      'doc' => 'Move (slide) tag if it exists',
 161                      ),
 162                  'delete' => array(
 163                      'shortopt' => 'd',
 164                      'doc' => 'Remove tag',
 165                      ),
 166                  'dry-run' => array(
 167                      'shortopt' => 'n',
 168                      'doc' => 'Don\'t do anything, just pretend',
 169                      ),
 170                  ),
 171              'doc' => '<package.xml> [files...]
 172  Sets a CVS tag on all files in a package.  Use this command after you have
 173  packaged a distribution tarball with the "package" command to tag what
 174  revisions of what files were in that release.  If need to fix something
 175  after running cvstag once, but before the tarball is released to the public,
 176  use the "slide" option to move the release tag.
 177  
 178  to include files (such as a second package.xml, or tests not included in the
 179  release), pass them as additional parameters.
 180  ',
 181              ),
 182          'package-dependencies' => array(
 183              'summary' => 'Show package dependencies',
 184              'function' => 'doPackageDependencies',
 185              'shortcut' => 'pd',
 186              'options' => array(),
 187              'doc' => '
 188  List all dependencies the package has.'
 189              ),
 190          'sign' => array(
 191              'summary' => 'Sign a package distribution file',
 192              'function' => 'doSign',
 193              'shortcut' => 'si',
 194              'options' => array(),
 195              'doc' => '<package-file>
 196  Signs a package distribution (.tar or .tgz) file with GnuPG.',
 197              ),
 198          'makerpm' => array(
 199              'summary' => 'Builds an RPM spec file from a PEAR package',
 200              'function' => 'doMakeRPM',
 201              'shortcut' => 'rpm',
 202              'options' => array(
 203                  'spec-template' => array(
 204                      'shortopt' => 't',
 205                      'arg' => 'FILE',
 206                      'doc' => 'Use FILE as RPM spec file template'
 207                      ),
 208                  'rpm-pkgname' => array(
 209                      'shortopt' => 'p',
 210                      'arg' => 'FORMAT',
 211                      'doc' => 'Use FORMAT as format string for RPM package name, %s is replaced
 212  by the PEAR package name, defaults to "PEAR::%s".',
 213                      ),
 214                  ),
 215              'doc' => '<package-file>
 216  
 217  Creates an RPM .spec file for wrapping a PEAR package inside an RPM
 218  package.  Intended to be used from the SPECS directory, with the PEAR
 219  package tarball in the SOURCES directory:
 220  
 221  $ pear makerpm ../SOURCES/Net_Socket-1.0.tgz
 222  Wrote RPM spec file PEAR::Net_Geo-1.0.spec
 223  $ rpm -bb PEAR::Net_Socket-1.0.spec
 224  ...
 225  Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm
 226  ',
 227              ),
 228          'convert' => array(
 229              'summary' => 'Convert a package.xml 1.0 to package.xml 2.0 format',
 230              'function' => 'doConvert',
 231              'shortcut' => 'c2',
 232              'options' => array(
 233                  'flat' => array(
 234                      'shortopt' => 'f',
 235                      'doc' => 'do not beautify the filelist.',
 236                      ),
 237                  ),
 238              'doc' => '[descfile] [descfile2]
 239  Converts a package.xml in 1.0 format into a package.xml
 240  in 2.0 format.  The new file will be named package2.xml by default,
 241  and package.xml will be used as the old file by default.
 242  This is not the most intelligent conversion, and should only be
 243  used for automated conversion or learning the format.
 244  '
 245              ),
 246          );
 247  
 248      var $output;
 249  
 250      // }}}
 251      // {{{ constructor
 252  
 253      /**
 254       * PEAR_Command_Package constructor.
 255       *
 256       * @access public
 257       */
 258      function PEAR_Command_Package(&$ui, &$config)
 259      {
 260          parent::PEAR_Command_Common($ui, $config);
 261      }
 262  
 263      // }}}
 264  
 265      // {{{ _displayValidationResults()
 266  
 267      function _displayValidationResults($err, $warn, $strict = false)
 268      {
 269          foreach ($err as $e) {
 270              $this->output .= "Error: $e\n";
 271          }
 272          foreach ($warn as $w) {
 273              $this->output .= "Warning: $w\n";
 274          }
 275          $this->output .= sprintf('Validation: %d error(s), %d warning(s)'."\n",
 276                                         sizeof($err), sizeof($warn));
 277          if ($strict && sizeof($err) > 0) {
 278              $this->output .= "Fix these errors and try again.";
 279              return false;
 280          }
 281          return true;
 282      }
 283  
 284      // }}}
 285      function &getPackager()
 286      {
 287          if (!class_exists('PEAR_Packager')) {
 288              require_once  'PEAR/Packager.php';
 289          }
 290          $a = &new PEAR_Packager;
 291          return $a;
 292      }
 293  
 294      function &getPackageFile($config, $debug = false, $tmpdir = null)
 295      {
 296          if (!class_exists('PEAR_Common')) {
 297              require_once  'PEAR/Common.php';
 298          }
 299          if (!class_exists('PEAR/PackageFile.php')) {
 300              require_once  'PEAR/PackageFile.php';
 301          }
 302          $a = &new PEAR_PackageFile($config, $debug, $tmpdir);
 303          $common = new PEAR_Common;
 304          $common->ui = $this->ui;
 305          $a->setLogger($common);
 306          return $a;
 307      }
 308      // {{{ doPackage()
 309  
 310      function doPackage($command, $options, $params)
 311      {
 312          $this->output = '';
 313          $pkginfofile = isset($params[0]) ? $params[0] : 'package.xml';
 314          $pkg2 = isset($params[1]) ? $params[1] : null;
 315          if (!$pkg2 && !isset($params[0])) {
 316              if (file_exists('package2.xml')) {
 317                  $pkg2 = 'package2.xml';
 318              }
 319          }
 320          $packager = &$this->getPackager();
 321          $compress = empty($options['nocompress']) ? true : false;
 322          $result = $packager->package($pkginfofile, $compress, $pkg2);
 323          if (PEAR::isError($result)) {
 324              return $this->raiseError($result);
 325          }
 326          // Don't want output, only the package file name just created
 327          if (isset($options['showname'])) {
 328              $this->output = $result;
 329          }
 330          if ($this->output) {
 331              $this->ui->outputData($this->output, $command);
 332          }
 333          return true;
 334      }
 335  
 336      // }}}
 337      // {{{ doPackageValidate()
 338  
 339      function doPackageValidate($command, $options, $params)
 340      {
 341          $this->output = '';
 342          if (sizeof($params) < 1) {
 343              $params[0] = "package.xml";
 344          }
 345          $obj = &$this->getPackageFile($this->config, $this->_debug);
 346          $obj->rawReturn();
 347          PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 348          $info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL);
 349          if (PEAR::isError($info)) {
 350              $info = $obj->fromPackageFile($params[0], PEAR_VALIDATE_NORMAL);
 351          } else {
 352              $archive = $info->getArchiveFile();
 353              $tar = &new Archive_Tar($archive);
 354              $tar->extract(dirname($info->getPackageFile()));
 355              $info->setPackageFile(dirname($info->getPackageFile()) . DIRECTORY_SEPARATOR .
 356                  $info->getPackage() . '-' . $info->getVersion() . DIRECTORY_SEPARATOR .
 357                  basename($info->getPackageFile()));
 358          }
 359          PEAR::staticPopErrorHandling();
 360          if (PEAR::isError($info)) {
 361              return $this->raiseError($info);
 362          }
 363          $valid = false;
 364          if ($info->getPackagexmlVersion() == '2.0') {
 365              if ($valid = $info->validate(PEAR_VALIDATE_NORMAL)) {
 366                  $info->flattenFileList();
 367                  $valid = $info->validate(PEAR_VALIDATE_PACKAGING);
 368              }
 369          } else {
 370              $valid = $info->validate(PEAR_VALIDATE_PACKAGING);
 371          }
 372          $err = array();
 373          $warn = array();
 374          if (!$valid) {
 375              foreach ($info->getValidationWarnings() as $error) {
 376                  if ($error['level'] == 'warning') {
 377                      $warn[] = $error['message'];
 378                  } else {
 379                      $err[] = $error['message'];
 380                  }
 381              }
 382          }
 383          $this->_displayValidationResults($err, $warn);
 384          $this->ui->outputData($this->output, $command);
 385          return true;
 386      }
 387  
 388      // }}}
 389      // {{{ doCvsTag()
 390  
 391      function doCvsTag($command, $options, $params)
 392      {
 393          $this->output = '';
 394          $_cmd = $command;
 395          if (sizeof($params) < 1) {
 396              $help = $this->getHelp($command);
 397              return $this->raiseError("$command: missing parameter: $help[0]");
 398          }
 399          $obj = &$this->getPackageFile($this->config, $this->_debug);
 400          $info = $obj->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL);
 401          if (PEAR::isError($info)) {
 402              return $this->raiseError($info);
 403          }
 404          $err = $warn = array();
 405          if (!$info->validate()) {
 406              foreach ($info->getValidationWarnings() as $error) {
 407                  if ($error['level'] == 'warning') {
 408                      $warn[] = $error['message'];
 409                  } else {
 410                      $err[] = $error['message'];
 411                  }
 412              }
 413          }
 414          if (!$this->_displayValidationResults($err, $warn, true)) {
 415              $this->ui->outputData($this->output, $command);
 416              return $this->raiseError('CVS tag failed');
 417          }
 418          $version = $info->getVersion();
 419          $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $version);
 420          $cvstag = "RELEASE_$cvsversion";
 421          $files = array_keys($info->getFilelist());
 422          $command = "cvs";
 423          if (isset($options['quiet'])) {
 424              $command .= ' -q';
 425          }
 426          if (isset($options['reallyquiet'])) {
 427              $command .= ' -Q';
 428          }
 429          $command .= ' tag';
 430          if (isset($options['slide'])) {
 431              $command .= ' -F';
 432          }
 433          if (isset($options['delete'])) {
 434              $command .= ' -d';
 435          }
 436          $command .= ' ' . $cvstag . ' ' . escapeshellarg($params[0]);
 437          array_shift($params);
 438          if (count($params)) {
 439              // add in additional files to be tagged
 440              $files = array_merge($files, $params);
 441          }
 442          foreach ($files as $file) {
 443              $command .= ' ' . escapeshellarg($file);
 444          }
 445          if ($this->config->get('verbose') > 1) {
 446              $this->output .= "+ $command\n";
 447          }
 448          $this->output .= "+ $command\n";
 449          if (empty($options['dry-run'])) {
 450              $fp = popen($command, "r");
 451              while ($line = fgets($fp, 1024)) {
 452                  $this->output .= rtrim($line)."\n";
 453              }
 454              pclose($fp);
 455          }
 456          $this->ui->outputData($this->output, $_cmd);
 457          return true;
 458      }
 459  
 460      // }}}
 461      // {{{ doCvsDiff()
 462  
 463      function doCvsDiff($command, $options, $params)
 464      {
 465          $this->output = '';
 466          if (sizeof($params) < 1) {
 467              $help = $this->getHelp($command);
 468              return $this->raiseError("$command: missing parameter: $help[0]");
 469          }
 470          $obj = &$this->getPackageFile($this->config, $this->_debug);
 471          $info = $obj->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL);
 472          if (PEAR::isError($info)) {
 473              return $this->raiseError($info);
 474          }
 475          $err = $warn = array();
 476          if (!$info->validate()) {
 477              foreach ($info->getValidationWarnings() as $error) {
 478                  if ($error['level'] == 'warning') {
 479                      $warn[] = $error['message'];
 480                  } else {
 481                      $err[] = $error['message'];
 482                  }
 483              }
 484          }
 485          if (!$this->_displayValidationResults($err, $warn, true)) {
 486              $this->ui->outputData($this->output, $command);
 487              return $this->raiseError('CVS diff failed');
 488          }
 489          $info1 = $info->getFilelist();
 490          $files = $info1;
 491          $cmd = "cvs";
 492          if (isset($options['quiet'])) {
 493              $cmd .= ' -q';
 494              unset($options['quiet']);
 495          }
 496          if (isset($options['reallyquiet'])) {
 497              $cmd .= ' -Q';
 498              unset($options['reallyquiet']);
 499          }
 500          if (isset($options['release'])) {
 501              $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $options['release']);
 502              $cvstag = "RELEASE_$cvsversion";
 503              $options['revision'] = $cvstag;
 504              unset($options['release']);
 505          }
 506          $execute = true;
 507          if (isset($options['dry-run'])) {
 508              $execute = false;
 509              unset($options['dry-run']);
 510          }
 511          $cmd .= ' diff';
 512          // the rest of the options are passed right on to "cvs diff"
 513          foreach ($options as $option => $optarg) {
 514              $arg = $short = false;
 515              if (isset($this->commands[$command]['options'][$option])) {
 516                  $arg = $this->commands[$command]['options'][$option]['arg'];
 517                  $short = $this->commands[$command]['options'][$option]['shortopt'];
 518              }
 519              $cmd .= $short ? " -$short" : " --$option";
 520              if ($arg && $optarg) {
 521                  $cmd .= ($short ? '' : '=') . escapeshellarg($optarg);
 522              }
 523          }
 524          foreach ($files as $file) {
 525              $cmd .= ' ' . escapeshellarg($file['name']);
 526          }
 527          if ($this->config->get('verbose') > 1) {
 528              $this->output .= "+ $cmd\n";
 529          }
 530          if ($execute) {
 531              $fp = popen($cmd, "r");
 532              while ($line = fgets($fp, 1024)) {
 533                  $this->output .= rtrim($line)."\n";
 534              }
 535              pclose($fp);
 536          }
 537          $this->ui->outputData($this->output, $command);
 538          return true;
 539      }
 540  
 541      // }}}
 542      // {{{ doPackageDependencies()
 543  
 544      function doPackageDependencies($command, $options, $params)
 545      {
 546          // $params[0] -> the PEAR package to list its information
 547          if (sizeof($params) != 1) {
 548              return $this->raiseError("bad parameter(s), try \"help $command\"");
 549          }
 550          $obj = &$this->getPackageFile($this->config, $this->_debug);
 551          $info = $obj->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL);
 552          if (PEAR::isError($info)) {
 553              return $this->raiseError($info);
 554          }
 555          $deps = $info->getDeps();
 556          if (is_array($deps)) {
 557              if ($info->getPackagexmlVersion() == '1.0') {
 558                  $data = array(
 559                      'caption' => 'Dependencies for pear/' . $info->getPackage(),
 560                      'border' => true,
 561                      'headline' => array("Required?", "Type", "Name", "Relation", "Version"),
 562                      );
 563  
 564                  foreach ($deps as $d) {
 565                      if (isset($d['optional'])) {
 566                          if ($d['optional'] == 'yes') {
 567                              $req = 'No';
 568                          } else {
 569                              $req = 'Yes';
 570                          }
 571                      } else {
 572                          $req = 'Yes';
 573                      }
 574                      if (isset($this->_deps_rel_trans[$d['rel']])) {
 575                          $rel = $this->_deps_rel_trans[$d['rel']];
 576                      } else {
 577                          $rel = $d['rel'];
 578                      }
 579  
 580                      if (isset($this->_deps_type_trans[$d['type']])) {
 581                          $type = ucfirst($this->_deps_type_trans[$d['type']]);
 582                      } else {
 583                          $type = $d['type'];
 584                      }
 585  
 586                      if (isset($d['name'])) {
 587                          $name = $d['name'];
 588                      } else {
 589                          $name = '';
 590                      }
 591  
 592                      if (isset($d['version'])) {
 593                          $version = $d['version'];
 594                      } else {
 595                          $version = '';
 596                      }
 597  
 598                      $data['data'][] = array($req, $type, $name, $rel, $version);
 599                  }
 600              } else { // package.xml 2.0 dependencies display
 601                  require_once  'PEAR/Dependency2.php';
 602                  $deps = $info->getDependencies();
 603                  $reg = &$this->config->getRegistry();
 604                  if (is_array($deps)) {
 605                      $d = new PEAR_Dependency2($this->config, array(), '');
 606                      $data = array(
 607                          'caption' => 'Dependencies for ' . $info->getPackage(),
 608                          'border' => true,
 609                          'headline' => array("Required?", "Type", "Name", 'Versioning', 'Group'),
 610                          );
 611                      foreach ($deps as $type => $subd) {
 612                          $req = ($type == 'required') ? 'Yes' : 'No';
 613                          if ($type == 'group') {
 614                              $group = $subd['attribs']['name'];
 615                          } else {
 616                              $group = '';
 617                          }
 618                          if (!isset($subd[0])) {
 619                              $subd = array($subd);
 620                          }
 621                          foreach ($subd as $groupa) {
 622                              foreach ($groupa as $deptype => $depinfo) {
 623                                  if ($deptype == 'attribs') {
 624                                      continue;
 625                                  }
 626                                  if ($deptype == 'pearinstaller') {
 627                                      $deptype = 'pear Installer';
 628                                  }
 629                                  if (!isset($depinfo[0])) {
 630                                      $depinfo = array($depinfo);
 631                                  }
 632                                  foreach ($depinfo as $inf) {
 633                                      $name = '';
 634                                      if (isset($inf['channel'])) {
 635                                          $alias = $reg->channelAlias($inf['channel']);
 636                                          if (!$alias) {
 637                                              $alias = '(channel?) ' .$inf['channel'];
 638                                          }
 639                                          $name = $alias . '/';
 640                                      }
 641                                      if (isset($inf['name'])) {
 642                                          $name .= $inf['name'];
 643                                      } elseif (isset($inf['pattern'])) {
 644                                          $name .= $inf['pattern'];
 645                                      } else {
 646                                          $name .= '';
 647                                      }
 648                                      if (isset($inf['uri'])) {
 649                                          $name .= ' [' . $inf['uri'] .  ']';
 650                                      }
 651                                      if (isset($inf['conflicts'])) {
 652                                          $ver = 'conflicts';
 653                                      } else {
 654                                          $ver = $d->_getExtraString($inf);
 655                                      }
 656                                      $data['data'][] = array($req, ucfirst($deptype), $name,
 657                                          $ver, $group);
 658                                  }
 659                              }
 660                          }
 661                      }
 662                  }
 663              }
 664  
 665              $this->ui->outputData($data, $command);
 666              return true;
 667          }
 668  
 669          // Fallback
 670          $this->ui->outputData("This package does not have any dependencies.", $command);
 671      }
 672  
 673      // }}}
 674      // {{{ doSign()
 675  
 676      function doSign($command, $options, $params)
 677      {
 678          require_once  'System.php';
 679          require_once  'Archive/Tar.php';
 680          // should move most of this code into PEAR_Packager
 681          // so it'll be easy to implement "pear package --sign"
 682          if (sizeof($params) != 1) {
 683              return $this->raiseError("bad parameter(s), try \"help $command\"");
 684          }
 685          if (!file_exists($params[0])) {
 686              return $this->raiseError("file does not exist: $params[0]");
 687          }
 688          $obj = $this->getPackageFile($this->config, $this->_debug);
 689          $info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL);
 690          if (PEAR::isError($info)) {
 691              return $this->raiseError($info);
 692          }
 693          $tar = new Archive_Tar($params[0]);
 694          $tmpdir = System::mktemp('-d pearsign');
 695          if (!$tar->extractList('package2.xml package.sig', $tmpdir)) {
 696              if (!$tar->extractList('package.xml package.sig', $tmpdir)) {
 697                  return $this->raiseError("failed to extract tar file");
 698              }
 699          }
 700          if (file_exists("$tmpdir/package.sig")) {
 701              return $this->raiseError("package already signed");
 702          }
 703          $packagexml = 'package.xml';
 704          if (file_exists("$tmpdir/package2.xml")) {
 705              $packagexml = 'package2.xml';
 706          }
 707          if (file_exists("$tmpdir/package.sig")) {
 708              unlink("$tmpdir/package.sig");
 709          }
 710          $input = $this->ui->userDialog($command,
 711                                         array('GnuPG Passphrase'),
 712                                         array('password'));
 713          $gpg = popen("gpg --batch --passphrase-fd 0 --armor --detach-sign --output $tmpdir/package.sig $tmpdir/$packagexml 2>/dev/null", "w");
 714          if (!$gpg) {
 715              return $this->raiseError("gpg command failed");
 716          }
 717          fwrite($gpg, "$input[0]\n");
 718          if (pclose($gpg) || !file_exists("$tmpdir/package.sig")) {
 719              return $this->raiseError("gpg sign failed");
 720          }
 721          $tar->addModify("$tmpdir/package.sig", '', $tmpdir);
 722          return true;
 723      }
 724  
 725      // }}}
 726  
 727      /**
 728       * For unit testing purposes
 729       */
 730      function &getInstaller(&$ui)
 731      {
 732          if (!class_exists('PEAR_Installer')) {
 733              require_once  'PEAR/Installer.php';
 734          }
 735          $a = &new PEAR_Installer($ui);
 736          return $a;
 737      }
 738      
 739      /**
 740       * For unit testing purposes
 741       */
 742      function &getCommandPackaging(&$ui, &$config)
 743      {
 744          if (!class_exists('PEAR_Command_Packaging')) {
 745              if ($fp = @fopen('PEAR/Command/Packaging.php', 'r', true)) {
 746                  fclose($fp);
 747                  include_once 'PEAR/Command/Packaging.php';
 748              }
 749          }
 750          
 751          if (class_exists('PEAR_Command_Packaging')) {
 752              $a = &new PEAR_Command_Packaging($ui, $config);
 753          } else {
 754              $a = null;
 755          }
 756          return $a;
 757      }
 758  
 759      // {{{ doMakeRPM()
 760  
 761      function doMakeRPM($command, $options, $params)
 762      {
 763  
 764          // Check to see if PEAR_Command_Packaging is installed, and
 765          // transparently switch to use the "make-rpm-spec" command from it
 766          // instead, if it does. Otherwise, continue to use the old version
 767          // of "makerpm" supplied with this package (PEAR).
 768          $packaging_cmd = $this->getCommandPackaging($this->ui, $this->config);
 769          if ($packaging_cmd !== null) {
 770              $this->ui->outputData('PEAR_Command_Packaging is installed; using '.
 771                  'newer "make-rpm-spec" command instead');
 772              return $packaging_cmd->run('make-rpm-spec', $options, $params);
 773          } else {
 774              $this->ui->outputData('WARNING: "pear makerpm" is no longer available; an '.
 775                'improved version is available via "pear make-rpm-spec", which '.
 776                'is available by installing PEAR_Command_Packaging');
 777          }
 778          return true;
 779      }
 780  
 781      function doConvert($command, $options, $params)
 782      {
 783          $packagexml = isset($params[0]) ? $params[0] : 'package.xml';
 784          $newpackagexml = isset($params[1]) ? $params[1] : dirname($packagexml) .
 785              DIRECTORY_SEPARATOR . 'package2.xml';
 786          $pkg = &$this->getPackageFile($this->config, $this->_debug);
 787          PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 788          $pf = $pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL);
 789          PEAR::staticPopErrorHandling();
 790          if (!PEAR::isError($pf)) {
 791              if (is_a($pf, 'PEAR_PackageFile_v2')) {
 792                  $this->ui->outputData($packagexml . ' is already a package.xml version 2.0');
 793                  return true;
 794              }
 795              $gen = &$pf->getDefaultGenerator();
 796              $newpf = &$gen->toV2();
 797              $newpf->setPackagefile($newpackagexml);
 798              $gen = &$newpf->getDefaultGenerator();
 799              PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
 800              $state = (isset($options['flat']) ? PEAR_VALIDATE_PACKAGING : PEAR_VALIDATE_NORMAL);
 801              $saved = $gen->toPackageFile(dirname($newpackagexml), $state,
 802                  basename($newpackagexml));
 803              PEAR::staticPopErrorHandling();
 804              if (PEAR::isError($saved)) {
 805                  if (is_array($saved->getUserInfo())) {
 806                      foreach ($saved->getUserInfo() as $warning) {
 807                          $this->ui->outputData($warning['message']);
 808                      }
 809                  }
 810                  $this->ui->outputData($saved->getMessage());
 811                  return true;
 812              }
 813              $this->ui->outputData('Wrote new version 2.0 package.xml to "' . $saved . '"');
 814              return true;
 815          } else {
 816              if (is_array($pf->getUserInfo())) {
 817                  foreach ($pf->getUserInfo() as $warning) {
 818                      $this->ui->outputData($warning['message']);
 819                  }
 820              }
 821              return $this->raiseError($pf);
 822          }
 823      }
 824  
 825      // }}}
 826  }
 827  
 828  ?>


Généré le : Sun Feb 25 14:08:00 2007 par Balluche grâce à PHPXref 0.7