diff options
author | Patrick Totzke <patricktotzke@gmail.com> | 2012-02-02 21:39:51 +0000 |
---|---|---|
committer | Patrick Totzke <patricktotzke@gmail.com> | 2012-02-02 21:39:51 +0000 |
commit | e4baf73beca49b694bbaada217eee846bef9d64f (patch) | |
tree | 1fc6f918f4e3a7e80da5c8b4bdeb684f6385826c /alot/helper.py | |
parent | cf2b7fa00596ecad58a665f0b5bac3c58087ff04 (diff) |
call_cmd_async
properly errback after process failed
Diffstat (limited to 'alot/helper.py')
-rw-r--r-- | alot/helper.py | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/alot/helper.py b/alot/helper.py index b55188e3..752c2fb8 100644 --- a/alot/helper.py +++ b/alot/helper.py @@ -11,6 +11,10 @@ from email.mime.image import MIMEImage from email.mime.text import MIMEText import urwid import magic +from twisted.internet import reactor +from twisted.internet.protocol import ProcessProtocol +from twisted.internet.defer import Deferred +import StringIO from settings import config @@ -262,9 +266,7 @@ def call_cmd_async(cmdlist, stdin=None): :rtype: `twisted.internet.defer.Deferred` """ - from twisted.internet import process - - class _EverythingGetter(protocol.ProcessProtocol): + class _EverythingGetter(ProcessProtocol): def __init__(self, deferred): self.deferred = deferred self.outBuf = StringIO.StringIO() @@ -272,21 +274,20 @@ def call_cmd_async(cmdlist, stdin=None): self.outReceived = self.outBuf.write self.errReceived = self.errBuf.write - def processEnded(self, reason): - out = self.outBuf.getvalue() - err = self.errBuf.getvalue() - out = string_decode(out, urwid.util.detected_encoding) - err = string_decode(err, urwid.util.detected_encoding) - e = reason.value - code = e.exitCode - if e.signal: - self.deferred.callback((out, err, e.signal)) + def processEnded(self, status): + termenc = urwid.util.detected_encoding + out = string_decode(self.outBuf.getvalue(), termenc) + err = string_decode(self.errBuf.getvalue(), termenc) + if status.value.exitCode == 0: + self.deferred.callback(out) else: - self.deferred.callback((out, err, code)) + terminated_obj = status.value + terminated_obj.stderr = err + self.deferred.errback(terminated_obj) - d = defer.Deferred() - proc = process.Process(executable=cmdlist[0], args=cmdlist[1:], - _EverythingGetter(d)) + d = Deferred() + proc = reactor.spawnProcess(_EverythingGetter(d), executable=cmdlist[0], + args=cmdlist[1:]) if stdin: proc.write(stdin) return d |