Explorar el Código

Fixes #1490 progress_stream would print a lot of new lines on "docker-compose pull" if there's no tty.

Signed-off-by: Yves Peter <[email protected]>
Yves Peter hace 10 años
padre
commit
3313dcb1ce
Se han modificado 2 ficheros con 45 adiciones y 9 borrados
  1. 14 9
      compose/progress_stream.py
  2. 31 0
      tests/unit/progress_stream_test.py

+ 14 - 9
compose/progress_stream.py

@@ -14,8 +14,14 @@ def stream_output(output, stream):
 
     for event in utils.json_stream(output):
         all_events.append(event)
+        is_progress_event = 'progress' in event or 'progressDetail' in event
 
-        if 'progress' in event or 'progressDetail' in event:
+        if not is_progress_event:
+            print_output_event(event, stream, is_terminal)
+            stream.flush()
+
+        # if it's a progress event and we have a terminal, then display the progress bars
+        elif is_terminal:
             image_id = event.get('id')
             if not image_id:
                 continue
@@ -27,17 +33,16 @@ def stream_output(output, stream):
                 stream.write("\n")
                 diff = 0
 
-            if is_terminal:
-                # move cursor up `diff` rows
-                stream.write("%c[%dA" % (27, diff))
+            # move cursor up `diff` rows
+            stream.write("%c[%dA" % (27, diff))
 
-        print_output_event(event, stream, is_terminal)
+            print_output_event(event, stream, is_terminal)
 
-        if 'id' in event and is_terminal:
-            # move cursor back down
-            stream.write("%c[%dB" % (27, diff))
+            if 'id' in event:
+                # move cursor back down
+                stream.write("%c[%dB" % (27, diff))
 
-        stream.flush()
+            stream.flush()
 
     return all_events
 

+ 31 - 0
tests/unit/progress_stream_test.py

@@ -34,3 +34,34 @@ class ProgressStreamTestCase(unittest.TestCase):
         ]
         events = progress_stream.stream_output(output, StringIO())
         self.assertEqual(len(events), 1)
+
+    def test_stream_output_progress_event_tty(self):
+        events = [
+            b'{"status": "Already exists", "progressDetail": {}, "id": "8d05e3af52b0"}'
+        ]
+
+        class TTYStringIO(StringIO):
+            def isatty(self):
+                return True
+
+        output = TTYStringIO()
+        events = progress_stream.stream_output(events, output)
+        self.assertTrue(len(output.getvalue()) > 0)
+
+    def test_stream_output_progress_event_no_tty(self):
+        events = [
+            b'{"status": "Already exists", "progressDetail": {}, "id": "8d05e3af52b0"}'
+        ]
+        output = StringIO()
+
+        events = progress_stream.stream_output(events, output)
+        self.assertEqual(len(output.getvalue()), 0)
+
+    def test_stream_output_no_progress_event_no_tty(self):
+        events = [
+            b'{"status": "Pulling from library/xy", "id": "latest"}'
+        ]
+        output = StringIO()
+
+        events = progress_stream.stream_output(events, output)
+        self.assertTrue(len(output.getvalue()) > 0)