summaryrefslogtreecommitdiff
path: root/pear/PEAR/Installer.php
diff options
context:
space:
mode:
Diffstat (limited to 'pear/PEAR/Installer.php')
-rw-r--r--pear/PEAR/Installer.php363
1 files changed, 0 insertions, 363 deletions
diff --git a/pear/PEAR/Installer.php b/pear/PEAR/Installer.php
deleted file mode 100644
index 007ba39def..0000000000
--- a/pear/PEAR/Installer.php
+++ /dev/null
@@ -1,363 +0,0 @@
-<?php
-//
-// +----------------------------------------------------------------------+
-// | PHP Version 4 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1997-2002 The PHP Group |
-// +----------------------------------------------------------------------+
-// | This source file is subject to version 2.02 of the PHP license, |
-// | that is bundled with this package in the file LICENSE, and is |
-// | available at through the world-wide-web at |
-// | http://www.php.net/license/2_02.txt. |
-// | If you did not receive a copy of the PHP license and are unable to |
-// | obtain it through the world-wide-web, please send a note to |
-// | license@php.net so we can mail you a copy immediately. |
-// +----------------------------------------------------------------------+
-// | Authors: Stig Bakken <ssb@fast.no> |
-// | Tomas V.V.Cox <cox@idecnet.com> |
-// | |
-// +----------------------------------------------------------------------+
-//
-// $Id$
-
-require_once 'PEAR/Common.php';
-require_once 'PEAR/Registry.php';
-require_once 'PEAR/Dependency.php';
-
-/**
- * Administration class used to install PEAR packages and maintain the
- * installed package database.
- *
- * TODO:
- * - Install the "role=doc" files in a central pear doc dir
- * - kill FIXME's
- *
- * @since PHP 4.0.2
- * @author Stig Bakken <ssb@fast.no>
- */
-class PEAR_Installer extends PEAR_Common
-{
- // {{{ properties
-
- /** name of the package directory, for example Foo-1.0 */
- var $pkgdir;
-
- /** directory where PHP code files go */
- var $phpdir;
-
- /** directory where PHP extension files go */
- var $extdir;
-
- /** directory where documentation goes */
- var $docdir;
-
- /** directory where the package wants to put files, relative
- * to one of the three previous dirs
- */
- var $destdir = '';
-
- /** debug level (integer) */
- var $debug = 1;
-
- /** temporary directory */
- var $tmpdir;
-
- /** PEAR_Registry object used by the installer */
- var $registry;
-
- // }}}
-
- // {{{ constructor
-
- function PEAR_Installer($phpdir = PEAR_INSTALL_DIR,
- $extdir = PEAR_EXTENSION_DIR,
- $docdir = null)
- {
- $this->PEAR();
- $this->phpdir = $phpdir;
- $this->extdir = $extdir;
- if ($docdir === null) {
- $docdir = PHP_DATADIR . DIRECTORY_SEPARATOR . 'pear' .
- DIRECTORY_SEPARATOR . 'doc';
- }
- $this->docdir = $docdir;
- }
-
- // }}}
-
- // {{{ _deletePackageFiles()
-
- function _deletePackageFiles($package)
- {
- $info = $this->registry->packageInfo($package);
- if ($info == null) {
- return $this->raiseError("$package not installed");
- }
- foreach ($info['filelist'] as $file => $props) {
- $path = $props['installed_as'];
- // XXX TODO: do a "rmdir -p dirname($path)" to maintain clean the fs
- if (!@unlink($path)) {
- $this->log(2, "unable to delete: $path");
- } else {
- $this->log(2, "+ deleted file: $path");
- }
- }
- }
-
- // }}}
- // {{{ _installFile()
-
- function _installFile($file, $atts, $tmp_path)
- {
- $type = strtolower($atts['role']);
- switch ($type) {
- case 'test':
- // don't install test files for now
- $this->log(2, "+ Test file $file won't be installed yet");
- return true;
- break;
- case 'doc':
- $dest_dir = $this->docdir . DIRECTORY_SEPARATOR .
- $this->pkginfo['package'];
- break;
- case 'php':
- default: {
- $dest_dir = $this->phpdir;
- if (isset($atts['baseinstalldir'])) {
- $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir'];
- }
- if (dirname($file) != '.') {
- $dest_dir .= DIRECTORY_SEPARATOR . dirname($file);
- }
- break;
- }
- }
- $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file);
- if (!@is_dir($dest_dir)) {
- if (!$this->mkDirHier($dest_dir)) {
- $this->log(0, "failed to mkdir $dest_dir");
- return false;
- }
- $this->log(2, "+ created dir $dest_dir");
- }
- $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file;
- $orig_perms = fileperms($orig_file);
- if (!@copy($orig_file, $dest_file)) {
- $this->log(0, "failed to copy $orig_file to $dest_file");
- return false;
- }
- chmod($dest_file, $orig_perms);
- $this->log(2, "+ copy $orig_file to $dest_file");
-
- // Store the full path where the file was installed for easy unistall
- $this->pkginfo['filelist'][$file]['installed_as'] = $dest_file;
-
- $this->log(1, "installed file $dest_file");
- return true;
- }
-
- // }}}
- // {{{ install()
-
- /**
- * Installs the files within the package file specified.
- *
- * @param $pkgfile path to the package file
- *
- * @return bool true if successful, false if not
- */
-
- function install($pkgfile, $options = array(), $config = null)
- {
- // recognized options:
- // - register_only : update registry but don't install files
- // - upgrade : upgrade existing install
- //
- if (empty($this->registry)) {
- $this->registry = new PEAR_Registry($this->phpdir);
- }
- $oldcwd = getcwd();
- $need_download = false;
- if (preg_match('#^(http|ftp)://#', $pkgfile)) {
- $need_download = true;
- } elseif (!@is_file($pkgfile)) {
- if (preg_match('/^[A-Z][A-Za-z0-9_]+$/', $pkgfile)) {
- // valid package name
- if ($config === null) {
- $pkgfile = "http://pear.php.net/get/$pkgfile";
- } else {
- $pkgfile = "http://" . $config->get('master_server') .
- "/get/$pkgfile";
- }
- $need_download = true;
- }
- return $this->raiseError("could not open the package file: $pkgfile");
- }
-
- // Download package -----------------------------------------------
- if ($need_download) {
- $file = basename($pkgfile);
- if (PEAR::isError($downloaddir = $this->mkTempDir())) {
- return $downloaddir;
- }
- $this->log(2, '+ tmp dir created at ' . $downloaddir);
- $downloadfile = $downloaddir . DIRECTORY_SEPARATOR . $file;
- $this->log(1, "downloading $pkgfile ...");
- if (!$fp = @fopen($pkgfile, 'r')) {
- return $this->raiseError("$pkgfile: failed to download ($php_errormsg)");
- }
- if (!$wp = @fopen($downloadfile, 'w')) {
- return $this->raiseError("$downloadfile: write failed ($php_errormsg)");
- }
- $bytes = 0;
- while ($data = @fread($fp, 16384)) {
- $bytes += strlen($data);
- if (!@fwrite($wp, $data)) {
- return $this->raiseError("$downloadfile: write failed ($php_errormsg)");
- }
- }
- $pkgfile = $downloadfile;
- fclose($fp);
- fclose($wp);
- $this->log(1, '...done: ' . number_format($bytes, 0, '', ',') . ' bytes');
- }
-
- // Decompress pack in tmp dir -------------------------------------
-
- // To allow relative package file calls
- if (!chdir(dirname($pkgfile))) {
- return $this->raiseError('unable to chdir to package directory');
- }
- $pkgfile = getcwd() . DIRECTORY_SEPARATOR . basename($pkgfile);
-
- if (PEAR::isError($tmpdir = $this->mkTempDir())) {
- chdir($oldcwd);
- return $tmpdir;
- }
- $this->log(2, '+ tmp dir created at ' . $tmpdir);
-
- $tar = new Archive_Tar($pkgfile, true);
- if (!@$tar->extract($tmpdir)) {
- chdir($oldcwd);
- return $this->raiseError("unable to unpack $pkgfile");
- }
- $file = basename($pkgfile);
- // Assume the decompressed dir name
- if (($pos = strrpos($file, '.')) === false) {
- chdir($oldcwd);
- return $this->raiseError("invalid package name");
- }
- $pkgdir = substr($file, 0, $pos);
- $descfile = $tmpdir . DIRECTORY_SEPARATOR . $pkgdir . DIRECTORY_SEPARATOR . 'package.xml';
-
- if (!is_file($descfile)) {
- chdir($oldcwd);
- return $this->raiseError("no package.xml file after extracting the archive");
- }
-
- // Parse xml file -----------------------------------------------
- $pkginfo = $this->infoFromDescriptionFile($descfile);
- if (PEAR::isError($pkginfo)) {
- chdir($oldcwd);
- return $pkginfo;
- }
-
- $pkgname = $pkginfo['package'];
-
- // Check dependencies -------------------------------------------
- if (isset($pkginfo['release_deps']) && !isset($options['nodeps'])) {
- $error = $this->checkDeps($pkginfo);
- if ($error) {
- $this->log(0, $error);
- return $this->raiseError('Dependencies failed');
- }
- }
-
- if (empty($options['upgrade'])) {
- // checks to do only when installing new packages
- if (empty($options['force']) && $this->registry->packageExists($pkgname)) {
- return $this->raiseError("$pkgname already installed");
- }
- } else {
- // check to do only when upgrading packages
- if (!$this->registry->packageExists($pkgname)) {
- return $this->raiseError("$pkgname not installed");
- }
- $v1 = $this->registry->packageInfo($pkgname, 'version');
- $v2 = $pkginfo['version'];
- $cmp = version_compare($v1, $v2, 'gt');
- if (empty($options['force']) && !version_compare($v2, $v1, 'gt')) {
- return $this->raiseError("upgrade to a newer version ($v2 is not newer than $v1)");
- }
- if (empty($options['register_only'])) {
- // when upgrading, remove old release's files first:
- $this->_deletePackageFiles($package);
- }
- }
-
- // Copy files to dest dir ---------------------------------------
-
- // info from the package it self we want to access from _installFile
- $this->pkginfo = $pkginfo;
- if (empty($options['register_only'])) {
- if (!is_dir($this->phpdir)) {
- chdir($oldcwd);
- return $this->raiseError("no script destination directory\n",
- null, PEAR_ERROR_DIE);
- }
- $tmp_path = dirname($descfile);
- foreach ($pkginfo['filelist'] as $file => $atts) {
- $this->_installFile($file, $atts, $tmp_path);
- }
- }
-
- // Register that the package is installed -----------------------
- if (empty($options['upgrade'])) {
- $ret = $this->registry->addPackage($pkgname, $this->pkginfo);
- } else {
- $ret = $this->registry->updatePackage($pkgname, $this->pkginfo, false);
- }
- chdir($oldcwd);
- return $ret;
- }
-
- // }}}
- // {{{ uninstall()
-
- function uninstall($package)
- {
- if (empty($this->registry)) {
- $this->registry = new PEAR_Registry($this->phpdir);
- }
-
- // Delete the files
- $this->_deletePackageFiles($package);
-
- // Register that the package is no longer installed
- return $this->registry->deletePackage($package);
- }
-
- // }}}
- // {{{ checkDeps()
-
- function checkDeps(&$pkginfo)
- {
- $deps = new PEAR_Dependency;
- $errors = null;
- if (is_array($pkginfo['release_deps'])) {
- foreach($pkginfo['release_deps'] as $dep) {
- if ($error = $deps->callCheckMethod($dep)) {
- $errors .= "\n$error";
- }
- }
- if ($errors) {
- return $errors;
- }
- }
- return false;
- }
-
- // }}}
-}
-
-?> \ No newline at end of file