Author: andar

Revision: 5109

Log:
        Fix up some commands

Diff:
Modified: trunk/deluge/ui/console/colors.py
===================================================================
--- trunk/deluge/ui/console/colors.py   2009-04-20 22:32:42 UTC (rev 5108)
+++ trunk/deluge/ui/console/colors.py   2009-04-21 02:43:20 UTC (rev 5109)
@@ -50,6 +50,15 @@
     "event": ("magenta", "black", "bold")
 }
 
+# Colors for various torrent states
+state_color = {
+    "Seeding": "{{blue,black,bold}}",
+    "Downloading": "{{green,black,bold}}",
+    "Paused": "{{white,black}}",
+    "Checking": "{{green,black}}",
+    "Queued": "{{yellow,black}}",
+    "Error": "{{red,black,bold}}"
+}
 
 def init_colors():
     # Create the color_pairs dict
@@ -65,6 +74,19 @@
 class BadColorString(Exception):
     pass
 
+def get_line_length(line):
+    """
+    Returns the string length without the color formatting.
+
+    """
+    if line.count("{{") != line.count ("}}"):
+        raise BadColorString("Number of {{ does not equal number of }}")
+
+    while line.find("{{") != -1:
+        line = line[:line.find("{{")] + line[line.find("}}") + 2:]
+
+    return len(line)
+
 def parse_color_string(s):
     """
     Parses a string and returns a list of 2-tuples (color, string).
@@ -72,6 +94,9 @@
     :param s:, string to parse
 
     """
+    if s.count("{{") != s.count ("}}"):
+        raise BadColorString("Number of {{ does not equal number of }}")
+
     ret = []
     # Keep track of where the strings
     col_index = 0

Modified: trunk/deluge/ui/console/commands/add.py
===================================================================
--- trunk/deluge/ui/console/commands/add.py     2009-04-20 22:32:42 UTC (rev 
5108)
+++ trunk/deluge/ui/console/commands/add.py     2009-04-21 02:43:20 UTC (rev 
5109)
@@ -22,10 +22,11 @@
 #      51 Franklin Street, Fifth Floor
 #      Boston, MA    02110-1301, USA.
 #
-from deluge.ui.console.main import BaseCommand, match_torrents
-from deluge.ui.console import mapping
+from deluge.ui.console.main import BaseCommand
 import deluge.ui.console.colors as colors
 from deluge.ui.client import client
+import deluge.component as component
+
 from optparse import make_option
 import os
 import base64
@@ -40,18 +41,20 @@
     usage = "Usage: add [-p <save-location>] <torrent-file> [<torrent-file> 
...]"
 
     def handle(self, *args, **options):
+        self.console = component.get("ConsoleUI")
+
         t_options = {}
         if options["path"]:
             t_options["download_location"] = options["path"]
 
         for arg in args:
-            self.write("{{info}}Attempting to add torrent: %s" % arg)
+            self.console.write("{{info}}Attempting to add torrent: %s" % arg)
             filename = os.path.split(arg)[-1]
             filedump = base64.encodestring(open(arg).read())
 
             def on_success(result):
-                self.write("{{success}}Torrent added!")
+                self.console.write("{{success}}Torrent added!")
             def on_fail(result):
-                self.write("{{error}}Torrent was not added! %s" % result)
+                self.console.write("{{error}}Torrent was not added! %s" % 
result)
 
             client.core.add_torrent_file(filename, filedump, 
t_options).addCallback(on_success).addErrback(on_fail)

Modified: trunk/deluge/ui/console/commands/connect.py
===================================================================
--- trunk/deluge/ui/console/commands/connect.py 2009-04-20 22:32:42 UTC (rev 
5108)
+++ trunk/deluge/ui/console/commands/connect.py 2009-04-21 02:43:20 UTC (rev 
5109)
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 #
 # connect.py
 #
@@ -25,17 +24,20 @@
 from deluge.ui.console.main import BaseCommand
 import deluge.ui.console.colors as colors
 from deluge.ui.client import client
+import deluge.component as component
 
 class Command(BaseCommand):
     """Connect to a new deluge server."""
