X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fpharext%2FPackager.php;h=23bcdc9999c52906cf6edcf0254789503c84500e;hb=2b97fd09b475f30027599e45e793af9610bf2a31;hp=9acb5ebc848a229c62a7d0e7c74eec63bcbf13cc;hpb=8bb44cb1907aff0691bf0b40443ef81d2251c29f;p=pharext%2Fpharext diff --git a/src/pharext/Packager.php b/src/pharext/Packager.php index 9acb5eb..23bcdc9 100644 --- a/src/pharext/Packager.php +++ b/src/pharext/Packager.php @@ -3,16 +3,13 @@ namespace pharext; use Phar; -use pharext\Cli\Args as CliArgs; -use pharext\Cli\Command as CliCommand; -use pharext\Exception; /** * The extension packaging command executed by bin/pharext */ class Packager implements Command { - use CliCommand; + use Cli\Command; /** * Extension source directory @@ -30,40 +27,42 @@ class Packager implements Command * Create the command */ public function __construct() { - $this->args = new CliArgs([ + $this->args = new Cli\Args([ ["h", "help", "Display this help", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG|CliArgs::HALT], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG|Cli\Args::HALT], ["v", "verbose", "More output", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG], ["q", "quiet", "Less output", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG], ["n", "name", "Extension name", - CliArgs::REQUIRED|CliArgs::SINGLE|CliArgs::REQARG], + Cli\Args::REQUIRED|Cli\Args::SINGLE|Cli\Args::REQARG], ["r", "release", "Extension release version", - CliArgs::REQUIRED|CliArgs::SINGLE|CliArgs::REQARG], + Cli\Args::REQUIRED|Cli\Args::SINGLE|Cli\Args::REQARG], ["s", "source", "Extension source directory", - CliArgs::REQUIRED|CliArgs::SINGLE|CliArgs::REQARG], + Cli\Args::REQUIRED|Cli\Args::SINGLE|Cli\Args::REQARG], ["g", "git", "Use `git ls-tree` to determine file list", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG], + ["b", "branch", "Checkout this tag/branch", + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::REQARG], ["p", "pecl", "Use PECL package.xml to determine file list, name and release", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG], ["d", "dest", "Destination directory", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::REQARG, + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::REQARG, "."], ["z", "gzip", "Create additional PHAR compressed with gzip", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG], ["Z", "bzip", "Create additional PHAR compressed with bzip", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG], ["S", "sign", "Sign the PHAR with a private key", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::REQARG], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::REQARG], ["E", "zend", "Mark as Zend Extension", - CliArgs::OPTIONAL|CliARgs::SINGLE|CliArgs::NOARG], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG], [null, "signature", "Show pharext signature", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG|CliArgs::HALT], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG|Cli\Args::HALT], [null, "license", "Show pharext license", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG|CliArgs::HALT], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG|Cli\Args::HALT], [null, "version", "Show pharext version", - CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG|CliArgs::HALT], + Cli\Args::OPTIONAL|Cli\Args::SINGLE|Cli\Args::NOARG|Cli\Args::HALT], ]); } @@ -105,9 +104,9 @@ class Packager implements Command } try { - /* source needs to be evaluated before CliArgs validation, - * so e.g. name and version can be overriden and CliArgs - * does not complain about missing arguments + /* source needs to be evaluated before Cli\Args validation, + * so Cli\Args does not complain about missing arguments, + * which come from SourceDir::getPackageInfo() */ $this->loadSource(); } catch (\Exception $e) { @@ -141,18 +140,23 @@ class Packager implements Command * @return string local source */ private function download($source) { - $this->info("Fetching remote source %s ...\n", $source); - if ($this->args->git) { - $task = new Task\GitClone($source); + $task = new Task\GitClone($source, $this->args->branch); } else { - $task = new Task\StreamFetch($source, function($bytes_pct) { - $this->info(" %3d%% [%s>%s] \r%s", - floor($bytes_pct*100), - str_repeat("=", round(50*$bytes_pct)), - str_repeat(" ", round(50*(1-$bytes_pct))), - $bytes_pct == 1 ? "\n":"" - ); + /* print newline only once */ + $done = false; + $task = new Task\StreamFetch($source, function($bytes_pct) use(&$done) { + if (!$done) { + $this->info(" %3d%% [%s>%s] \r", + floor($bytes_pct*100), + str_repeat("=", round(50*$bytes_pct)), + str_repeat(" ", round(50*(1-$bytes_pct))) + ); + if ($bytes_pct == 1) { + $done = true; + $this->info("\n"); + } + } }); } $local = $task->run($this->verbosity()); @@ -167,10 +171,15 @@ class Packager implements Command * @return string extracted directory */ private function extract($source) { - $this->debug("Extracting %s ...\n", $source); - - $task = new Task\Extract($source); - $dest = $task->run($this->verbosity()); + try { + $task = new Task\Extract($source); + $dest = $task->run($this->verbosity()); + } catch (\Exception $e) { + if (false === strpos($e->getMessage(), "checksum mismatch")) { + throw $e; + } + $dest = (new Task\PaxFixup($source))->run($this->verbosity()); + } $this->cleanup[] = new Task\Cleanup($dest); return $dest; @@ -182,17 +191,22 @@ class Packager implements Command * @return string local source directory */ private function localize($source) { - if (!stream_is_local($source)) { + if (!stream_is_local($source) || ($this->args->git && isset($this->args->branch))) { $source = $this->download($source); $this->cleanup[] = new Task\Cleanup($source); } - $source = realpath($source); - if (!is_dir($source)) { - $source = $this->extract($source); + if (!$real = realpath($source)) { + $error = "Cannot find source '$source'"; + if ($this->args->git) { + $error .= "; did you forget to specify --branch for a remote git source?"; + } + throw new Exception($error); + } + if (!is_dir($real)) { + $source = $this->extract($real); $this->cleanup[] = new Task\Cleanup($source); - if ($this->args->pecl) { - $this->debug("Sanitizing PECL dir ...\n"); + if (!$this->args->git) { $source = (new Task\PeclFixup($source))->run($this->verbosity()); } } @@ -211,8 +225,10 @@ class Packager implements Command $this->source = new SourceDir\Pecl($source); } elseif ($this->args["git"]) { $this->source = new SourceDir\Git($source); - } elseif (is_file("$source/parext_package.php")) { + } elseif (is_file("$source/pharext_package.php")) { $this->source = include "$source/pharext_package.php"; + } else { + $this->source = new SourceDir\Basic($source); } if (!$this->source instanceof SourceDir) { @@ -220,7 +236,10 @@ class Packager implements Command } foreach ($this->source->getPackageInfo() as $key => $val) { - $this->args->$key = $val; + /* do not override command line arguments */ + if (!isset($this->args->$key)) { + $this->args->$key = $val; + } } } } @@ -230,15 +249,13 @@ class Packager implements Command */ private function createPackage() { try { - $meta = array_merge($this->metadata(), [ - "date" => date("Y-m-d"), + $meta = array_merge(Metadata::all(), [ "name" => $this->args->name, "release" => $this->args->release, - "license" => @file_get_contents(current(glob($this->source->getBaseDir()."/LICENSE*"))), - "stub" => "pharext_installer.php", + "license" => $this->source->getLicense(), "type" => $this->args->zend ? "zend_extension" : "extension", ]); - $file = (new Task\PharBuild($this->source, $meta))->run($this->verbosity()); + $file = (new Task\PharBuild($this->source, __DIR__."/../pharext_installer.php", $meta))->run($this->verbosity()); } catch (\Exception $e) { $this->error("%s\n", $e->getMessage()); exit(self::EBUILD);