57 function toTgz(&$packager, $compress =
true, $where =
null)
59 require_once
'Archive/Tar.php';
60 if ($where ===
null) {
61 if (!($where = System::mktemp(array(
'-d')))) {
62 return PEAR::raiseError(
'PEAR_Packagefile_v1::toTgz: mktemp failed');
64 } elseif (!@System::mkDir(array(
'-p', $where))) {
65 return PEAR::raiseError(
'PEAR_Packagefile_v1::toTgz: "' . $where .
'" could' .
68 if (file_exists($where . DIRECTORY_SEPARATOR .
'package.xml') &&
69 !is_file($where . DIRECTORY_SEPARATOR .
'package.xml')) {
70 return PEAR::raiseError(
'PEAR_Packagefile_v1::toTgz: unable to save package.xml as' .
71 ' "' . $where . DIRECTORY_SEPARATOR .
'package.xml"');
74 return PEAR::raiseError(
'PEAR_Packagefile_v1::toTgz: invalid package file');
76 $pkginfo = $this->_packagefile->getArray();
77 $ext = $compress ?
'.tgz' :
'.tar';
78 $pkgver = $pkginfo[
'package'] .
'-' . $pkginfo[
'version'];
79 $dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext;
80 if (file_exists(getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext) &&
81 !is_file(getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext)) {
82 return PEAR::raiseError(
'PEAR_Packagefile_v1::toTgz: cannot create tgz file "' .
83 getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext .
'"');
85 if ($pkgfile = $this->_packagefile->getPackageFile()) {
86 $pkgdir = dirname(realpath($pkgfile));
87 $pkgfile = basename($pkgfile);
89 return PEAR::raiseError(
'PEAR_Packagefile_v1::toTgz: package file object must ' .
90 'be created from a real file');
96 foreach ($this->_packagefile->getFilelist() as $fname => $atts) {
97 $file = $pkgdir . DIRECTORY_SEPARATOR . $fname;
98 if (!file_exists($file)) {
99 return PEAR::raiseError(
"File does not exist: $fname");
101 $filelist[$i++] = $file;
102 if (!isset($atts[
'md5sum'])) {
103 $this->_packagefile->setFileAttribute($fname,
'md5sum', md5_file($file));
105 $packager->log(2,
"Adding file $fname");
114 $ok = $tar->createModify(array($packagexml),
'', $where);
115 if (PEAR::isError($ok)) {
118 return PEAR::raiseError(
'PEAR_Packagefile_v1::toTgz: tarball creation failed');
121 if (!$tar->addModify($filelist, $pkgver, $pkgdir)) {
122 return PEAR::raiseError(
'PEAR_Packagefile_v1::toTgz: tarball creation failed');
124 return $dest_package;
136 $nofilechecking =
false)
138 if (!$this->_packagefile->validate($state, $nofilechecking)) {
139 return PEAR::raiseError(
'PEAR_Packagefile_v1::toPackageFile: invalid package.xml',
140 null,
null,
null, $this->_packagefile->getValidationWarnings());
142 if ($where ===
null) {
143 if (!($where = System::mktemp(array(
'-d')))) {
144 return PEAR::raiseError(
'PEAR_Packagefile_v1::toPackageFile: mktemp failed');
146 } elseif (!@System::mkDir(array(
'-p', $where))) {
147 return PEAR::raiseError(
'PEAR_Packagefile_v1::toPackageFile: "' . $where .
'" could' .
150 $newpkgfile = $where . DIRECTORY_SEPARATOR . $name;
151 $np = @fopen($newpkgfile,
'wb');
153 return PEAR::raiseError(
'PEAR_Packagefile_v1::toPackageFile: unable to save ' .
154 "$name as $newpkgfile");
156 fwrite($np, $this->
toXml($state,
true));
186 $this->_packagefile->setDate(date(
'Y-m-d'));
187 if (!$this->_packagefile->validate($state, $nofilevalidation)) {
190 $pkginfo = $this->_packagefile->getArray();
191 static $maint_map = array(
197 $ret =
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
198 $ret .=
"<!DOCTYPE package SYSTEM \"http://pear.php.net/dtd/package-1.0\">\n";
199 $ret .=
"<package version=\"1.0\" packagerversion=\"1.10.18\">\n" .
200" <name>$pkginfo[package]</name>";
201 if (isset($pkginfo[
'extends'])) {
202 $ret .=
"\n<extends>$pkginfo[extends]</extends>";
205 "\n <summary>".$this->_fixXmlEncoding($pkginfo[
'summary']).
"</summary>\n" .
206" <description>".trim($this->
_fixXmlEncoding($pkginfo[
'description'])).
"\n </description>\n" .
208 foreach ($pkginfo[
'maintainers'] as $maint) {
209 $ret .=
" <maintainer>\n";
210 foreach ($maint_map as $idx => $elm) {
215 $ret .=
" </maintainer>\n";
217 $ret .=
" </maintainers>\n";
219 if (isset($pkginfo[
'changelog']) && count($pkginfo[
'changelog']) > 0) {
220 $ret .=
" <changelog>\n";
221 foreach ($pkginfo[
'changelog'] as $oldrelease) {
224 $ret .=
" </changelog>\n";
226 $ret .=
"</package>\n";
374 function _addDir(&$dirs, $dir, $file =
null, $attributes =
null)
376 if ($dir == array() || $dir == array(
'.')) {
377 $dirs[
'files'][basename($file)] = $attributes;
380 $curdir = array_shift($dir);
381 if (!isset($dirs[
'dirs'][$curdir])) {
382 $dirs[
'dirs'][$curdir] = array();
384 $this->
_addDir($dirs[
'dirs'][$curdir], $dir, $file, $attributes);
469 $str = preg_replace(
'/^[\r\n]+/',
'', $str);
471 $indent_len = strspn($str,
" \t");
472 $indent = substr($str, 0, $indent_len);
475 foreach (explode(
"\n", $str) as $line) {
476 if (substr($line, 0, $indent_len) == $indent) {
477 $data .= substr($line, $indent_len) .
"\n";
504 function &
toV2($class =
'PEAR_PackageFile_v2', $strict =
false)
507 if (!$this->_packagefile->validate()) {
508 $a = PEAR::raiseError(
'invalid package.xml version 1.0 cannot be converted' .
509 ' to version 2.0',
null,
null,
null,
510 $this->_packagefile->getValidationWarnings(
true));
518 'xmlns' =>
'http://pear.php.net/dtd/package-2.0',
519 'xmlns:tasks' =>
'http://pear.php.net/dtd/tasks-1.0',
520 'xmlns:xsi' =>
'http://www.w3.org/2001/XMLSchema-instance',
521 'xsi:schemaLocation' =>
"http://pear.php.net/dtd/tasks-1.0\n" .
522"http://pear.php.net/dtd/tasks-1.0.xsd\n" .
523"http://pear.php.net/dtd/package-2.0\n" .
524'http://pear.php.net/dtd/package-2.0.xsd',
526 'name' => $this->_packagefile->getPackage(),
527 'channel' =>
'pear.php.net',
529 $arr[
'summary'] = $this->_packagefile->getSummary();
530 $arr[
'description'] = $this->_packagefile->getDescription();
531 $maintainers = $this->_packagefile->getMaintainers();
532 foreach ($maintainers as $maintainer) {
533 if ($maintainer[
'role'] !=
'lead') {
537 'name' => $maintainer[
'name'],
538 'user' => $maintainer[
'handle'],
539 'email' => $maintainer[
'email'],
542 $arr[
'lead'][] = $new;
545 if (!isset($arr[
'lead'])) {
546 $arr[
'lead'] = array(
549 'email' =>
'noleadmaintainer@example.com',
554 if (count($arr[
'lead']) == 1) {
555 $arr[
'lead'] = $arr[
'lead'][0];
558 foreach ($maintainers as $maintainer) {
559 if ($maintainer[
'role'] ==
'lead') {
563 'name' => $maintainer[
'name'],
564 'user' => $maintainer[
'handle'],
565 'email' => $maintainer[
'email'],
568 $arr[$maintainer[
'role']][] = $new;
571 if (isset($arr[
'developer']) && count($arr[
'developer']) == 1) {
572 $arr[
'developer'] = $arr[
'developer'][0];
575 if (isset($arr[
'contributor']) && count($arr[
'contributor']) == 1) {
576 $arr[
'contributor'] = $arr[
'contributor'][0];
579 if (isset($arr[
'helper']) && count($arr[
'helper']) == 1) {
580 $arr[
'helper'] = $arr[
'helper'][0];
583 $arr[
'date'] = $this->_packagefile->getDate();
586 'release' => $this->_packagefile->getVersion(),
587 'api' => $this->_packagefile->getVersion(),
591 'release' => $this->_packagefile->getState(),
592 'api' => $this->_packagefile->getState(),
596 'php' =>
'http://www.php.net/license',
597 'php license' =>
'http://www.php.net/license',
598 'lgpl' =>
'http://www.gnu.org/copyleft/lesser.html',
599 'bsd' =>
'http://www.opensource.org/licenses/bsd-license.php',
600 'bsd style' =>
'http://www.opensource.org/licenses/bsd-license.php',
601 'bsd-style' =>
'http://www.opensource.org/licenses/bsd-license.php',
602 'mit' =>
'http://www.opensource.org/licenses/mit-license.php',
603 'gpl' =>
'http://www.gnu.org/copyleft/gpl.html',
604 'apache' =>
'http://www.opensource.org/licenses/apache2.0.php'
607 if (isset($licensemap[strtolower($this->_packagefile->getLicense())])) {
608 $arr[
'license'] = array(
609 'attribs' => array(
'uri' =>
610 $licensemap[strtolower($this->_packagefile->getLicense())]),
611 '_content' => $this->_packagefile->getLicense()
615 $arr[
'license'] = $this->_packagefile->getLicense();
618 $arr[
'notes'] = $this->_packagefile->getNotes();
622 $release = ($this->_packagefile->getConfigureOptions() || $this->_isExtension) ?
623 'extsrcrelease' :
'phprelease';
624 if ($release ==
'extsrcrelease') {
625 $arr[
'channel'] =
'pecl.php.net';
626 $arr[
'providesextension'] = $arr[
'name'];
629 $arr[$release] = array();
630 if ($this->_packagefile->getConfigureOptions()) {
631 $arr[$release][
'configureoption'] = $this->_packagefile->getConfigureOptions();
632 foreach ($arr[$release][
'configureoption'] as $i => $opt) {
633 $arr[$release][
'configureoption'][$i] = array(
'attribs' => $opt);
635 if (count($arr[$release][
'configureoption']) == 1) {
636 $arr[$release][
'configureoption'] = $arr[$release][
'configureoption'][0];
641 if ($release ==
'extsrcrelease' && count($arr[$release]) > 1) {
643 $arr[
'dependencies'][
'required'][
'pearinstaller'][
'min'] =
'1.4.1';
646 if ($cl = $this->_packagefile->getChangelog()) {
647 foreach ($cl as $release) {
651 'release' => $release[
'version'],
652 'api' => $release[
'version'],
654 if (!isset($release[
'release_state'])) {
655 $release[
'release_state'] =
'stable';
660 'release' => $release[
'release_state'],
661 'api' => $release[
'release_state'],
663 if (isset($release[
'release_date'])) {
664 $rel[
'date'] = $release[
'release_date'];
666 $rel[
'date'] = date(
'Y-m-d');
669 if (isset($release[
'release_license'])) {
670 if (isset($licensemap[strtolower($release[
'release_license'])])) {
671 $uri = $licensemap[strtolower($release[
'release_license'])];
673 $uri =
'http://www.example.com';
675 $rel[
'license'] = array(
676 'attribs' => array(
'uri' => $uri),
677 '_content' => $release[
'release_license']
680 $rel[
'license'] = $arr[
'license'];
683 if (!isset($release[
'release_notes'])) {
684 $release[
'release_notes'] =
'no release notes';
687 $rel[
'notes'] = $release[
'release_notes'];
688 $arr[
'changelog'][
'release'][] = $rel;
693 $ret->setConfig($this->_packagefile->_config);
694 if (isset($this->_packagefile->_logger) && is_object($this->_packagefile->_logger)) {
695 $ret->setLogger($this->_packagefile->_logger);
698 $ret->fromArray($arr);
881 if (count($package[
'platform']) || count($package[
'install-as'])) {
883 $genericIgnore = array();
884 foreach ($package[
'install-as'] as $file => $as) {
886 if (!isset($package[
'platform'][$file])) {
891 if (isset($package[
'platform'][$file]) &&
892 $package[
'platform'][$file][0] ==
'!') {
897 if (isset($package[
'platform'][$file]) &&
898 $package[
'platform'][$file][0] !=
'!') {
899 $genericIgnore[] = $file;
903 foreach ($package[
'platform'] as $file => $platform) {
904 if (isset($package[
'install-as'][$file])) {
907 if ($platform[0] !=
'!') {
909 $genericIgnore[] = $file;
912 if (count($package[
'platform'])) {
913 $oses = $notplatform = $platform = array();
914 foreach ($package[
'platform'] as $file => $os) {
917 if (isset($oses[substr($os, 1)])) {
920 $oses[substr($os, 1)] = count($oses);
922 if (isset($oses[$os])) {
925 $oses[$os] = count($oses);
929 foreach ($oses as $os => $releaseNum) {
930 $release[$releaseNum][
'installconditions'][
'os'][
'name'] = $os;
931 $release[$releaseNum][
'filelist'] = array(
'install' => array(),
932 'ignore' => array());
933 foreach ($package[
'install-as'] as $file => $as) {
935 if (!isset($package[
'platform'][$file])) {
936 $release[$releaseNum][
'filelist'][
'install'][] =
947 if (isset($package[
'platform'][$file]) &&
948 $package[
'platform'][$file] == $os) {
949 $release[$releaseNum][
'filelist'][
'install'][] =
960 if (isset($package[
'platform'][$file]) &&
961 $package[
'platform'][$file] !=
"!$os" &&
962 $package[
'platform'][$file][0] ==
'!') {
963 $release[$releaseNum][
'filelist'][
'install'][] =
974 if (isset($package[
'platform'][$file]) &&
975 $package[
'platform'][$file] ==
"!$os") {
976 $release[$releaseNum][
'filelist'][
'ignore'][] =
986 if (isset($package[
'platform'][$file]) &&
987 $package[
'platform'][$file][0] !=
'!' &&
988 $package[
'platform'][$file] != $os) {
989 $release[$releaseNum][
'filelist'][
'ignore'][] =
998 foreach ($package[
'platform'] as $file => $platform) {
999 if (isset($package[
'install-as'][$file])) {
1003 if ($platform ==
"!$os") {
1004 $release[$releaseNum][
'filelist'][
'ignore'][] =
1013 if ($platform[0] !=
'!' && $platform != $os) {
1014 $release[$releaseNum][
'filelist'][
'ignore'][] =
1022 if (!count($release[$releaseNum][
'filelist'][
'install'])) {
1023 unset($release[$releaseNum][
'filelist'][
'install']);
1025 if (!count($release[$releaseNum][
'filelist'][
'ignore'])) {
1026 unset($release[$releaseNum][
'filelist'][
'ignore']);
1029 if (count($generic) || count($genericIgnore)) {
1030 $release[count($oses)] = array();
1031 if (count($generic)) {
1032 foreach ($generic as $file) {
1033 if (isset($package[
'install-as'][$file])) {
1034 $installas = $package[
'install-as'][$file];
1038 $release[count($oses)][
'filelist'][
'install'][] =
1047 if (count($genericIgnore)) {
1048 foreach ($genericIgnore as $file) {
1049 $release[count($oses)][
'filelist'][
'ignore'][] =
1059 foreach ($release as $i => $rel) {
1060 if (isset($rel[
'filelist'][
'install']) &&
1061 count($rel[
'filelist'][
'install']) == 1) {
1062 $release[$i][
'filelist'][
'install'] =
1063 $release[$i][
'filelist'][
'install'][0];
1065 if (isset($rel[
'filelist'][
'ignore']) &&
1066 count($rel[
'filelist'][
'ignore']) == 1) {
1067 $release[$i][
'filelist'][
'ignore'] =
1068 $release[$i][
'filelist'][
'ignore'][0];
1071 if (count($release) == 1) {
1072 $release = $release[0];
1076 foreach ($package[
'install-as'] as $file => $value) {
1077 $release[
'filelist'][
'install'][] =
1085 if (count($release[
'filelist'][
'install']) == 1) {
1086 $release[
'filelist'][
'install'] = $release[
'filelist'][
'install'][0];