Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.8.1, 0.8.2, and 0.8.3

synch: redirect stdout file descriptor to capture hook output

This collects hook output when the target repo is locally reachable.
It does not work for http repositories, but I get no hook output on
the console when I push to http either.

Fixes #273

Changeset 5a9fc130ab1a

Parent 9b8db508ca57

by Steve Borho

Changes to one file · Browse files at 5a9fc130ab1a Showing diff from parent 9b8db508ca57 Diff from another changeset...

Change 1 of 6 Show Entire File hggtk/​synch.py Stacked
 
11
12
13
 
14
15
16
 
35
36
37
38
39
40
41
42
43
 
 
 
 
 
44
45
46
 
254
255
256
257
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258
259
260
 
287
288
289
290
 
291
292
293
 
376
377
378
379
380
 
 
381
382
383
 
596
597
598
 
 
 
 
 
 
599
600
601
 
11
12
13
14
15
16
17
 
36
37
38
 
 
 
 
 
 
39
40
41
42
43
44
45
46
 
254
255
256
 
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
 
300
301
302
 
303
304
305
306
 
389
390
391
 
 
392
393
394
395
396
 
609
610
611
612
613
614
615
616
617
618
619
620
@@ -11,6 +11,7 @@
 import Queue  import os  import sys +import threading  import urllib    from mercurial import hg, ui, extensions, url @@ -35,12 +36,11 @@
  self.last_drop_time = None   self.lastcmd = []   - self.saved_stdout = sys.stdout - self.saved_stderr = sys.stderr - if os.name == 'nt': - # Pipe stderr, stdout to self.write - sys.stdout = self - sys.stderr = self + # Replace stdout file descriptor with our own pipe + self.oldstdout = os.dup(sys.__stdout__.fileno()) + self.stdoutq = Queue.Queue() + self.readfd, writefd = os.pipe() + os.dup2(writefd, sys.__stdout__.fileno())     # persistent app data   self._settings = settings.Settings('synch') @@ -254,7 +254,20 @@
    self.load_settings()   self.update_pull_setting() - gobject.idle_add(self.update_buttons) + gobject.idle_add(self.finalize_startup) + + def finalize_startup(self, *args): + self.update_buttons() + def pollstdout(*args): + while True: + # blocking read of stdout pipe + o = os.read(self.readfd, 1024) + if o: + self.stdoutq.put(o) + else: + break + thread = threading.Thread(target=pollstdout, args=[]) + thread.start()     def update_pull_setting(self):   ppull = self.repo.ui.config('tortoisehg', 'postpull', 'None') @@ -287,7 +300,7 @@
  elif not os.path.isdir(path) and path.endswith('.hg'):   self.pathtext.set_text(hglib.toutf(path))   - def update_buttons(self, *args): + def update_buttons(self):   self.buttonhbox.hide()   try:   # open a new repo, rebase can confuse cached repo @@ -376,8 +389,8 @@
  else:   self.update_settings()   self._settings.write() - sys.stdout = self.saved_stdout - sys.stderr = self.saved_stderr + os.dup2(self.oldstdout, sys.__stdout__.fileno()) + os.close(self.oldstdout)   return False     def delete(self, widget, event): @@ -596,6 +609,12 @@
  self.write_err(msg)   except Queue.Empty:   pass + while self.stdoutq.qsize(): + try: + msg = self.stdoutq.get(0) + self.write_err(msg) + except Queue.Empty: + pass     if self.cmd_running():   return True