[CalendarServer-changes] [8262] CalendarServer/trunk/calendarserver/tools/shell.py

source_changes at macosforge.org source_changes at macosforge.org
Tue Nov 8 14:02:37 PST 2011


Revision: 8262
          http://trac.macosforge.org/projects/calendarserver/changeset/8262
Author:   wsanchez at apple.com
Date:     2011-11-08 14:02:37 -0800 (Tue, 08 Nov 2011)
Log Message:
-----------
More awesome

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/tools/shell.py

Modified: CalendarServer/trunk/calendarserver/tools/shell.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/shell.py	2011-11-08 18:46:21 UTC (rev 8261)
+++ CalendarServer/trunk/calendarserver/tools/shell.py	2011-11-08 22:02:37 UTC (rev 8262)
@@ -24,12 +24,11 @@
 import traceback
 from shlex import shlex
 
-#from twisted.python import log
 from twisted.python.text import wordWrap
 from twisted.python.usage import Options, UsageError
 from twisted.internet.defer import succeed, maybeDeferred
 from twisted.conch.stdio import runWithProtocol as shellWithProtocol
-from twisted.conch.recvline import HistoricRecvLine
+from twisted.conch.recvline import RecvLine as ReceiveLineProtocol
 from twisted.application.service import Service
 
 from txdav.common.icommondatastore import NotFoundError
@@ -96,8 +95,17 @@
         """
 
 
-class ShellProtocol(HistoricRecvLine):
+class UnknownArguments (Exception):
     """
+    Unknown arguments.
+    """
+    def __init__(self, arguments):
+        Exception.__init__(self, "Unknown arguments: %s" % (arguments,))
+        self.arguments = arguments
+
+
+class ShellProtocol(ReceiveLineProtocol):
+    """
     Data store shell protocol.
     """
 
@@ -108,103 +116,49 @@
     ps = ("ds% ", "... ")
 
     def __init__(self, store):
-        HistoricRecvLine.__init__(self)
+        ReceiveLineProtocol.__init__(self)
         self.wd = RootDirectory(store)
 
-    def connectionMade(self):
-        HistoricRecvLine.connectionMade(self)
+    def lineReceived(self, line):
+        lexer = shlex(line)
+        lexer.whitespace_split = True
 
-        CTRL_C         = "\x03"
-        CTRL_D         = "\x04"
-        CTRL_L         = "\x0c"
-        CTRL_BACKSLASH = "\x1c"
+        tokens = []
+        while True:
+            token = lexer.get_token()
+            if not token:
+                break
+            tokens.append(token)
 
-        self.keyHandlers[CTRL_C        ] = self.handle_INT
-        self.keyHandlers[CTRL_D        ] = self.handle_EOF
-        self.keyHandlers[CTRL_L        ] = self.handle_FF
-        self.keyHandlers[CTRL_BACKSLASH] = self.handle_QUIT
+        if tokens:
+            cmd = tokens.pop(0)
+            #print "Arguments: %r" % (tokens,)
 
-    def handle_INT(self):
-        """
-        Handle ^C as an interrupt keystroke by resetting the current input
-        variables to their initial state.
-        """
-        self.pn = 0
-        self.lineBuffer = []
-        self.lineBufferIndex = 0
-        self.interpreter.resetBuffer()
+            m = getattr(self, "cmd_%s" % (cmd,), None)
+            if m:
+                try:
+                    m(tokens)
+                except UnknownArguments, e:
+                    self.terminal.write("%s\n" % (e,))
+                except Exception, e:
+                    print "Error: %s" % (e,)
+                    print "-"*80
+                    f.printTraceback()
+                    print "-"*80
 
-        self.terminal.nextLine()
-        self.terminal.write("KeyboardInterrupt")
-        self.terminal.nextLine()
-        self.terminal.write(self.ps[self.pn])
+            else:
+                self.terminal.write("Unknown command: %s\n" % (cmd,))
 
-    def handle_EOF(self):
-        if self.lineBuffer:
-            self.terminal.write("\a")
-        else:
-            self.handle_QUIT()
-
-    def handle_FF(self):
-        """
-        Handle a "form feed" byte - generally used to request a screen
-        refresh/redraw.
-        """
-        self.terminal.eraseDisplay()
-        self.terminal.cursorHome()
         self.drawInputLine()
 
-    def handle_QUIT(self):
-        self.terminal.loseConnection()
-
-    def prompt(self):
-        pass
-
-    def lineReceived(self, line):
-        try:
-            lexer = shlex(line)
-            lexer.whitespace_split = True
-
-            tokens = []
-            while True:
-                token = lexer.get_token()
-                if not token:
-                    break
-                tokens.append(token)
-
-            if tokens:
-                cmd = tokens.pop(0)
-                #print "Arguments: %r" % (tokens,)
-
-                m = getattr(self, "cmd_%s" % (cmd,), None)
-                if m:
-                    def onError(f):
-                        print "Error: %s" % (f.getErrorMessage(),)
-                        print "-"*80
-                        f.printTraceback()
-                        print "-"*80
-
-                    d = maybeDeferred(m, tokens)
-                    d.addCallback(lambda _: self.prompt)
-                    d.addErrback(onError)
-                    return d
-                else:
-                    print "Unknown command: %s" % (cmd,)
-
-        except Exception, e:
-            print "Error: %s" % (e,)
-            print "-"*80
-            traceback.print_exc()
-            print "-"*80
-
     def cmd_pwd(self, tokens):
         """
         Print working directory.
         """
         if tokens:
-            print "Unknown arguments: %s" % (tokens,)
+            raise UnknownArguments(tokens)
             return
-        print self.wd
+        self.terminal.write("%s\n" % (self.wd,))
 
     def cmd_cd(self, tokens):
         """
@@ -216,14 +170,14 @@
             return
 
         if tokens:
-            print "Unknown arguments: %s" % (tokens,)
+            raise UnknownArguments(tokens)
             return
 
         path = dirname.split("/")
 
         def notFound(f):
             f.trap(NotFoundError)
-            print "No such directory: %s" % (dirname,)
+            self.terminal.write("No such directory: %s\n" % (dirname,))
 
         def setWD(wd):
             self.wd = wd
@@ -238,16 +192,20 @@
         List working directory.
         """
         if tokens:
-            print "Unknown arguments: %s" % (tokens,)
+            raise UnknownArguments(tokens)
             return
 
         for name in self.wd.list():
-            print name
+            self.terminal.write("%s\n" % (name,))
 
     def cmd_info(self, tokens):
         """
         Print information about working directory.
         """
+        if tokens:
+            raise UnknownArguments(tokens)
+            return
+
         d = self.wd.describe()
         d.addCallback(lambda x: sys.stdout.write(x))
         return d
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20111108/8470b2d2/attachment-0001.html>


More information about the calendarserver-changes mailing list