-    def handle(self, host='localhost', port='58846', username="", password="", 
**options):
+    def handle(self, host="", port="58846", username="", password="", 
**options):
+        self.console = component.get("ConsoleUI")
+
         port = int(port)
         d = client.connect(host, port, username, password)
         def on_connect(result):
-            print templates.SUCCESS('Connected to %s:%d!' % (host, port))
+            self.console.write("{{success}}Connected to %s:%s!" % (host, port))
 
         def on_connect_fail(result):
-            print templates.ERROR("Failed to connect to %s:%d!" % (host, port))
+            self.console.write("{{error}}Failed to connect to %s:%s!" % (host, 
port))
 
         d.addCallback(on_connect)
         d.addErrback(on_connect_fail)

Modified: trunk/deluge/ui/console/commands/halt.py
===================================================================
--- trunk/deluge/ui/console/commands/halt.py    2009-04-20 22:32:42 UTC (rev 
5108)
+++ trunk/deluge/ui/console/commands/halt.py    2009-04-21 02:43:20 UTC (rev 
5109)
@@ -1,8 +1,8 @@
-#!/usr/bin/env python
 #
 # halt.py
 #
 # Copyright (C) 2008-2009 Ido Abramovich <[email protected]>
+# Copyright (C) 2009 Andrew Resch <[email protected]>
 #
 # Deluge is free software.
 #
@@ -22,12 +22,20 @@
 #      51 Franklin Street, Fifth Floor
 #      Boston, MA    02110-1301, USA.
 #
-from deluge.ui.console.main import BaseCommand, match_torrents
-from deluge.ui.console import mapping
+from deluge.ui.console.main import BaseCommand
 import deluge.ui.console.colors as colors
 from deluge.ui.client import client
+import deluge.component as component
 
 class Command(BaseCommand):
     "Shutdown the deluge server."
     def handle(self, **options):
-        client.daemon.shutdown(None)
+        self.console = component.get("ConsoleUI")
+
+        def on_shutdown(result):
+            self.write("{{success}}Daemon was shutdown")
+
+        def on_shutdown_fail(reason):
+            self.write("{{error}}Unable to shutdown daemon: %s" % reason)
+
+        
client.daemon.shutdown().addCallback(on_shutdown).addErrback(on_shutdown_fail)

Modified: trunk/deluge/ui/console/commands/help.py
===================================================================
--- trunk/deluge/ui/console/commands/help.py    2009-04-20 22:32:42 UTC (rev 
5108)
+++ trunk/deluge/ui/console/commands/help.py    2009-04-21 02:43:20 UTC (rev 
5109)
@@ -1,8 +1,8 @@
-#!/usr/bin/env python
 #
 # help.py
 #
 # Copyright (C) 2008-2009 Ido Abramovich <[email protected]>
+# Copyright (C) 2009 Andrew Resch <[email protected]>
 #
 # Deluge is free software.
 #
@@ -22,46 +22,44 @@
 #      51 Franklin Street, Fifth Floor
 #      Boston, MA    02110-1301, USA.
 #
-from deluge.ui.console import UI_PATH
-from deluge.ui.console.main import BaseCommand, load_commands
+from deluge.ui.console.main import BaseCommand
 import deluge.ui.console.colors as colors
-#from deluge.ui.console.colors import templates
-import os
+import deluge.component as component
 
 class Command(BaseCommand):
     """displays help on other commands"""
 
     usage =  "Usage: help [command]"
 
-    def __init__(self):
-        BaseCommand.__init__(self)
+#    def __init__(self):
+#        BaseCommand.__init__(self)
         # get a list of commands, exclude 'help' so we won't run into a 
recursive loop.
-        self._commands = load_commands(os.path.join(UI_PATH,'commands'), None, 
exclude=['help'])
-        self._commands['help'] = self
+        #self._commands = load_commands(os.path.join(UI_PATH,'commands'), 
None, exclude=['help'])
 
+#        self._commands['help'] = self
+
     def handle(self, *args, **options):
+        self.console = component.get("ConsoleUI")
+        self._commands = self.console._commands
         if args:
             if len(args) > 1:
                 #print usage
