PEAR is discontinued

This is a static archive preserving historical releases and metadata. No new packages or updates will be published. For updates to existing packages, or to publish new packages, please use Composer and Packagist.

Home » PEAR » PEAR » Bug #10261

Transaction handling fails to halt/rollback on certain errors

Details

Submitted2007-03-04 11:35 UTC
Fromtimj at php dot net
Assignedcellog
StatusClosed
PackagePEAR
PHP Version5.1.6
Roadmaps1.5.2

Comments

[2007-03-04 11:35 UTC] timj at php dot net

Description:
------------
The PEAR transaction handler fails to halt/roll back on some critical errors.

Consider package X, which requires package Y. If I do "pear install X", and the installation of "Y" fails then I would expect PEAR to roll back the whole transaction and not to continue installing X. Instead, for some types of installation errors, PEAR will report X as being correctly installed even though it's required dependency Y failed to install.

A 100% reproducible test scenario is available.

Test script:
---------------
This test script reproduces the described scenario, where by way of illustration, "X" is DB_ldap and "Y" is DB. However, there is nothing special about these particular packages; they just happen to be a simple and convenient example.

Start with a clean PEAR install. Assume that 1.7.9 is the latest version of PEAR::DB. We manually force an error such that the place where PEAR expects to download DB-1.7.9.tgz to is unwriteable. (For those not familiar with UNIX, the below creates an unwriteable empty file called "DB-1.7.9.tgz" in the PEAR download directory)

$ pear config-get download_dir
/path/to/download
$ touch /path/to/download/DB-1.7.9.tgz
$ chmod 000 /path/to/download/DB-1.7.9.tgz
$ pear install --onlyreqdeps DB_ldap

Expected result:
----------------
Once PEAR realises that it is not possible to install a dependency of DB_ldap, it should abort the whole transaction and NOT proceed to install DB_ldap with missing dependencies.

Actual result:
--------------
pear/DB_ldap: Skipping required dependency "pear/PEAR", is already installed
downloading DB_ldap-1.1.1.tgz ...
Starting to download DB_ldap-1.1.1.tgz (7,950 bytes)
.....done: 7,950 bytes
downloading DB-1.7.9.tgz ...
Could not download from "http://pear.php.net/get/DB-1.7.9.tgz", cannot download "pear/DB" (could not open /path/to/download/DB-1.7.9.tgz for writing)
Error: cannot download "pear/DB"
+ create dir /path/to/pear/DB
about to commit 4 file operations
successfully committed 4 file operations
install ok: channel://pear.php.net/DB_ldap-1.1.1
[tim@langesund pear2]$ pear -c pearrc list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.3.2 stable
Console_Getopt 1.2.2 stable
DB_ldap 1.1.1 stable
PEAR 1.5.0 stable
Structures_Graph 1.0.2 stable

Note how DB_ldap has been installed *without* its required dependency DB! The transaction should have been aborted and rolled back at the point where PEAR reported "Error: cannot download "pear/DB"".