--- a/hggtk/__init__.py Sun May 04 23:20:27 2008 -0500
+++ b/hggtk/__init__.py Wed May 07 12:14:49 2008 +0100
@@ -4,4 +4,6 @@
# Default icon for apps which do not set one
from shlib import get_tortoise_icon
-gtk.window_set_default_icon_from_file(get_tortoise_icon("hg.ico"))
+icon = get_tortoise_icon("hg.ico")
+if icon:
+ gtk.window_set_default_icon_from_file(icon)
--- a/hggtk/gdialog.py Sun May 04 23:20:27 2008 -0500
+++ b/hggtk/gdialog.py Wed May 07 12:14:49 2008 +0100
@@ -30,6 +30,7 @@
from shlib import shell_notify, set_tortoise_icon, Settings
from thgconfig import ConfigDialog
from gtklib import MessageDialog
+from hglib import toutf
class SimpleMessage(MessageDialog):
@@ -43,8 +44,8 @@
def __init__(self, title, message, parent):
SimpleMessage.__init__(self, parent, gtk.DIALOG_MODAL,
gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE)
- self.set_title(title)
- self.set_markup('<b>' + message + '</b>')
+ self.set_title(toutf(title))
+ self.set_markup('<b>' + toutf(message) + '</b>')
class Confirm(SimpleMessage):
"""Dialog returns gtk.RESPONSE_YES or gtk.RESPONSE_NO
@@ -52,18 +53,18 @@
def __init__(self, title, files, parent, primary=None):
SimpleMessage.__init__(self, parent, gtk.DIALOG_MODAL,
gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO)
- self.set_title('Confirm ' + title)
+ self.set_title(toutf('Confirm ' + title))
if primary is None:
primary = title + ' file' + ((len(files) > 1 and 's') or '') + '?'
primary = '<b>' + primary + '</b>'
- self.set_markup(primary)
+ self.set_markup(toutf(primary))
message = ''
for i, file in enumerate(files):
message += ' ' + file + '\n'
if i == 9:
message += ' ...\n'
break
- self.format_secondary_text(message)
+ self.format_secondary_text(toutf(message))
class GDialog(gtk.Window):
--- a/hggtk/hgcmd.py Sun May 04 23:20:27 2008 -0500
+++ b/hggtk/hgcmd.py Wed May 07 12:14:49 2008 +0100
@@ -50,7 +50,7 @@
hbox = gtk.HBox()
self.status_text = gtk.Label()
- self.status_text.set_text(" ".join(cmdline).replace("\n", " "))
+ self.status_text.set_text(toutf(" ".join(cmdline).replace("\n", " ")))
self.status_text.set_alignment(0, 0.5)
self.status_text.set_ellipsize(pango.ELLIPSIZE_END)
hbox.pack_start(self.status_text, True, True, 3)
--- a/hggtk/history.py Sun May 04 23:20:27 2008 -0500
+++ b/hggtk/history.py Wed May 07 12:14:49 2008 +0100
@@ -281,8 +281,11 @@
self.opts['no_merges'] = True
self.graphview.refresh(False, [], self.opts)
elif self._filter == "tagged":
- tagged = [hex(r) for t, r in self.repo.tagslist()]
- tagged.reverse()
+ tagged = []
+ for t, r in self.repo.tagslist():
+ hr = hex(r)
+ if hr not in tagged:
+ tagged.insert(0, hr)
self.opts['revs'] = tagged
self.graphview.refresh(False, [], self.opts)
elif self._filter == "parents":
--- a/hggtk/tracelog.py Sun May 04 23:20:27 2008 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-#
-# A PyGtk-based Python Trace Collector window
-#
-# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>
-#
-
-import pygtk
-pygtk.require("2.0")
-import gtk
-import gobject
-import pango
-import threading
-import Queue
-import win32trace
-
-from hglib import toutf
-
-class TraceLog():
- def __init__(self):
- self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
- self.window.set_title("Python Trace Collector")
-
- # construct window
- self.window.set_default_size(700, 400)
- self.main_area = gtk.VBox()
- self.window.add(self.main_area)
-
- # mimic standard dialog widgets
- self.action_area = gtk.HBox()
- self.main_area.pack_end(self.action_area, False, False, 5)
- sep = gtk.HSeparator()
- self.main_area.pack_end(sep, False, False, 0)
- self.vbox = gtk.VBox()
- self.main_area.pack_end(self.vbox)
-
- # add python trace ouput window
- scrolledwindow = gtk.ScrolledWindow()
- scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
- self.textview = gtk.TextView(buffer=None)
- self.textview.set_editable(False)
- self.textview.modify_font(pango.FontDescription("Monospace"))
- scrolledwindow.add(self.textview)
- self.textview.set_editable(False)
- self.textbuffer = self.textview.get_buffer()
- self.vbox.pack_start(scrolledwindow, True, True)
- self.vbox.show_all()
-
- # add buttons
- self._button_quit = gtk.Button("Quit")
- self._button_quit.connect('clicked', self._on_ok_clicked)
- self.action_area.pack_end(self._button_quit, False, False, 5)
-
- self._button_clear = gtk.Button("Clear")
- self._button_clear.connect('clicked', self._on_clear_clicked)
- self.action_area.pack_end(self._button_clear, False, False, 5)
-
- # add assorted window event handlers
- self.window.connect('map_event', self._on_window_map_event)
- self.window.connect('delete_event', self._on_window_close_clicked)
-
- def _on_ok_clicked(self, button):
- self._stop_read_thread()
- gtk.main_quit()
-
- def _on_clear_clicked(self, button):
- self.write("", False)
-
- def _on_window_close_clicked(self, event, param):
- self._stop_read_thread()
- gtk.main_quit()
-
- def _on_window_map_event(self, event, param):
- self._begin_trace()
-
- def _begin_trace(self):
- self.queue = Queue.Queue()
- win32trace.InitRead()
- self.write("Collecting Python Trace Output...\n")
- gobject.timeout_add(10, self._process_queue)
- self._start_read_thread()
-
- def _start_read_thread(self):
- self._read_trace = True
- self.thread1 = threading.Thread(target=self._do_read_trace)
- self.thread1.start()
-
- def _stop_read_thread(self):
- self._read_trace = False
-
- # wait for worker thread to to fix Unhandled exception in thread
- self.thread1.join()
-
- def _process_queue(self):
- """
- Handle all the messages currently in the queue (if any).
- """
- while self.queue.qsize():
- try:
- msg = self.queue.get(0)
- self.write(msg)
- except Queue.Empty:
- pass
-
- return True
-
- def _do_read_trace(self):
- """
- print buffer collected in win32trace
- """
- while self._read_trace:
- msg = win32trace.read()
- if msg:
- self.queue.put(msg)
-
- def write(self, msg, append=True):
- msg = toutf(msg)
- if append:
- enditer = self.textbuffer.get_end_iter()
- self.textbuffer.insert(enditer, msg)
- else:
- self.textbuffer.set_text(msg)
-
- def main(self):
- self.window.show_all()
- gtk.main()
-
-def run():
- dlg = TraceLog()
- dlg.main()
-
-if __name__ == "__main__":
- run()
-
--- a/setup.py Sun May 04 23:20:27 2008 -0500
+++ b/setup.py Wed May 07 12:14:49 2008 +0100
@@ -49,7 +49,7 @@
extra['windows'] = [
{"script":"hgproc.py",
"icon_resources": [(1, "icons/tortoise/hg.ico")]},
- {"script":"hggtk/tracelog.py",
+ {"script":"tracelog.py",
"icon_resources": [(1, "icons/tortoise/python.ico")]}
]
extra['com_server'] = ["tortoisehg"]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tracelog.py Wed May 07 12:14:49 2008 +0100
@@ -0,0 +1,139 @@
+#
+# A PyGtk-based Python Trace Collector window
+#
+# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>
+#
+
+import pygtk
+pygtk.require("2.0")
+import gtk
+import gobject
+import pango
+import threading
+import Queue
+import win32trace
+
+try:
+ from hggtk.hglib import toutf
+except ImportError:
+ import locale
+ _encoding = locale.getpreferredencoding()
+ def toutf(s):
+ return s.decode(_encoding, 'replace').encode('utf-8')
+
+class TraceLog():
+ def __init__(self):
+ self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+ self.window.set_title("Python Trace Collector")
+
+ # construct window
+ self.window.set_default_size(700, 400)
+ self.main_area = gtk.VBox()
+ self.window.add(self.main_area)
+
+ # mimic standard dialog widgets
+ self.action_area = gtk.HBox()
+ self.main_area.pack_end(self.action_area, False, False, 5)
+ sep = gtk.HSeparator()
+ self.main_area.pack_end(sep, False, False, 0)
+ self.vbox = gtk.VBox()
+ self.main_area.pack_end(self.vbox)
+
+ # add python trace ouput window
+ scrolledwindow = gtk.ScrolledWindow()
+ scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ self.textview = gtk.TextView(buffer=None)
+ self.textview.set_editable(False)
+ self.textview.modify_font(pango.FontDescription("Monospace"))
+ scrolledwindow.add(self.textview)
+ self.textview.set_editable(False)
+ self.textbuffer = self.textview.get_buffer()
+ self.vbox.pack_start(scrolledwindow, True, True)
+ self.vbox.show_all()
+
+ # add buttons
+ self._button_quit = gtk.Button("Quit")
+ self._button_quit.connect('clicked', self._on_ok_clicked)
+ self.action_area.pack_end(self._button_quit, False, False, 5)
+
+ self._button_clear = gtk.Button("Clear")
+ self._button_clear.connect('clicked', self._on_clear_clicked)
+ self.action_area.pack_end(self._button_clear, False, False, 5)
+
+ # add assorted window event handlers
+ self.window.connect('map_event', self._on_window_map_event)
+ self.window.connect('delete_event', self._on_window_close_clicked)
+
+ def _on_ok_clicked(self, button):
+ self._stop_read_thread()
+ gtk.main_quit()
+
+ def _on_clear_clicked(self, button):
+ self.write("", False)
+
+ def _on_window_close_clicked(self, event, param):
+ self._stop_read_thread()
+ gtk.main_quit()
+
+ def _on_window_map_event(self, event, param):
+ self._begin_trace()
+
+ def _begin_trace(self):
+ self.queue = Queue.Queue()
+ win32trace.InitRead()
+ self.write("Collecting Python Trace Output...\n")
+ gobject.timeout_add(10, self._process_queue)
+ self._start_read_thread()
+
+ def _start_read_thread(self):
+ self._read_trace = True
+ self.thread1 = threading.Thread(target=self._do_read_trace)
+ self.thread1.start()
+
+ def _stop_read_thread(self):
+ self._read_trace = False
+
+ # wait for worker thread to to fix Unhandled exception in thread
+ self.thread1.join()
+
+ def _process_queue(self):
+ """
+ Handle all the messages currently in the queue (if any).
+ """
+ while self.queue.qsize():
+ try:
+ msg = self.queue.get(0)
+ self.write(msg)
+ except Queue.Empty:
+ pass
+
+ return True
+
+ def _do_read_trace(self):
+ """
+ print buffer collected in win32trace
+ """
+ while self._read_trace:
+ msg = win32trace.read()
+ if msg:
+ self.queue.put(msg)
+
+ def write(self, msg, append=True):
+ msg = toutf(msg)
+ if append:
+ enditer = self.textbuffer.get_end_iter()
+ self.textbuffer.insert(enditer, msg)
+ else:
+ self.textbuffer.set_text(msg)
+
+ def main(self):
+ self.window.show_all()
+ gtk.main()
+
+def run():
+ dlg = TraceLog()
+ dlg.main()
+
+if __name__ == "__main__":
+ run()
+