lib/php/libsdk/SDK/Build/Dependency/Manager.php (121 lines of code) (raw):

<?php namespace SDK\Build\Dependency; use SDK\{Config, Cache, Exception, FileOps, Lock}; class Manager { use FileOps; protected $stability; protected $arch; protected $path; protected $cache; protected $series; protected $fetcher; protected $updatesFlag = NULL; public function __construct(string $path, string $stability, string $arch) {/*{{{*/ $this->stability = $stability; $this->arch = $arch; $this->path = $path; $this->cache = new Cache($path); $host = Config::getDepsHost(); $port = Config::getDepsPort(); $scheme = Config::getDepsUriScheme(); $fetcher = new Fetcher($host, $port, $scheme, $this->arch, $this->stability); $series = new Series($this->stability, $this->arch, $this->cache, NULL); $fetcher->setSeries($series); $series->setFetcher($fetcher); $this->fetcher = $fetcher; $this->series = $series; }/*}}}*/ protected function getTmpSeriesPath() : string {/*{{{*/ return Config::getTmpDir() . DIRECTORY_SEPARATOR . $this->series->getname(); }/*}}}*/ public function updatesAvailable() : bool {/*{{{*/ if (NULL !== $this->updatesFlag) { return $this->updatesFlag; } $this->updatesFlag = $this->series->updatesAvailable() || !file_exists(Config::getDepsLocalPath()); return $this->updatesFlag; }/*}}}*/ /* FIXME implement rollback */ public function performUpdate(string &$msg = NULL, bool $force = false, bool $backup = true) : void {/*{{{*/ if (!$force) { if (!$this->updatesAvailable()) { $msg .= "No updates are available"; return; } $lock = new Lock(Config::getDepsLocalPath()); if (!$lock->locked()) { $msg .= "Dependencies was updated by another process."; echo "Another process is updating same dependency path. I'm just going to wait for it to finish and then exit.", PHP_EOL; $lock->exclusive(true); unset($lock); return; } } $series_data = $this->series->getData(); $tmp_dir = $this->md("", true); $tmp_dir_packs = $this->md($tmp_dir . DIRECTORY_SEPARATOR . "packs"); $tmp_dir_deps = $this->md($tmp_dir . DIRECTORY_SEPARATOR . "deps"); foreach ($series_data as $item) { echo "Processing package $item", PHP_EOL; $pkg = new Package($item, $this->series, $this->fetcher); $pkg->retrieve($tmp_dir_packs); $pkg->unpack($tmp_dir_deps); $pkg->cleanup(); unset($pkg); } /* Clear, it is an extra handling. So far it's the only case, doing it this way. And, we have no package definitions ATM to handle it otherwise. */ $extra = $tmp_dir_deps . DIRECTORY_SEPARATOR . "openssl.cnf"; if (file_exists($extra)) { $tdir = $tmp_dir_deps . DIRECTORY_SEPARATOR . "template" . DIRECTORY_SEPARATOR . "ssl"; $this->md($tdir); $this->mv($extra, $tdir . DIRECTORY_SEPARATOR . "openssl.cnf"); } if (file_exists($this->path)) { if ($backup) { $suffix = date("YmdHi"); $new_path = "{$this->path}.$suffix"; /* This is fine, it's gonna be on the same drive. */ if (!$this->mv($this->path, $new_path)) { if (!$force) { unset($lock); } throw new Exception("Unable to rename '{$this->path}' to '$new_path'"); } } else { if (!$this->rm($this->path)) { if (!$force) { unset($lock); } throw new Exception("Unable to remove the current dependency dir at '{$this->path}'"); } } } else { $up = dirname($this->path); if (!file_exists($up)) { if (!$this->md($up)) { if (!$force) { unset($lock); } throw new Exception("Unable to create '{$this->path}'"); } } } $this->mv($tmp_dir_deps, $this->path); $this->rm($tmp_dir_packs); $this->rm($tmp_dir); $this->series->cache(); /* save new series file, move the updated deps and backup the old ones, cleanup.*/ $msg .= "Updates performed successfully. " . PHP_EOL; if ($backup) { if (isset($new_path)) { $msg .= "Old dependencies backed up into '$new_path'."; } } else { $msg .= "No backup was created."; } if (!$force) { unset($lock); } }/*}}}*/ } /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */