Редакция 69 | Содержимое файла | Сравнить с предыдущей | Последнее изменение | Открыть журнал | RSS
Редакция | Автор | № строки | Строка |
---|---|---|---|
69 | alex-w | 1 | <?php |
2 | /** |
||
3 | * <tasks:replace> |
||
4 | * |
||
5 | * PHP versions 4 and 5 |
||
6 | * |
||
7 | * LICENSE: This source file is subject to version 3.0 of the PHP license |
||
8 | * that is available through the world-wide-web at the following URI: |
||
9 | * http://www.php.net/license/3_0.txt. If you did not receive a copy of |
||
10 | * the PHP License and are unable to obtain it through the web, please |
||
11 | * send a note to license@php.net so we can mail you a copy immediately. |
||
12 | * |
||
13 | * @category pear |
||
14 | * @package PEAR |
||
15 | * @author Greg Beaver <cellog@php.net> |
||
16 | * @copyright 1997-2008 The PHP Group |
||
17 | * @license http://www.php.net/license/3_0.txt PHP License 3.0 |
||
18 | * @version CVS: $Id: Replace.php,v 1.17 2008/05/13 21:28:20 cellog Exp $ |
||
19 | * @link http://pear.php.net/package/PEAR |
||
20 | * @since File available since Release 1.4.0a1 |
||
21 | */ |
||
22 | /** |
||
23 | * Base class |
||
24 | */ |
||
25 | require_once 'PEAR/Task/Common.php'; |
||
26 | /** |
||
27 | * Implements the replace file task. |
||
28 | * @category pear |
||
29 | * @package PEAR |
||
30 | * @author Greg Beaver <cellog@php.net> |
||
31 | * @copyright 1997-2008 The PHP Group |
||
32 | * @license http://www.php.net/license/3_0.txt PHP License 3.0 |
||
33 | * @version Release: 1.7.2 |
||
34 | * @link http://pear.php.net/package/PEAR |
||
35 | * @since Class available since Release 1.4.0a1 |
||
36 | */ |
||
37 | class PEAR_Task_Replace extends PEAR_Task_Common |
||
38 | { |
||
39 | var $type = 'simple'; |
||
40 | var $phase = PEAR_TASK_PACKAGEANDINSTALL; |
||
41 | var $_replacements; |
||
42 | |||
43 | /** |
||
44 | * Validate the raw xml at parsing-time. |
||
45 | * @param PEAR_PackageFile_v2 |
||
46 | * @param array raw, parsed xml |
||
47 | * @param PEAR_Config |
||
48 | * @static |
||
49 | */ |
||
50 | function validateXml($pkg, $xml, $config, $fileXml) |
||
51 | { |
||
52 | if (!isset($xml['attribs'])) { |
||
53 | return array(PEAR_TASK_ERROR_NOATTRIBS); |
||
54 | } |
||
55 | if (!isset($xml['attribs']['type'])) { |
||
56 | return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'type'); |
||
57 | } |
||
58 | if (!isset($xml['attribs']['to'])) { |
||
59 | return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'to'); |
||
60 | } |
||
61 | if (!isset($xml['attribs']['from'])) { |
||
62 | return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'from'); |
||
63 | } |
||
64 | if ($xml['attribs']['type'] == 'pear-config') { |
||
65 | if (!in_array($xml['attribs']['to'], $config->getKeys())) { |
||
66 | return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'], |
||
67 | $config->getKeys()); |
||
68 | } |
||
69 | } elseif ($xml['attribs']['type'] == 'php-const') { |
||
70 | if (defined($xml['attribs']['to'])) { |
||
71 | return true; |
||
72 | } else { |
||
73 | return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'], |
||
74 | array('valid PHP constant')); |
||
75 | } |
||
76 | } elseif ($xml['attribs']['type'] == 'package-info') { |
||
77 | if (in_array($xml['attribs']['to'], |
||
78 | array('name', 'summary', 'channel', 'notes', 'extends', 'description', |
||
79 | 'release_notes', 'license', 'release-license', 'license-uri', |
||
80 | 'version', 'api-version', 'state', 'api-state', 'release_date', |
||
81 | 'date', 'time'))) { |
||
82 | return true; |
||
83 | } else { |
||
84 | return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'], |
||
85 | array('name', 'summary', 'channel', 'notes', 'extends', 'description', |
||
86 | 'release_notes', 'license', 'release-license', 'license-uri', |
||
87 | 'version', 'api-version', 'state', 'api-state', 'release_date', |
||
88 | 'date', 'time')); |
||
89 | } |
||
90 | } else { |
||
91 | return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'type', $xml['attribs']['type'], |
||
92 | array('pear-config', 'package-info', 'php-const')); |
||
93 | } |
||
94 | return true; |
||
95 | } |
||
96 | |||
97 | /** |
||
98 | * Initialize a task instance with the parameters |
||
99 | * @param array raw, parsed xml |
||
100 | * @param unused |
||
101 | */ |
||
102 | function init($xml, $attribs) |
||
103 | { |
||
104 | $this->_replacements = isset($xml['attribs']) ? array($xml) : $xml; |
||
105 | } |
||
106 | |||
107 | /** |
||
108 | * Do a package.xml 1.0 replacement, with additional package-info fields available |
||
109 | * |
||
110 | * See validateXml() source for the complete list of allowed fields |
||
111 | * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 |
||
112 | * @param string file contents |
||
113 | * @param string the eventual final file location (informational only) |
||
114 | * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail |
||
115 | * (use $this->throwError), otherwise return the new contents |
||
116 | */ |
||
117 | function startSession($pkg, $contents, $dest) |
||
118 | { |
||
119 | $subst_from = $subst_to = array(); |
||
120 | foreach ($this->_replacements as $a) { |
||
121 | $a = $a['attribs']; |
||
122 | $to = ''; |
||
123 | if ($a['type'] == 'pear-config') { |
||
124 | if ($this->installphase == PEAR_TASK_PACKAGE) { |
||
125 | return false; |
||
126 | } |
||
127 | if ($a['to'] == 'master_server') { |
||
128 | $chan = $this->registry->getChannel($pkg->getChannel()); |
||
129 | if (!PEAR::isError($chan)) { |
||
130 | $to = $chan->getServer(); |
||
131 | } else { |
||
132 | $this->logger->log(0, "$dest: invalid pear-config replacement: $a[to]"); |
||
133 | return false; |
||
134 | } |
||
135 | } else { |
||
136 | if ($this->config->isDefinedLayer('ftp')) { |
||
137 | // try the remote config file first |
||
138 | $to = $this->config->get($a['to'], 'ftp', $pkg->getChannel()); |
||
139 | if (is_null($to)) { |
||
140 | // then default to local |
||
141 | $to = $this->config->get($a['to'], null, $pkg->getChannel()); |
||
142 | } |
||
143 | } else { |
||
144 | $to = $this->config->get($a['to'], null, $pkg->getChannel()); |
||
145 | } |
||
146 | } |
||
147 | if (is_null($to)) { |
||
148 | $this->logger->log(0, "$dest: invalid pear-config replacement: $a[to]"); |
||
149 | return false; |
||
150 | } |
||
151 | } elseif ($a['type'] == 'php-const') { |
||
152 | if ($this->installphase == PEAR_TASK_PACKAGE) { |
||
153 | return false; |
||
154 | } |
||
155 | if (defined($a['to'])) { |
||
156 | $to = constant($a['to']); |
||
157 | } else { |
||
158 | $this->logger->log(0, "$dest: invalid php-const replacement: $a[to]"); |
||
159 | return false; |
||
160 | } |
||
161 | } else { |
||
162 | if ($t = $pkg->packageInfo($a['to'])) { |
||
163 | $to = $t; |
||
164 | } else { |
||
165 | $this->logger->log(0, "$dest: invalid package-info replacement: $a[to]"); |
||
166 | return false; |
||
167 | } |
||
168 | } |
||
169 | if (!is_null($to)) { |
||
170 | $subst_from[] = $a['from']; |
||
171 | $subst_to[] = $to; |
||
172 | } |
||
173 | } |
||
174 | $this->logger->log(3, "doing " . sizeof($subst_from) . |
||
175 | " substitution(s) for $dest"); |
||
176 | if (sizeof($subst_from)) { |
||
177 | $contents = str_replace($subst_from, $subst_to, $contents); |
||
178 | } |
||
179 | return $contents; |
||
180 | } |
||
181 | } |
||
182 | ?> |