-
Notifications
You must be signed in to change notification settings - Fork 0
/
PharBuilder.php
102 lines (91 loc) · 3.44 KB
/
PharBuilder.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
/*
* ZenMagick - Another PHP framework.
* Copyright (C) 2006-2011 zenmagick.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
?>
<?php
namespace zenmagick\base\classloader;
use FilesystemIterator;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use zenmagick\base\utils\FolderWhitelistFilterIterator;
/**
* <code>Phar</code> builder for directories controlled by a <em>classloader.ini</em> file.
*
* @author DerManoMann <[email protected]>
*/
class PharBuilder {
private $path;
/**
* Create a new instance.
*
* @param string path Path to a folder that <strong>must</strong> contain a <em>classloader.ini</em> file.
*/
public function __construct($path) {
$this->path = $path;
}
/**
* Get a list of directories to be included.
*
* @return array A list of directory names to be included in the <code>phar</code>.
*/
public function getIncludes() {
// get all directories to include...
$includes = array();
foreach (parse_ini_file($this->path.DIRECTORY_SEPARATOR.'classloader.ini', true) as $type => $mappings) {
foreach ($mappings as $key => $dir) {
$path = realpath($this->path.DIRECTORY_SEPARATOR.$dir);
if ('namespaces' == $type) {
// check for '@'
$token = explode('@', $dir);
$path = realpath($this->path.DIRECTORY_SEPARATOR.$token[0]);
$path = $path.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $key);
}
$path = realpath($path);
if (!empty($path)) {
$includes[$path] = $path;
}
}
}
$includes = array_keys($includes);
// add classloader.ini
$includes[] = realpath($this->path.'/classloader.ini');
return $includes;
}
/**
* Get the name of the <code>phar</code> file.
*
* @return string The full path the the file to be created.
*/
public function getPharPath() {
return $this->path.DIRECTORY_SEPARATOR.basename($this->path).'.phar';
}
/**
* Create the <code>phar</code>.
*/
public function create() {
$iterator = new RecursiveDirectoryIterator($this->path, FilesystemIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS);
// real recursive iterator
$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);
// filter based on the folder list take from the classloader.ini
$iterator = new FolderWhitelistFilterIterator($iterator, $this->getIncludes());
// create phar
$phar = new \Phar($this->getPharPath());
$phar->buildFromIterator($iterator, $this->path);
}
}