1
0

v8 - 2011.06.23

Fixed: Bugs relating to the new Community Contributed Modules section & GCC stored modules
Added: Modules information for the new Gallery 3.0.2 Modules tab
Added: SPEED! The module checking process is now 60% faster than before thanks to logic updates in the data gathering process. The decrease in update checking time will be more noticeable as more modules are added.
This commit is contained in:
brentil 2011-06-24 18:00:58 -04:00
parent 74bca55d52
commit daac27904d
5 changed files with 377 additions and 92 deletions

View File

@ -1,6 +1,6 @@
<?php defined("SYSPATH") or die("No direct script access.");/**
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2010 Bharat Mediratta
* Copyright (C) 2000-2011 Bharat Mediratta
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,7 +16,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class Admin_Moduleupdates_Controller extends Admin_Controller {
/**
@ -39,36 +38,212 @@ class Admin_Moduleupdates_Controller extends Admin_Controller {
* @author brentil <forums@inner-ninja.com>
*/
public function index() {
//Start execution timer
$bgtime=time();
$view = new Admin_View("admin.html");
$view->page_title = t("Gallery 3 :: Manage Module Updates");
$view->content = new View("admin_moduleupdates.html");
$view->content->mu_version = module::get_version("moduleupdates");
$all_modules = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$refreshCache = false;
$cache = unserialize(Cache::instance()->get("moduleupdates_cache"));
$cache_updates = unserialize(Cache::instance()->get("moduleupdates_cache_updates"));
//if someone pressed the button to refresh now
if (request::method() == "post") {
access::verify_csrf();
$cache = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$cache_updates = array("date" => "", "updates" => 0);
$refreshCache = true;
}else if(count($cache) < 1 or $cache_updates['date'] == ""){
//if there are no items in the cache array or the update date is "" refresh the data
$cache = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$cache_updates = array("date" => "", "updates" => 0);
$refreshCache = true;
}
//Check the ability to access the Gallery3 GitHub
$GitHub = null;
try {
$GitHub = fopen ("http://github.com", "r");
if ($GitHub != null) {
$GitHub = '<font color=green>Online</font>';
}else{
$GitHub = '<font color=red>Offline</font>';
}
}
catch (Exception $e) {
}
//Check the ability to access the Google
$Google = null;
try {
$Google = fopen ("http://google.com", "r");
if ($Google != null) {
$Google = '<font color=green>Online</font>';
}else{
$Google = '<font color=red>Offline</font>';
}
}
catch (Exception $e) {
}
foreach (module::available() as $this_module_name => $module_info) {
list ($remote_version, $remote_server) = $this->get_remote_module_version($this_module_name);
$font_color = "black";
if ($remote_version == "DNE") {
$font_color = "blue";
} else if ($remote_version < $module_info->code_version) {
$font_color = "green";
} else if ($remote_version > $module_info->code_version) {
$font_color = "red";
}
$all_modules->$this_module_name = array ("name" => $module_info->name, "locked" => $module_info->locked,
"code_version" => $module_info->code_version, "active" => $module_info->active,
"version" => $module_info->version,"description" => $module_info->description,
"remote_version" => $remote_version, "remote_server" => $remote_server, "font_color" => $font_color);
$update_count = 0;
if($refreshCache == true){
foreach (module::available() as $this_module_name => $module_info) {
$font_color_local = "black";
$core_version = '';
$core_server = '';
$core_dlink = '';
$font_color_core = "black";
$contrib_version = '';
$contrib_server = '';
$contrib_dlink = '';
$font_color_contrib = "black";
$gh_version = '';
$gh_server = '';
$gh_dlink = '';
$font_color_gh = "black";
$font_color_local = $this->get_local_module_version_color ($module_info->version, $module_info->code_version);
list ($core_version, $core_server) = $this->get_remote_module_version($this_module_name, "CORE");
$font_color_core = $this->get_module_version_color ($module_info->version, $module_info->code_version, $core_version);
if(!is_numeric($core_version)) {
list ($contrib_version, $contrib_server) = $this->get_remote_module_version($this_module_name, "CONTRIB");
$font_color_contrib = $this->get_module_version_color ($module_info->version, $module_info->code_version, $contrib_version);
list ($gh_version, $gh_server) = $this->get_remote_module_version($this_module_name, "GH");
$font_color_gh = $this->get_module_version_color ($module_info->version, $module_info->code_version, $gh_version);
}
if($font_color_core == "red" or $font_color_contrib == "red" or $font_color_gh == "red"){
$update_count++;
}
$module_info->name = "<a href=\"http://codex.gallery2.org/Gallery3:Modules:".$this_module_name."\" target=\"_new\">".$module_info->name."</a>";
if (is_numeric($core_version)) {
if($core_version > $module_info->version) {
$core_dlink = "http://github.com/gallery/gallery3/tree/master/modules/".$this_module_name;
}
}
if (is_numeric($contrib_version)) {
if($contrib_version > $module_info->version) {
$contrib_dlink = "http://github.com/gallery/gallery3-contrib/tree/master/".
substr_replace(gallery::VERSION,"",strpos(gallery::VERSION," ")) ."/modules/".$this_module_name;
}
}
if (is_numeric($gh_version)) {
if($gh_version > $module_info->version) {
$this_gm_repo = str_replace(".","",substr_replace(gallery::VERSION,"",strpos(gallery::VERSION," ")));
if($this_gm_repo == "30"){
$gh_dlink = "http://www.gallerymodules.com/update/".$this_module_name;
} else {
$gh_dlink = "http://www.gallerymodules.com/update".$this_gm_repo."/".$this_module_name;
}
}
}
//populate the list fo modules and their data
$cache->$this_module_name = array ("name" => $module_info->name, "locked" => $module_info->locked,
"code_version" => $module_info->code_version, "active" => $module_info->active,
"version" => $module_info->version,"description" => $module_info->description,
"core_version" => $core_version, "core_server" => $core_server, "font_color_core" => $font_color_core,
"contrib_version" => $contrib_version, "contrib_server" => $contrib_server, "font_color_contrib" => $font_color_contrib,
"gh_version" => $gh_version, "gh_server" => $gh_server, "font_color_gh" => $font_color_gh,
"font_color_local" => $font_color_local, "core_dlink" => $core_dlink, "contrib_dlink" => $contrib_dlink,
"gh_dlink" => $gh_dlink);
}
//Define right now as YYYY.MM.DD HH:MM with the # of updates that are out of date
$cache_updates = array("date" => date("Y.m.d - H:i"), "updates" => $update_count);
//Write out the new data to cache with a 30 day expiration & 0 for update data so it's always present
Cache::instance()->set("moduleupdates_cache", serialize($cache), array("ModuleUpdates"), 30*86400);
Cache::instance()->set("moduleupdates_cache_updates", serialize($cache_updates), array("ModuleUpdates"), null);
log::success("moduleupdates", t("Completed checking remote GitHub for modules updates."));
}
$view->content->vars = $cache;
$view->content->update_time = $cache_updates['date'];
$view->content->csrf = access::csrf_token();
$view->content->Google = $Google;
$view->content->GitHub = $GitHub;
$view->content->Gallery_Version = substr_replace(gallery::VERSION,"",strpos(gallery::VERSION," "));
$view->content->vars = $all_modules;
//End execution timer
$ExecutionTime = (time()-$bgtime);
if ($ExecutionTime < 1) {
$ExecutionTime = '<font color=green>1</font>';
}else if ($ExecutionTime <= 30){
$ExecutionTime = '<font color=green>' . $ExecutionTime . '</font>';
}else if ($ExecutionTime <= 60){
$ExecutionTime = '<font color=orange>' . $ExecutionTime . '</font>';
}else{
$ExecutionTime = '<font color=red>' . $ExecutionTime . '</font>';
}
$view->content->ExecutionTime = $ExecutionTime;
print $view;
}
/**
*
**/
private function get_module_version_color ($version, $code_version, $remote_version) {
$font_color = "black";
//BLACK - no module version detected
if ($remote_version == "") {
$font_color = "black";
//BLUE - DNE: Does Not Exist, this module was not found
} else if ($remote_version == "DNE") {
$font_color = "blue";
//GREEN - Your version is newer than the GitHub
} else if ($remote_version < $code_version or ($version != ''
and $remote_version < $version)) {
$font_color = "green";
//RED - Your version is older than the GitHub
} else if ($remote_version > $code_version or ($version != ''
and $remote_version > $version)) {
$font_color = "red";
}
return $font_color;
}
/**
*
**/
private function get_local_module_version_color ($version, $code_version) {
$font_color = "black";
//PINK - Your installed version is newer than file version
if ($version != '' and $code_version < $version) {
$font_color = "pink";
//ORANGE - Your file version is newer than the installed version
} else if ($version != '' and $code_version > $version) {
$font_color = "orange";
}
return $font_color;
}
/**
* Parses the known GitHub repositories for new versions of modules.
*
@ -78,48 +253,102 @@ class Admin_Moduleupdates_Controller extends Admin_Controller {
*
* http://github.com/gallery/gallery3
* http://github.com/gallery/gallery3-contrib
* http://www.gallerymodules.com
*
* @author brentil <forums@inner-ninja.com>
* @param String The folder name of the module to search for on the remote GitHub server
* @return Array An array with the remote module version and the server it was found on.
* @param String - The folder name of the module to search for on the remote GitHub server
* @param String - The remote server to check against
* @return Array - An array with the remote module version and the server it was found on.
*/
private function get_remote_module_version ($module_name) {
private function get_remote_module_version ($module_name, $server_location) {
$version = 'DNE';
$version = '';
$server = '';
$file = null;
try {
$file = fopen ("http://github.com/gallery/gallery3/raw/master/modules/".$module_name."/module.info", "r");
$server = '(G3)';
}
catch (Exception $e) {
//echo 'Message: ' .$e->getMessage() . '<br>';
}
if ($file == null) {
try {
$file = fopen ("http://github.com/gallery/gallery3-contrib/raw/master/modules/".$module_name."/module.info", "r");
$server = '(G3CC)';
}
catch (Exception $e) {
//echo 'Message: ' .$e->getMessage() . '<br>';
}
}
if ($file != null) {
switch ($server_location) {
case "CONTRIB":
//Check the Gallery3 Community Contributions GitHub
if ($file == null) {
try {
$thisInstalledVersion = gallery::VERSION;
//Gallery versions prior to 3.0.2 contained the codename in the version string
if (substr_count($thisInstalledVersion, ' ') > 0 ){
$thisInstalledVersion = substr_replace($thisInstalledVersion,"",strpos($thisInstalledVersion," "));
}
//Truncate the minor version number
if (substr_count($thisInstalledVersion, '.') > 1 ){
$thisInstalledVersion = substr_replace($thisInstalledVersion,"",strripos($thisInstalledVersion,"."));
}
$file = fopen ("http://github.com/gallery/gallery3-contrib/raw/master/".
$thisInstalledVersion ."/modules/".$module_name."/module.info", "r");
if ($file != null) {
$server = '(GCC)';
}
}
catch (Exception $e) {
//echo 'Message: ' .$e->getMessage() . '<br>';
}
}
break;
case "CORE":
//Check the main Gallery3 GitHub
if ($file == null) {
try {
$file = fopen ("http://github.com/gallery/gallery3/raw/master/modules/".$module_name."/module.info", "r");
if ($file != null) {
$server = '(G)';
}
}
catch (Exception $e) {
}
}
break;
case "GH":
//Check GalleryModules.com
if ($file == null) {
try {
$this_gm_repo = str_replace(".","",substr_replace(gallery::VERSION,"",strpos(gallery::VERSION," ")));
if($this_gm_repo == "30"){
$file = fopen ("http://www.gallerymodules.com/m/".$module_name, "r");
} else {
$file = fopen ("http://www.gallerymodules.com/".$this_gm_repo."m/".$module_name, "r");
}
if ($file != null) {
$server = '(GH)';
}
}
catch (Exception $e) {
}
}
break;
}
if ($file != null) {
while (!feof ($file)) {
$line = fgets ($file, 1024);
//Regular expression to find & gather the version number in the remote module.info file
if (preg_match ("@version = (.*)@i", $line, $out)) {
$version = $out[1];
break;
}
if ($server_location == "GH"){
//GH stores only the version info
if($line == "Not entered" or $line == "See git") {
$line = "";
}
if (substr_count($line, '.') > 0) {
$line = str_replace('.','',$line);
}
$version = $line;
break;
} else {
//Regular expression to find & gather the version number in the remote module.info file
if (preg_match ("@version = (.*)@i", $line, $out)) {
$version = $out[1];
break;
}
}
}
fclose ($file);
}
return array ($version, $server);
}
}
return array ($version, $server);
}
}

