[gnome-boxes: 5/5] installed-media: Generic mapping of image to gnome release



commit 017af64640c81d2228632f700cfecf769c428caa
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Thu Oct 3 03:48:45 2013 +0300

    installed-media: Generic mapping of image to gnome release
    
    Using the date on gnome-continuous image filenames, ensure that we map
    the image to the first gnome release after the date on the image.
    Mapping for older images will still have to be hardcoded I'm afraid.

 src/installed-media.vala |   40 +++++++++++++++++++++++++++++++++-------
 src/os-database.vala     |   23 +++++++++++++++++------
 2 files changed, 50 insertions(+), 13 deletions(-)
---
diff --git a/src/installed-media.vala b/src/installed-media.vala
index b8a9379..a0b8f8f 100644
--- a/src/installed-media.vala
+++ b/src/installed-media.vala
@@ -11,6 +11,7 @@ private class Boxes.InstalledMedia : Boxes.InstallerMedia {
                                                    ".vmdk", ".vmdk.gz",
                                                    ".vpc", ".vpc.gz",
                                                    ".cloop", ".cloop.gz" };
+    private static Regex date_regex = /20[0-9]{6,6}/;
 
     public override bool need_user_input_for_vm_creation { get { return false; } }
     public override bool ready_to_create { get { return true; } }
@@ -114,15 +115,40 @@ private class Boxes.InstalledMedia : Boxes.InstallerMedia {
         if (!device_file.contains ("gnome-continuous") && !device_file.contains ("gnome-ostree"))
             return null;
 
-        try {
-            return yield os_db.get_os_by_id ("http://gnome.org/continuous/3.10";);
-        } catch (OSDatabaseError.UNKNOWN_OS_ID error) {
-            debug ("gnome-continuous definition not found in libosinfo db");
+        var date = get_date_from_filename ();
+        if (date == null) {
+            try {
+                // No date on filename means older gnome-continuous images and
+                // hence more close to 3.10 than anything newer.
+                return yield os_db.get_os_by_id ("http://gnome.org/continuous/3.10";);
+            } catch (OSDatabaseError.UNKNOWN_OS_ID error) {
+                debug ("gnome-continuous definition not found in libosinfo db");
 
-            return null;
-        } catch (OSDatabaseError error) {
-            throw error;
+                return null;
+            }
         }
+
+        var os_list = yield os_db.list_os_by_distro ("gnome", date);
+        if (os_list.length () > 0)
+            return os_list.data;
+        else
+            return null;
+    }
+
+    private GLib.Date? get_date_from_filename () {
+        GLib.MatchInfo match_info;
+
+        date_regex.match (device_file, 0, out match_info);
+        if (!match_info.matches ())
+            return null;
+
+        var date_str = match_info.fetch (0);
+        var date = GLib.Date ();
+        date.set_year ((GLib.DateYear) int.parse (date_str[0:4]));
+        date.set_month ((GLib.DateMonth) int.parse (date_str[4:6]));
+        date.set_day ((GLib.DateDay) int.parse (date_str[6:8]));
+
+        return date;
     }
 
     private async bool decompress () throws GLib.Error {
diff --git a/src/os-database.vala b/src/os-database.vala
index a93372e..df92add 100644
--- a/src/os-database.vala
+++ b/src/os-database.vala
@@ -83,8 +83,10 @@ private class Boxes.OSDatabase : GLib.Object {
     }
 
     // Returned list is in ascending order by release dates. If release date is
-    // unavailable, we assume that OS is very old, or at least older than
-    // entries with release dates and @after.
+    // unavailable and OS is
+    // a. released, we assume that it is older than other OSes and @after.
+    // b. unreleased, we assume that it is newer than other OSes and @after.
+    //
     // If @after is non-null, only list releases after the given date.
     public async GLib.List<Os> list_os_by_distro (string distro, GLib.Date? after = null) throws 
OSDatabaseError {
         if (!yield ensure_db_loaded ())
@@ -97,15 +99,24 @@ private class Boxes.OSDatabase : GLib.Object {
 
         var after_list = new GLib.List<Os> ();
         foreach (var entity in os_list.get_elements ()) {
+            var os = entity as Os;
+
             if (after != null) {
-                var release_date = (entity as Os).get_release_date ();
-                if (release_date != null && release_date.compare (after) > 0)
-                    after_list.append (entity as Os);
+                var release_date = os.get_release_date ();
+                var status = os.get_release_status ();
+
+                if (status != ReleaseStatus.RELEASED || (release_date != null && release_date.compare 
(after) > 0))
+                    after_list.append (os);
             } else
-                after_list.append (entity as Os);
+                after_list.append (os);
         }
 
         after_list.sort ((os_a, os_b) => {
+            if (os_a.get_release_status () != ReleaseStatus.RELEASED)
+                return 1;
+            else if (os_b.get_release_status () != ReleaseStatus.RELEASED)
+                return -1;
+
             var release_a = os_a.get_release_date ();
             var release_b = os_b.get_release_date ();
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]