98 lines
2.8 KiB
PHP
98 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace MakePhar;
|
|
|
|
class PharBuilder
|
|
{
|
|
|
|
protected $manifest;
|
|
|
|
protected $files = [];
|
|
|
|
protected $phar;
|
|
|
|
public function __construct(Manifest $manifest)
|
|
{
|
|
$this->manifest = $manifest;
|
|
}
|
|
|
|
public function prepare()
|
|
{
|
|
log_debug("Finding files to add...");
|
|
$this->files = $this->manifest->findSourceFiles();
|
|
log_debug("Found %d files", count($this->files));
|
|
}
|
|
|
|
public function build()
|
|
{
|
|
// Create the phar
|
|
$phar = new \Phar("/tmp/output.phar");
|
|
$vo = posix_isatty(STDOUT);
|
|
|
|
// Add files
|
|
log_debug("Adding files to phar archive...");
|
|
$t = count($this->files); $i = 0; $lp = null;
|
|
$phar->startBuffering();
|
|
foreach ($this->files as $file) {
|
|
$i++;
|
|
$tp = dirname($file->src);
|
|
if ($tp!=$lp) {
|
|
$lp=$tp;
|
|
printf("\r\e[K%d/%d %s", $i, $t, $tp);
|
|
}
|
|
if (fnmatch("*.php",$file->src)) {
|
|
$phar->addFromString($file->dest?:$file->src, php_strip_whitespace($file->src));
|
|
} else {
|
|
$phar->addFile($file->dest?:$file->src, $file->src);
|
|
}
|
|
}
|
|
($vo) && printf("\r\e[K");
|
|
$phar->stopBuffering();
|
|
|
|
// Create stub
|
|
if ($this->manifest->getIsLibrary()) {
|
|
log_debug("Creating library stub...");
|
|
// Create library stub
|
|
$stub = '<?php ';
|
|
$stub.= 'require_once __DIR__."/vendor/autoload.php";';
|
|
if (($stubfile = $this->manifest->getStubFile())) {
|
|
$stub.= 'require_once __DIR__."/'.ltrim($stubfile,'/').'";';
|
|
}
|
|
$phar->addFromString("index.php", $stub);
|
|
} else {
|
|
log_debug("Creating application stub...");
|
|
// Write application stub
|
|
$stubfile = $this->manifest->getStubFile();
|
|
$stub = '<?php require_once __DIR__."/'.ltrim($stubfile,'/').'";';
|
|
$phar->addFromString("index.php", $stub);
|
|
// Make the phar stub executable
|
|
$mainstub = $phar->createDefaultStub("index.php");
|
|
$tmp = "/tmp/".uniqid("stub"); file_put_contents($tmp, $mainstub);
|
|
$mainstub = php_strip_whitespace($tmp);
|
|
unlink($tmp);
|
|
$mainstub = "#!/usr/bin/env php\n{$mainstub}";
|
|
$phar->setStub($mainstub);
|
|
}
|
|
|
|
// Close the phar
|
|
$phar = null;
|
|
}
|
|
|
|
public function finalize()
|
|
{
|
|
$output = $this->manifest->getOutput();
|
|
|
|
if (file_exists($output)) {
|
|
unlink($output);
|
|
}
|
|
log_debug("Writing %s", $output);
|
|
rename("/tmp/output.phar", $output);
|
|
|
|
if (!$this->manifest->getIsLibrary()) {
|
|
chmod($output, 0777);
|
|
}
|
|
|
|
}
|
|
|
|
}
|