X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fpharext%2FPackager.php;h=b54d2849092adf724d837fe9174b6340e790053f;hb=e44f0adc7b18845a2cd3dc63fdab5d9bcdc10f76;hp=efd72b657913327f74c9360280f506a1ba8946b2;hpb=f4a6d7917282e5d31a56606ee3064f6a225d776c;p=pharext%2Fpharext diff --git a/src/pharext/Packager.php b/src/pharext/Packager.php index efd72b6..b54d284 100644 --- a/src/pharext/Packager.php +++ b/src/pharext/Packager.php @@ -5,6 +5,7 @@ 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 @@ -44,6 +45,8 @@ class Packager implements Command CliArgs::REQUIRED|CliArgs::SINGLE|CliArgs::REQARG], ["g", "git", "Use `git ls-tree` to determine file list", CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG], + ["b", "branch", "Checkout this tag/branch", + CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::REQARG], ["p", "pecl", "Use PECL package.xml to determine file list, name and release", CliArgs::OPTIONAL|CliArgs::SINGLE|CliArgs::NOARG], ["d", "dest", "Destination directory", @@ -71,11 +74,7 @@ class Packager implements Command */ function __destruct() { foreach ($this->cleanup as $cleanup) { - if (is_dir($cleanup)) { - $this->rm($cleanup); - } elseif (file_exists($cleanup)) { - unlink($cleanup); - } + $cleanup->run(); } } @@ -104,7 +103,7 @@ class Packager implements Command } } catch (\Exception $e) { $this->error("%s\n", $e->getMessage()); - exit(2); + exit(self::EARGS); } try { @@ -112,16 +111,7 @@ class Packager implements Command * so e.g. name and version can be overriden and CliArgs * does not complain about missing arguments */ - if ($this->args["source"]) { - $source = $this->localize($this->args["source"]); - if ($this->args["pecl"]) { - $this->source = new SourceDir\Pecl($this, $source); - } elseif ($this->args["git"]) { - $this->source = new SourceDir\Git($this, $source); - } else { - $this->source = new SourceDir\Pharext($this, $source); - } - } + $this->loadSource(); } catch (\Exception $e) { $errs[] = $e->getMessage(); } @@ -141,7 +131,7 @@ class Packager implements Command if (!$this->args["quiet"]) { $this->help($prog); } - exit(1); + exit(self::EARGS); } $this->createPackage(); @@ -153,23 +143,28 @@ 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->debug(" %3d%% [%s>%s] \r", - floor($bytes_pct*100), - str_repeat("=", round(50*$bytes_pct)), - str_repeat(" ", round(50*(1-$bytes_pct))) - ); + /* 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; + printf("\n"); + } + } }); } - $local = $task->run($this->args->verbose); - $this->debug("\n"); + $local = $task->run($this->verbosity()); - $this->cleanup[] = $local; + $this->cleanup[] = new Task\Cleanup($local); return $local; } @@ -179,12 +174,17 @@ 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->args->verbose); + 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[] = $dest; + $this->cleanup[] = new Task\Cleanup($dest); return $dest; } @@ -194,61 +194,92 @@ 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[] = $source; + $this->cleanup[] = new Task\Cleanup($source); } $source = realpath($source); if (!is_dir($source)) { $source = $this->extract($source); - $this->cleanup[] = $source; + $this->cleanup[] = new Task\Cleanup($source); - if ($this->args->pecl) { - $this->debug("Sanitizing PECL dir ...\n"); - $source = (new Task\PeclFixup($source))->run($this->args->verbose); + if (!$this->args->git) { + $source = (new Task\PeclFixup($source))->run($this->verbosity()); } } return $source; } + /** + * Load the source dir + * @throws \pharext\Exception + */ + private function loadSource(){ + if ($this->args["source"]) { + $source = $this->localize($this->args["source"]); + + if ($this->args["pecl"]) { + $this->source = new SourceDir\Pecl($source); + } elseif ($this->args["git"]) { + $this->source = new SourceDir\Git($source); + } 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) { + throw new Exception("Unknown source dir $source"); + } + + foreach ($this->source->getPackageInfo() as $key => $val) { + $this->args->$key = $val; + } + } + } + /** * Creates the extension phar */ 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*"))), + "license" => $this->source->getLicense(), "stub" => "pharext_installer.php", "type" => $this->args->zend ? "zend_extension" : "extension", ]); - $file = (new Task\PharBuild($this->source, $meta))->run(); + $file = (new Task\PharBuild($this->source, $meta))->run($this->verbosity()); + } catch (\Exception $e) { + $this->error("%s\n", $e->getMessage()); + exit(self::EBUILD); + } + try { if ($this->args->sign) { $this->info("Using private key to sign phar ...\n"); - $pass = (new Task\Askpass)->run($this->args->verbose); + $pass = (new Task\Askpass)->run($this->verbosity()); $sign = new Task\PharSign($file, $this->args->sign, $pass); - $pkey = $sign->run($this->args->verbose); + $pkey = $sign->run($this->verbosity()); } } catch (\Exception $e) { $this->error("%s\n", $e->getMessage()); - exit(4); + exit(self::ESIGN); } if ($this->args->gzip) { try { $gzip = (new Task\PharCompress($file, Phar::GZ))->run(); $move = new Task\PharRename($gzip, $this->args->dest, $this->args->name ."-". $this->args->release); - $name = $move->run($this->args->verbose); + $name = $move->run($this->verbosity()); $this->info("Created gzipped phar %s\n", $name); if ($this->args->sign) { $sign = new Task\PharSign($name, $this->args->sign, $pass); - $sign->run($this->args->verbose)->exportPublicKey($name.".pubkey"); + $sign->run($this->verbosity())->exportPublicKey($name.".pubkey"); } } catch (\Exception $e) { @@ -260,13 +291,13 @@ class Packager implements Command try { $bzip = (new Task\PharCompress($file, Phar::BZ2))->run(); $move = new Task\PharRename($bzip, $this->args->dest, $this->args->name ."-". $this->args->release); - $name = $move->run($this->args->verbose); + $name = $move->run($this->verbosity()); $this->info("Created bzipped phar %s\n", $name); if ($this->args->sign) { $sign = new Task\PharSign($name, $this->args->sign, $pass); - $sign->run($this->args->verbose)->exportPublicKey($name.".pubkey"); + $sign->run($this->verbosity())->exportPublicKey($name.".pubkey"); } } catch (\Exception $e) { @@ -276,7 +307,7 @@ class Packager implements Command try { $move = new Task\PharRename($file, $this->args->dest, $this->args->name ."-". $this->args->release); - $name = $move->run($this->args->verbose); + $name = $move->run($this->verbosity()); $this->info("Created executable phar %s\n", $name); @@ -286,7 +317,7 @@ class Packager implements Command } catch (\Exception $e) { $this->error("%s\n", $e->getMessage()); - exit(4); + exit(self::EBUILD); } } }