-                self.write(usage)
+                self.console.write(usage)
                 return
             try:
                 cmd = self._commands[args[0]]
             except KeyError:
                 #print templates.ERROR('unknown command %r' % args[0])
-                self.write("{{error}}Unknown command %r" % args[0])
+                self.console.write("{{error}}Unknown command %r" % args[0])
                 return
             try:
                 parser = cmd.create_parser()
-                self.write(parser.format_help())
+                self.console.write(parser.format_help())
             except AttributeError, e:
-                self.write(cmd.__doc__ or 'No help for this command')
+                self.console.write(cmd.__doc__ or 'No help for this command')
         else:
             max_length = max( len(k) for k in self._commands)
             for cmd in sorted(self._commands):
-                self.write("{{info}}" + cmd + "{{input}} - " + 
self._commands[cmd].__doc__ or '')
-            self.write("")
-            self.write('For help on a specific command, use "<command> 
--help"')
-
-    def complete(self, text, *args):
-        return [ x for x in self._commands.keys() if x.startswith(text) ]
+                self.console.write("{{info}}" + cmd + "{{input}} - " + 
self._commands[cmd].__doc__ or '')
+            self.console.write("")
+            self.console.write('For help on a specific command, use "<command> 
--help"')

Modified: trunk/deluge/ui/console/commands/info.py
===================================================================
--- trunk/deluge/ui/console/commands/info.py    2009-04-20 22:32:42 UTC (rev 
5108)
+++ trunk/deluge/ui/console/commands/info.py    2009-04-21 02:43:20 UTC (rev 
5109)
@@ -1,8 +1,8 @@
-#!/usr/bin/env python
 #
 # info.py
 #
 # Copyright (C) 2008-2009 Ido Abramovich <[email protected]>
+# Copyright (C) 2009 Andrew Resch <[email protected]>
 #
 # Deluge is free software.
 #
@@ -23,13 +23,13 @@
 #      Boston, MA    02110-1301, USA.
 #
 
-from deluge.ui.console.main import BaseCommand, match_torrents
-from deluge.ui.console import mapping
+from optparse import make_option
+
+from deluge.ui.console.main import BaseCommand
 import deluge.ui.console.colors as colors
-#from deluge.ui.console.colors import templates
 from deluge.ui.client import client
 import deluge.common as common
-from optparse import make_option
+import deluge.component as component
 
 status_keys = ["state",
         "save_path",
@@ -73,25 +73,58 @@
 
 
     def handle(self, *args, **options):
-        def on_to_ids(result):
-            def on_match_torrents(torrents):
-                for torrent in torrents:
-                    self.show_info(torrent, options.get("verbose"))
+        self.console = component.get("ConsoleUI")
+        # Compile a list of torrent_ids to request the status of
+        torrent_ids = []
+        for arg in args:
+            torrent_ids.extend(self.console.match_torrent(arg))
 
-            match_torrents(result).addCallback(on_match_torrents)
-        mapping.to_ids(args).addCallback(on_to_ids)
+        def on_torrents_status(status):
+            # Print out the information for each torrent
+            for key, value in status.items():
+                self.show_info(key, value, options["verbose"])
 
-#    def complete(self, text, *args):
-#        torrents = match_torrents()
-#        names = mapping.get_names(torrents)
-#        return [ x[1] for x in names if x[1].startswith(text) ]
+        def on_torrents_status_fail(reason):
+            self.console.write("{{error}}Error getting torrent info: %s" % 
reason)
 
-    def show_info(self, torrent, verbose):
+        d = client.core.get_torrents_status({"id": torrent_ids}, status_keys)
+        d.addCallback(on_torrents_status)
+        d.addErrback(on_torrents_status_fail)
+
+    def show_info(self, torrent_id, status, verbose=False):
+        """
+        Writes out the torrents information to the screen.
+
+        :param torrent_id: str, the torrent_id
+        :param status: dict, the torrents status, this should have the same 
keys
+            as status_keys
+        :param verbose: bool, if true, we print out more information about the
+            the torrent
+        """
+        self.console.write(" ")
+        self.console.write("{{info}}Name: {{input}}%s" % (status["name"]))
+        self.console.write("{{info}}ID: {{input}}%s" % (torrent_id))
+        s = "{{info}}State: %s%s" % (colors.state_color[status["state"]], 
status["state"])
+        # Only show speed if active
+        if status["state"] in ("Seeding", "Downloading"):
+            if status["state"] != "Seeding":
+                s += " {{info}}Down Speed: {{input}}%s" % 
common.fspeed(status["download_payload_rate"])
+            s += " {{info}}Up Speed: {{input}}%s" % 
common.fspeed(status["upload_payload_rate"])
+
+            if common.ftime(status["eta"]):
+                s += " {{info}}ETA: {{input}}%s" % common.ftime(status["eta"])
+
+        self.console.write(s)
+
+        s = "{{info}}Seeds: {{input}}%s (%s)" % (status["num_seeds"], 
status["total_seeds"])
+        s += " {{info}}Peers: {{input}}%s (%s)" % (status["num_peers"], 
status["total_peers"])
+        s += " {{info}}Ratio: {{input}}%.3f" % status["ratio"]
+        s += " {{info}}Availibility: {{input}}%.2f" % 
status["distributed_copies"]
+        self.console.write(s)
+
+
+"""    def __show_info(self, torrent, verbose):
         def _got_torrent_status(state):
-            print templates.info_general('ID', torrent)
-            print templates.info_general('Name', state['name'])
-            #self._mapping[state['name']] = torrent # update mapping
-            print templates.info_general('Path', state['save_path'])
 
             if verbose or not state['is_seed']:
                 print templates.info_transfers("Completed", 
common.fsize(state['total_done']) + "/" + common.fsize(state['total_size']))
@@ -129,3 +162,4 @@
                                         str(common.fspeed(peer['up_speed'])), 
str(common.fspeed(peer['down_speed'])))
             print ""
         client.core.get_torrent_status(torrent, 
status_keys).addCallback(_got_torrent_status)
+"""

Modified: trunk/deluge/ui/console/commands/pause.py
===================================================================
--- trunk/deluge/ui/console/commands/pause.py   2009-04-20 22:32:42 UTC (rev 
5108)
+++ trunk/deluge/ui/console/commands/pause.py   2009-04-21 02:43:20 UTC (rev 
5109)
@@ -1,8 +1,8 @@
-#!/usr/bin/env python
 #
 # pause.py
 #
 # Copyright (C) 2008-2009 Ido Abramovich <[email protected]>
+# Copyright (C) 2009 Andrew Resch <[email protected]>
 #
 # Deluge is free software.
 #
@@ -22,30 +22,27 @@
 #      51 Franklin Street, Fifth Floor
 #      Boston, MA    02110-1301, USA.
 #
-from deluge.ui.console.main import BaseCommand, match_torrents
-from deluge.ui.console import mapping
+from deluge.ui.console.main import BaseCommand
 from deluge.ui.client import client
 import deluge.ui.console.colors as colors
+import deluge.component as component
 
 class Command(BaseCommand):
     """Pause a torrent"""
-    usage = "Usage: pause [ all | <torrent-id> [<torrent-id> ...] ]"
+    usage = "Usage: pause [ * | <torrent-id> [<torrent-id> ...] ]"
     def handle(self, *args, **options):
+        self.console = component.get("ConsoleUI")
+
         if len(args) == 0:
-            print self.usage
+            self.console.write(self.usage)
             return
-        if len(args) == 1 and args[0] == 'all':
-            args = tuple() # empty tuple means everything
-        try:
-            args = mapping.to_ids(args)
-            torrents = match_torrents(args)
-            client.pause_torrent(torrents)
-        except Exception, msg:
-            print templates.ERROR(str(msg))
-        else:
-            print templates.SUCCESS('torrent%s successfully paused' % ('s' if 
len(args) > 1 else ''))
+        if len(args) > 0 and args[0].lower() == '*':
+            client.core.pause_all_torrents()
+            return
 
-    def complete(self, text, *args):
-        torrents = match_torrents()
-        names = mapping.get_names(torrents)
-        return [ x[1] for x in names if x[1].startswith(text) ]
+        torrent_ids = []
+        for arg in args:
+            torrent_ids.extend(self.console.match_torrent(arg))
+
+        if torrent_ids:
+            client.core.pause_torrent(torrent_ids)

Modified: trunk/deluge/ui/console/commands/quit.py
===================================================================
--- trunk/deluge/ui/console/commands/quit.py    2009-04-20 22:32:42 UTC (rev 
5108)
+++ trunk/deluge/ui/console/commands/quit.py    2009-04-21 02:43:20 UTC (rev 
5109)
@@ -34,3 +34,5 @@
             def on_disconnect(result):
                 reactor.stop()
             client.disconnect().addCallback(on_disconnect)
+        else:
+            reactor.stop()

Modified: trunk/deluge/ui/console/commands/resume.py
===================================================================
--- trunk/deluge/ui/console/commands/resume.py  2009-04-20 22:32:42 UTC (rev 
5108)
+++ trunk/deluge/ui/console/commands/resume.py  2009-04-21 02:43:20 UTC (rev 
5109)
@@ -1,8 +1,8 @@
-#!/usr/bin/env python
 #
 # resume.py
 #
 # Copyright (C) 2008-2009 Ido Abramovich <[email protected]>
+# Copyright (C) 2009 Andrew Resch <[email protected]>
 #
 # Deluge is free software.
 #
@@ -22,30 +22,27 @@
 #      51 Franklin Street, Fifth Floor
 #      Boston, MA    02110-1301, USA.
 #
-from deluge.ui.console.main import BaseCommand, match_torrents
-from deluge.ui.console import mapping
+from deluge.ui.console.main import BaseCommand
 from deluge.ui.client import client
 import deluge.ui.console.colors as colors
+import deluge.component as component
 
 class Command(BaseCommand):
     """Resume a torrent"""
-    usage = "Usage: resume [ all | <torrent-id> [<torrent-id> ...] ]"
+    usage = "Usage: resume [ * | <torrent-id> [<torrent-id> ...] ]"
     def handle(self, *args, **options):
+        self.console = component.get("ConsoleUI")
+
         if len(args) == 0:
-            print self.usage
+            self.console.write(self.usage)
             return
-        if len(args) == 1 and args[0] == 'all':
-            args = tuple() # empty tuple means everything
-        try:
-            args = mapping.to_ids(args)
-            torrents = match_torrents(args)
-            client.resume_torrent(torrents)
-        except Exception, msg:
-            print templates.ERROR(str(msg))
-        else:
-            print templates.SUCCESS('torrent%s successfully resumed' % ('s' if 
len(args) > 1 else ''))
+        if len(args) > 0 and args[0] == '*':
+            client.core.resume_all_torrents()
+            return
 
-    def complete(self, text, *args):
-        torrents = match_torrents()
-        names = mapping.get_names(torrents)
-        return [ x[1] for x in names if x[1].startswith(text) ]
+        torrent_ids = []
+        for arg in args:
+            torrent_ids.extend(self.console.match_torrent(arg))
+
+        if torrent_ids:
+            client.core.resume_torrent(torrent_ids)

Modified: trunk/deluge/ui/console/commands/rm.py
===================================================================
--- trunk/deluge/ui/console/commands/rm.py      2009-04-20 22:32:42 UTC (rev 
5108)
+++ trunk/deluge/ui/console/commands/rm.py      2009-04-21 02:43:20 UTC (rev 
5109)
@@ -1,8 +1,8 @@
-#!/usr/bin/env python
 #
 # rm.py
 #
 # Copyright (C) 2008-2009 Ido Abramovich <[email protected]>
+# Copyright (C) 2009 Andrew Resch <[email protected]>
 #
 # Deluge is free software.
 #
@@ -22,13 +22,14 @@
 #      51 Franklin Street, Fifth Floor
 #      Boston, MA    02110-1301, USA.
 #
-from deluge.ui.console.main import BaseCommand, match_torrents
-from deluge.ui.console import mapping
+from deluge.ui.console.main import BaseCommand
 import deluge.ui.console.colors as colors
 from deluge.ui.client import client
+import deluge.component as component
+
 from optparse import make_option
-import os
 
+
 class Command(BaseCommand):
     """Remove a torrent"""
     usage = "Usage: rm <torrent-id>"
@@ -40,14 +41,12 @@
     )
 
     def handle(self, *args, **options):
-        try:
-            args = mapping.to_ids(args)
-            torrents = match_torrents(args)
-            client.remove_torrent(torrents, options['remove_data'])
-        except Exception, msg:
-            print template.ERROR(str(msg))
+        self.console = component.get("ConsoleUI")
+        if len(args) == 0:
+            self.console.write(usage)
 
-    def complete(self, text, *args):
-        torrents = match_torrents()
-        names = mapping.get_names(torrents)
-        return [ x[1] for x in names if x[1].startswith(text) ]
+        torrent_ids = []
+        for arg in args:
+            torrent_ids.extend(self.console.match_torrent(arg))
+
+        client.core.remove_torrent(torrent_ids, options['remove_data'])

Modified: trunk/deluge/ui/console/eventlog.py
===================================================================
--- trunk/deluge/ui/console/eventlog.py 2009-04-20 22:32:42 UTC (rev 5108)
+++ trunk/deluge/ui/console/eventlog.py 2009-04-21 02:43:20 UTC (rev 5109)
@@ -25,6 +25,7 @@
 
 import deluge.component as component
 import deluge.common
+import colors
 from deluge.ui.client import client
 
 from deluge.log import LOG as log
@@ -58,16 +59,8 @@
     def on_torrent_state_changed_event(self, torrent_id, state):
         log.debug("on_torrent_state_changed_event!")
         # Modify the state string color
-        state_color = {
-            "Seeding": "{{blue,black,bold}}",
-            "Downloading": "{{green,black,bold}}",
-            "Paused": "{{white,black}}",
-            "Checking": "{{green,black}}",
-            "Queued": "{{yellow,black}}",
-            "Error": "{{red,black,bold}}"
-        }
-        if state in state_color:
-            state = state_color[state] + state
+        if state in colors.state_color:
+            state = colors.state_color[state] + state
 
         self.console.write("{{event}}* TorrentStateChanged: %s {{info}}%s 
(%s)" %
             (state, self.console.get_torrent_name(torrent_id), torrent_id))

Modified: trunk/deluge/ui/console/main.py
===================================================================
--- trunk/deluge/ui/console/main.py     2009-04-20 22:32:42 UTC (rev 5108)
+++ trunk/deluge/ui/console/main.py     2009-04-21 02:43:20 UTC (rev 5109)
@@ -25,6 +25,10 @@
 
 import os, sys
 import optparse
+import shlex
+
+from twisted.internet import defer, reactor
+
 from deluge.ui.console import UI_PATH
 import deluge.component as component
 from deluge.ui.client import client
@@ -32,14 +36,14 @@
 from deluge.ui.coreconfig import CoreConfig
 from deluge.ui.console.statusbars import StatusBars
 from deluge.ui.console.eventlog import EventLog
+import deluge.ui.console.screen as screen
+import deluge.ui.console.colors as colors
+from deluge.log import LOG as log
 
-from twisted.internet import defer, reactor
-import shlex
-import screen
-import colors
+# XXX: Remove when the commands are all fixed up
+def match_torrents(a=[]):
+    pass
 
-from deluge.log import LOG as log
-
 class OptionParser(optparse.OptionParser):
     """subclass from optparse.OptionParser so exit() won't exit."""
     def exit(self, status=0, msg=None):
@@ -62,7 +66,6 @@
     option_list = tuple()
     aliases = []
 
-
     def complete(self, text, *args):
         return []
     def handle(self, *args, **options):
@@ -85,24 +88,7 @@
                             epilog = self.epilog,
                             option_list = self.option_list)
 
-
-def match_torrents(array=[]):
-    # Make sure we don't have any duplicates
-    array = set(array)
-    # We return this defer and it will be fired once we received the session
-    # state and intersect the data.
-    d = defer.Deferred()
-
-    def _got_session_state(tors):
-        if not array:
-            d.callback(tors)
-        d.callback(list(tors.intersection(array)))
-
-    client.core.get_session_state().addCallback(_got_session_state)
-
-    return d
-
-def load_commands(command_dir, write_func, exclude=[]):
+def load_commands(command_dir, exclude=[]):
     def get_command(name):
         return getattr(__import__('deluge.ui.console.commands.%s' % name, {}, 
{}, ['Command']), 'Command')()
 
@@ -112,8 +98,6 @@
             if filename.split('.')[0] in exclude or filename.startswith('_') 
or not filename.endswith('.py'):
                 continue
             cmd = get_command(filename[:-3])
-            # Hack to give the commands a write function
-            cmd.write = write_func
             aliases = [ filename[:-3] ]
             aliases.extend(cmd.aliases)
             for a in aliases:
@@ -126,7 +110,7 @@
     def __init__(self, args=None):
         component.Component.__init__(self, "ConsoleUI", 2)
         # Load all the commands
-        self._commands = load_commands(os.path.join(UI_PATH, 'commands'), 
self.write)
+        self._commands = load_commands(os.path.join(UI_PATH, 'commands'))
 
         # Try to connect to the localhost daemon
         def on_connect(result):
@@ -236,10 +220,11 @@
         if not getattr(options, '_exit', False):
             try:
                 self._commands[cmd].handle(*args, **options.__dict__)
-            except StopIteration, e:
-                raise
             except Exception, e:
                 self.write("{{error}}" + str(e))
+                log.exception(e)
+                import traceback
+                self.write("%s" % traceback.format_exc())
 
     def tab_completer(self, line, cursor, second_hit):
         """
@@ -330,9 +315,27 @@
 
         return None
 
+    def match_torrent(self, string):
+        """
+        Returns a list of torrent_id matches for the string.  It will search 
both
+        torrent_ids and torrent names, but will only return torrent_ids.
+
+        :param string: str, the string to match on
+
+        :returns: list of matching torrent_ids. Will return an empty list if
+            no matches are found.
+
+        """
+        ret = []
+        for tid, name in self.torrents:
+            if tid.startswith(string) or name.startswith(string):
+                ret.append(tid)
+
+        return ret
+
     def on_torrent_added_event(self, torrent_id):
         def on_torrent_status(status):
-            self.torrents.append(torrent_id, status["name"])
+            self.torrents.append((torrent_id, status["name"]))
         client.get_torrent_status(torrent_id, 
["name"]).addCallback(on_torrent_status)
 
     def on_torrent_removed_event(self, torrent_id):

Modified: trunk/deluge/ui/console/screen.py
===================================================================
--- trunk/deluge/ui/console/screen.py   2009-04-20 22:32:42 UTC (rev 5108)
+++ trunk/deluge/ui/console/screen.py   2009-04-21 02:43:20 UTC (rev 5109)
@@ -116,16 +116,7 @@
         """
         log.debug("adding line: %s", text)
 
-        def get_line_length(line):
-            """
-            Returns the string length without the color formatting.
 
-            """
-            while line.find("{{") != -1:
-                line = line[:line.find("{{")] + line[line.find("}}") + 2:]
-
-            return len(line)
-
         def get_line_chunks(line):
             """
             Returns a list of 2-tuples (color string, text)
@@ -155,7 +146,12 @@
 
         for line in text.splitlines():
             # We need to check for line lengths here and split as necessary
-            line_length = get_line_length(line)
+            try:
+                line_length = colors.get_line_length(line)
+            except colors.BadColorString:
+                log.error("Passed a bad colored string..")
+                line_length = len(line)
+
             if line_length >= (self.cols - 1):
                 s = ""
                 # The length of the text without the color tags
@@ -198,7 +194,12 @@
 
         """
         col = 0
-        parsed = colors.parse_color_string(string)
+        try:
+            parsed = colors.parse_color_string(string)
+        except colors.BadColorString:
+            log.error("Cannot add bad color string: %s", string)
+            return
+
         for index, (color, s) in enumerate(parsed):
             if index + 1 == len(parsed):
                 # This is the last string so lets append some " " to it



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"deluge-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/deluge-commit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to