Version matrix

Signed-off-by: Eike Stepper <stepper@esc-net.de>
diff --git a/.cvsignore b/.cvsignore
deleted file mode 100644
index 98d8a5a..0000000
--- a/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-logs
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..333c1e9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+logs/
diff --git a/downloads/.gitignore b/downloads/.gitignore
new file mode 100644
index 0000000..df92cc8
--- /dev/null
+++ b/downloads/.gitignore
@@ -0,0 +1 @@
+drops/
diff --git a/downloads/versions.php b/downloads/versions.php
index a491842..71b8347 100644
--- a/downloads/versions.php
+++ b/downloads/versions.php
@@ -3,28 +3,199 @@
 
 header( 'Cache-control: no cache' );
 
-$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="' . $pageFolderPath . '/styles.css" media="screen"/>' . "\n\t");
+$local = true;
+if ($local)
+{
+  $drops = "C:/develop/git/cdo.www/downloads/drops";
+  $archive = null;
+}
+else
+{
+  $drops = "/home/data/httpd/download.eclipse.org/modeling/emf/cdo/drops";
+  $archive = "/home/data/httpd/archive.eclipse.org/modeling/emf/cdo/drops";
+  
+  $App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="' . $pageFolderPath . '/styles.css" media="screen"/>' . "\n\t");
+}
 
 $pageAuthor   = "Eike Stepper";
 
 print '<div id="midcolumn">' . "\n";
 print '<h1>Versions</h1>';
 
-if ($handle = opendir("/home/data/httpd/download.eclipse.org/modeling/emf/cdo/drops"))
+$releases = [];
+$bundles = [];
+
+if ($handle = opendir($drops))
 {
-  while (false !== ($entry = readdir($handle)))
+  while (false !== ($drop = readdir($handle)))
   {
-    if (str_starts_with($entry, "R"))
+    if (startsWith($drop, "R"))
     {
-      echo "$entry\n";
+      $folder = $drops;
+      
+      $webPropertiesFile = "$folder/$drop/web.properties";
+      if (!file_exists($webPropertiesFile))
+      {
+        if ($archive == null)
+        {
+          continue;
+        }
+        
+        $folder = $archive;
+        
+        $webPropertiesFile = "$folder/$drop/web.properties";
+        if (!file_exists($webPropertiesFile))
+        {
+          continue;
+        }
+      }
+      
+      {
+        $webProperties = parse_ini_file($webPropertiesFile);
+        $release = $webProperties['web.label'];
+              
+        $buildInfoXml = simplexml_load_file("$folder/$drop/build-info.xml");
+        $train = (string) $buildInfoXml['train'];
+        $eclipse = (string) $buildInfoXml['eclipse'];
+        $emf = (string) $buildInfoXml['emf'];
+        $commit = (string) $buildInfoXml['revision'];
+        $versions = [];
+        
+        $indexXml = simplexml_load_file("$folder/$drop/index.xml");
+        foreach ($indexXml->element as $element)
+        {
+          if ($element['type'] == "osgi.bundle")
+          {
+            $bundle = $element['name'];
+            if (startsWith($bundle, "org.eclipse.") &&
+                !endsWith($bundle, ".source") &&
+                !contains($bundle, ".examples") &&
+                !contains($bundle, ".buddies") &&
+                !contains($bundle, ".jms") &&
+                !contains($bundle, ".tests"))
+            {
+              $version = (string) $element['version'];
+              $versions += ["$bundle" => $version];
+            }
+          }
+        }
+        
+        $releases += ["$release" => array(
+          "drop" => $drop,
+          "commit" => $commit,
+          "train" => $train,
+          "eclipse" => $eclipse,
+          "emf" => $emf,
+          "versions" => $versions)];
+          
+        $bundles = array_merge($bundles, $versions);
+      }
     }
   }
 
   closedir($handle);
 }
 
+$releases = array_reverse($releases);
+
+$bundles = array_keys($bundles);
+natsort($bundles);
+$bundles = array_values($bundles);
+
+
+print "<table border='1'>\n";
+print "  <tr>\n";
+print "    <th>&nbsp;</th>\n";
+
+foreach ($releases as $release => $info)
+{
+  $drop = $info["drop"];
+  print "    <th><h3><a href=\"http://download.eclipse.org/modeling/emf/cdo/drops/$drop\">CDO $release</a></h3></th>\n";
+}
+
+print "  </tr>\n";
+
+headLine($releases, "Drop", "drop");
+headLine($releases, "Commit", "commit");
+headLine($releases, "Simrel", "train");
+headLine($releases, "Eclipse", "eclipse");
+headLine($releases, "EMF", "emf");
+
+foreach ($bundles as $bundle)
+{
+  print "  <tr>\n";
+  print "    <td>$bundle</td>\n";
+
+  foreach ($releases as $release => $info)
+  {
+    $versions = $info["versions"];
+    if (isset($versions[$bundle]))
+    {
+      $version = $versions[$bundle];
+      $file = $bundle . "_" . $version . ".jar";
+      print "    <td align='center'><a href=\"http://download.eclipse.org/modeling/emf/cdo/drops/$drop/plugins/$file\" title=\"CDO $release &rarr; $file\">" . simpleVersion($version) . "</a></td>\n";
+    }
+    else
+    {
+      print "    <td>&nbsp;</td>\n";
+    }
+  }
+  
+  print "  </tr>\n";
+}
+
+print "</table>\n";
 print '</div>';
 
 
+function headLine($releases, $label, $field)
+{
+  print "  <tr>\n";
+  print "    <th>$label</th>\n";
+  
+  foreach ($releases as $release => $info)
+  {
+    $value = $info[$field];
+    
+    if ($field === "commit")
+    {
+     $value = substr($value, 0, 7);
+    }
+    
+    print "    <th>$value</th>\n";
+  }
+  
+  print "  </tr>\n";
+}
+
+function simpleVersion($version)
+{
+  $segments = explode(".", $version);
+  return "$segments[0].$segments[1].$segments[2]";
+}
+
+function contains($haystack, $needle)
+{
+  return strpos($haystack, $needle) !== false;
+}
+
+function startsWith($haystack, $needle)
+{
+  $length = strlen($needle);
+  return substr($haystack, 0, $length) === $needle;
+}
+
+function endsWith($haystack, $needle)
+{
+  $length = strlen($needle);
+  if (!$length)
+  {
+    return true;
+  }
+  
+  return substr($haystack, -$length) === $needle;
+}
+
+
 ########################################################################
 include "$areaRoot/_footer.php"; ?>