From 54583f10e2615f6410d0eb330a6be72cc165c2da Mon Sep 17 00:00:00 2001
From: James Cameron <quozl@laptop.org>
Date: Tue, 16 Feb 2010 14:54:05 +1100
Subject: [PATCH 2/2] restore sugar-launch by bundle id substring, fixes #897

sugar-launch uses GetBundlePath which calls bundleregistry.get_bundle().

In this patch, the get_bundle() method is changed to retain as much of
the original API as possible, yet in the situation where it might return
None it will now return a bundle if there is only one bundle that
matches the search string.

http://bugs.sugarlabs.org/ticket/897
http://dev.laptop.org/ticket/9189

Patch tested on Sugar 0.84.10 on OLPC XO-1.5 build os108.

Test case:

import jarabe.model.bundleregistry
registry = jarabe.model.bundleregistry.BundleRegistry()
tests = ['org.laptop.Terminal', 'Terminal', 'terminal', 'e', 'asdqweas']
for x in tests:
    y = registry.get_bundle(x)
    if y is None:
        z = 'None'
    else:
        z = y.get_bundle_id()
    print x, z

Output before patch:

org.laptop.Terminal org.laptop.Terminal
Terminal None
terminal None
e None
asdqweas None

Output after patch:

org.laptop.Terminal org.laptop.Terminal
Terminal org.laptop.Terminal
terminal org.laptop.Terminal
e None
asdqweas None
---
 src/jarabe/model/bundleregistry.py |   16 +++++++++++++---
 1 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/jarabe/model/bundleregistry.py b/src/jarabe/model/bundleregistry.py
index 60b2ab9..4e7ef66 100644
--- a/src/jarabe/model/bundleregistry.py
+++ b/src/jarabe/model/bundleregistry.py
@@ -158,12 +158,22 @@ class BundleRegistry(gobject.GObject):
         self._write_favorites_file()
 
     def get_bundle(self, bundle_id):
-        """Returns an bundle given his service name"""
+        """Returns a bundle given service name or substring,
+        returns None if there is either no match, or more than one
+        match by substring."""
+        result = []
+        key = bundle_id.lower()
+
         for bundle in self._bundles:
-            if bundle.get_bundle_id() == bundle_id:
+            name = bundle.get_bundle_id()
+            if name == bundle_id:
                 return bundle
+            if key in name.lower():
+                result.append(bundle)
+        if len(result) == 1:
+            return result[0]
         return None
-    
+
     def __iter__(self):
         return self._bundles.__iter__()
 
-- 
1.6.6.1

