run.py: buffer fractional lines until a newline is received.

This makes output a lot prettier, but a bit less immediate.  It doesn't
affect --raw mode though, so it should be okay.

Change-Id: Ib6371ee7fd39cfb8fe36783037da3d842d923b33
diff --git a/run.py b/run.py
index b540421..1130dc7 100755
--- a/run.py
+++ b/run.py
@@ -42,23 +42,32 @@
 
 
 class Handler(object):
+  """When data is received from the given file, print it line by line."""
+
   def __init__(self, prefix, fileobj):
     self.prefix = prefix
     self.fileobj = fileobj
+    self.buf = ''
+
+  def __del__(self):
+    if self.buf and not self.buf.endswith('\n'):
+      self.buf += '\n'
+    self.PrintBuf()
 
   def fileno(self):  #gpylint: disable-msg=C6409
     return self.fileobj.fileno()
 
+  def PrintBuf(self):
+    while '\n' in self.buf:
+      line, self.buf = self.buf.split('\n', 1)
+      print '%s: %s' % (self.prefix, line)
+
   def Run(self):
     """Read from this handler and write its results to stdout."""
-    buf = os.read(self.fileobj.fileno(), 65536)
-    if buf:
-      if not buf.endswith('\n'):
-        buf += '\n'
-      lines = buf.split('\n')[:-1]
-      for line in lines:
-        print '%s: %s' % (self.prefix, line)
-    return buf
+    got = os.read(self.fileobj.fileno(), 65536)
+    self.buf += got
+    self.PrintBuf()
+    return got
 
 
 def main():