mikuli.cz

:)
git clone https://git.sr.ht/~ashymad/mikuli.cz
Log | Files | Refs

commit 9fdeb9972b744f3c9abc8ef98ff44182d33f3f21
parent 2b8adbaab8da3ebf37f8b8f1a1fde57049829871
Author: markseu <mark2011@mayberg.se>
Date:   Sat, 26 Mar 2016 13:27:38 +0100

System update (version handling)

Diffstat:
Msystem/plugins/commandline.php | 94+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Msystem/plugins/core.php | 81++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Msystem/themes/flatsite.css | 2+-
3 files changed, 126 insertions(+), 51 deletions(-)

diff --git a/system/plugins/commandline.php b/system/plugins/commandline.php @@ -5,7 +5,7 @@ // Command line plugin class YellowCommandline { - const Version = "0.6.7"; + const Version = "0.6.8"; var $yellow; //access to API var $files; //number of files var $errors; //number of errors @@ -16,7 +16,8 @@ class YellowCommandline function onLoad($yellow) { $this->yellow = $yellow; - $this->yellow->config->setDefault("commandlineVersionUrl", "https://github.com/datenstrom/yellow-plugins"); + $this->yellow->config->setDefault("commandlinePluginsUrl", "https://github.com/datenstrom/yellow-plugins"); + $this->yellow->config->setDefault("commandlineThemesUrl", "https://github.com/datenstrom/yellow-themes"); } // Handle command @@ -62,10 +63,9 @@ class YellowCommandline $statusCode = 0; $serverSoftware = $this->yellow->toolbox->getServerSoftware(); echo "Yellow ".YellowCore::Version.", PHP ".PHP_VERSION.", $serverSoftware\n"; - $url = $this->yellow->config->get("commandlineVersionUrl"); list($dummy, $command) = $args; - list($statusCode, $versionCurrent) = $this->getPluginVersion(); - list($statusCode, $versionLatest) = $this->getPluginVersion($url); + list($statusCode, $versionCurrent) = $this->getSoftwareVersion(); + list($statusCode, $versionLatest) = $this->getSoftwareVersion(false); foreach($versionCurrent as $key=>$value) { if($versionCurrent[$key] >= $versionLatest[$key]) @@ -76,7 +76,7 @@ class YellowCommandline ++$updates; } } - if($statusCode != 200) echo "ERROR checking updates at $url: $versionLatest[error]\n"; + if($statusCode != 200) echo "ERROR checking updates: $versionLatest[error]\n"; if($updates) echo "Yellow $command: $updates update".($updates==1 ? "":"s")." available at $url\n"; return $statusCode; } @@ -427,58 +427,62 @@ class YellowCommandline return $locations; } - // Return plugin version - function getPluginVersion($url = "") + // Return software version + function getSoftwareVersion($current = true) { $version = array(); - if(empty($url)) + if($current) { $statusCode = 200; - $version["YellowCore"] = YellowCore::Version; - foreach($this->yellow->plugins->plugins as $key=>$value) $version[$value["class"]] = $value[version]; + foreach($this->yellow->plugins->getData() as $key=>$value) $version[$key] = $value; + foreach($this->yellow->themes->getData() as $key=>$value) $version[$key] = $value; } else { - if(extension_loaded("curl")) - { - $pluginVersionUrl = $this->getPluginVersionUrl($url); - $curlHandle = curl_init(); - curl_setopt($curlHandle, CURLOPT_URL, $pluginVersionUrl); - curl_setopt($curlHandle, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; YellowCore/".YellowCore::Version).")"; - curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, 30); - $rawData = curl_exec($curlHandle); - $statusCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE); - curl_close($curlHandle); - if($statusCode == 200) - { - if(defined("DEBUG") && DEBUG>=2) echo "YellowCommandline::getPluginVersion file:$pluginVersionUrl\n"; - foreach($this->yellow->toolbox->getTextLines($rawData) as $line) - { - if(preg_match("/^(\w+)\s*:\s*([0-9\.]+)/", $line, $matches)) - { - $version[$matches[1]] = $matches[2]; - if(defined("DEBUG") && DEBUG>=3) echo "YellowCommandline::getPluginVersion $matches[1]:$matches[2]\n"; - } - } - } - if($statusCode == 0) $statusCode = 444; - $version["error"] = $this->yellow->toolbox->getHttpStatusFormatted($statusCode); - } else { - $statusCode = 500; - $version["error"] = "Plugin 'commandline' requires cURL library!"; - } + list($statusCodePlugins, $versionPlugins) = $this->getSoftwareVersionFromUrl($this->yellow->config->get("commandlinePluginsUrl")); + list($statusCodeThemes, $versionThemes) = $this->getSoftwareVersionFromUrl($this->yellow->config->get("commandlineThemesUrl")); + $statusCode = max($statusCodePlugins, $statusCodeThemes); + $version = array_merge($versionPlugins, $versionThemes); } - uksort($version, strnatcasecmp); return array($statusCode, $version); } - // Return plugin version URL from repository - function getPluginVersionUrl($url) + // Return software version URL from repository + function getSoftwareVersionFromUrl($url) { + $version = array(); + $urlVersion = $url; if(preg_match("#^https://github.com/(.+)$#", $url, $matches)) { - $url = "https://raw.githubusercontent.com/".$matches[1]."/master/version.ini"; + $urlVersion = "https://raw.githubusercontent.com/".$matches[1]."/master/version.ini"; } - return $url; + if(extension_loaded("curl")) + { + $curlHandle = curl_init(); + curl_setopt($curlHandle, CURLOPT_URL, $urlVersion); + curl_setopt($curlHandle, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; YellowCore/".YellowCore::Version).")"; + curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, 30); + $rawData = curl_exec($curlHandle); + $statusCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE); + curl_close($curlHandle); + if($statusCode == 200) + { + if(defined("DEBUG") && DEBUG>=2) echo "YellowCommandline::getSoftwareVersion location:$urlVersion\n"; + foreach($this->yellow->toolbox->getTextLines($rawData) as $line) + { + if(preg_match("/^(\w+)\s*:\s*([0-9\.]+)/", $line, $matches)) + { + $version[$matches[1]] = $matches[2]; + if(defined("DEBUG") && DEBUG>=3) echo "YellowCommandline::getSoftwareVersion $matches[1]:$matches[2]\n"; + } + } + } + if($statusCode == 0) $statusCode = 444; + $version["error"] = "$url - ".$this->yellow->toolbox->getHttpStatusFormatted($statusCode); + } else { + $statusCode = 500; + $version["error"] = "Plugin 'commandline' requires cURL library!"; + } + return array($statusCode, $version); } // Return command help diff --git a/system/plugins/core.php b/system/plugins/core.php @@ -10,6 +10,7 @@ class YellowCore var $pages; //pages from file system var $files; //files from file system var $plugins; //plugins + var $themes; //themes var $config; //configuration var $text; //text strings var $lookup; //location and file lookup @@ -21,6 +22,7 @@ class YellowCore $this->pages = new YellowPages($this); $this->files = new YellowFiles($this); $this->plugins = new YellowPlugins($this); + $this->themes = new YellowThemes($this); $this->config = new YellowConfig($this); $this->text = new YellowText($this); $this->lookup = new YellowLookup($this); @@ -79,6 +81,7 @@ class YellowCore } $this->config->load($this->config->get("configDir").$this->config->get("configFile")); $this->text->load($this->config->get("pluginDir").$this->config->get("textFile")); + $this->themes->load($this->config->get("themeDir")."(.*).css"); date_default_timezone_set($this->config->get("serverTime")); list($pathRoot, $pathHome) = $this->lookup->getContentInformation(); $this->config->set("contentRootDir", $pathRoot); @@ -561,7 +564,11 @@ class YellowPage $output .= "Yellow ".YellowCore::Version.", PHP ".PHP_VERSION.", $serverSoftware<br />\n"; foreach($this->yellow->plugins->getData() as $key=>$value) { - $output .= htmlspecialchars("$key: $value")."<br />\n"; + $output .= htmlspecialchars("$key $value")."<br />\n"; + } + foreach($this->yellow->themes->getData() as $key=>$value) + { + $output .= htmlspecialchars("$key $value")."<br />\n"; } } else { foreach($this->yellow->config->getData($text) as $key=>$value) @@ -603,7 +610,7 @@ class YellowPage { $this->error(500, "Language '".$this->get("language")."' does not exist!"); } - if(!is_file($this->yellow->config->get("themeDir").$this->get("theme").".css")) + if(!$this->yellow->themes->isExisting($this->get("theme"))) { $this->error(500, "Theme '".$this->get("theme")."' does not exist!"); } @@ -1533,14 +1540,14 @@ class YellowFiles class YellowPlugins { var $yellow; //access to API - var $plugins; //registered plugins var $modified; //plugin modification date + var $plugins; //registered plugins function __construct($yellow) { $this->yellow = $yellow; - $this->plugins = array(); $this->modified = 0; + $this->plugins = array(); } // Load plugins @@ -1583,7 +1590,7 @@ class YellowPlugins { $version = array(); $version["YellowCore"] = YellowCore::Version; - foreach($this->plugins as $key=>$value) $version[$value["class"]] = $value[version]; + foreach($this->plugins as $key=>$value) $version[$value["class"]] = $value["version"]; uksort($version, strnatcasecmp); return $version; } @@ -1601,6 +1608,70 @@ class YellowPlugins } } +// Yellow themes +class YellowThemes +{ + var $yellow; //access to API + var $modified; //theme modification date + var $themes; //themes + + function __construct($yellow) + { + $this->yellow = $yellow; + $this->modified = 0; + $this->themes = array(); + } + + // Load themes + function load($fileName) + { + $path = dirname($fileName); + $regex = "/^".basename($fileName)."$/"; + foreach($this->yellow->toolbox->getDirectoryEntries($path, $regex, true, false) as $entry) + { + $name = $this->yellow->lookup->normaliseName(basename($entry), true, true); + $theme = $version = ""; + $this->modified = max($this->modified, filemtime($entry)); + $fileData = $this->yellow->toolbox->readFile($entry, 4096); + foreach($this->yellow->toolbox->getTextLines($fileData) as $line) + { + preg_match("/^\/\*\s*(.*?)\s*:\s*(.*?)\s*\*\/$/", $line, $matches); + if(lcfirst($matches[1])=="theme" && !strempty($matches[2])) $theme = $matches[2]; + if(lcfirst($matches[1])=="version" && !strempty($matches[2])) $version = $matches[2]; + if(!empty($line) && $line[0]!= '/') break; + } + if(!empty($theme) && !empty($version)) + { + $this->themes[$name] = array(); + $this->themes[$name]["theme"] = $theme; + $this->themes[$name]["version"] = $version; + if(defined("DEBUG") && DEBUG>=3) echo "YellowThemes::load $theme:$version<br/>\n"; + } + } + } + + // Return theme version + function getData() + { + $version = array(); + foreach($this->themes as $key=>$value) $version[$value["theme"]] = $value["version"]; + uksort($version, strnatcasecmp); + return $version; + } + + // Return theme modification date, Unix time or HTTP format + function getModified($httpFormat = false) + { + return $httpFormat ? $this->yellow->toolbox->getHttpDateFormatted($this->modified) : $this->modified; + } + + // Check if theme exists + function isExisting($name) + { + return !is_null($this->themes[$name]); + } +} + // Yellow configuration class YellowConfig { diff --git a/system/themes/flatsite.css b/system/themes/flatsite.css @@ -1,4 +1,4 @@ -/* Flatsite theme */ +/* Theme: Flatsite theme */ /* Version: 0.6.5 */ /* Designer: Mark Mayberg */