View File

@ -1,6 +1,6 @@
<?php defined("SYSPATH") or die("No direct script access.");/**
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2010 Bharat Mediratta
* Copyright (C) 2000-2011 Bharat Mediratta
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View File

@ -1,6 +1,6 @@
<?php defined("SYSPATH") or die("No direct script access.");/**
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2010 Bharat Mediratta
* Copyright (C) 2000-2011 Bharat Mediratta
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -17,21 +17,35 @@
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class moduleupdates_installer {
static function install() {
$version = module::get_version("moduleupdates");
if ($version == 0) {
module::set_version("moduleupdates", 1);
if ($version < 1) {
module::set_version("moduleupdates", 8);
//Remove the ModuleUpdates cache entry 'JIC'
Cache::instance()->delete("ModuleUpdates");
//create the blank ModuleUpdates cache entry with an expiration of 0 days
Cache::instance()->set("moduleupdates_cache", "", array("ModuleUpdates"), null);
Cache::instance()->set("moduleupdates_cache_updates", "", array("ModuleUpdates"), null);
}
}
static function upgrade($version) {
module::set_version("moduleupdates", 8);
//Remove the ModuleUpdates cache entry 'JIC'
Cache::instance()->delete("ModuleUpdates");
//Empty the ModuleUpdates cache entry so our new version starts from scratch
Cache::instance()->set("moduleupdates_cache", "", array("ModuleUpdates"), null);
Cache::instance()->set("moduleupdates_cache_updates", "", array("ModuleUpdates"), null);
}
static function uninstall() {
//Remove the ModuleUpdates cache entry as we remove the module
Cache::instance()->delete("ModuleUpdates");
module::delete("moduleupdates");
}
}
}

View File

@ -1,3 +1,7 @@
name = "Module Updates"
name = "ModuleUpdates"
description = "Compares your installed module version against the ones stored in the GitHub."
version = 1
version = 8
author_name = "brentil"
author_url = "http://gallery.menalto.com/user/153736"
info_url = "http://codex.gallery2.org/Gallery3:Modules:moduleupdates"
discuss_url = "http://gallery.menalto.com/node/96574"

View File

@ -1,36 +1,74 @@
<?php defined("SYSPATH") or die("No direct script access.") ?>
<div id="g-admin-moduleupdates" class="g-block">
<h1> <?= t("Module Updates") ?> </h1>
<p>
<?= t("Compares your installed module version against the ones stored in the GitHub.<br><br>") ?>
<?= t("<font color=red>Red = Out of Date</font><br>") ?>
<?= t("<font color=green>Green = Your version is newer</font><br>") ?>
<?= t("<font color=blue>Blue = Does Not Exist/No information available</font><br>") ?>
</p>
<ul id="g-action-status" class="g-message-block">
<li class="g-warning"><?= t("Versions are compared from the official Gallery3 (G3) and official Gallery3 Community Contributions (G3CC). Versions downloaded from the forums will not be shown.") ?></li>
</ul>
<h1> <?= t("ModuleUpdates v".$mu_version) ?> </h1>
<?= t("Compares your installed module version against the ones stored in the GitHub and GalleryModules.") ?>
<div class="g-block-content">
<table>
<tr>
<th> <?= t("Module") ?> </th>
<th> <?= t("Your Version") ?> </th>
<th> <?= t("Remote Version") ?> </th>
<th> <?= t("Description") ?> </th>
</tr>
<? foreach ($vars as $module_name): ?>
<tr class="<?= text::alternate("g-odd", "g-even") ?>">
<td> <? echo "<font color=".$module_name['font_color'].">"; ?> <?= $module_name['name'] ?> </font> </td>
<td> <? echo "<font color=".$module_name['font_color'].">"; ?> <?= $module_name['code_version'] ?> </font> </td>
<td> <? echo "<font color=".$module_name['font_color'].">"; ?> <?= $module_name['remote_version'] ?> <?= $module_name['remote_server'] ?> </font> </td>
<td> <? echo "<font color=".$module_name['font_color'].">"; ?> <?= $module_name['description'] ?> </font> </td>
</tr>
<? endforeach ?>
</table>
<form method="post" action="<?= url::site("admin/moduleupdates") ?>" id="g-configure-moduleupdates-form">
<input type="hidden" name="csrf" value="<? echo $csrf; ?>" />
<fieldset>
<legend>ModuleUpdates Information</legend>
<ul>
<li><?= t("<font color=red>Red = Your version is older than the GitHub</font><br>") ?></li>
<li><?= t("<font color=green>Green = Your version is newer than the GitHub</font><br>") ?></li>
<li><?= t("<font color=orange>Orange = Your file version is newer than the installed version</font><br>") ?></li>
<li><?= t("<font color=pink>Pink = Your installed version is newer than file version</font><br>") ?></li>
<li><?= t("Outbound Status: " . $Google . " - GitHub Status: " . $GitHub . " - Execution Time: " . $ExecutionTime . " s <br>") ?></li>
<li><input type="submit" value="<?= t("Check Modules for Updates")?>" class="submit" /> <? if($update_time == ""){ echo "&nbsp;- Last Scan: Unknown";}else{ echo "&nbsp;- Last Scan: ".$update_time;} ?></li>
</ul>
</fieldset>
</form>
<br>
<ul id="g-action-status" class="g-message-block">
<li class="g-warning"><?= t("Versions are compared from GitHub for Gallery Core (GC), Gallery Community Contributions (GCC), and GalleryModules.com (GM). Versions downloaded from the forums will not be shown.") ?></li>
</ul>
<fieldset>
<legend>Core Modules</legend>
<table>
<tr>
<th> <?= t("Module") ?> </th>
<th><center> <?= t("Local /<br>Installed") ?> </center></th>
<th width=50><center> <?= t("GC") ?> </center></th>
<th> <?= t("Description") ?> </th>
</tr>
<? foreach ($vars as $module_name): ?>
<? if(is_numeric($module_name['core_version'])) { ?>
<tr class="<?= text::alternate("g-odd", "g-even") ?>">
<td> <?= t($module_name['name']) ?> </td>
<td align=center> <? echo "<font color=".$module_name['font_color_local'].">"; ?> <? if($module_name['font_color_local'] != "black"){ echo "<b><u>*"; } ?> <? if (is_numeric($module_name['code_version'])) echo $module_name['code_version']; ?><? if (is_numeric($module_name['version'])) echo " / ".$module_name['version']; ?> <? if($module_name['font_color_local'] != "black"){ echo "*</b></u>"; } ?> </td>
<td align=center> <? echo "<font color=".$module_name['font_color_core'].">"; ?> <? if($module_name['font_color_core'] != "black" and $module_name['font_color_core'] != "" ){ echo "<b><u>*"; } ?> <? if(is_numeric($module_name['core_version'])) if($module_name['core_version'] > $module_name['code_version']) { echo "<a href=\"".$module_name['core_dlink']."\" target=\"_blank\">".$module_name['core_version']."</a>";} else { echo $module_name['core_version']; } ?> <? if($module_name['font_color_core'] != "black"){ echo "*</b></u>"; } ?> </font> </td>
<td> <?= t($module_name['description']) ?> </td>
</tr>
<? } ?>
<? endforeach ?>
</table>
</fieldset>
<fieldset>
<legend>Community Contributed Modules</legend>
<table>
<tr>
<th> <?= t("Module") ?> </th>
<th><center> <?= t("Local /<br>Installed") ?> </center></th>
<th width=50><center> <?= t("GCC") ?> </center></th>
<th width=85><center> <?= t("GM") ?> </center></th>
<th> <?= t("Description") ?> </th>
</tr>
<? foreach ($vars as $module_name): ?>
<? if(is_numeric($module_name['contrib_version']) or is_numeric($module_name['gh_version'])) { ?>
<tr class="<?= text::alternate("g-odd", "g-even") ?>">
<td> <?= t($module_name['name']) ?> </td>
<td align=center> <? echo "<font color=".$module_name['font_color_local'].">"; ?> <? if($module_name['font_color_local'] != "black"){ echo "<b><u>*"; } ?> <? if (is_numeric($module_name['code_version'])) echo $module_name['code_version']; ?><? if (is_numeric($module_name['version'])) echo " / ".$module_name['version']; ?> <? if($module_name['font_color_local'] != "black"){ echo "*</b></u>"; } ?> </td>
<td align=center> <? echo "<font color=".$module_name['font_color_contrib'].">"; ?> <? if($module_name['font_color_contrib'] != "black" and $module_name['font_color_contrib'] != "" ){ echo "<b><u>*"; } ?> <? if(is_numeric($module_name['contrib_version'])) if($module_name['contrib_version'] > $module_name['version'] or $module_name['core_version'] > $module_name['code_version']) { echo "<a href=\"".$module_name['contrib_dlink']."\" target=\"_blank\">".$module_name['contrib_version']."</a>";} else { echo $module_name['contrib_version']; } ?> <? if($module_name['font_color_contrib'] != "black"){ echo "*</b></u>"; } ?> </font> </td>
<td align=center> <? echo "<font color=".$module_name['font_color_gh'].">"; ?> <? if($module_name['font_color_gh'] != "black" and $module_name['font_color_gh'] != "" ){ echo "<b><u>*"; } ?> <? if(is_numeric($module_name['gh_version'])) if($module_name['gh_version'] > $module_name['version'] or $module_name['core_version'] > $module_name['code_version']) { echo "<a href=\"".$module_name['gh_dlink']."\" target=\"_blank\">".$module_name['gh_version']."</a>";} else { echo $module_name['gh_version']; } ?> <? if($module_name['font_color_gh'] != "black"){ echo "*</b></u>"; } ?> </font> </td>
<td> <?= t($module_name['description']) ?> </td>
</tr>
<? } ?>
<? endforeach ?>
</table>
</fieldset>
</div>
</div>
<pre>
</pre>
</div>