Commit: 6cb1bcf3756806a35c0f058ddcba07f1a4f82f45 Author: Anatol Belski <[email protected]> Tue, 1 Oct 2013 11:09:17 +0200 Parents: e9e65b6fc5294fcf65c4176dac249a53b65edc27 Branches: master
Link: http://git.php.net/?p=web/rmtools.git;a=commitdiff;h=6cb1bcf3756806a35c0f058ddcba07f1a4f82f45 Log: multiple fixes - fixed compression formats - implemented build from uncompressed tar - added bsdtar as a fallback for gnu tar Changed paths: M client/include/PeclExt.php Diff: diff --git a/client/include/PeclExt.php b/client/include/PeclExt.php index 5ac8b1e..eb1fcb7 100644 --- a/client/include/PeclExt.php +++ b/client/include/PeclExt.php @@ -9,11 +9,12 @@ class PeclExt { protected $pkg_path; protected $pkg_basename; - protected $pkg_comp; + protected $pkg_fmt; protected $name; protected $version; protected $build; protected $tar_cmd = 'c:\apps\git\bin\tar.exe'; + protected $bsdtar_cmd = 'c:\apps\bsdtar\bin\bsdtar.exe'; protected $gzip_cmd = 'c:\apps\git\bin\gzip.exe'; protected $bzip2_cmd = 'c:\apps\git\bin\bzip2.exe'; protected $xz_cmd = 'c:\apps\xzutils\xz.exe'; @@ -35,27 +36,30 @@ class PeclExt if ('.tgz' == substr($pkg_path, -4)) { $this->pkg_basename = basename($pkg_path, '.tgz'); - $this->pkg_comp = 'tgz'; + $this->pkg_fmt = 'tgz'; } else if ('.tar.gz' == substr($pkg_path, -7)) { $this->pkg_basename = basename($pkg_path, '.tar.gz'); - $this->pkg_comp = 'tgz'; + $this->pkg_fmt = 'tgz'; } else if ('.tbz' == substr($pkg_path, -4)) { $this->pkg_basename = basename($pkg_path, '.tbz'); - $this->pkg_comp = 'tbz'; + $this->pkg_fmt = 'tbz'; } else if ('.tar.bz2' == substr($pkg_path, -8)) { $this->pkg_basename = basename($pkg_path, '.tar.bz2'); - $this->pkg_comp = 'tbz'; + $this->pkg_fmt = 'tbz'; } else if ('.txz' == substr($pkg_path, -4)) { $this->pkg_basename = basename($pkg_path, '.txz'); - $this->pkg_comp = 'txz'; + $this->pkg_fmt = 'txz'; } else if ('.tar.xz' == substr($pkg_path, -7)) { $this->pkg_basename = basename($pkg_path, '.tar.xz'); - $this->pkg_comp = 'txz'; + $this->pkg_fmt = 'txz'; + } else if ('.tar' == substr($pkg_path, -4)) { + $this->pkg_basename = basename($pkg_path, '.tar'); + $this->pkg_fmt = 'tar'; } else if ('.zip' == substr($pkg_path, -4)) { $this->pkg_basename = basename($pkg_path, '.zip'); - $this->pkg_comp = 'zip'; + $this->pkg_fmt = 'zip'; } else { - throw new \Exception("Unsupported compression format, please pass tgz, tar.gz or zip"); + throw new \Exception("Unsupported package format. We support zip, pure tarball, tarball compressed with gzip, bzip2 or xz"); } $this->pkg_path = $pkg_path; @@ -180,19 +184,35 @@ class PeclExt $unopts = "-df"; break; + case 'tar': + // pass + break; + default: throw new \Exception("Unsupported compression format '$format'"); } - $uncompress_cmd = $uncmd . ' ' . $unopts . ' ' . escapeshellarg(basename($this->pkg_path)); - system($uncompress_cmd, $ret); - if ($ret) { - throw new \Exception("Failed to gunzip the tarball"); + + if ('tar' != $format) { + $uncompress_cmd = $uncmd . ' ' . $unopts . ' ' . escapeshellarg(basename($this->pkg_path)); + system($uncompress_cmd, $ret); + if ($ret) { + $this->cleanup(); + throw new \Exception("Failed to gunzip the tarball"); + } } - $tar_cmd = $this->tar_cmd . ' -xf ' . escapeshellarg($tar_name); + /* try gnu tar first */ + $tar_cmd = $this->tar_cmd . ' --no-same-owner --no-same-permissions -xf ' . escapeshellarg($tar_name); system($tar_cmd, $ret); if ($ret) { - throw new \Exception("Failed to untar the tarball"); + /* not done yet, retry with bsdtar */ + $tar_cmd = $this->bsdtar_cmd . ' -xf ' . escapeshellarg($tar_name); + system($tar_cmd, $ret); + if ($ret) { + /* definitely broken, give up */ + $this->cleanup(); + throw new \Exception("Failed to untar the tarball"); + } } unlink($tar_name); @@ -216,9 +236,12 @@ class PeclExt public function unpack() { - switch ($this->pkg_comp) { + switch ($this->pkg_fmt) { case 'tgz': - $tmp_path = $this->uncompressTarball($this->pkg_comp); + case 'tbz': + case 'txz': + case 'tar': + $tmp_path = $this->uncompressTarball($this->pkg_fmt); break; case 'zip': @@ -629,6 +652,7 @@ if (!function_exists('rmtools\combinations')) { { if ($this->tmp_extract_path) { $path = dirname($this->tmp_extract_path); + /* Do not delete TMP_DIR */ if (strtolower(realpath(TMP_DIR)) == strtolower(realpath($path))) { $path = $this->tmp_extract_path; } -- PHP Webmaster List Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
