From a079269166d120bcbcb33d34f4b1c8f60d102e32 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Thu, 20 Dec 2012 02:53:48 -0500
Subject: [PATCH] Fix version comparisons with -stable suffix (#1488876)

---
 CHANGELOG                           |    1 +
 installer/rcube_install.php         |    6 +++---
 bin/installto.sh                    |    2 +-
 program/lib/Roundcube/bootstrap.php |   16 ++++++++++++++++
 tests/Framework/Bootstrap.php       |    8 ++++++++
 bin/update.sh                       |    4 ++--
 6 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index c4e63aa..02e2045 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fix version comparisons with -stable suffix (#1488876)
 - Add unsupported alternative parts to attachments list (#1488870)
 - Add Compose button on message view page (#1488747)
 - Display 'Sender' header in message preview
diff --git a/bin/installto.sh b/bin/installto.sh
index de96bf0..e6cf79d 100755
--- a/bin/installto.sh
+++ b/bin/installto.sh
@@ -35,7 +35,7 @@
 
 $oldversion = $m[1];
 
-if (version_compare($oldversion, RCMAIL_VERSION, '>='))
+if (version_compare(version_parse($oldversion), version_parse(RCMAIL_VERSION), '>='))
   die("Installation at target location is up-to-date!\n");
 
 echo "Upgrading from $oldversion. Do you want to continue? (y/N)\n";
diff --git a/bin/update.sh b/bin/update.sh
index 59aa596..2015aa9 100755
--- a/bin/update.sh
+++ b/bin/update.sh
@@ -34,7 +34,7 @@
     $opts['version'] = $input;
 }
 
-if ($opts['version'] && version_compare($opts['version'], RCMAIL_VERSION, '>'))
+if ($opts['version'] && version_compare(version_parse($opts['version']), version_parse(RCMAIL_VERSION), '>'))
   die("Nothing to be done here. Bye!\n");
 
 
@@ -169,7 +169,7 @@
   }
   
   // index contacts for fulltext searching
-  if (version_compare($opts['version'], '0.6', '<')) {
+  if (version_compare(version_parse($opts['version']), '0.6.0', '<')) {
     system(INSTALL_PATH . 'bin/indexcontacts.sh');
   }
   
diff --git a/installer/rcube_install.php b/installer/rcube_install.php
index dfd6356..530be3e 100644
--- a/installer/rcube_install.php
+++ b/installer/rcube_install.php
@@ -633,8 +633,8 @@
    */
   function update_db($DB, $version)
   {
-    $version = strtolower($version);
-    $engine = isset($this->db_map[$DB->db_provider]) ? $this->db_map[$DB->db_provider] : $DB->db_provider;
+    $version = version_parse(strtolower($version));
+    $engine  = isset($this->db_map[$DB->db_provider]) ? $this->db_map[$DB->db_provider] : $DB->db_provider;
 
     // read schema file from /SQL/*
     $fname = INSTALL_PATH . "SQL/$engine.update.sql";
@@ -643,7 +643,7 @@
       foreach ($lines as $line) {
         $is_comment = preg_match('/^--/', $line);
         if (!$from && $is_comment && preg_match('/from version\s([0-9.]+[a-z-]*)/', $line, $m)) {
-          $v = strtolower($m[1]);
+          $v = version_parse(strtolower($m[1]));
           if ($v == $version || version_compare($version, $v, '<='))
             $from = true;
         }
diff --git a/program/lib/Roundcube/bootstrap.php b/program/lib/Roundcube/bootstrap.php
index 18c07dd..530a7f8 100644
--- a/program/lib/Roundcube/bootstrap.php
+++ b/program/lib/Roundcube/bootstrap.php
@@ -358,6 +358,22 @@
 
 
 /**
+ * Fix version number so it can be used correctly in version_compare()
+ *
+ * @param string $version Version number string
+ *
+ * @param return Version number string
+ */
+function version_parse($version)
+{
+    return str_replace(
+        array('-stable', '-git'),
+        array('.0', '.99'),
+        $version);
+}
+
+
+/**
  * mbstring replacement functions
  */
 if (!extension_loaded('mbstring'))
diff --git a/tests/Framework/Bootstrap.php b/tests/Framework/Bootstrap.php
index d18fd37..904be7e 100644
--- a/tests/Framework/Bootstrap.php
+++ b/tests/Framework/Bootstrap.php
@@ -207,4 +207,12 @@
         $this->assertFalse($result, "Invalid ASCII (UTF-8 character [2])");
     }
 
+    /**
+     * bootstrap.php: version_parse()
+     */
+    function test_version_parse()
+    {
+        $this->assertEquals('0.9.0', version_parse('0.9-stable'));
+        $this->assertEquals('0.9.99', version_parse('0.9-git'));
+    }
 }

--
Gitblit v1.9.1