[ Index ]
 

Code source de SPIP Agora 1.4

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

title

Body

[fermer]

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

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


Généré le : Sat Feb 24 14:40:03 2007 par Balluche grâce à PHPXref 0.7