diff hglib/util.py @ 49:3d7e0325ba1c

util: introduce a generic error handler that is aware of return codes
author Idan Kamara <idankk86@gmail.com>
date Thu, 18 Aug 2011 16:20:22 +0300
parents 19d2c55c3928
children d1f57f162274
line wrap: on
line diff
--- a/hglib/util.py	Thu Aug 18 16:20:04 2011 +0300
+++ b/hglib/util.py	Thu Aug 18 16:20:22 2011 +0300
@@ -1,4 +1,4 @@
-import itertools, cStringIO
+import itertools, cStringIO, error
 
 def grouper(n, iterable):
     ''' list(grouper(2, range(4))) -> [(0, 1), (2, 3)] '''
@@ -98,3 +98,35 @@
             cmd.append(a)
 
     return cmd
+
+class reterrorhandler(object):
+    """
+    This class is meant to be used with rawcommand() error handler argument.
+    It remembers the return value the command returned if it's one of allowed
+    values, which is only 1 if none are given. Otherwise it raises a CommandError.
+
+    >>> e = reterrorhandler('')
+    >>> bool(e)
+    True
+    >>> e(1, 'a', '')
+    'a'
+    >>> bool(e)
+    False
+    """
+    def __init__(self, args, allowed=None):
+        self.args = args
+        self.ret = 0
+        if allowed is None:
+            self.allowed = [1]
+        else:
+            self.allowed = allowed
+
+    def __call__(self, ret, out, err):
+        self.ret = ret
+        if ret not in self.allowed:
+            raise error.CommandError(self.args, ret, out, err)
+        return out
+
+    def __nonzero__(self):
+        """ Returns True if the return code was 0, False otherwise """
+        return self.ret == 0