Merge lp://staging/~jelmer/tribunal/unreloadable into lp://staging/~mbp/tribunal/view-subunit-broken

Proposed by Jelmer Vernooij
Status: Merged
Merged at revision: not available
Proposed branch: lp://staging/~jelmer/tribunal/unreloadable
Merge into: lp://staging/~mbp/tribunal/view-subunit-broken
Diff against target: 124 lines (+55/-13)
1 file modified
bin/tribunal-subunit (+55/-13)
To merge this branch: bzr merge lp://staging/~jelmer/tribunal/unreloadable
Reviewer Review Type Date Requested Status
Martin Pool Approve
Jonathan Lange Pending
Review via email: mp+18009@code.staging.launchpad.net
To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) wrote :

This makes the handling of unseekable streams (such as stdin) a bit friendlier.

Revision history for this message
Martin Pool (mbp) wrote :

I don't think I really like the gui defaulting to reading stdin, because it will look to users like it's just hung. But we can fix that separately; I realize you're just building on Robert's change there. The message is ok.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/tribunal-subunit'
2--- bin/tribunal-subunit 2010-01-25 15:31:21 +0000
3+++ bin/tribunal-subunit 2010-01-25 16:23:16 +0000
4@@ -16,16 +16,17 @@
5 except ImportError:
6 pass
7
8-from pprint import pformat
9+import errno
10 import sys
11
12 import gtk
13 import pango
14
15-from testtools import (
16- MultiTestResult,
17- TestResult,
18- )
19+try:
20+ import testrepository.repository.file
21+except ImportError:
22+ testrepository = None
23+
24 from subunit import TestProtocolServer
25 from subunit.test_results import TestResultFilter
26
27@@ -35,7 +36,6 @@
28 from tribunal.eventloop import GtkLoop
29 from tribunal.view import (
30 load_glade,
31- TribunalWindow,
32 )
33
34
35@@ -96,6 +96,10 @@
36 pass
37
38
39+class UnreloadableStream(Exception):
40+ """The test stream can not be reloaded (probably because it is a pipe)."""
41+
42+
43 class SubunitWindow(object):
44 """Per-window application logic.
45
46@@ -209,26 +213,49 @@
47
48 def on_filter_failed_menuitem_toggled(self, menuitem):
49 self._show_failed = menuitem.active
50- self.reload_stream()
51+ try:
52+ self.reload_stream()
53+ except UnreloadableStream:
54+ pass
55
56 def on_filter_skipped_menuitem_toggled(self, menuitem):
57 self._show_skipped = menuitem.active
58- self.reload_stream()
59+ try:
60+ self.reload_stream()
61+ except UnreloadableStream:
62+ pass
63
64 def on_filter_success_menuitem_toggled(self, menuitem):
65 self._show_success = menuitem.active
66- self.reload_stream()
67+ try:
68+ self.reload_stream()
69+ except UnreloadableStream:
70+ pass
71
72 def on_reload_button_clicked(self, reload_button):
73- self.reload_stream()
74+ try:
75+ self.reload_stream()
76+ except UnreloadableStream:
77+ dialog = gtk.Dialog(title="Stream not reloadable",
78+ parent=self.subunit_window,
79+ buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
80+ label = gtk.Label("This stream is not reloadable. Perhaps it is a pipe?")
81+ dialog.vbox.pack_start(label, True, True, 0)
82+ label.show()
83+ dialog.run()
84+ dialog.destroy()
85
86 def show_all(self):
87 # show the top level window and the rest will follow
88 self.subunit_window.show_all()
89
90 def reload_stream(self):
91- self._last_input_file.seek(0)
92- self.load_from_subunit_stream(self._last_input_file)
93+ try:
94+ self._last_input_file.seek(0)
95+ except IOError, errno.ESPIPE:
96+ raise UnreloadableStream()
97+ else:
98+ self.load_from_subunit_stream(self._last_input_file)
99
100
101 class ViewSubunitApp(object):
102@@ -257,7 +284,22 @@
103 glade_xml.signal_autoconnect(self)
104
105 self._window.show_all()
106- self._window.load_from_subunit_stream(file(argv[1], 'rt'))
107+ if len(argv) < 2:
108+ stream = None
109+ # Try for testrepository source
110+ if testrepository is not None:
111+ factory = testrepository.repository.file.RepositoryFactory()
112+ try:
113+ repo = factory.open('.')
114+ except IOError:
115+ stream = None
116+ else:
117+ stream = repo.get_test_run(repo.latest_id()).get_subunit_stream()
118+ if stream is None:
119+ stream = sys.stdin
120+ else:
121+ stream = file(argv[1], 'rb')
122+ self._window.load_from_subunit_stream(stream)
123
124 self._event_loop.start()
125

Subscribers

People subscribed via source and target branches

to all changes: