root/trunk/midcom/build/packageStatic.php

Revision 14773, 12.6 kB (checked in by rambo, 8 months ago)

scripted whitespace normalization, see r14772

Line 
1 <?php
2
3
4 /**
5  * Created on 10/09/2006
6  * @author tarjei huse
7  * @package midcom.admin.aegir
8  * @copyright The Midgard Project, http://www.midgard-project.org
9  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
10  *
11  */
12 require_once "phing/Task.php";
13 /**
14  * This class
15  */
16 class packageStatic extends Task
17 {
18
19     protected $package = null; // package name
20     /**
21      * The PEAR name of the package.
22      */
23     protected $package_name;
24     protected $channel = "pear.midcom-project.org";
25
26     function __construct()
27     {
28
29     }
30
31     protected $returnProperty; // name of property to set to return value
32
33     /**
34      * The root path to where the module is stored.
35      */
36     private $path = null;
37     /**
38      * The target directory where the packagefile should be saved.
39      */
40     protected $target_dir = null;
41     /**
42      * The setter for the attribute "message"
43      */
44     public function setTarget_dir($str)
45     {
46         $this->target_dir = $str;
47     }
48     public function setPath($str)
49     {
50         $this->path = $str;
51     }
52     public function setPackage($str)
53     {
54         $this->package = $str;
55     }
56     public function setChannel($str)
57     {
58         $this->channel = $str;
59     }
60     /** Sets property name to set with return value of function or expression.*/
61     public function setReturnProperty($r)
62     {
63         $this->returnProperty = $r;
64     }
65
66     protected $copyfiles = array ();
67
68     /**
69      * The init method: Do init steps.
70      */
71     public function init()
72     {
73         // nothing to do here
74     }
75
76     /**
77      * The main entry point method.
78      */
79     public function main()
80     {
81         $this->package_name = str_replace('.', '_', $this->package);
82         $this->package_name = str_replace('-', '_', $this->package);
83         $this->package_name = str_replace('/', '', $this->package_name);
84         
85         echo "Using package name : {$this->package_name} \n";
86         // todo add more validation
87         if ($this->target_dir === null 
88             || !is_dir($this->target_dir
89         ) {
90             throw new Exception("You must set the target attribute to a writable directory (current: {$this->target_dir})!\n");
91         }
92         // read the manifest
93         //$this->readManifest();
94         $packageInfo = $this->getComponentInfo();
95         // build the filelist
96         $filelist = $this->getFileList($packageInfo);
97         // create the xml for package.xml
98         $xml = $this->createXml($packageInfo, $filelist);
99         // save package.xml.
100         file_put_contents($this->path . "/" . $this->package . "/package.xml", $xml);
101         
102         $this->execPearPackage();
103         // I planned to use the tar task to create the package, then this would be needed
104         $name = $this->package_name . "-" . $packageInfo['version'];
105         $this->project->setProperty($this->returnProperty, $name);
106         // should I delete package.xml? Hmm, todo I think.
107
108     }
109
110     protected function execPearPackage()
111     {
112         $curr_dir = getcwd();
113         chdir($this->target_dir);
114         $pear = exec('which pear');
115         if (!is_executable($pear))
116         {
117             die("Pear executable $pear is not executable!");
118         }
119         
120         $ret = exec("$pear package-validate {$this->path}/{$this->package}/package.xml", $out, $status);
121         $out = null;
122         if ($status == 0)
123         {
124             $ret = exec("$pear package {$this->path}/{$this->package}/package.xml", $out, $status);
125             foreach ($out as $line) {
126                 if (stripos($line, 'error')) {
127                     echo $line . "\n";
128                 }
129                 if (stripos($line, 'warning')) {
130                     echo $line . "\n";
131                 }
132                 
133             }
134             
135         }
136         else
137         {
138             chdir($curr_dir);
139             echo implode($out);
140             die ("Packagefile did not validate! Exiting.");
141         }
142         chdir($curr_dir);
143         
144     }
145
146     protected function getFileList($packageInfo)
147     {
148
149         $filelist_config = array (
150             'filelist' => '',
151             'package' => $packageInfo,
152             'component' => $this->package_name,
153             'path' => realpath($this->path . "/" . $this->package),
154             'prefix' => '  ',
155             'baseinstalldir' => "/{$this->package}", //
156             'static' => true,
157             'install-as-prefix' => ''
158             
159             );
160         $filelist = $this->directory_list_contents($filelist_config);
161         return $filelist;
162     }
163
164     /**
165      * Generate the filelist
166      * @param array $config File listing configuration
167      * @return string File XML list
168      */
169     function directory_list_contents($config, $directory_name_override = null)
170     {
171         
172         $directory = dir($config['path']);
173         
174         if ($directory_name_override)
175         {
176             $dir_name = $directory_name_override;
177         } else
178         {
179             $dir_name = basename($config['path']);
180         }
181
182         // Add more to the prefix
183         $config['prefix'] .= '  ';
184         $config['filelist'] .= "{$config['prefix']}<dir name=\"{$dir_name}\">\n";
185         
186
187         // List contents
188         while (false !== ($entry = $directory->read()))
189         {
190             if (substr($entry, 0, 1) == '.')
191             {
192                 // Ignore dotfiles
193                 continue;
194             }
195             if ($entry == 'CVS' || $entry == '.svn')
196             {
197                 // Ignore CVS directories
198                 continue;
199             }
200             if ($entry == 'package.xml')
201             {
202                 // Ignore the package file itself
203                 continue;
204             }
205
206             // Handle packaging file roles
207             elseif ($dir_name == 'config' && $entry == 'mgdschema.xml')
208             {
209                 // MgdSchemas shipped by components are placed in config/mgdschema.xml
210                 $role = 'mgdschema';
211             }
212             elseif ($dir_name == 'config' && $entry == 'mgdschema.sql')
213             {
214                 // SQL files shipped by components are placed in config/mgdschema.xml
215                 // These will be installed via the Datagard database update command
216                 $role = 'midgardsql';
217             } else
218             {
219                 // All files are by default PHP
220                 $role = 'php';
221
222                 // Check for potential other file extensions
223                 $path_parts = pathinfo($entry);
224                 switch ($path_parts['extension'])
225                 {
226                     // binary formats
227                     case 'jpg' :
228                     case 'gif' :
229                     case 'png' :
230                     case 'zip' :
231                     case 'tgz' :
232                         $role = 'data';
233                         break;
234                         // Web formats *not* in static directory
235                     case 'html' :
236                     case 'js' :
237                     case 'htc' :
238                     case 'css' :
239                         $role = 'data';
240                         break;
241                 }
242             }
243             
244             if (is_dir("{$config['path']}/{$entry}"))
245             {
246                 
247                 // List the subdirectory
248                 $subconfig = $config;
249                 $subconfig['path'] = "{$config['path']}/{$entry}";
250                 $subconfig['install-as-prefix'] .= "{$entry}/";
251                 $config['filelist'] = $this->directory_list_contents($subconfig);
252             } else
253             {
254                 // List the files
255                 if ($config['static'])
256                 {
257                     $role = 'web';
258                     $config['filelist'] .= "{$config['prefix']}  <file name=\"{$entry}\" role=\"{$role}\" baseinstalldir=\"{$config['baseinstalldir']}\" " .
259                             "                                            install-as=\"{$config['install-as-prefix']}{$entry}\"  />\n";
260                 } else
261                 {
262                     $config['filelist'] .= "{$config['prefix']}  <file baseinstalldir=\"{$config['baseinstalldir']}\" name=\"{$entry}\" role=\"{$role}\" />\n";
263                 }
264             }
265             //$this->copyfiles[] = $config['path'] . "/" . $entry;
266         }
267
268         $directory->close();
269         $config['filelist'] .= "{$config['prefix']}</dir>\n";
270         return $config['filelist'];
271     }
272
273     public function getComponentInfo()
274     {
275         $component = array ();
276         $component['baseinstalldir'] = "/";
277         
278         // PEAR packages can't have dots in their names
279         $package['name'] = $this->package_name;
280
281         
282         $package['license'] = 'LGPL';
283         
284
285         // Version string is a string
286         $package['version'] = '1.0.0';
287
288         // Release date is today
289         // TODO: Get latest modification date from CHANGES
290         $package['date'] = date('Y-m-d');
291         $package['time'] = date('H:i:s');
292
293         $package['state'] = 'stable';
294
295         // Load the summary
296         $package['summary'] = "Static icons";
297
298         $package['description'] = "MidCOM Icons.";
299
300
301         //     Generate the maintainer list
302         $maintainers = array(
303             'tarjei' => array('role'  => 'lead', 'name' => "Tarjei Huse" , 'active' => 'yes'),
304             'torben' => array('role'  => 'lead', 'name' => "Torben Nehmer" , 'active' => 'no')
305         );
306         $package['maintainers'] = "";
307         foreach ($maintainers as $username => $person)
308         {
309             if (!is_array($person))
310             {
311                 $person = Array ();
312             }
313
314             if (!array_key_exists('name', $person))
315             {
316                 // Maintainer must have a name
317                 continue;
318             }
319
320             if (!array_key_exists('role', $person))
321             {
322                 $person['role'] = 'developer';
323             }
324
325             if (!array_key_exists('active', $person))
326             {
327                 $person['active'] = 'yes';
328             }
329
330             $package['maintainers'] .= "
331                                             <{$person['role']}>
332                                                 <name>{$person['name']}</name>   
333                                                 <user>{$username}</user>
334                                                 <email>{$person['email']}</email>
335                                                 <active>{$person['active']}</active>
336                                             </{$person['role']}>
337                                             ";
338         }
339         
340
341         // Generate dependencies, if any
342         $package['dependencies'] = '';
343                 return $package;
344     }
345     
346     protected function createXml($package, $filelist)
347     {
348
349         // Create package XML
350         return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
351                 <package packagerversion=\"1.4.5\" version=\"2.0\" xmlns=\"http://pear.php.net/dtd/package-2.0\" xmlns:tasks=\"http://pear.php.net/dtd/tasks-1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://pear.php.net/dtd/tasks-1.0
352                 http://pear.php.net/dtd/tasks-1.0.xsd
353                 http://pear.php.net/dtd/package-2.0
354                 http://pear.php.net/dtd/package-2.0.xsd\">
355                     <name>{$package['name']}</name>
356                     <channel>{$this->channel}</channel>
357                     <summary>
358                         {$package['summary']}
359                     </summary>
360                     <description>
361                         {$package['description']}
362                     </description>
363                     {$package['maintainers']}
364                     <date>{$package['date']}</date>
365                     <time>{$package['time']}</time>
366                     <version>
367                         <release>{$package['version']}</release>
368                         <api>{$package['version']}</api>
369                     </version>
370                     <stability>
371                         <release>{$package['state']}</release>
372                         <api>{$package['state']}</api>
373                     </stability>
374                     <license>{$package['license']}</license>
375                     <notes>{$package['version']} {$package['state']}</notes>       
376                     <contents>\n{$filelist}    </contents>       
377                     <dependencies>
378                         <required>
379                             <php>
380                                 <min>4.3.0</min>
381                             </php>
382                             <pearinstaller>
383                                 <min>1.4.0</min>
384                             </pearinstaller>       
385                             {$package['dependencies']}  </required>
386                     </dependencies>
387                     <phprelease />
388                 </package>
389                     ";
390
391     }
392
393 }
394 ?>
Note: See TracBrowser for help on using the browser.