<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi Everyone,</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">So after I upgraded to 0.9.0b2, my custom ObservedShellCommand class broke. The logs show up blank. I added some test output but it just outputs a single zero character. Any ideas? I’m not sure where to start looking. Thx!<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Greg<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:blue">class</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> _LogObserver(util.LogLineObserver):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">def</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> __init__(self, warningPatterns=</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">None</span><span style="font-size:10.0pt;font-family:Consolas;color:black">,
 errorPatterns=</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">None</span><span style="font-size:10.0pt;font-family:Consolas;color:black">, failImmediately=</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">True</span><span style="font-size:10.0pt;font-family:Consolas;color:black">):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        util.LogLineObserver.__init__(self)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.step =
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">None</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.warningPatterns = [compile(i, IGNORECASE)
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">for</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> i
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">in</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> warningPatterns]
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> warningPatterns
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">else</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> []</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.errorPatterns = [compile(i, IGNORECASE)
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">for</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> i
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">in</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> errorPatterns]
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> errorPatterns
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">else</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> []</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.failImmediately = failImmediately</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.warnings = []</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.errors = []</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self._log =
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">None</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:#7D7D7D">@property</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">def</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> log(self):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">return</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> self.step.observerLog</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">def</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> _processLine(self, line):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> any([i.search(line)
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">for</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> i
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">in</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> self.errorPatterns]):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">            self.errors.append(line)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">           
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">yield</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> self.log.<span style="background:blue;mso-highlight:blue">addStdout</span>(unicode(</span><span style="font-size:10.0pt;font-family:Consolas;color:#C9802B">'Error:
 '</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> + line))</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">           
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> self.failImmediately:</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">               
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">yield</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> self.log.<span style="background:blue;mso-highlight:blue">addStdout</span>(</span><i><span style="font-size:10.0pt;font-family:Consolas;color:#00AA00">u'Aborting
 step from observed errors.'</span></i><span style="font-size:10.0pt;font-family:Consolas;color:black">)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">               
</span><i><span style="font-size:10.0pt;font-family:Consolas;color:silver"># TODO: Interrupt step cleanly.</span></i><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">               
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">raise</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> buildstep.BuildStepFailed(</span><span style="font-size:10.0pt;font-family:Consolas;color:#C9802B">'Aborting step
 from observed errors.'</span><span style="font-size:10.0pt;font-family:Consolas;color:black">)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">elif</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> any([i.search(line)
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">for</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> i
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">in</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> self.warningPatterns]):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">            self.warnings.append(line)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">           
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">yield</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> self.log.<span style="background:blue;mso-highlight:blue">addStdout</span>(unicode(</span><span style="font-size:10.0pt;font-family:Consolas;color:#C9802B">'Warning:
 '</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> + line))</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">def</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> outLineReceived(self, line):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self._processLine(line)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">def</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> errLineReceived(self, line):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self._processLine(line)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">def</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> getResults(self):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> len(self.errors) >
</span><span style="font-size:10.0pt;font-family:Consolas;color:maroon">0</span><span style="font-size:10.0pt;font-family:Consolas;color:black">:</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">           
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">return</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> FAILURE</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> len(self.warnings) >
</span><span style="font-size:10.0pt;font-family:Consolas;color:maroon">0</span><span style="font-size:10.0pt;font-family:Consolas;color:black">:</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">           
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">return</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> WARNINGS</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">return</span><span style="font-size:10.0pt;font-family:Consolas;color:black">
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">None</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:blue">class</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> ObservedShellCommand(buildstep.ShellMixin, buildstep.BuildStep):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:#C9802B">"""Detects errors and warnings in stdio of a shell command."""</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">    name =
</span><span style="font-size:10.0pt;font-family:Consolas;color:#C9802B">"observed_shell"</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">def</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> __init__(self, warningPatterns=</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">None</span><span style="font-size:10.0pt;font-family:Consolas;color:black">,
 errorPatterns=</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">None</span><span style="font-size:10.0pt;font-family:Consolas;color:black">, failImmediately=</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">True</span><span style="font-size:10.0pt;font-family:Consolas;color:black">,
 **kwargs):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        kwargs = self.setupShellMixin(kwargs)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        buildstep.BuildStep.__init__(self, **kwargs)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.observerLog =
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">None</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.logObserver = _LogObserver(warningPatterns, errorPatterns, failImmediately)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.cmd =
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">None</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:#7D7D7D">@defer.inlineCallbacks</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">def</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> run(self):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.observerLog =
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">yield</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> self.addLog(</span><span style="font-size:10.0pt;font-family:Consolas;color:#C9802B">'observer'</span><span style="font-size:10.0pt;font-family:Consolas;color:black">)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.addLogObserver(</span><span style="font-size:10.0pt;font-family:Consolas;color:#C9802B">'stdio'</span><span style="font-size:10.0pt;font-family:Consolas;color:black">,
 self.logObserver)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">yield</span><span style="font-size:10.0pt;font-family:Consolas;color:black">
 self.observerLog.<span style="background:blue;mso-highlight:blue">addStdout</span>(</span><i><span style="font-size:10.0pt;font-family:Consolas;color:#00AA00">u'Observation log output test.'</span></i><span style="font-size:10.0pt;font-family:Consolas;color:black">)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        cmd =
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">yield</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> self.makeRemoteShellCommand()</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        self.cmd = cmd</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">yield</span><span style="font-size:10.0pt;font-family:Consolas;color:black">
 self.runCommand(cmd)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> cmd.results()
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">in</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> [FAILURE, EXCEPTION]:</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">            results = cmd.results()</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">else</span><span style="font-size:10.0pt;font-family:Consolas;color:black">:</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">            observedResults = self.logObserver.getResults()</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">            results = observedResults
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> observedResults
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">else</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> cmd.results()</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        defer.returnValue(results)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">   
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">def</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> interrupt(self, reason):</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        buildstep.BuildStep.interrupt(self, reason)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black">
 self.cmd:</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">            d = self.cmd.interrupt(reason)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Consolas;color:black">            d.addErrback(log.err,
</span><span style="font-size:10.0pt;font-family:Consolas;color:#C9802B">'while interrupting command'</span><span style="font-size:10.0pt;font-family:Consolas;color:black">)</span><span style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:Consolas;color:black">           
</span><o:p></o:p></p>
</div>
</body>
</html>